天天看點

SQL Server 與Oracle 差異性開發文法

概念上的差別

   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*plus,isql*plus, pl/sql等.

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

   6.主要資料類型

     Orace:主要支援char ,varchar2,long,number,datetime,raw,long raw,clob,blob,bfile(存儲指定二進制檔案的路徑位址)

     前面三個是Character資料類型,varchar2支援可變長度的字元串,long支援可變長度的字元資料,raw,long raw用于存儲二進制資料,long raw 可變長度.

     最後三個是大對象(lob)資料類型,存儲非結構化的資訊,例如聲音剪輯,視訊檔案。

CLOG表示Character Lob,可以存儲大量的字元資料,它對于存儲非結構化的XML文檔非常有用。

BLOG表示Binary LOG,此資料類型可以存儲大型二進制對象,如圖形、視訊剪輯,聲音檔案等

BFILE資料類型用做指向存儲在Oracle資料庫以外的檔案的指針。

不支援,money,貨币

   LOB(大型對象)資料類型,可以儲存4GB的資訊。LOB有以下3種類型:

   。CLOB,隻能存儲字元資料

   。NCLOB,儲存本地語言字元集資料

   。BLOB,以二進制資訊儲存資料

     Sql server 主要支援的文本類型char ,varchar,nchar,nvarchar,text,ntext,image,貨币類型Money,二進制 binary,varbinary等等

開發文法

2.1   SQL 文法

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

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

1. 修改表

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

            Ms sql是ALTER 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)

2. 建立臨時表

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 newtable(col1)select 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.Oracle中的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文法是coalesce(ex1,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中的資料庫對象

1.   同義詞

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

文法:CREATE PUBLIC SYNONYM seqname FOR OBJECT

2.   序列 

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

創建序列: 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   傳回序列的目前值

3.   簇(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,encode 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 value(p) =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. 對象視圖

借助對象視圖可以将面向對象的結構(如抽象資料類型)應用于現有已經投入使用的表,而不需重建整個應用程式

2.2   PL/SQL與T_SQL文法

一批處理

  SQL的能力有限,諸如在事務處理方面。

批處理: oracle與ms 都進行了擴充。

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

Oracle的語法是:

面向對象的特性之一是封裝,程式包就是對相關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] 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

繼續閱讀