pl/sql 内部程序块 &异常处理

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 过程已成功完成。

猜你喜欢

转载自blog.csdn.net/gameloftnet/article/details/83903260