DECLARE
--子程序声明部分,例如定义变量,常量,游标
BEGIN
-- 子程序编写sql语句
EXECTPTION
-- 子程序处理异常
END;
SQL> DECLARE
2 v_x NUMBER :=30; --全局变量
3 BEGIN
4 DECLARE
5 v_x VARCHAR2(40):='ABC'; --局部变量,只能在内部程序块中使用
6 v_y NUMBER:=30;
7 BEGIN
8 DBMS_OUTPUT.put_line('内部程序块中输出: v_x ='||v_x);
9 DBMS_OUTPUT.put_line('内部程序块中输出: v_y ='||v_y);
10 END;
11 DBMS_OUTPUT.put_line('外部程序块中输出: v_x ='||v_x);
12 END;
13 /
内部程序块中输出: v_x =ABC
内部程序块中输出: v_y =30
外部程序块中输出: v_x =30
PL/SQL 过程已成功完成。
异常处理语法
WHEN 异常类型 | 用户定义异常 | 异常代码 | OTHERS THEN
异常处理;
SQL> DECLARE
2 v_result NUMBER;
3 BEGIN
4 v_result :=10/0;
5 EXCEPTION
6 WHEN zero_divide THEN
7 DBMS_OUTPUT.put_line('被除数不能为0');
8 DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
9 END;
10 /
被除数不能为0
SQLCODE = -1476
PL/SQL 过程已成功完成。
用户定义异常
方式1:
声明异常对象并用名称来引用它,使用others 异常捕获用户定义的异常
方式2:
声明异常对象并将他与有效的Oracle错误代码映射,需要编写单独的WHEN
语句捕获
SQL> DECLARE
2 v_data NUMBER;
3 v_myexp EXCEPTION;
4 BEGIN
5 v_data:=&inputdata;
6 IF v_data >10 THEN
7 RAISE v_myexp;
8 END IF;
9 EXCEPTION
10 WHEN others THEN
11 DBMS_OUTPUT.put_line('输入数据错误');
12 DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
13 DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
14 END;
15 /
输入 inputdata 的值: 20
原值 5: v_data:=&inputdata;
新值 5: v_data:=20;
输入数据错误
SQLCODE = 1
SQLERRM = User-Defined Exception
PL/SQL 过程已成功完成。
为自定义异常设置异常代码
PRAGMA EXCEPTION_INIT(异常名称,Oracle错误代码);
SQL> DECLARE
2 v_data NUMBER;
3 v_myexp EXCEPTION;
4 PRAGMA EXCEPTION_INIT(v_myexp,-20789);
5 BEGIN
6 v_data:=&inputdata;
7 IF v_data >10 THEN
8 RAISE v_myexp;
9 END IF;
10 EXCEPTION
11 WHEN others THEN
12 DBMS_OUTPUT.put_line('输入数据错误');
13 DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
14 DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
15 END;
16 /
输入 inputdata 的值: 20
原值 6: v_data:=&inputdata;
新值 6: v_data:=20;
输入数据错误
SQLCODE = -20789
SQLERRM = ORA-20789:
PL/SQL 过程已成功完成。
动态异常
RAISE_APPLICATION_ERROR(错误号,错误信息[,是否添加到错误栈])
错误号:只接受-20000 - -20999范围内的错误号,与声明的错误号一致
错误信息:用于定义在使用SQLERRM输出时的错误提升信息.
是否添加错误到错误栈,如果设置为TRUE,则表示将错误添加到任意已有错误栈,可选
SQL> DECLARE
2 v_data NUMBER;
3 v_myexp EXCEPTION;
4 PRAGMA EXCEPTION_INIT(v_myexp,-20789);
5 BEGIN
6 v_data:=&inputdata;
7 IF v_data >10 THEN
8 RAISE_APPLICATION_ERROR(-20789,'数据有误');
9 END IF;
10 EXCEPTION
11 WHEN others THEN
12 DBMS_OUTPUT.put_line('输入数据错误');
13 DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
14 DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
15 END;
16 /
输入 inputdata 的值: 20
原值 6: v_data:=&inputdata;
新值 6: v_data:=20;
输入数据错误
SQLCODE = -20789
SQLERRM = ORA-20789: 数据有误
PL/SQL 过程已成功完成。