|
N/A (dbms_lock.sleep)
WAITFOR
循环控制
WHILE LOOP…END LOOP;
LABEL…GOTO LABEL; FOR…END LOOP; LOOP…END LOOP;
WHILE <condition> BEGIN… END
LABEL…GOTO LABEL
程序注释
/* … */, --
/* … */, --
打印输出
RDBMS_OUTPUT.PUT_ LINE
PRINT
引发程序错误(Raise program error)
RAISE_APPLICATION_ ERROR
RAISERROR
执行程序
EXECUTE
EXECUTE
语句终止符
Semicolon (;)
N/A
声明变量
Transact-SQL和PL/SQL的变量是用DECLARE关键字创建的。Transact-SQL变量用@标记,并且就像PL/SQL一样,在第一次创建时,用空值初始化。
Oracle
Microsoft SQL
DECLARE VSSN CHAR(9); VFNAME VARCHAR2(12); VLNAME VARCHAR2(20); VBIRTH_DATE DATE; VLOAN_AMOUNT NUMBER(12,2);
DECLARE @VSSN CHAR(9), @VFNAME VARCHAR2(12), @VLNAME VARCHAR2(20), @VBIRTH_DATE DATETIME, @VLOAN_AMOUNT NUMERIC(12,2)
Transact-SQL不支持%TYPE和%ROWTYPE变量数据类型定义。一个Transact-SQL变量不能在DECLARE命令中初始化。在Microsoft SQL Server数据类型定义中也不能使用Oracle的NOT NULL和CONSTANT关键字。
像Oracle的LONG和LONG RAW数据类型一样。文本和图形数据类型不能被用做变量定义。此外,Transact-SQL不支持PL/SQL风格的记录和表的定义。
给变量赋值
Oracle和Microsoft SQL Server提供了下列方法来为本地变量赋值。
Oracle
Microsoft SQL
Assignment operator (:=)
SET @local_variable = value
SELECT...INTO syntax for selecting column values from a single row
SELECT @local_variable = expression [FROM…] for assigning a literal value, an expression involving other local variables, or a column value from a single row
FETCH…INTO syntax
FETCH…INTO syntax
这里有一些语法示例
Oracle
Microsoft SQL
DECLARE VSSN CHAR(9); VFNAME VARCHAR2(12); VLNAME VARCHAR2(20); BEGIN VSSN := ''''123448887''''; SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN; END;
DECLARE @VSSN CHAR(9), @VFNAME VARCHAR(12), @VLNAME VARCHAR(20) SET @VSSN = ''''12355887'''' SELECT @VFNAME=FNAME, @VLNAME=LNAME FROM STUDENTS WHERE SSN = @VSSN
语句块
Oracle PL/SQL和Microsoft SQL Server Transact-SQL都支持用BEGIN…END术语来标记语句块。Transact-SQL不需要在DECLARE语句后使用一个语句块。如果在Microsoft SQL Server 中的IF语句和WHILE循环中有多于一个语句被执行,则需要使用BEGIN…END语句块。
Oracle
Microsoft SQL
DECLARE DECLARE VARIABLES ... BEGIN -- THIS IS REQUIRED SYNTAX PROGRAM_STATEMENTS ... IF ...THEN STATEMENT1; STATEMENT2; STATEMENTN; END IF; WHILE ... LOOP STATEMENT1; STATEMENT2; STATEMENTN; END LOOP; END; -- THIS IS REQUIRED SYNTAX
DECLARE DECLARE VARIABLES ... BEGIN -- THIS IS OPTIONAL SYNTAX PROGRAM_STATEMENTS ... IF ... BEGIN STATEMENT1 STATEMENT2 STATEMENTN 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; <<label name here>>
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语 << 上一页 [11] [12] [13] [14] [15] [16] [17] 下一页 [Access]sql随机抽取记录 [Access]ASP&SQL让select查询结果随机排序的实现方法 [聊天工具]企业邮件系统的利器----FoxMail Server [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜 [系统软件]SQL语句性能优化--LECCO SQL Expert [系统软件]关于Windows2000Server的灾难恢复 [常用软件][网络]下载服务革命性风暴Poco Server评测 [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信… [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现
|