邹瑞20201207

总结

游标 Cursor

在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,游标 可以存储查询返回的多条数据。

CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;

例如:cursor c1 is select ename from emp;

游标的使用步骤:

  1. 打开游标: open c1; (打开游标执行查询)
  2. 取一行游标的值:fetch c1 into pjob; (取一行到变量中)
  3. 关闭游标: close c1;(关闭游标释放资源)
  4. 游标的结束方式 exit when c1%notfound

注意: 上面的 pjob 必须与 emp 表中的 ename 列类型一致:定义:pjob emp.ename %type;

PL/SQL中动态执行SQL语句

在PL/SQL程序开发中,可以使用DML语句和事务控制语句,但是还有很多语句(比如DDL语句)不能 直接在PL/SQL中执行。这些语句可以使用动态SQL来实现。

PL/SQL块先编译然后再执行,动态SQL语句在编译时不能确定,只有在程序执行时把SQL语句作为字符 串的形式由动态SQL命令来执行。在编译阶段SQL语句作为字符串存在,程序不会对字符串中的内容进 行编译,在运行阶段再对字符串中的SQL语句进行编译和执行,动态SQL的语法是:

EXECUTE IMMEDIATE 动态语句字符串

[INTO 变量列表]

[USING 参数列表]

如果动态语句是SELECT语句,可以把查询的结果保存到INTO后面的变量中。如果动态语句中存在参 数,USING为语句中的参数传值。

动态SQL中的参数格式是:[:参数名],参数在运行时需要使用USING传值。

  1. SQL语句中存在3个参数分别标识为:[:1、:2、:3],因此需要用USING关键字对三个参数分别赋 值。
  2. 对动态查询语句可以使用INTO子句把查询的结果保存到一个变量中,要求该结果只能是单行。
  3. 在Oracle的insert,update,delete语句都可以使用RETURNING子句把操作影响的行中的数据返 回,对SQL语句中存在RETURNING子句时,在动态执行时可以使用RETURNING INTO来接收。
  4. 动态执行参数中可以是:[:数字]也可以是[:字符串]。

PL/SQL的异常处理

在程序运行时出现的错误,称为异常。发生异常后,语句将停止执行,PL/SQL引擎立即将控制权转到 PL/SQL块的异常处理部分。异常处理机制简化了代码中的错误检测。PL/SQL中任何异常出现时,每一 个异常都对应一个异常码和异常信息。

PL/SQL中用EXCEPTION关键字开始异常处理。具体语法是:

BEGIN

​ --可执行部分

EXCEPTION

-- 异常处理开始

WHEN 异常名1 THEN

--对应异常处理

WHEN 异常名2 THEN

--对应异常处理 ……

WHEN OTHERS THEN

--其他异常处理

END;

异常发生时,进入异常处理部分,具体的异常与若干个WHEN子句中指明的异常名匹配,匹配成功就进 入对应的异常处理部分,如果对应不成功,则进入OTHERS进行处理

declare

newSal emp.sal%type;

begin

select sal into newSal from emp;

exception

when TOO_MANY_ROWS then

dbms_output.put_line('返回太多记录了');

when others then

dbms_output.put_line('未知异常');

end;

自定义异常

除了预定义异常外,用户还可以在开发中自定义异常,自定义异常可以让用户采用与PL/SQL引擎处理 错误相同的方式进行处理,用户自定义异常的两个关键点:

异常定义:在PL/SQL块的声明部分采用EXCEPTION关键字声明异常,定义方法与定义变量相同。 比如声明一个myexception异常方法是:

myexception EXCEPTION;

异常引发:在程序可执行区域,使用RAISE关键字进行引发。比如引发myexception方法是:RAISE myexception;

  1. 用EXCEPTION定义一个异常变量myexp
  2. 在一定条件下用RAISE引发异常myexp
  3. 在异常处理部分,捕获异常,如果不处理异常,该异常就抛给程序执行者。

标签

评论

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1