引用完整性 下表提供了一個用來定義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 | niladic
function | 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存儲程序可以有最多
級嵌套
嵌套層數在被調用的程序開始執行時增加
在被調用的程序結束 運行時減少
下面的例子說明了怎樣用一個Transact
SQL存儲程序來代替一個Oracle的PL/SQL封裝函數
Transact
SQL的 版本更簡單一些
因為SQL Server的返回結果的能力是在一個存儲程序中直接用SELECT語句設置的
不需要 使用游標
Oracle Microsoft SQL CREATE OR REPLACE PACKAGE STUDENT_ADMIN
P
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_ADMIN
P
AS CURSOR C
RETURN STUDENT%ROWTYPE IS SELECT * FROM STUDENT_ADMIN
STUDENT WHERE NOT EXISTS (SELECT
X
FROM STUDENT_ADMIN
GRADE WHERE GRADE
SSN=STUDENT
SSN) 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 := WORKREC
FNAME||
||WORKREC
LNAME||
social security number
||WORKREC
SSN||
is not enrolled in any classes!
; ROWCOUNT := ROWCOUNT +
; ENDIF; RETURN(ROWCOUNT); CREATE PROCEDURE STUDENT_ADMIN
SHOW_ RELUCTANT_STUDENTS AS SELECT FNAME+
+LNAME+
social security number
+ SSN+
is not enrolled in any classes!
FROM STUDENT_ADMIN
STUDENT S WHERE NOT EXISTS (SELECT
X
FROM STUDENT_ADMIN
GRADE G WHERE G
SSN=S
SSN) 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
允許開發人員給定一個時間
時間段
或者事件來觸發一個語句塊
存儲程序或者事務的執行
這是Transact
SQL對於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