END WHILE ... BEGIN STATEMENT1 STATEMENT2 STATEMENTN END
END -- THIS IS REQUIRED SYNTAX 条件处理
Microsoft SQL Server Transact-SQL的条件语句包括IF和ELSE,但不包括Oracle PL/SQL中的ELSEIF语句。
可以用嵌套多重IF语句来到达同样的效果。对于广泛的条件测试,用CASE表达式也许更容易和可读一些。
Oracle Microsoft SQL DECLARE
VDEGREE_PROGRAM CHAR(1);
VDEGREE_PROGRAM_NAME VARCHAR2(20); BEGIN
VDEGREE_PROGRAM := 'U' IF VDEGREE_PROGRAM = 'U' THEN
VDEGREE_PROGRAM_NAME := 'Undergraduate'
ELSIF VDEGREE_PROGRAM = 'M' THEN VDEGREE_PROGRAM_ NAME := 'Masters'
ELSIF VDEGREE_PROGRAM = 'P' THEN VDEGREE_PROGRAM_ NAME := 'PhD' ELSE VDEGREE_PROGRAM_
NAME := 'Unknown' END IF; END;
----------------------------------------------------- DECLARE
@VDEGREE_PROGRAM CHAR(1),
@VDEGREE_PROGRAM_NAME VARCHAR(20) SELECT @VDEGREE_PROGRAM = 'U' SELECT @VDEGREE_PROGRAM_
NAME = CASE @VDEGREE_PROGRAM WHEN 'U' THEN 'Undergraduate' WHEN 'M' THEN 'Masters'
WHEN 'P' THEN 'PhD'. ELSE 'Unknown' END
重复执行语句(循环)
Oracle PL/SQL提供了无条件的LOOP和FOR LOOP。Transact-SQL则提供了WHILE循环和GOTO语句。
WHILE Boolean_expression
{sql_statement | statement_block}
[BREAK] [CONTINUE]
WHILE循环需要测试一个布尔表达式来决定一个或者多个语句的重复执行。
只要给定的表达式结果为真,这个(些)语句就一直重复执行下去。如果有多个语句需要执行,则这些语句必须放在一个BEGIN…END块中。
Oracle Microsoft SQL DECLARE
COUNTER NUMBER; BEGIN
COUNTER := 0
WHILE (COUNTER <5) LOOP COUNTER := COUNTER + 1; END LOOP; END;
------------------------------------------------------ DECLARE
@COUNTER NUMERIC SELECT@COUNTER = 1 WHILE (@COUNTER <5) BEGIN
SELECT @COUNTER = @COUNTER +1 END
语句的执行可以在循环的内部用BREAK和CONTINUE关键字控制。BREAK关键字使WHILE循环无条件的结束,
而CONTINUE关键字使WHILE循环跳过后面的语句重新开始。BREAK关键字同Oracle PL/SQL中的EXIT关键字是等价的。
而在Oracle中没有和CONTINUE等价的关键字
GOTO语句
Oracle和Microsoft SQL Server都有GOTO语句,但是语法不同。GOTO语句使Transact-SQL跳到指定的标号处运行,
在GOTO语句后指定标号之间的任何语句都不会被执行。
Oracle Microsoft SQL GOTO label;
<
PRINT语句
Transact-SQL的PRINT语句执行同PL/SQL的RDBMS_OUTPUT.put_line过程同样的操作。该语句用来打印用户给定的消息。
用PRINT语句打印的消息上限是8,000个字符。定义为char或者varchar数据类型的变量可以嵌入打印语句。
如果使用其它数据类型的变量,则必须使用CONVERT或者CAST函数。本地变量、全局变量可以被打印。可以用单引号或者双引号来封闭文本。
从存储过程返回
Microsoft SQL Server和Oracle都有RETURN语句。RETURN使你的程序从查询或者过程中无条件的跳出。RETURN是立即的、
完全的、并且可以用于从过程、批处理或者语句块的任意部分跳出。在REUTRN后面的语句将不会被执行。
Oracle Microsoft SQL
RETURN expression: RETURN [integer_expression]
引发程序错误(Raising program errors)
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返回不明确的未经处理的异常错误消息。 作为代替,当一个不可预见的问题发生的时候,异常处理器总是返回Oracle错误消息。
当一个Transact-SQL失败时,它总是返回一个详细的错误消息给客户程序。因此,除非需要某些特定的错误处理,
一般是不需要RAISERROR语句的。
Oracle Microsoft SQL
CREATE OR REPLACE FUNCTION DEPT_ADMIN.DELETE_DEPT
(VDEPT IN VARCHAR2) RETURN NUMBER AS BEGIN
DELETE FROM DEPT_ADMIN.DEPT WHERE DEPT = VDEPT; RETURN(SQL%ROWCOUNT); EXCEPTION
WHEN OTHER THEN
RAISE_APPLICATION_ERROR (-20001,SQLERRM); END DELETE_DEPT;
------------------------------------------------------ / CREATE PROCEDURE DEPT_ADMIN.DELETE_DEPT @VDEPT VARCHAR(4) AS
DELETE FROM DEPT_DB.DBO.DEPT WHERE DEPT = @VDEPT