Oracle和SQLServer的语法区别(10)

2019-08-20 19:54

Oracle Microsoft SQL Server CREATE TABLE STUDENT_ADMIN.STUDENT ( CREATE TABLE USER_DB.STUDENT SSN CHAR(9) NOT NULL, _ADMIN.STUDENT ( FNAME VARCHAR2(12) NULL, SSN CHAR(9) NOT NULL, LNAME VARCHAR2(20) NOT NULL, FNAME VARCHAR(12) NULL, GENDER CHAR(1) NOT NULL LNAME VARCHAR(20) NOT NULL, CONSTRAINT GENDER CHAR(1) NOT NULL STUDENT_GENDER_CK CONSTRAINT STUDENT_GENDER_CK CHECK (GENDER IN ('M','F')), CHECK (GENDER IN ('M','F')), MAJOR VARCHAR2(4) MAJOR VARCHAR(4) DEFAULT 'Undc' NOT NULL, DEFAULT 'Undc' NOT NULL, BIRTH_DATE DATE NULL, BIRTH_DATE DATETIME NULL, TUITION_PAID NUMBER(12,2) TUITION_PAID NUMERIC(12,2) NULL, NULL, TUITION_TOTAL NUMERIC(12,2) NULL, TUITION_TOTAL NUMBER(12,2) START_DATE DATETIME NULL, NULL, GRAD_DATE DATETIME NULL, START_DATE DATE NULL, LOAN_AMOUNT NUMERIC(12,2) NULL, GRAD_DATE DATE NULL, DEGREE_PROGRAM CHAR(1) LOAN_AMOUNT NUMBER(12,2) NULL, DEFAULT 'U' NOT NULL DEGREE_PROGRAM CHAR(1) CONSTRAINT STUDENT_DEGREE_CK DEFAULT 'U' NOT NULL CHECK CONSTRAINT (DEGREE_PROGRAM IN ('U', 'M', STUDENT_DEGREE_CK CHECK 'P','D')), (DEGREE_PROGRAM IN ('U', 'M', ... 'P', 'D')), ... 有关用户定义的规则和默认值的说明:出于向后兼容的考虑,仍保留 Microsoft SQL Server 规则和默认值,但对于新的应用程序开发,建议使用 CHECK 和 DEFAULT 约束。有关详细信息,请参见 SQL Server Books Online。

为空性

Microsoft SQL Server 和 Oracle 创建列约束,来实施为空性。Oracle 列默认为 NULL,除非在 CREATE TABLE 或 ALTER TABLE 语句中指定了 NOT NULL。在 Microsoft SQL Server 中,数据库和会话设置可以覆盖列定义中使用的数据类型为空性。

所有的 SQL 脚本(不论是 Oracle 还是 SQL Server)都应该为每一列显式定义 NULL 和 NOT NULL。要了解这一策略是如何实施的,请参见 Oratable.sql 和 Sstable.sql 示例表创建脚本。如果没有显式定义,列的为空性遵循下列规则。

Null 设置 说明 SQL Server 使用该数据类型创建时指定的为空使用用户定义的数据类性。使用 sp_help 系统存储过程,来获取数据型定义列 类型默认的为空性。 如果系统提供的数据类型只有一个选择,则它优先。现在,bit 数据类型只能定义为 NOT NULL。 如果任何会话设置是 ON(使用 SET 打开),那么: 如果 ANSI_NULL_DFLT_ON 为 ON,则赋值 NULL。 如果 ANSI_NULL_DFLT_OFF 为 ON,则赋值 NOT 使用系统提供的数据类NULL。 型定义列 如果配置了任何数据库设置(用 sp_dboption 系统存储过程更改),那么: 如果 ANSI null default 为 true,则赋值 NULL。 如果 ANSI null default 为 false,则赋值 NOT NULL。 如果没有显式地定义(没有设置任何 NULL/NOT NULL ASNI_NULL_DFLT 选项),会话没有改变,并且没有定义 数据库设为默认值(ANSI null default 为 false),那么,SQL Server 赋值为 NOT NULL。 下表提供了一个用于定义引用完整性约束的语法比较。

约束 Microsoft SQL Server [CONSTRAINT [CONSTRAINT constraint_name] constraint_name] PRIMARY KEY [CLUSTERED | PRIMARY KEY (col_name [, NONCLUSTERED] (col_name [, PRIMARY KEY col_name2 [..., col_name2 [..., col_name16]]) col_name16]]) [USING INDEX [ON segment_name] storage_parameters] [NOT FOR REPLICATION] [CONSTRAINT [CONSTRAINT constraint_name] constraint_name] UNIQUE [CLUSTERED | UNIQUE (col_name [, NONCLUSTERED](col_name [, UNIQUE col_name2 [..., col_name2 [..., col_name16]]) col_name16]]) [USING INDEX [ON segment_name] storage_parameters] [NOT FOR REPLICATION] [CONSTRAINT [CONSTRAINT constraint_name] constraint_name] FOREIGN KEY [FOREIGN KEY (col_name [FOREIGN KEY (col_name [, [, col_name2 [..., col_name2 [..., Oracle col_name16]])] REFERENCES [owner.]ref_table [(ref_col [, ref_col2 [..., ref_col16]])] [ON DELETE CASCADE] col_name16]])] DEFAULT CHECK REFERENCES [owner.]ref_table [(ref_col [, ref_col2 [..., ref_col16]])] [NOT FOR REPLICATION] [CONSTRAINT constraint_name] 列属性,但不是约束 DEFAULT DEFAULT {constant_expression | (constant_expression) niladic-function | NULL} [FOR col_name] [NOT FOR REPLICATION] [CONSTRAINT [CONSTRAINT constraint_name] constraint_name] CHECK [NOT FOR REPLICATION] CHECK (expression) (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 Server CREATE PROC[EDURE] procedure_name [;number] [ data_type} [VARYING] [= CREATE OR REPLACE PROCEDURE {@parameter default] [OUTPUT] [user.]procedure ] [(argument [IN | OUT] datatype [,Un] [, argument [IN | OUT] [WITH datatype] { RECOMPILE | ENCRYPTION | {IS | AS} block RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS sql_statement [Un] 在 SQL Server 中,临时过程创建在 tempdb 数据库中,对于局部临时过程,在 procedure_name 前加一个数字符 (#procedure_name),全局临时过程前加两个数字符 (##procedure_name)。 局部临时过程只能由创建它的用户使用。运行局部临时过程的权限不能授予其他用户。用户会话结束后,局部临时过程自动被删除。

所有的 SQL Server 用户均可使用全局临时过程。如果创建了全局临时过程,所有的用户均可以访问它,权限不能被显式地撤销。使用过程的最后一个用户会话结束后,全局临时过程被删除。 SQL Server 存储过程最多可嵌套 32 级。嵌套级在调用过程开始执行时递增,调用过程执行结束时递减。

下面的例子给出了,如何使用 Transact-SQL 存储过程替代 Oracle PL/SQL 打包的函数。Transact-SQL 版本要简单得多,因为 SQL Server 可以直接从存储过程中的 SELECT 语句返回结果集,而无需使用游标。

Oracle Microsoft SQL Server CREATE OR REPLACE PACKAGE STUDENT_ADMIN.P1 CREATE PROCEDURE AS ROWCOUNT NUMBER :=0; STUDENT_ADMIN.SHOW_ CURSOR C1 RETURN STUDENT%ROWTYPE; RELUCTANT_STUDENTS FUNCTION SHOW_RELUCTANT_STUDENTS AS SELECT FNAME+'' (WORKVAR OUT VARCHAR2) RETURN NUMBER; +LNAME+', social END P1; security number'+ SSN+' / is not enrolled in any classes!' CREATE OR REPLACE PACKAGE BODY FROM STUDENT_ADMIN.P1 AS CURSOR C1 RETURN STUDENT_ADMIN.STUDENT STUDENT%ROWTYPE IS S SELECT * FROM STUDENT_ADMIN.STUDENT WHERE NOT EXISTS WHERE NOT EXISTS (SELECT 'X' FROM (SELECT 'X' FROM STUDENT_ADMIN.GRADE STUDENT_ADMIN.GRADE G WHERE GRADE.SSN=STUDENT.SSN) ORDER BY SSN; WHERE G.SSN=S.SSN) ORDER BY SSN FUNCTION SHOW_RELUCTANT_STUDENTS RETURN@@ROWCOUNT (WORKVAR OUT VARCHAR2) RETURN NUMBER IS GO WORKREC STUDENT%ROWTYPE; BEGIN IF NOT C1%ISOPEN THEN OPEN C1; ROWCOUNT :=0; ENDIF; FETCH C1 INTO WORKREC; IF (C1%NOTFOUND) THEN CLOSE C1; ROWCOUNT :=0; ELSE WORKVAR := WORKREC.FNAME||' '||WORKREC.LNAME|| ', social security number '||WORKREC.SSN||' is not enrolled in any classes!'; ROWCOUNT := ROWCOUNT + 1; ENDIF; RETURN(ROWCOUNT); EXCEPTION WHEN OTHERS THEN IF C1%ISOPEN THEN CLOSE C1; ROWCOUNT :=0; ENDIF; RAISE_APPLICATION_ERROR(-20001,SQLERRM); END SHOW_RELUCTANT_STUDENTS; END P1; / SQL Server 不支持类似 Oracle 包或函数的结构,也不支持创建存储过程的 CREATE OR REPLACE 选项。

延迟存储过程的执行

Microsoft SQL Server 提供了 WAITFOR,它允许开发人员指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。对于 Transact-SQL 来说,它就相当于 Oracle 的 dbms_lock.sleep。


Oracle和SQLServer的语法区别(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:JSP学期授课计划

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: