分享
 
 
 

Oracle数据库向MSSQLServer7.0的迁移(4)

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

声明变量

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

Transact-SQL 不支持 %TYPE 和 %ROWTYPE 变量数据类型定义。在 DECLARE 命令中,不能对 Transact-SQL 变量进行初始化。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 Transact-SQL 支持使用 BEGINUEND 术语,来指定程序块。Transact-SQL 不要求在 DECLARE 语句后面使用语句块。在 Microsoft SQL Server 中,如果 IF 语句和 WHILE 循环执行不止一个语句,需要使用 BEGINUEND 语句块。

条件处理

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

重复的语句执行(循环)

Oracle PL/SQL 提供了无条件的 LOOP 和 FOR LOOP。而 Transact-SQL 则提供了 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 语句,Transact-SQL 批处理执行就会跳到标号处。GOTO 语句和标号之间的语句不执行。

PRINT 语句

Transact-SQL PRINT 语句和 PL/SQL RDBMS_OUTPUT.put_line 过程所执行的操作相同。它用于打印用户指定的消息。

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

从存储过程返回

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

提出程序错误

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

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

RAISERROR ({msg_id | msg_str}, severity, state

[, argument1 [, argument2]])

[WITH options]

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

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

游标的实现

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Transact-SQL 需要使用 DEALLOCATE CURSOR 语句,删除游标数据结构。DEALLOCATE CURSOR 语句与 CLOS

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有