Oracle exception(二)

2014-11-24 12:53:02 · 作者: · 浏览: 1
R := 0;

v_test3 NUMBER := 0;

BEGIN

v_test3 := v_test1 / v_test2;

dbms_output.put_line(v_test3);

EXCEPTION

WHEN zero_divide THEN

dbms_output.put_line('0不能作为除数.');

END;

/

9. INVALID_NUMBER(invalid_number)该异常触发ORA-01722错误。

数字或值错误,或字符到数值的转换错误。

示例:

BEGIN

UPDATE emp SET sal = sal + '1oo'; -- 1oo

EXCEPTION

WHEN invalid_number THEN

dbms_output.put_line('输入的数字不正确.');

END;

/

DECLARE

v_test NUMBER;

v_test2 NUMBER;

BEGIN

v_test := '100';

v_test2 := '1a';

dbms_output.put_line(v_test);

EXCEPTION

WHEN INVALID_NUMBER THEN

DBMS_OUTPUT.PUT_LINE('输入的数字不正确.');

END;

/

10. ACCESS_INTO_NULL(access_into_null)该异常触发ORA-06530错误。

当程序中的对象还没有先进行对象初始化的操作,就直接为对象的属性赋值,将触发该异常。

示例:

DECLARE

v_test test_type;

BEGIN

v_test.v_name := 'test';

EXCEPTION

WHEN access_into_null THEN

dbms_output.put_line('首先初始化对象v_test');

END;

/

11. COLLECTION IS NULL(collection is null)该异常触发ORA-06531错误。

在给集合元素赋值前,必须先初始化该集合元素,否则触发该异常。

示例:

DECLARE

TYPE emp_ssn_array IS TABLE OF NUMBER/* INDEX BY BINARY_INTEGER*/;

best_employees emp_ssn_array;

BEGIN

best_employees(0) := '123456';

dbms_output.put_line('best_employees(0): ' || best_employees(0));

EXCEPTION

WHEN collection_is_null THEN

dbms_output.put_line('必须初始化集合元素.');

END;

/

12. SUBSCRIPT_BEYOND_COUNT(subscript_beyond_count)该异常触发ORA-06533错误。

当使用复合数据类型时,如果下标越界触发该异常。

示例:

DECLARE

TYPE test_array IS VARRAY(20) OF NUMBER;

v_test test_array;

BEGIN

v_test := test_array(123456);

dbms_output.put_line('v_test(1): ' || v_test(2));

EXCEPTION

WHEN subscript_beyond_count THEN

dbms_output.put_line('下标越界.');

END;

/

13.SUBSCRIPT_OUTSIDE_LIMIT(subscript_outside_limit)该异常触发ORA-06532错误

当使用复合数据类型时,如果下标为负值时触发该异常。

示例:

DECLARE

TYPE test_array IS VARRAY(20) OF NUMBER;

v_test test_array;

BEGIN

v_test := test_array(123456);

dbms_output.put_line('v_test(-1): ' || v_test(-1));

EXCEPTION

WHEN subscript_outside_limit THEN

dbms_output.put_line('下标不能是负数.');

END;

/

14.LONIN_DENIED该异常触发ORA_01017错误。

当PL/SQL连接数据库时,如果密码错误,将触发该异常。

15. NOT_LOGGED_ON该异常触发ORA-01012错误。

如果PL/SQL没有连接数据库,程序运行将触发该异常。

16 PROGRAM_ERROR该异常触发ORA-06501错误。

如果出现该异常,则表示PL/SQL的内部问题。用户可能需要重新安装数据字典和PL/SQL系统包。

17 ROWTYPE MISMATCH该异常触发ORA-06504错误。

在赋值时,如果宿主游标变量和PL/SQL游标变量的返回类型不兼容,将触发该异常。

18 SELF_IF_NULL该异常触发ORA-30625错误。

在使用对象类型时,如果在NULL示例上调用成员方法将触发该异常。

19 STORAGE_ERROR该异常触发ORA-06500错误。

当PL/SQL块运行时,如果走出内在空间或内在被损坏则触发该异常。

20 SYS_INVALID_ROWID该异常触发ORA-01410错误。

当将字符串转变为ROWID时,如果使用了无效的字符串则触发该异常。

21 TIMEOUT_ON_RESOURCE该异常触发ORA-00051错误。

Oracle在等待资源时出现超时错误时将触发该异常。

22 ORA-04021Oracle在等待资源时出现超时错误,该资源可能被其它session锁住,此时将触发该异常。

23 ORA-01791 不是Selected表达式SELECT DISTINCT goodsid,

barcode,

depotid,

goodsname

FROM sa_sale

WHERE depotid = '11'

ORDER BY selldate

这句话执行的时候就有错误, 但把排序换成order by Goodsid 或其它Barcode,DepotId,GoodsName的时候均没有错误,这是因为selldate不在查询结果字段中,而且这个语句是distinct语句。所以会出现这个错误

下边给出正确的解决办法:

SELECT goodsid,

barcode,

depotid,

goodsname

FROM (SELECT DISTINCT goodsid,

barcode,

depotid,

goodsname,

selldate

FROM sa_sale

WHERE depotid = '11')

ORDER BY selldate

24 ORA-01002: fetch out of s