语句。 例: declare cursor empl_dep is select last_name;department_name from employees;departments where employees。department_id=departments。department_id; empl_name employees。last_name %type; depart_name departments。department_name %type; begin open empl_dep; fetch empl_dep into empl_name;depart_name; dbms_output。put_line(empl_name ||chr(32)||"work in"||chr(32)||depart_name); while empl_dep%found loop fetch empl_dep into empl_name;depart_name; dbms_output。put_line(empl_name ||chr(32)||"work in"||chr(32)||depart_name); end loop; if empl_dep%isopen then dbms_output。put_line(empl_dep%rowcount); end if; close empl_dep; end; 5。FOR循环的游标使用: for record_name in cursor_name loop statement1; statement2; 。。。。。。 end loop; 游标不需要打开,FETCH和关闭,直接在循环中使用 record_name。col_name(子查询中的 第 86 页,共 106 页 …………………………………………………………Page 87…………………………………………………………… 资源来自网络,仅供学习! Oracle 从入门到精通 col_name)就可以。 declare cursor cur_empl_dep is select last_name;department_name from employees;departments where employees。department_id=departments。department_id; begin for re_empl_dep in cur_empl_dep loop dbms_output。put_line(re_empl_dep。last_name||" work in "||re_empl_dep。department_name); end loop; end; begin for re_empl_dep in (select last_name;department_name from employees;departments where employees。department_id=departments。department_id) loop dbms_output。put_line(re_empl_dep。last_name||" work in "||re_empl_dep。department_name); end loop; end; 6。带参数的游标: 处理串行化数据(一个执行完才能执行下一个)。 CURSOR cursor_name '(parameter_name datatype;。。。。。)' IS select_statement; OPEN cursor_name '(parameter_name datatype;。。。。。)'; 限制:不能实现多个游标的并行打开。 例: declare cursor dep_cur (dep_id employees。department_id %type) is select employee_id;last_name;department_id from employees where department_id=dep_id; begin for j in 1 。。 5 loop for i in dep_cur(j*10) loop dbms_output。put_line(i。employee_id||" : "||i。last_name||" in " ||i。department_id); end loop; end loop; end; 在查询的同时锁定数据: select 。。。。 from 。。。。 for update 'of column reference' 'nowait'; 'nowait' 如果得不到访问资源就立即返回。 如果要使用游标修改数据的话,一定要在游标定义中 SELECT 语句中加上 FOR UPDATE。 第 87 页,共 106 页 …………………………………………………………Page 88…………………………………………………………… 资源来自网络,仅供学习! Oracle 从入门到精通 在游标执行过程中的 UPDATE 语句: UPDATE。。。。SET。。。WHERE CRRENT OF cursor_name; 7。异常处理 异常:在执行过程中出现的错误。 错误触发:语句执行错误(规则)。 显式触发:人为认定的异常,人为规定出现异常的数据范围(逻辑)。 8。预定义异常: 有编号,有名称。使用异常名称扑捉; NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX 在索引上出现重复数; exception when NO_DATA_FOUND then statement1; statement2; 。。。。。。。。; when TOO_MANY_ROWS then statement1; statement2; 。。。。。。。。。。。; when others then statement1; statement2; 。。。。。。。。。。。; 9。非预定义异常: 有编号,没名称。需要先定义名称再扑捉; (1)在 DECLARE 部分定义一个异常的名称; exc_name EXCEPTION; (2)把名称和异常编号连接起来; PARGMA EXCEPTION_INIT(exc_name;…exc_number); 3、函数: SQLCODE :返回错误编号 SQLERRM :返回错误信息 写入错误日志的内容: 用户,时间,对象,操作,错误编号,错误信息。 用户定义异常: (1)命名; (2)raise关键字在 BEGIN 后触发; 第 88 页,共 106 页 …………………………………………………………Page 89…………………………………………………………… 资源来自网络,仅供学习! Oracle 从入门到精通 (3)捕捉; 语法: exception when exception1 or exception2 then statement1; statement2; 。。。。。。。。; when exception3 or exception4 then statement1; statement2; 。。。。。。。。。。。; when others then statement1; statement2; 。。。。。。。。。。。; 能够判断出的异常放到 WHEN 语句中,将那些无法预测的异常放在 OTHERS 中做成错误日志表。 在程序内部的在程序内部捕捉,程序外部的程序外部捕捉,只有都没捕捉到,才会传到环境中。 抛出异常: RAISE_APPLICATION_ERROR RAISE_APPLICATION_ERROR(自定义错误编号,自定义信息); 不会被 EXCEPTION 捕捉到,而是直接回显到界面上给用户看到。 在 EXCEPTION 。。。WHEN 。。。THEN 之前或之中都可以使用。 函数: 不能独立出现,只能作为表达式来使用。 create 'or replace' function fun_name '(parameter1 'mode' datatype;parameter2 'mode' datatype; 。。。)' return datetype is/as pl/sql block; 只能返回一个且必须有一个返回类型。 在 pl/sql block 中必须有一个可以执行的 RETURN子句。 只允许接受 IN 模式的参数。 函数可以返回 BOOLEAN类型,但不能将返回 BOOLEAN 类型的