熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

把Oracle數據庫移植到Microsoft SQL Server 7.0(4)

2022-06-13   來源: Oracle 

  引用完整性 下表提供了一個用來定義referential完整性約束的語法比較 約束 Oracle Microsoft SQL Server PRIMARY KEY [CONSTRAINT constraint_name] PRIMARY KEY (col_name [ col_name [ col_name]]) [USING INDEX storage_parameters] [CONSTRAINT constraint_name] PRIMARY KEY [CLUSTERED | NONCLUSTERED] (col_name [ col_name [ col_name]]) [ON segment_name] [NOT FOR REPLICATION] UNIQUE [CONSTRAINT constraint_name] UNIQUE (col_name [ col_name [ col_name]]) [USING INDEX storage_parameters] [CONSTRAINT constraint_name] UNIQUE [CLUSTERED | NONCLUSTERED](col_name [ col_name [ col_name]]) [ON segment_name] [NOT FOR REPLICATION] FOREIGN KEY [CONSTRAINT constraint_name] [FOREIGN KEY (col_name [ col_name [ col_name]])] REFERENCES [owner]ref_table [(ref_col [ ref_col [ ref_col]])] [ON DELETE CASCADE] [CONSTRAINT constraint_name] [FOREIGN KEY (col_name [ col_name [ col_name]])] REFERENCES [owner]ref_table [(ref_col [ ref_col [ ref_col]])] [NOT FOR REPLICATION] DEFAULT Column property not a constraint DEFAULT (constant_expression) [CONSTRAINT constraint_name] DEFAULT {constant_expression | niladicfunction | NULL} [FOR col_name] [NOT FOR REPLICATION] CHECK [CONSTRAINT constraint_name] CHECK (expression) [CONSTRAINT constraint_name] CHECK [NOT FOR REPLICATION] (expression)   NOT FOR REPLICATION子句用來在復制過程中掛起列級別FOREIGN KEY以及CHECK約束   外部鍵 定義外部關鍵字的語法在各種RDBMS中都是相似的在外部關鍵字中標明的列數和每一列的數據類型必須和 REFERENCES子句相匹配一個輸入到列中的非空的值必須在REFERENCES子句中定義表和列中存在並且被提 及的表的列必須有一個PRIMARY KEY或者UNIQUE約束 Microsoft SQL Server約束提供了在同一個數據庫中引用表的能力要實現在數據庫范圍的應用完整性可 以使用基於表的觸發器 Oracle和SQL Server都支持自引用表這種表中有對同一個表的一列或幾列的引用例如CLASS表中的 prereq列可以引用CLASS表中的ccode列以確保一個有效的課程編號是作為一個子句的先決條件輸入的 在Oracle中實現層疊式的刪除和修改是使用CASCADE DELETE子句而SQL Server用表觸發器來實現同樣的 功能如果需要了解更多的信息請參看本章後面的SQL語言支持部分   用戶定義的完整性 用戶定義的完整性允許你定義特定的商業規則該規則不屬於其他完整性的范疇   存儲過程 Microsoft SQL Server存儲程序用CREATE PROCEDURE語句來接受或者返回用戶提供的參數除臨時存儲程序 以外存儲程序是在當前數據庫中創建的下表顯示了Oracle和SQL Server的語法 Oracle Microsoft SQL  CREATE OR REPLACE PROCEDURE [user]procedure     [(argument [IN | OUT] datatype     [ argument [IN | OUT] datatype] {IS | AS} block CREATE PROC[EDURE] procedure_name        [;number]     [        {@parameter data_type} [VARYING]        [= default] [OUTPUT]     ]     […n] [WITH     { RECOMPILE   | ENCRYPTION |       RECOMPILE ENCRYPTION} ] [FOR REPLICATION] AS     sql_statement […n]   在SQL Server中臨時存儲程序是在tempdb數據庫中通過在procedure_name前加上數字標記來創建的加一 個數字標記(#procedure_name)表示是一個本地臨時存儲程序加兩個數字標記(##procedure_name)表示 是一個全局臨時程序 一個本地臨時程序只能被創建它的用戶使用執行本地臨時程序的許可不能授予其他用戶本地臨時程序在 用戶會話結束時自動刪除 一個全局的臨時程序可以被所有的SQL Server用戶使用如果一個全局臨時程序被創建了所有的用戶都可 以訪問它並且不能顯式的撤回許可全局臨時程序在最後一個用戶會話結束的時候自動刪除 SQL Server存儲程序可以有最多級嵌套嵌套層數在被調用的程序開始執行時增加在被調用的程序結束 運行時減少 下面的例子說明了怎樣用一個TransactSQL存儲程序來代替一個Oracle的PL/SQL封裝函數TransactSQL的 版本更簡單一些因為SQL Server的返回結果的能力是在一個存儲程序中直接用SELECT語句設置的不需要 使用游標 Oracle Microsoft SQL  CREATE OR REPLACE PACKAGE    STUDENT_ADMINP AS ROWCOUNT    NUMBER :=;    CURSOR C RETURN    STUDENT%ROWTYPE;    FUNCTION    SHOW_RELUCTANT_STUDENTS (WORKVAR OUT VARCHAR)       RETURN NUMBER; END P; / CREATE OR REPLACE PACKAGE BODY    STUDENT_ADMINP AS CURSOR C    RETURN STUDENT%ROWTYPE IS       SELECT * FROM       STUDENT_ADMINSTUDENT         WHERE NOT EXISTS       (SELECT X FROM       STUDENT_ADMINGRADE       WHERE       GRADESSN=STUDENTSSN) ORDER       BY SSN; FUNCTION SHOW_RELUCTANT_STUDENTS    (WORKVAR OUT VARCHAR) RETURN    NUMBER IS    WORKREC STUDENT%ROWTYPE;    BEGIN       IF NOT C%ISOPEN THEN OPEN C;       ROWCOUNT :=;       ENDIF;       FETCH C INTO WORKREC;       IF (C%NOTFOUND) THEN         CLOSE C;         ROWCOUNT :=;       ELSE         WORKVAR := WORKRECFNAME||         ||WORKRECLNAME||          social security number         ||WORKRECSSN|| is not enrolled            in any classes!;         ROWCOUNT := ROWCOUNT + ;       ENDIF; RETURN(ROWCOUNT); CREATE PROCEDURE STUDENT_ADMINSHOW_ RELUCTANT_STUDENTS AS SELECT FNAME+ +LNAME+ social   security number+ SSN+ is not enrolled in any    classes! FROM STUDENT_ADMINSTUDENT S WHERE NOT EXISTS    (SELECT X FROM    STUDENT_ADMINGRADE G    WHERE GSSN=SSSN) ORDER BY SSN RETURN@@ROWCOUNT GO       EXCEPTION WHEN OTHERS THEN IF C%ISOPEN THEN CLOSE C; ROWCOUNT :=; ENDIF; RAISE_APPLICATION_ERROR(SQLERRM); END SHOW_RELUCTANT_STUDENTS; END P; /     SQL Server不支持與Oracle包或者函數相似的構造也不支持在創建存儲程序時的CREATE OR REPLACE選項   延遲存儲過程的執行 Microsoft SQL Server提供了WAITFOR允許開發人員給定一個時間時間段或者事件來觸發一個語句塊 存儲程序或者事務的執行這是TransactSQL對於Oracle中dbms_lock_sleep的等價 WAITFOR {DELAY time | TIME time} 指示Microsoft SQL Server等待直到給定的時間過去以後再執行最多可以到小時 在這裡 DELAY 指示Microsoft SQL Server等待直到給定數量的時間過去以後才執行最多可以設置到小時 time 需要等待的時間時間可以是任何可接受的datetime數據類型的格式或者可以作為一個本地變量給出 但是不能指定datetime值的日期部分 TIME 指示SQL Server等到指定的時間 例如 BEGIN WAITFOR TIME : EXECUTE update_all_stats END   指定存儲程序中的參數 要在一個存儲程序中指定一個參數可以使用下面給出的語法 Oracle Microsoft SQL  Varname datatype DEFAULT ; {@parameter data_type} [VARYING]    [= default] [OUTPUT]   觸發器(Triggers) Oracle和Microsoft SQL Server都有觸發器但它們在執行上有些不同
From:http://tw.wingwit.com/Article/program/Oracle/201311/17836.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.