数据库

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

Oracle 数据库向 MS SQL Server 7.0 的迁移(4)


发布日期:2021年11月06日
 
Oracle 数据库向 MS SQL Server 7.0 的迁移(4)

声明变量

TransactSQL 和 PL/SQL 变量是使用 DECLARE 关键字来创建的TransactSQL 变量用 @ 来标识并且像 PL/SQL 变量一样第一次创建时该变量被初始化为空值

TransactSQL 不支持 %TYPE 和 %ROWTYPE 变量数据类型定义在 DECLARE 命令中不能对 TransactSQL 变量进行初始化Oracle NOT NULL 和 CONSTANT 关键字不能用在 Microsoft SQL Server 数据类型定义中

与 Oracle LONG 和 LONG RAW 数据类型一样text 和 image 数据类型不能用于变量声明此外不支持 PL/SQL 类型的记录和表定义

变量赋值

Oracle 和 Microsoft SQL Server 提供以下方法给局部变量赋值

语句块

Oracle PL/SQL 和 Microsoft SQL Server TransactSQL 支持使用 BEGINUEND 术语来指定程序块TransactSQL 不要求在 DECLARE 语句后面使用语句块在 Microsoft SQL Server 中如果 IF 语句和 WHILE 循环执行不止一个语句需要使用 BEGINUEND 语句块

条件处理

Microsoft SQL Server TransactSQL 条件语句包含 IF 和 ELSE 语句而不是 Oracle PL/SQL 中的 ELSIF 语句可以嵌套多个 IF 语句来达到同样的效果对于大量的条件测试CASE 表达式更容易阅读

重复的语句执行(循环)

Oracle PL/SQL 提供了无条件的 LOOP 和 FOR LOOP而 TransactSQL 则提供了 WHILE 循环和 GOTO 语句来达到循环的目的

WHILE Boolean_expression

{sql_statement | statement_block}

[BREAK] [CONTINUE]

对于一个或多个语句的重复执行WHILE 循环测试一个布尔表达式只要给定的表达式求值为 TRUE语句就会重复执行如果要执行多个语句它们必须放在一个 BEGINUEND 块中

可以使用 BREAK 和 CONTINUE 关键字从循环的内部控制语句的执行BREAK 关键字导致从 WHILE 循环中无条件退出CONTINUE 关键字使 WHILE 循环跳过后面的语句并重新开始循环BREAK 关键字和 Oracle PL/SQL EXIT 关键字等同Oracle 没有 CONTINUE 的对等关键字

GOTO 语句

Oracle 和 Microsoft SQL Server 均有 GOTO 语句但是语法不同遇到 GOTO 语句TransactSQL 批处理执行就会跳到标号处GOTO 语句和标号之间的语句不执行

PRINT 语句

TransactSQL PRINT 语句和 PL/SQL RDBMS_OUTPUTput_line 过程所执行的操作相同它用于打印用户指定的消息

PRINT 语句的消息限度为 个字符使用 char 或 varchar 数据类型定义的变量可以嵌入打印语句中如果使用了任何其它数据类型必须使用 CONVERT 或 CAST 函数可以打印局部变量全局变量和文本可用单引号和双引号将文本括上

从存储过程返回

Microsoft SQL Server 和 Oracle 均有 RETURN 语句使用 RETURN 语句程序可从查询或过程无条件退出RETURN 是一条可立即执行的完整语句并可在任何时候用于从过程批处理或语句块中退出RETURN 后面的语句均不执行

提出程序错误

TransactSQL RAISERROR 语句返回一个用户定义的错误信息并设定一个系统标志来记录已发生了一个错误它和 PL/SQL raise_application_error 异常错误处理程序的功能相似

RAISERROR 语句允许客户从 sysmessages 表检索一个条目或使用用户定义的严重性和状态信息动态地创建一条消息定义后此消息作为服务器错误信息返回给客户

RAISERROR ({msg_id | msg_str} severity state

[ argument [ argument]])

[WITH options]

转换 PL/SQL 程序时可能不需要使用 RAISERROR 语句在下面的代码示例中PL/SQL 程序使用 raise_application_error 异常错误处理程序而 TransactSQL 程序什么也不使用加入 raise_application_error 异常错误处理程序可避免 PL/SQL 程序返回二义性的 unhandled exception 错误信息相反当发生意外问题时它总是返回 Oracle 错误信息 (SQLERRM)

当 TransactSQL 程序失败时它总是给客户程序返回详细的错误信息因此除非需要进行专门错误处理否则并不总是需要 RAISERROR 语句

游标的实现

不管从数据库中请求行数的多少Oracle 始终要求游标和 SELECT 语句一起使用在 Microsoft SQL Server 中未包含在游标内的 SELECT 语句把行作为默认结果集返回给客户这是一种将数据返回给客户程序的有效方法

SQL Server 给游标函数提供了两个接口当在 TransactSQL 批处理或存储过程时使用游标时SQL 语句可用来声明打开游标和从游标以及定位更新和删除中提取当使用来自 DBLibraryODBC 或 OLE DB 的游标时SQL Server 客户机库透明地调用内置的服务器函数以更有效地处理游标

当从 Oracle 导入 PL/SQL 过程时首先确定游标是否需要执行和 TransactSQL 中相同的功能如果游标只给客户程序返回一组行则使用 TransactSQL 中无游标的 SELECT 语句返回一个默认的结果集如果使用游标向局部过程变量每次加载一行数据则必须使用 TransactSQL 中的游标

下表给出了游标的使用语法

尽管 TransactSQL DECLARE CURSOR 语句不支持使用游标参数但它的确支持局部变量当游标打开时这些局部变量的值可在游标中使用Microsoft SQL Server 在其 DECLARE CURSOR 语句中提供了许多额外的功能

INSENSITIVE 选项用于定义游标使之创建一个要使用的数据的临时副本对游标的所有请求均由此临时表应答因此对基表的修改不会反映在对该游标提取所返回的数据中这种类型游标访问的数据不能被修改

应用程序可以请求一种游标类型然后执行一条不被所请求类型服务器游标支持的 TransactSQL 语句SQL Server 就会返回一个错误指出游标类型已经更改或者如给定了一组要素SQL Server 就会隐式转换游标有关使 SQL Server 隐式地将游标从一种类型转换到另一种类型的完整要素列表请参见 SQL Server Books Online

除向前提取外SCROLL 选项还允许向后绝对和相对提取滚动游标使用键集游标模型在该模型中任何用户对基表的已提交删除和更新都会反映在以后的提取中仅当没有使用 INSENSITIVE 选项来声明该游标时才成立

如果选定了 READ ONLY 选项则禁止对游标中的任何行进行更新该选项将改写对游标更新的默认功能

UPDATE [OF column_list] 语句用于定义游标中可更新的列如果给出了 [OF column_list]则只有列出的列允许修改如果没有给出列表所有的列均可更新除非游标已定义为 READ ONLY

注意到SQL Server 游标的名称作用域就是连接本身这一点是很重要的这和局部变量的名称作用域不同在同一用户连接上在第一个游标释放之前不能声明与现有游标名称相同的第二个游标

与 PL/SQL 不同在一个游标打开时TransactSQL 不支持向该游标传递参数当 TransactSQL 游标打开时结果集成员身份和次序是固定的对于其他用户已提交的对基表的更新和删除均会反映在所有未使用 INSENSITIVE 选项定义的游标提取中对于 INSENSITIVE 游标还会生成一个临时表

Oracle 游标只能向前移动不能向后或相对滚动SQL Server 可以使用下表所示的提取选项向前和向后滚动只有当游标使用 SCROLL 选项声明时这些提取选项才可以使用

TransactSQL FETCH 语句不需要 INTO 子句如果没有指定返回变量该行就会作为单行结果集自动返回给客户但是如果过程必须给客户提供行则使用无游标的 SELECT 语句更为有效

在每个 FETCH 之后@@FETCH_STATUS 函数均被更新它和 PL/SQL 中使用的 CURSOR_NAME%FOUND 和 CURSOR_NAME%NOTFOUND 变量用法类似每次成功提取后@@FETCH_STATUS 函数值被设为 如果该提取要读取游标结尾之外的地方则返回值 如果游标打开后请求的行已被从表中删除则 @@FETCH_STATUS 函数返回 通常返回值 只在使用 SCROLL 选项声明的游标中出现每次提取后必须检查该变量以保证数据的有效性

SQL Server 不支持 Oracle 的游标 FOR 循环语法

在 PL/SQL 和 TransactSQL 中用于更新和删除的 CURRENT OF 子句语法和函数是相同的定位 UPDATE 或 DELETE 用于对指定游标内的当前行进行更新和删除操作

TransactSQL CLOSE CURSOR 语句关闭游标但数据结构仍可用于重新打开游标PL/SQL CLOSE CURSOR 语句关闭并释放所有的数据结构

TransactSQL 需要使用 DEALLOCATE CURSOR 语句删除游标数据结构DEALLOCATE CURSOR 语句与 CLOS               

上一篇:修改oracle9i数据库字符集的方法

下一篇:用CREATE TABLE陈述式声明计算数据列