SQL server 與Oracle開發比較【轉】

SQL server 與Oracle開發比較

  本文檔主要從oraclesql server語法上進行差異性比較,諸如兩者在管理,性能,優化等方面的差異不作比較。

概念上區別

   1.Oracle 是一種對象關係數據庫管理系統(ORDBMS),Sql server 只是關係型數據庫管

     理系統(RDBMS.

   2.Oracle使用Internet文件系統,該系統基於Java的應用程序,可以使數據庫基於成爲

     Internet的開發平臺;Sql server 是基於windows

   3.Orace 主要的三類文件是:數據文件,控制文件,恢復日誌文件

     Sql server: 主要數據文件(必須有且只能有一個),次要數據文件以及日誌文件

   4.兩者支持的命令類別差不多,數據定義語言,數據操縱語言,事務處理控制語言,

     數據控制語言.Oracle中,在事務控制語言中除了commit,rollback等還多了一個

     Savepoint,設置保存點。

   5.oracle sql的擴展叫PL/SQL,主要的結構化查詢工具有sql*plusisql*plus, pl/sql

     Ms sql的擴展叫Transact-SQL,主要的結構化查詢工具就是自帶的查詢分析器

   6.主要數據類型

     Orace:主要支持char ,varchar2,long,number,datetime,raw,long raw,clob,blob,bfie

     前面三個是Character數據類型,varchar2支持可變長度的字符串,long支持可

     變長度的字符數據,raw,long raw用於存儲二進制數據,long raw 可變長度

     最後三個是大對象(lob)數據類型,存儲非結構化的信息,例如聲音剪輯,視頻文件

     CLOG表示Character Lob,可以存儲大量的字符數據,它對於存儲非結構化的XML

     文檔非常有用。BLOG表示Binary LOG,此數據類型可以存儲大型二進制對象,如

     圖形、視頻剪輯,聲音文件等

     支不支持,money,貨幣

     Sql server 主要支持的文本類型char ,varchar,nchar,nvarchar,text,ntext,image,貨幣類型

     Money,二進制 binary,varbinary等等

開發語法

A.SQL 語法

    兩者的SQL語法基本上是相同的,只是一些細節方面的問題

 一: 表的管理:修改表的結構,如增加,刪除列,創建表

       修改表

          1.修改表的列的數據類型,大小的定義不同,如下面修改數據類型。

            Ms sqlALTER TABLE table_name ALTER COLUMN col DECIMAL (5, 2)

                Oracle Alter TABLE table_name modify(col decimal(5,2))

          2.增加和刪除表的列,兩者是相同的 

            Alter tabe table_name add(col definition)

            Alter tabe table_name drop column col_name

          3 .Oracle如果不要用某列,然後又不想刪除,就可以將某個列標記爲未用

            Alter tabe table_name set unused(tel_no)

.創建臨時表

Oracle 的語法是:

Create global temporary table aa(col number) on commit preserve rows;

臨時表只在用戶會話時存在的表,或其數據在用戶事務處理期間可

持續存在的表,創建臨時表時可以指定該表是否應當在用戶會話

期間持續存在(使用on commit preserve rows

On commit delete rows 表示事務處理完成後刪除它的行

            Ms sql的語法是:

               Select * into #temptable from existedtable

  查詢方面:      

1.查表的前N行記錄

oracle 是用rownum select * from table_name where rownum<n

              

            Ms sql 是用top select top n * from table_name

              

         2.查詢表的結構

 Orace 可以通desc來查看錶的結構 語法是:desc table_name

       或者使用數據字典表user_tab_coumns也可以查看到

         Select column_name,data_type from user_tab_coumns

         Where table_name=''

           Ms sql可以通過一些系統的存儲過程來看錶的結構

             語法是:exec sp_help table_name

         3.將一個表的數據添加到另外一個表中

a.新表存在前提下:兩者語法是一樣的,如

                 insert into newtablecol1select col1 from old_table

b.新表不存在前提下,可以用

 oracle 可以用Create tabe new _table_name as select * from old_table

             ms sql 可以用 Select * into new_table from old_table

    操作符

         1.連接操作符

             Oracle ‘||’; Ms sql‘+’

         2. Oracle的比較操作符中不等於除了'<>'之外,還有一個 '!='

         3. 算術操作符,都是+-*/;邏輯操作符都是and,not,or(相同點)

         4. oracle集合操作符除了union,union all之外還加入intersect,minus

           Intersect是僅返回兩個查詢都有行,minus返回第一個查詢有第

           二個查詢沒有的行

      函數

        1.轉換函數

           Oracle 中有to_char(),to_date(),to_number()

           Ms sql 中有cast,convert

        2.系統日期:

Oracle: sysdate

Ms sql:  getdate()

          

            Select sysdate from dual 一定要from子句

            Select getdate() 不一定要from

         3.Decode函數相當if else,或者ms 中的case語句

           語法是decode(value,if1,then1,if2,then2....)

             decode(col1,'1','true','0','fase')

4.常規函數

Nvl 語法是NVL(EXP1,EXP2) 表示如果ex1爲空則返回ex2

Nvl2 語法是nvl(exp1,exp2,exp3)表示如果ex1爲空,則返回ex3,否則返回ex2

Nullif 語法是nullif(ex1,ex2) 如果這兩個表達式相等則返回空

coalesce語法是coalesceex1,ex2,....exn)返回第一個非空表達式

         5.分組函數

Oracle 中的分組函數Rollup,cube

Rollup返回的結果集包含分組行和小計行,cube產生交叉報表

:

Select a,b,sum(c) from tabname group by rollup(a,b)

Select a,b,sum(c) from tabname group by cube(a,b)

            Ms sql中的分組函數 compute  compute by

              Compute子句爲行聚集函數生成彙總值,該彙總值做爲一個附加的行顯示

            在結果集中。沒有GROUP BY 子句的情況下,也可以使用關鍵字COMPUTE.

            此關鍵字使用MAX,MIN,SUM,COUNT,AVG等函數生成彙總值,而compute by

            則在控制中斷時給出該彙總值,compute by 必須包括在order by 子句中。

         還有很多函數,諸如日期函數,字符串函數等等,就不一一作比較了。

         Oracle中還有很多比較好的分析函數,也不列舉了。

五.Oracle中的數據庫對象

同義詞

      作用:簡化SQL語句;隱藏對象的名稱和所有者,提供對象的公共訪問等。

      語法:CREATE PUBLIC SYNONYM seqname FOR OBJECT

序列 

     用來生成唯一、邊續的整數,它通常用來自動生成主鍵或唯一值的鍵。

    創建序列: create sequence seqname [increment by 1] start with 1 maxvalue 10

     minvalue 1 cycle cache

    訪問序列:

                   Select seqname.nextval from dual 將返回序列的初始值

                   Select seqname.currval from dual   返回序列的當前值

       簇(cluster

            簇是共享相同數據塊的一組表,因爲這些表具有相同的列,並且經常一起使用。

          當兩個或多個表的存儲在物理上十分接近時,可以通過簇來提高使用這些表的

          SQL聯接語句的性能。簇是存儲表的方法

          應該先創建簇,然後再創建簇中的表,

六.Oracle中的對象類型

1. 抽象數據類型

    此類型是包含一個或多個子類型的數據類型,並且這些數據類型並不侷限

   於標準的oracle數據類型

     如:create or replace type t_mm as object(col number(3),

         col2 varchar2(20))/

       此時可以在創建表時使用該類型,如下

         Create table test (aa varchar2(5),bb t_mm, cc number(10))

       插入記錄:

          Insert into test values('cccc', t_mm(1,'col'))

       類型聲明:

           用戶定義的數據類型也可以聲明爲 final,not final,instantiable,

           not instantiabe

           Not final表示允許類型派生子類型。默認是final

           create or replace type t_mm as object(col number(3),

            col2 varchar2(20)) Not final

           not instantiabe表示類型沒有構造函數。

2. 可變數組

    可變數組有助於在單個行中存儲和重複記錄的屬性。

    數據與表中的其它數據是存儲在一起的,有限數目的行,不能被索引

    創建可變數組的 語法是:

       create type array1 as varray(5) of varchar2(5)

    向可變數組中插入記錄

    Insert into test1 values ('2ee', array1('1','2','3','4','5') )

    Select * from test1 結果集如下

       2ee

       '1','2','3','4','5'

    Select col2 from test1 結果集如下

       '1','2','3','4','5'

    Select * from table(select t.col2 from test1 where col1='2ee'); 結果集如下

       1

       2

       3

       4

       5

3. 嵌套表

   它是包含在表中的表,對每行數據項數目沒有限制,一個表在

 另一表中是作爲一列,主表中的每一行的嵌套表可以包含若干行。

    創建嵌套表

       先創建一個類型

       Create type ord_ty as object(itemcode varchar2(5),qty _ord number(5),

      Qty_held number(5));

      創建另一個抽象數據類型,即嵌套表數據類型

      Create type ord_nt as table of ord_ty

      創建嵌套表

       Create table order_mas (orderno varchar2(5),odate date,

       vencode varchar2(5), dets ord_nt) nested table dets store as ord_nt_tab;

      向嵌套表中插入數據:

       Insert into order_mas values(‘001’,to_date('18-07-08','DD-MM-YY'),

       'V009',ord_nt( ord_ty('i001',10,5),ord_ty('i002',34,2));

      更新嵌套表的值:

       Update table(select e.dets from order_mas e where e.orderno='001') p

       Set valuep) =ord_ty('i090',8,9) where p.itemcode='i001';

      刪除嵌套表的值:

        Delete from table(select e.dets from order_mas e where e.orderno='001') p

        where p.itemcode='i001';

4. 對象表

              在對象表中每一行都是一個行對象,對象表與關係表不同:

              對象表中的每一行都有一個OID值,即對象標識符值。該值是在創建行時

             分配的。可以使用create table 命令來創建對象表。

               在創建對象類型時,Oracle 中是不允許爲屬性定義約束條件,但是

             可以在創建對象表時爲對象類型的屬性指定約束條件。

               Create table vend_master of vend_ty(vencode constraint vc_pk primary key);

               創建對象表與關係表語法不同

               表的使用方法不同 插入數據可以使用抽象數據類型的構造函數,如果對象

              表所基於抽象數據類型又基於另一抽象數據類型,則必須多個構造函數的嵌

              套調用。

                  Insert into vend_master values (vend_ty());

5. 對象視圖

       藉助對象視圖可以將面向對象的結構(如抽象數據類型)應用於現有已經

     投入使用的表,而不需重建整個應用程序

B.PL/SQLT_SQL語法

 

 批處理

  SQL的能力畢竟有限,諸如事務處理方面,批處理於是oraclems 都把它進行了擴展,oracle 的擴展叫PL/SQL由聲明部分,可執行部分,異常處理部分組成順序如下:   

Declare declarations

 Begin

      Executable statements

      Exception

          Handles

 End

   Ms 的擴展叫 Transact_SQL,簡稱T_SQL.

      批處理:就是一次執行處理一組命令的過程。GO關鍵字樗着批處理的結束。

     use master

        go

      複雜一點也是由三部分組成:聲明部分,可執行部分,異常處理部分

     不同的是,異常處理部分一般用跳轉語句來實現。    

 例如:

         Declare declarations

          Begin

             Excutable statements

             IF @ERROR <>0 GOTO ERROR

         End

         ERROR:

            BEGIN

             RAISERROR(20058, 16, -1)

              return (1)

            END 

  邏輯控制語句       

   1. 控制結構:

     Oracle

         If condition then ........

         End if

         Case selector 

          when exp1 then statements

          Else statements

         End case

     SQL SERVER

         IF condition

           Sql statements

         ELSE

           Sql statements

        Case selector

        When ex1 then statements

        Else statements

        End

   2. 迭代結構

       oracle

          Loop statements end loop;

          While condition

          Loop statement end loop;

       Sql server

            While condition

            Begin

              Sql statement

            End

   面象對象編程涉及的概念有對象,類,屬性和方法,面向對象的三大特性是:

   封裝,繼承和多態。

   將數據和函數包裝到一個單元中的過程稱爲封裝。不能從外部訪問數據,只能包裝在

   類中的那些函數才能訪問數據

   繼承可以是SQL類型的繼承和方法的繼承。

   多態是一個對象可以呈現多種形式的能力,這使得不同的對象可以具有相同的名稱

   的方法,這些方法實現的任務相似,但實現方式卻不同。

    .變量與常量

Pl/sql變量與常量可以具有屬性,支持的屬性類型有

%type,%rowtype

聲明引用數據庫列或變量的數據類型的變量時,可以使用%type屬性。如:

 Declare

      Variable_name table_name.col_name %type

        使用這個優點是,不需要知道列vencode的準確數據類型

      %rowtype屬性提供表示表中行的記錄類型。

     .過程與函數(Procedure & Function)

       a. 建立存儲過程的語法不同:

           Ms sql 的語法是:

             Create procedure procedure_name 

               (

                   @Id int =null,

                   @name varchar(10) out[put]

               )

 as

 [變量定義區]

begin sql_statement end

--------------------------------------------------------------------   

             CREATE FUNCTION function_name (@DATE datetime)

RETURNS int

AS begin sql statement end

 面向對象的特性之一是封裝,程序包就是對相關PL/SQL類型,子程序,遊標,異常,變量,和常量的封裝,它包含兩部分程序包規格說明和程序包主體

在包規格說明書中,可以聲明類型,變量,常量,異常,遊標,子程序

程序包主體實現在程序包規格中定義的遊標、子程序

        包頭語法部分:

Create or replace package package_name is|as

 Public type and item declarations

 Subprogram specifications

 End package_name

實例如下:

 Create or replace package pack_me is

 Procedure order_proc(orno varchar2);

  Function    order_fun(ornos varchar2) return varchar2;

 End pack_me

包體語法部分:

Create or replace package body package_name is|as

 Private type and item decarations

 Subprogram bodies

End package_name;

         包體具體實例就不寫了,包頭隻是起一個聲明作用,具體實現部分都在包體裡面。

         下面是創建存儲過程的語法:

          Create [or replace] procedure procedure_name[arg1 in|out|in out]type {is|as}

           [變量定義區]

          Begin

             Execute Sql statement

          Exception handlers

End

         注意:參數列表那裡,oracle是先定義參數是輸入還是輸出參數,然後再定義

參數類型sql server正好相反

         創建函數的語法:

Create function function_name argument

 Return datatype is|as

 Local decaration

Begin

Excutable statement

Exception

Handles

End;

      b.變量賦值

1.    Oracle裏的用法:存儲過程中邊查詢邊給變量賦值。

select 某一列名 into 變量名 from table where ..;

相當於sql server中的select 變量名=. From table where ….

注意:select * /某一列名 into 表名

        2.   Oracle 直接賦值的符號是:' := '

   觸發器(Trigger)

        Oracle

        Create or replace trigger trigger_name [before/after]

       [insert/update/delete] on table_name

        變量聲明

        begin

        Sql statement

        end

Ms sql

Create trigger trigger_name on table

{for |after|instead of} [insert|update|delete] as sql_statements

     遊標(Curcor)

        Oracle中提供兩種遊標類型,它們是靜態遊標和ref遊標

靜態遊標又分爲隱式遊標與顯式遊標

Ref遊標,遊標變量是一種引用 類型

隱式遊標屬性包括%notfound,%found,%rowcount,%isopen

如:

       Begin

                    Delete from ta where ord='ddd'

               If sql%notfound then

                     Dbms_output.put_line(''未找到值)

              Else

                     Dbms_output.put_line(找到並刪除之)

            End if

End

顯示遊標:可以用下面語句控制遊標

      Open cursorname

       Fetch cursor_name into var_name

       Close cursor_name

        創建遊標語法:

     Oracle:

       declare variable

       Cursor test is select * from order

    Sql server

       Declare test cursor for select * from order

     .錯誤處理(Exception & test & debug)

有兩種類型的異常:一種預定義,另外一種是用戶自定義

預定義的類型有很多,如No_data_found,Cursor_already_open

       對於Oracle的調試,可以藉助第三方工具,如toad,Pl.sql Developer,

       對於sql server採用 變量或者print 形式進行調試

        Oracle異常定義部分的示例:

            Exception

          When <exception_name> then statements

           When others then

               Statements

           End;

         其中<exception_name>是系統預定義的名字。

       Raiser_application_error用於創建用戶定義的錯誤信息的過程,用戶定義的錯誤消息

     可以指定的異常描述的更詳細

      Sql server在錯誤處理上多采用自定義。或者是用goto跳轉的方式

       如:

        Begin

        Sql statements

        if @error<>0 goto error

        end

        Error:

            Return;

      或是直接用raiserror

      if @error<>0

begin

raiserror('發生錯誤.',-1,-1)

return (1)

end

好了,兩者的主要的差異就寫到這,但願我表述清楚了,由於東西比較多,所以還有很多具體東西沒有寫

 

http://www.cnblogs.com/wangxiaohuo/archive/2008/04/20/1162631.html

 


 

函數

SQLServer和Oracle的常用函數對比  
 
  1.絕對值  
  S:select abs(-1) value
  O:select abs(-1) value from dual

  2.取整(大)  
  S:select ceiling(-1.001) value  
  O:select ceil(-1.001) value from dual

  3.取整(小)  
  S:select floor(-1.001) value  
  O:select floor(-1.001) value from dual

  4.取整(截取)
  S:select cast(-1.002 as int) value  
  O:select trunc(-1.002) value from dual  

  5.四捨五入
  S:select round(1.23456,4) value 1.23460
  O:select round(1.23456,4) value from dual 1.2346

  6.e爲底的冪  
  S:select Exp(1) value 2.7182818284590451  
  O:select Exp(1) value from dual 2.71828182

  7.取e爲底的對數
  S:select log(2.7182818284590451) value 1
  O:select ln(2.7182818284590451) value from dual; 1

  8.取10爲底對數
  S:select log10(10) value 1
  O:select log(10,10) value from dual; 1

  9.取平方
  S:select SQUARE(4) value 16
  O:select power(4,2) value from dual 16

  10.取平方根
  S:select SQRT(4) value 2
  O:select SQRT(4) value from dual 2

  11.求任意數爲底的冪
  S:select power(3,4) value 81
  O:select power(3,4) value from dual 81

  12.取隨機數
  S:select rand() value  
  O:select sys.dbms_random.value(0,1) value from dual;

  13.取符號
  S:select sign(-8) value -1
  O:select sign(-8) value from dual -1
  ----------數學函數

  14.圓周率
  S:SELECT PI() value 3.1415926535897931
  O:不知道

  15.sin,cos,tan 參數都以弧度爲單位
  例如:select sin(PI()/2) value 得到1(SQLServer)

  16.Asin,Acos,Atan,Atan2 返回弧度

  17.弧度角度互換(SQLServer,Oracle不知道)
  DEGREES:弧度-〉角度
  RADIANS:角度-〉弧度

  ---------數值間比較

  18. 求集合最大值
  S:select max(value) value from  
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select greatest(1,-2,4,3) value from dual

  19. 求集合最小值
  S:select min(value) value from  
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select least(1,-2,4,3) value from dual

  20.如何處理null值(F2中的null以10代替)
  S:select F1,IsNull(F2,10) value from Tbl
  O:select F1,nvl(F2,10) value from Tbl

  --------數值間比較

  21.求字符序號
  S:select ascii('a') value
  O:select ascii('a') value from dual

  22.從序號求字符
  S:select char(97) value
  O:select chr(97) value from dual

  23.連接
  S:select '11'+'22'+'33' value
  O:select CONCAT('11','22')||33 value from dual

  23.子串位置 --返回3
  S:select CHARINDEX('s','sdsq',2) value  
  O:select INSTR('sdsq','s',2) value from dual

  23.模糊子串的位置 --返回2,參數去掉中間%則返回7
  S:select patindex('%d%q%','sdsfasdqe') value  
  O:oracle沒發現,但是instr可以通過第四霾問刂瞥魷執問?BR>  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

  24.求子串
  S:select substring('abcd',2,2) value  
  O:select substr('abcd',2,2) value from dual

  25.子串代替 返回aijklmnef
  S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
  O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

  26.子串全部替換
  S:沒發現
  O:select Translate('fasdbfasegas','fa','我' ) value from dual

  27.長度
  S:len,datalength
  O:length

  28.大小寫轉換 lower,upper

  29.單詞首字母大寫
  S:沒發現
  O:select INITCAP('abcd dsaf df') value from dual

  30.左補空格(LPAD的第一個參數爲空格則同space函數)
  S:select space(10)+'abcd' value
  O:select LPAD('abcd',14) value from dual

  31.右補空格(RPAD的第一個參數爲空格則同space函數)
  S:select 'abcd'+space(10) value
  O:select RPAD('abcd',14) value from dual

  32.刪除空格
  S:ltrim,rtrim
  O:ltrim,rtrim,trim

  33. 重複字符串
  S:select REPLICATE('abcd',2) value  
  O:沒發現

  34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
  S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
  O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
  SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
  返回0-4,4爲同音,1最高

  --------------日期函數

  35.系統時間
  S:select getdate() value
  O:select sysdate value from dual

  36.前後幾日
  直接與整數相加減

  37.求日期
  S:select convert(char(10),getdate(),20) value
  O:select trunc(sysdate) value from dual
  select to_char(sysdate,'yyyy-mm-dd') value from dual

  38.求時間
  S:select convert(char(8),getdate(),108) value
  O:select to_char(sysdate,'hh24:mm:ss') value from dual

  39.取日期時間的其他部分
  S:DATEPART 和 DATENAME 函數 (第一個參數決定)  
  O:to_char函數 第二個參數決定

  參數---------------------------------下表需要補充
  year yy, yyyy  
  quarter qq, q (季度)
  month mm, m (m O無效)
  dayofyear dy, y (O表星期)
  day dd, d (d O無效)
  week wk, ww (wk O無效)
  weekday dw (O不清楚)
  Hour hh,hh12,hh24 (hh12,hh24 S無效)
  minute mi, n (n O無效)
  second ss, s (s O無效)
  millisecond ms (O無效)
  ----------------------------------------------

  40.當月最後一天
  S:不知道
  O:select LAST_DAY(sysdate) value from dual

  41.本星期的某一天(比如星期日)
  S:不知道
  O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

  42.字符串轉時間
  S:可以直接轉或者select cast('2004-09-08'as datetime) value
  O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

  43.求兩日期某一部分的差(比如秒)
  S:select datediff(ss,getdate(),getdate()+12.3) value
  O:直接用兩個日期相減(比如d1-d2=12.3)
  SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

  44.根據差值求新的日期(比如分鐘)
  S:select dateadd(mi,8,getdate()) value
  O:SELECT sysdate+8/60/24 vaule FROM DUAL;

  45.求不同時區時間
  S:不知道
  O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

  -----時區參數,北京在東8區應該是Ydt-------
  AST ADT 大西洋標準時間
  BST BDT 白令海標準時間
  CST CDT 中部標準時間
  EST EDT 東部標準時間
  GMT 格林尼治標準時間
  HST HDT 阿拉斯加—夏威夷標準時間
  MST MDT 山區標準時間
  NST 紐芬蘭標準時間
  PST PDT 太平洋標準時間
  YST YDT YUKON標準時間   
Oracle支持的字符函數和它們的Microsoft SQL Server等價函數:

函數 Oracle Microsoft SQL Server  
把字符轉換爲ASCII ASCII ASCII  
字串連接 CONCAT (expression + expression)  
把ASCII轉換爲字符 CHR CHAR  
返回字符串中的開始字符(左起) INSTR CHARINDEX  
把字符轉換爲小寫 LOWER LOWER  
把字符轉換爲大寫 UPPER UPPER  
填充字符串的左邊 LPAD N/A  
清除開始的空白 LTRIM LTRIM  
清除尾部的空白 RTRIM RTRIM  
字符串中的起始模式(pattern) INSTR PATINDEX  
多次重複字符串 RPAD REPLICATE  
字符串的語音表示 SOUNDEX SOUNDEX  
重複空格的字串 RPAD SPACE  
從數字數據轉換爲字符數據 TO_CHAR STR  
子串 SUBSTR SUBSTRING  
替換字符 REPLACE STUFF  
將字串中的每個詞首字母大寫 INITCAP N/A  
翻譯字符串 TRANSLATE N/A  
字符串長度 LENGTH DATELENGTH or LEN  
列表中最大的字符串 GREATEST N/A  
列表中最小的字符串 LEAST N/A  
如果爲NULL則轉換字串 NVL ISNULL  

 

日期函數

函數 Oracle Microsoft SQL Server  
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD  
兩個日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF  
當前日期和時間 SYSDATE GETDATE()  
一個月的最後一天 LAST_DAY N/A  
時區轉換 NEW_TIME N/A  
日期後的第一個週日 NEXT_DAY N/A  
代表日期的字符串 TO_CHAR DATENAME  
代表日期的整數 TO_NUMBER
(TO_CHAR)) DATEPART  
日期舍入 ROUND CONVERT  
日期截斷 TRUNC CONVERT  
字符串轉換爲日期 TO_DATE CONVERT  
如果爲NULL則轉換日期 NVL ISNULL  

 

轉換函數

    函數          Oracle      Microsoft SQL Server  
數字轉換爲字符   TO_CHAR        CONVERT  
字符轉換爲數字   TO_NUMBER      CONVERT  
日期轉換爲字符   TO_CHAR        CONVERT  
字符轉換爲日期   TO_DATE        CONVERT  
16進制轉換爲2進制 HEX_TO_RAW    CONVERT  
2進制轉換爲16進制 RAW_TO_HEX    CONVERT  

 

其它行級別的函數

      函數           Oracle       Microsoft SQL Server  
返回第一個非空表達式 DECODE           COALESCE  
當前序列值           CURRVAL            N/A  
下一個序列值         NEXTVAL            N/A  
如果exp1 = exp2, 返回null DECODE NULLIF  
用戶登錄賬號ID數字    UID            SUSER_ID  
用戶登錄名           USER            SUSER_NAME  
用戶數據庫ID數字      UID            USER_ID  
用戶數據庫名         USER            USER_NAME  
當前用戶            CURRENT_USER     CURRENT_USER  
用戶環境(audit trail) USERENV        N/A  
在CONNECT BY子句中的級別 LEVEL N/A  

 

合計函數

函數 Oracle Microsoft SQL Server  
Average AVG AVG  
Count COUNT COUNT  
Maximum MAX MAX  
Minimum MIN MIN  
Standard deviation STDDEV STDEV or STDEVP  
Summation SUM SUM  
Variance VARIANCE VAR or VARP

Oracle還有一個有用的函數EXTRACT,提取並且返回日期時間或時間間隔表達式中特定的時間域:
EXTRACT(YEAR FROM 日期)

 

 


 

存儲過程

一. 多表連接查詢,更新存儲過程
Sql存儲過程
ALTER PROCEDURE [dbo].[ GetEvent]
  @SCSWId nvarchar(20)= null ,
  @ToDate DATETIME,
  @FromDate DATETIME
 AS
  SELECT NOTES.NOTE_ID,
  NOTES.NOTE,
  SCSW_CALENDAR.DATE_TIME   
  FROM SCSW_CALENDAR
  LEFT OUTER JOIN NOTES ON SCSW_CALENDAR.NOTE_ID=notes.note_id
  WHERE SCSW_CALENDAR.SCSW_ID = SCSWId
  ORDER BY Patient.PatientId

Oracel存儲過程

1.查詢數據的存儲過程
PROCEDURE GetEvent(SCSWId IN VARCHAR2, FromDate IN DATE, ToDate IN DATE, refOut OUT refcursor)
IS
BEGIN
  OPEN refOut FOR
  select NOTES.NOTE_ID,  
NOTES.NOTE,  
SCSW_CALENDAR.DATE_TIME
  from SCSW_CALENDAR
  left join NOTES on SCSW_CALENDAR.NOTE_ID=notes.note_id
  where SCSW_CALENDAR.SCSW_ID = SCSWId
  AND SCSW_CALENDAR.DATE_TIME >= FromDate
  AND SCSW_CALENDAR.DATE_TIME < ToDate
  order by SCSW_CALENDAR.DATE_TIME;
END GetEvent;

2.更新數據的存儲過程:
procedure UpdateArticlesubmodel
(
 ArticleSubID number,
 ArticleTitle nvarchar2,
 ArticleKeyWord nvarchar2,
 ArticleContent CLOB,
 CreatePerson nvarchar2,
 ChangeDate date,
 SetTop number,
 ArticleSubStyleID number,
 Checked number
)
as
begin
  update "ArticleSubModel"
  set "ArticleTitle"=ArticleTitle,
  "ArticleKeyWord"=ArticleKeyWord,
  "ArticleContent"=ArticleContent,
  "CreatePerson"=CreatePerson,
  "CreateDate"=ChangeDate,
  "SetTop"=SetTop,
  "ArticleSubStyleID"=ArticleSubStyleID,
  "Checked"=Checked
  where "ArticleSubID"=ArticleSubID;
  commit;
  Exception when others then
  rollback;
end UpdateArticlesubmodel;
3.刪除數據的存儲過程
procedure DeleteArticlesubmodel
(
 ArticleSubID number
)
as
begin
  delete from "ArticleSubAccessories"
  where "ArticleSubID"=ArticleSubID;
  delete from "ArticleSubModel"
  where "ArticleSubID"=ArticleSubID;
  commit;
  Exception when others then
  rollback;
end DeleteArticlesubmodel;

 


 

 

1.  top N 問題 
在sql server中,top N 問題很容易解決,如下例:從表stbdbdj中選取排序後的第一行數據進行賦值。

在sql中解決方法很簡單,在select 後面加上:top n 即可,其中 n 代表行數。

 select top 1 @entrust_date = entrust_date,
@entrust_no = entrust_no
from run2k..stbdbdj
where entrust_date = @date
and entrust_no > @entrust_no_q
and report_status = '1'
order by entrust_date,entrust_no;

在oracle中,沒有top n這個命令,我們採取把兩層查詢方式解決:首先,把需要查找的字段值直接進行排序,然後在外面進行第二次查詢,並使用rownum決定行數。

select entrust_date,entrust_no
into @entrust_date, @entrust_no
from ( select entrust_date,entrust_no
from stbdbdj
where entrust_date = @date
and entrust_no > @entrust_no_q
and report_status = '1'
order by entrust_date,entrust_no )
where rownumber <=1 ;

2. 如何解決結果集返回時,* 和變量同時存在的問題
下面例子表示,在用遊標返回結果集時,同時返回一個變量的值,在 sql server 中代碼如下所示:
select a.*,b.organ_id
from run2k..stbbp a,run2k..stkaccoarg b
where a.date = @entrust_date
and a.serial_no = @serial_no
and a.branch_no = b.branch_no
and a.exchange_type = b.exchange_type;

但在oracle中卻沒有這種用法,’*’後面必需跟from。解決方法如下:
1)我們可以把 '*' 變成所需要選擇的字段,就是說採用表中需要顯示的全部字段表示*。
例如:

 open  p_cursor  for 
select  branch_no,...,organ_id
where ... 
2)如果這個字段或者說變量是從另外一張表中取出來的,同樣可以採用下面的辦法。

open p_cursor for
select a.*,b.organ_id;
from stkaccoentrust a, stkaccoarg b
where a.branch_no = b.branch_no
and a.exchange_type = b.exchange_type
and a.init_date = v_entrust_date
and a.serial_no = v_serial_no;

3. 外聯接問題
sql <---> oracle 
a = *b <---> a(+)= b
a *= b <---> a = b(+)

4. 多條記錄求和問題
select sum(A+B+C)
into D
from ...
where ...
group by ...

單條記錄求和
select A+B
into C
from ...
where ...

5. case 問題轉換 
sql:
case client_status
when '0' then '正常'
when '1' then '凍結'
when '2' then '掛失'
when '3' then '銷戶'
else '未知'
end

oracle:
decode(client_status,'0','正常,'1','凍結','2','掛失','3','銷戶','未知');

6. char 和 varchar 類型區別: 
char 尾部補空格,varchar 尾部不補空格。

7. convert轉換問題
sql ---> oracle 
convert(char(5),branch_no) ---> to_char(branch_no,'99999')
convert(char(19),count(*)) ---> lpad(to_char(count(*)),19)
convert(varchar(20),serial_no) ---> to_char(serial_no,'999...9' )
總共20個9
lpad(to_char(serial_no),20)

8. charindex(substring,string) ---> instr(string,substring) 
子串 父串 ---> 父串 子串


 

 

 

Oracle中差別


SQL SERVER中:
本質上沒區別。只是函數有如:只能返回一個變量的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。 
     函數限制比較多,比如不能用臨時表,只能用表變量.還有一些函數都不可用等等.而存儲過程的限制相對就比較少 
      1.    一般來說,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。 
      2.    對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。 
      3.    存儲過程一般是作爲一個獨立的部分來執行(EXEC執行),而函數可以作爲查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 
      4.    當存儲過程和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裏沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。 
      Procedure cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
 
sql server中總結的用法大部分適用於Oracle,在具體的使用過程中,還要看系統實現的複雜程度和實際情況.有經驗的DBA對於這兩者的運用應該已經瞭然於胸了,高手路過還請多多指教!

 

轉自:http://www.cnblogs.com/jayhong/archive/2009/08/30/1556642.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章