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

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 14:00:15
 声明变量
  Transact-SQL 和 PL/SQL 变量是使用 DECLARE 关键字来创建的。Transact-SQL 变量用
@ 来标识,并且像 PL/SQL 变量一样,第一次创建时该变量被初始化为空值。
  
  Transact-SQL 不支持 %TYPE 和 %ROWTYPE 变量数据类型定义。在 DECLARE 命令中,不
能对 Transact-SQL 变量进行初始化。Oracle NOT NULL 和 CONSTANT 关键字不能用在
  与 Oracle LONG 和 LONG RAW 数据类型一样,text 和 image 数据类型不能用于变量声
  变量赋值
  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 错
  当 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 DECLARE CURSOR 语句不支持使用游标参数,但它的确支持局部变量
。当游标打开时,这些局部变量的值可在游标中使用。Microsoft SQL Server 在其 DECLARE
  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],则只有列出的列允许修改。如果没有给出列表,所有的列均可更新,除非游标
  注意到,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 语句关闭游标,但数据结构仍可用于重新打开游标。
  Transact-SQL 需要使用 DEALLOCATE CURSOR 语句,删除游标数据结构。DEALLOCATE
CURSOR 语句与 CLOSE CURSOR 的不同之处在于,关闭的游标可以重新打开。DEALLOCATE
CURSOR 语句释放所有与游标有关的数据结构,并删除游标的定义。
  下面示例给出了,PL/SQL 和 Transact-SQL 中对等的游标语句。

  优化 SQL 语句
  本节提供了用于优化 Transact-SQL 语句的一些 SQL Server 工具的信息。有关优化
SQL Server 数据库的详细信息,请参见本卷前面的“性能优化”。
  可以使用 SQL Server 查询分析器的图形显示计划功能,了解优化程序处理语句的详细信
  此图形工具可以实时地捕获服务器活动的连续记录。SQL Server 事件探查器监视多个不
同的服务器事件和事件类别,使用用户定义的标准筛选这些事件,并把跟踪记录输出到屏幕、
  SQL Server 事件探查器可用于:
  监视 SQL Server 的性能。
  调试 Transact-SQL 语句和存储过程。
  确定执行缓慢的查询。
  解决 SQL Server 中的问题。通过捕获引起某一特定问题的所有事件,然后在测试系统上
重现这些事件,以重复和分离该问题,达到解决问题的目的。
  在项目开发阶段,通过单步执行语句,每次一行,测试 SQL 语句和存储过程,来确认代
  在生产系统上捕获事件,并在测试系统上重现所捕获的那些事件,从而为测试或调试重建
了生产环境中所发生的事件。通过在其它系统中重现所捕获的事件,用户可继续使用生产系统
  SQL Server 事件探查器给一组扩展存储过程提供了图形用户界面。也可以直接使用这些
扩展存储过程。因此,可以创建自己的应用程序,它使用 SQL Server 事件探查器扩展存储过
  SET 语句可以为工作会话期、触发器或存储过程运行期设定 SQL Sever 查询处理选项。
  SET FORCEPLAN ON 语句强制优化程序按照表在 FROM 子句中出现的顺序处理联接,类似
  SET SHOWPLAN_ALL 和 SET SHOWPLAN_TEXT 语句只返回查询或语句的执行计划信息,但不
执行查询或语句。要运行查询或语句,将相应的显示计划语句设为 OFF。然后,查询或语句就
会执行。SHOWPLAN 选项与 Oracle EXPLAIN PLAN 工具提供的结果类似。
  使用 SET STATISTICES PROFILE ON,每个执行的查询返回标准的结果集,然后,返回附
加结果集(给出查询执行的事件探查)。其它选项包括 SET STATISTICS IO 和 SET
  Transact-SQL 语句处理包括分两步,即编译和执行。NOEXEC 选项编译每个查询,但不
执行。NOEXEC 设为 ON 时,不执行随后的语句(包括其它 SET 语句),直到 NOEXEC 设为
  SET SHOWPLAN ON
  SET NOEXEC ON
  go
  SELECT * FROM DEPT_ADMIN.DEPT,
  STUDENT_ADMIN.STUDENT
  WHERE MAJOR = DEPT
  go
  STEP 1
  The type of query is SETON
  STEP 1
  The type of query is SETON
  STEP 1
  The type of query is SELECT
  FROM TABLE
  DEPT_ADMIN.DEPT
  Nested iteration
  Table Scan
  FROM TABLE
  STUDENT_ADMIN.STUDENT
  Nested iteration
  Table Scan
  Oracle 需要使用提示,来调整基于开销的优化程序的操作和性能。Microsoft SQL
Server 基于开销的优化程序不需要使用提示,来协助其查询评估过程。但是在某些情况下,
  INDEX = {index_name index_id} 提示指定了该表使用的索引名或 ID。 index_id 为
0,就会强制一个表扫描,而当 index_id 为 1,则强制使用聚集索引(如存在)。这和
  如果其列顺序和 ORDER BY 子句匹配,SQL Server FASTFIRSTROW 提示就会指示优化程序
使用非聚集索引。这个提示的运行方式和 Oracle FIRST_ROWS 提示类似。

Tags:

作者:佚名
分享到: 微信 更多