Oracle

ORACLE和SQL语法区别归纳(2)

日期:2015-06-28 00:00:00 来源: IT猫扑网

  字串连接

  Oracle 使用两个管道符号(||)来作为字串连接操作符,SQL Server则使用加号(+)。这个差别要求你在应用程序中做小小的修改。

  Oracle Microsoft SQL

  SELECT FNAME||' '||LNAME AS NAME

  FROM STUDENT_ADMIN.STUDENT

  -----------------------------------------------

  SELECT FNAME +' '+ LNAME AS    NAME

  FROM STUDENT_ADMIN.STUDENT

  流控制(Control-of-Flow)语言

  流控制语言控制SQL 语句执行流,语句块以及存储过程。PL/SQL 和Transact-SQL 提供了多数相同的结构,但是还是有一些语法差别。

  关键字

  这是两个RDBMS支持的关键字。

  语句 Oracle PL/SQL ---------------------Microsoft SQL  Server Transact-SQL

  声明变量 DECLARE DECLARE

  语句块 BEGIN...END; BEGIN...END

  条件处理 IF…THEN,

  ELSIF…THEN,

  ELSE

  ENDIF;

  --------------------------------------------------------

  IF…[BEGIN…END]

  ELSE

  [BEGIN…END]

  ELSE IF

  CASE expression

  无条件结束 RETURN------------ RETURN

  无条件结束当前程序块后面的语句 EXIT BREAK

  重新开始一个WHILE循环 N/A CONTINUE

  等待指定间隔 N/A (dbms_lock.sleep) WAITFOR

  循环控制 WHILE LOOP…END LOOP;

  ------------

  LABEL…GOTO LABEL;

  FOR…END LOOP;

  LOOP…END LOOP;

  WHILE

  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 := ?'

  SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN;

  END;

#p#副标题#e#

  ------------------------------------------------------------------------------

  DECLARE @VSSN CHAR(9),

  @VFNAME VARCHAR(12),

  @VLNAME VARCHAR(20)

  SET @VSSN = ?'

  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循环需要测试一个布尔表达式来决定一个或者多个语句的重复执行。

#p#副标题#e#

  只要给定的表达式结果为真,这个(些)语句就一直重复执行下去。如果有多个语句需要执行,则这些语句必须放在一个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等价的关

相关文章

相关下载

网友评论

我要评论...
    没有更早的评论了
    取消