数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

把Oracle数据库移植到Microsoft SQL Server 7.0(4)


发布日期:2021年09月20日
 
把Oracle数据库移植到Microsoft SQL Server 7.0(4)

引用完整性          下表提供了一个用来定义referential完整性约束的语法比较          约束 Oracle Microsoft SQLServer       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都有触发器但它们在执行上有些不同               

上一篇:简单查询树形结构数据库表

下一篇:OracleForms在BS模式下其它图片格式的显示方法