邹瑞20201207
总结
游标 Cursor
在写 java 程序中有集合的概念,那么在 pl/sql 中也会用到多条记录,这时候我们就要用到游标,游标 可以存储查询返回的多条数据。
CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句;
例如:cursor c1 is select ename from emp;
游标的使用步骤:
- 打开游标: open c1; (打开游标执行查询)
- 取一行游标的值:fetch c1 into pjob; (取一行到变量中)
- 关闭游标: close c1;(关闭游标释放资源)
- 游标的结束方式 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传值。
- SQL语句中存在3个参数分别标识为:[:1、:2、:3],因此需要用USING关键字对三个参数分别赋 值。
- 对动态查询语句可以使用INTO子句把查询的结果保存到一个变量中,要求该结果只能是单行。
- 在Oracle的insert,update,delete语句都可以使用RETURNING子句把操作影响的行中的数据返 回,对SQL语句中存在RETURNING子句时,在动态执行时可以使用RETURNING INTO来接收。
- 动态执行参数中可以是:[:数字]也可以是[:字符串]。
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;
- 用EXCEPTION定义一个异常变量myexp
- 在一定条件下用RAISE引发异常myexp
- 在异常处理部分,捕获异常,如果不处理异常,该异常就抛给程序执行者。
近期评论