[轉]SQLServer和Oracle,存儲過程區別,常用函數對比


本文轉自:http://www.cnblogs.com/neru/archive/2011/08/18/2144049.html

以前一直用sqlserver,只有很少的一點oracle的經驗,現在要用oracle做一個很復雜的存儲過程,感覺好別扭~ 唉

為啥就不能用sqlserver呢。。。

 


 

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

 


 

 

http://blog.163.com/mikelisuper/blog/static/72241886201112745343430/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM