知识大全 ORACLE和SQL语法区别归纳(2)

Posted 语句

篇首语:一锹挖不成水井,一天盖不成罗马城。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ORACLE和SQL语法区别归纳(2)相关的知识,希望对你有一定的参考价值。

ORACLE和SQL语法区别归纳(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  字串连接

  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( );

  VFNAME VARCHAR ( );

  VLNAME VARCHAR ( );

  VBIRTH_DATE DATE;

  VLOAN_AMOUNT NUMBER( );

  

  DECLARE

  @VSSN CHAR( )

  @VFNAME VARCHAR ( )

  @VLNAME VARCHAR ( )

  @VBIRTH_DATE DATETIME

  @VLOAN_AMOUNT NUMERIC( )

  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( );

  VFNAME VARCHAR ( );

  VLNAME VARCHAR ( );

  BEGIN

  VSSN := ?

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

  END;

  

  DECLARE @VSSN CHAR( )

  @VFNAME VARCHAR( )

  @VLNAME VARCHAR( )

  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

  STATEMENT ;

  STATEMENT ;

  STATEMENTN;

  END IF;

  WHILE LOOP

  STATEMENT ;

  STATEMENT ;

  STATEMENTN;

  END LOOP;

  END; THIS IS REQUIRED SYNTAX DECLARE

  DECLARE VARIABLES

  BEGIN THIS IS OPTIONAL SYNTAX

  PROGRAM_STATEMENTS

  IF

  BEGIN

  STATEMENT

  STATEMENT

  STATEMENTN

  END

  WHILE

  BEGIN

  STATEMENT

  STATEMENT

  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( );

  VDEGREE_PROGRAM_NAME VARCHAR ( );

  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( )

  @VDEGREE_PROGRAM_NAME VARCHAR( )

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

  WHILE (COUNTER < ) LOOP

  COUNTER := COUNTER + ;

  END LOOP;

  END;

  

  DECLARE

  @COUNTER NUMERIC

  SELECT@COUNTER =

  WHILE (@COUNTER < )

  BEGIN

  SELECT @COUNTER =

  @COUNTER +

  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;

  <> GOTO label

  PRINT语句

  Transact SQL 的PRINT语句执行同PL/SQL 的RDBMS_OUTPUT put_line过程同样的操作 该语句用来打印用户给定的消息

  用PRINT语句打印的消息上限是 个字符 定义为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

  [ argument [ argument >)

  [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 VARCHAR ) RETURN NUMBER AS

  BEGIN

  DELETE FROM DEPT_ADMIN DEPT

  WHERE DEPT = VDEPT;

  RETURN(SQL %ROWCOUNT);

  EXCEPTION

  WHEN OTHER THEN

  RAISE_APPLICATION_ERROR

  ( SQLERRM);

  END DELETE_DEPT;

  

  / CREATE PROCEDURE

  DEPT_ADMIN DELETE_DEPT

  @VDEPT VARCHAR( ) AS

  DELETE FROM DEPT_DB DBO DEPT

  WHERE DEPT = @VDEPT

  RETURN @@ROWCOUNT

  GO

  实现游标

  Oracle 在使用SELECT语句时总是需要游标 不管从数据库中请求多少行 在 Microsoft SQL Server

  SELECT语句并不把在返回客户的行上附加游标作为缺省的结果集合 这是一种返回数据给客户应用程序的有效的方法

  SQL Server为游标函数提供了两种接口 当在Transact SQL 批处理或者存储过程中使用游标的时候 SQL 语句可用来声明

  打开 和从游标中抽取 就像定位更新和删除一样 当使用来自DB Library ODBC 或者OLEDB程序的游标时 SQL Server

  显式的调用内建的服务器函数来更有效的处理游标

  当从Oracle 输入一个PL/SQL 过程时 首先判断是否需要在Transact SQL 中采用游标来实现同样的功能 如果游标仅仅返回一

  组行给客户程序 就使用非游标的SELECT语句来返回缺省的结果集合 如果游标用来从行中一次取得一个数据给本地过程变量

  你就必须在Transact SQL 中使用游标

  语法

  下表显示了使用游标的语法

  操作 Oracle Microsoft SQL  Server

  声明一个游标 CURSOR cursor_name [(cursor_parameter(s))]

  IS select_statement;

  

  DECLARE cursor_name CURSOR

  [LOCAL | GLOBAL]

  [FORWARD_ONLY | SCROLL]

  [STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

  [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

  [TYPE_WARNING]

  FOR select_statement

  [FOR UPDATE [OF column_name [ …n>]

  打开一个游标 OPEN cursor_name [(cursor_parameter(s))];

  

  OPEN cursor_name

  从游标中提取(Fetching) FETCH cursor_name INTO variable(s)

  

  FETCH FROM] cursor_name

  [INTO @variable(s)]

  更新提取行 UPDATE table_name

  SET statement(s)…

  WHERE CURRENT OF cursor_name; UPDATE table_name

  SET statement(s)…

  WHERE CURRENT OF cursor_name

  删除提取行 DELETE FROM table_name

  WHERE CURRENT OF cursor_name; DELETE FROM table_name

  WHERE CURRENT OF cursor_name

  关闭游标 CLOSE cursor_name; CLOSE cursor_name

  清除游标数据结构 N/A DEALLOCATE cursor_name

  声明一个游标

  尽管Transact SQL DECLARE CURSOR语句不支持游标参数的使用 但它确实支持本地变量 当游标打开的时候

  它就使用这些本地变量的值 Microsoft SQL Server在其DECLARE CURSOR中提供了许多附加的功能

  INSENSITIVE选项用来定义一个创建数据的临时拷贝以被游标使用的游标 游标的所有请求都由这个临时表来应答 因此

  对原表的修改不会反映到那些由fetch返回的用于该游标的数据上 这种类型的游标访问的数据是不能被修改的

  应用程序可以请求一个游标类型然后执行一个不被所请求的服务器游标类型支持的Transact SQL 语句 SQL Server返回一个错误

  指出该游标类型被改变了 或者给出一组参数 隐式的转换游标 欲取得一个触发SQL Server 隐式的把游标从一种类型转换为

  另一种类型的参数的完整列表 请参阅SQL Server联机手册

  SCROLL选项允许除了前向的抽取以外 向后的 绝对的和相对的数据抽取 一个滚动游标使用一种键集合的游标模型 在该模型中

  任何用户提交的对表的删除和更新都将影响后来的数据抽取 只有在游标没有用INSENSITIVE选项声明时 上面的特性才起作用

  如果选择了READ ONLY选项 对游标中的行的更新就被禁止 该选项将覆蓋游标的缺省选项枣允许更新

  UPDATE [OF column_list]语句用来在游标中定义一个可更新的列 如果提供了[OF column_list] 那么仅仅是那些列出的列可以被修改

  如果没有指定任何列 则所有的列都是可以更新的 除非游标被定义为READ ONLY

  重要的是 注意到一个SQL Server游标的名字范围就是连接自己 这和本地变量的名字范围是不同的

  不能声明一个与同一个用户连接上的已有的游标相同名字的游标 除非第一个游标被释放

  打开一个游标

  Transact SQL 不支持向一个打开的游标传递参数 这一点和PL/SQL 是不一样的 当一个Transact SQL 游标被打开以后

  结果集的成员和顺序就固定下来了 其它用户提交的对原表的游标的更新和删除将反映到对所有未加INSENSITIVE选项定义

  的游标的数据抽取上 对一个INSENSITIVE游标 将生成一个临时表

  抽取数据

  Oracle 游标只能向前移动枣没有向后或者相对滚动的能力 SQL Server游标可以向前或者向后滚动 具体怎么滚动

  要由下表给出的数据抽取选项来决定 只有在游标是用SCROLL选项声明的前提下 这些选项才能使用

  卷动选项 描述

  NEXT 如果这是对游标的第一次提取 则返回结果集合的第一行 否则 在结果结合内移动游标到下一行

  NEXT是在结果集合中移动的基本方法 NEXT是缺省的游标提取(fetch)

  PRIOR 返回结果集合的前一行

  FIRST 把游标移动到结果集合的第一行 同时返回第一行

  LAST 把游标移动到结果集合的最后一行 同时返回最后一行

  ABSOLUTE n 返回结果集合的第n行 如果n为负数 则返回倒数第n行

  RELATIVE n 返回当前提取行后的第n行 如果n是负数 则返回从游标相对位置起的倒数第n行

  Transact SQL 的FETCH语句不需要INTO子句 如果没有指定返回变量 行就自动作为一个单行结果集合返回给客户 但是

  如果你的过程必须把行给客户 一个不带游标的SELECT语句更有效一些

  在每一个FETCH后面 @@FETCH_STATUS函数被更新 这和在PL/SQL 中使用CURSOR_NAME%FOUND和CURSOR_NAME%NOTFOUND变量是相似的

   @@FETCH_STATUS函数在每一次成功的数据抽取以后被设定为 如果数据抽取试图读取一个超过游标末尾的数据 则返回一个为 的值

  如果请求的行在游标打开以后从表上被删除了 @@FETCH_STATUS函数就返回一个为 的值 只有游标是用SCROLL选项定义的情况下

  才会返回 值 在每一次数据抽取之后都必须检查该变量 以确保数据的有效性

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

  CURRENT OF子句

  更新和删除的CURRENT OF子句语法和函数在PL/SQL 和Transact SQL 中是一样的 在给定游标中 在当前行上执行定位的UPDATE和DELETE

  关闭一个游标

  Transact SQL 的CLOSE CURSOR语句关闭游标 但是保留数据结构以备重新打开 PL/SQL 的CLOSE CURSOR语句关闭并且释放所有的数据结构

  Transact SQL 需要用DEALLOCATE CURSOR语句来清除游标数据结构 DEALLOCATE CURSOR语句同CLOSE CURSOR是不一样的

  后者保留数据结构以备重新打开 DEALLOCATE CURSOR释放所有与游标相关的数据结构并且清除游标的定义

  游标示例

  下面的例子显示了在PL/SQL 和Transact SQL 等价的游标语句

cha138/Article/program/Oracle/201311/17760

相关参考

知识大全 oracle与sql的区别(常用函数)

  许多软件公司都理解开发不依赖于特定数据库类型(例如OracleSQLServerDB)的应用程序的重要性它可以让客户们选择自己习惯的平台一般来说软件开发人员都能够识别出他们的负责数据库维护的客户和

知识大全 asp和SQL语法中引号的使用方法

asp和SQL语法中引号的使用方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz

知识大全 关于SQL Server语法一些参考和应用

关于SQLServer语法一些参考和应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一资料定

知识大全 sql update 语法与实例

  sqlupdate语法与实例  在日常使用的数据库教程是一个不断变化的数据存储在SQL是用于修改数据已经在数据库中的更新和删除mandsThe更新语句可以更新表格中的一个或多个记录命令  UPDA

知识大全 SQL语句语法大全

SQL语句语法大全  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  小编整理的一些比较常用的SQL

知识大全 SQL语句的基本语法一

SQL语句的基本语法一  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一SELECT语句的完整语

知识大全 PL/SQL基本语法要素(组图)

PL/SQL基本语法要素(组图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  常量    定义

知识大全 SQL联合查询(内联、左联、右联、全联)的语法

SQL联合查询(内联、左联、右联、全联)的语法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  概

知识大全 MS SQL Server 数据库语法

MSSQLServer数据库语法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据操作  SE

知识大全 Oracle触发器语法及实例

Oracle触发器语法及实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Oracle触发器