/*--异常
命名的系统异常 产生原因
access_into_null 未定义对象
case_not_found case中若未包含相应的when,并且没有设置
collection_is_null 集合元素未初始化
curser_already_open 游标已经打开
dup_val_on_index 唯一索引对应的列上有重复的值
invalid_cursor 在不合法的游标上进行操作
invalid_number 内嵌的 sql 语句不能将字符转换为数字
no_data_found 使用 select into 未返回行,或应用索引表未初始化的
too_many_rows 执行 select into 时,结果集超过一行
zero_divide 除数为 0
subscript_beyond_count 元素下标超过嵌套表或varray的最大值
subscript_outside_limit 使用嵌套表或 varray 时,将下标指定为负数
value_error 赋值时,变量长度不足以容纳实际数据
login_denied pl/sql 应用程序连接到 oracle 数据库时,提供了不正确的用户名或密码
not_logged_on pl/sql 应用程序在没有连接 oralce 数据库的情况下访问数据
program_error pl/sql 内部问题,可能需要重装数据字典& pl./sql系统包
rowtype_mismatch 主游标变量与 pl/sql 游标变量的返回类型不兼容
self_is_null 使用对象类型时,在 null 对象上调用对象方法
storage_error 运行 pl/sql 时,超出内存空间
sys_invalid_id 无效的 rowid 字符串
timeout_on_resource oracle 在等待资源时超时
*/
--异常
--例子
declare
v_empno emp.empno%type:=&empno;
begin
update emp set sal=sal+1000 where empno=v_empno;
commit;
exception
when no_data_found then
dbms_output.putline('指定的员工不存在');
when others then
dbms_output.putline('产生了其他异常');
end;
---自定义异常
declare
v_empno emp.empno%type:=&empno;
noresult exception;
begin
update emp set sal=sal+1000 where empno=v_empno;
if(sql%notfound) then---判断SQL语句是否成功执行。当有作用行时否其值为FALSE,否则其
值为TRUE。
raise noresult;---抛出异常
else
commit;
end if;
exception
when noresult then
dbms_output.putline('指定员工不存在');
when others then
dbms_output.put_line('产生其他异常');
END;
/* 一、游标的相关概念及特性
1.定义
映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集
中某个特定的行,然后根据业务需求对该行进行相应特定的操作。
2.游标的分类
在Oracel中,游标可以分为两大类:静态游标 和 REF游标(动态游标)。REF游标是一种引用
类型,类似于指针。而静态游标又分为显式游标和隐式游标两种。
结构图如下: |--隐式游标:系统自动定义的游标,用于处理select
into 和DML语句。
|---静态游标---|
Oracle游标-----| |--显式游标:即用户自定义游标,专门用于处理
select语句返回的多行数据。
|---REF游标(本文不作详细介绍)
3.游标使用的一般过程:
显式游标:声明--->打开--->读取--->关闭。
隐式游标:直接使用读取,声明、打开、关闭都是系统自动进行的。
4.游标的4个共同属性:%FOUND,%NOTFOUND,%ISOPEN,%ROWCOUNT。
%FOUND 布尔型属性,如果SQL语句至少影响到一行数据,则该属性为TRUE,否则为FALSE。
%NOTFOUND 布尔型属性,与%FOUND相反。
%ISOPEN 布尔型属性,判断游标的状态,当游标已经打开时返回TRUE,游标关闭时则返回FALSE
。
%ROWCOUNT 数字型属性,返回受SQL影响的行数。
注:当使用隐式游标的属性时,需要在属性前加上SQL。因为Oracle在创建隐式游标时,默认的
游标名为SQL。比如:..... if SQL%NOTFOUND then....
二、隐式游标
1.隐式游标定义
隐式游标由系统自动定义,其过程由oracle控制,完全自动化。比如当DML被使用时,Oracle为
每一个不属于显式游标的DML语句都创建一个隐式游标,其声明、打开、关闭都是系统自动进行。另外,
隐式游标默认的名称是SQL,不能对SQL游标显式地执行OPEN,FETCH,CLOSE语句。
2.隐式游标的属性
类似于显示游标,隐式游标同样具有四种属性,只不过隐式游标以SQL%开头,而显示游标以
Cursor_name%开头。
并且,通过SQL%总是只能访问前一个DML操作或单行SELECT操作的游标属性,用于判断DML执行
的状态和结果,进而控制程序的流程。
SQL%ISOPEN
游标是否打开。当执行select into、insert、update、delete这些DML操作时,
Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭游标。因为是隐式游标
,故SQL%ISOPEN总是FALSE。
SQL%FOUND
判断SQL语句是否成功执行。当有作用行时则成功执行为TRUE,否则为FALSE。
SQL%NOTFOUND
判断SQL语句是否成功执行。当有作用行时否其值为FALSE,否则其值为TRUE。
SQL%ROWCOUNT
在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL。
对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1;
如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND。*/
---DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中
---的数据。基本的数据操作分成两类四种:检索(查询)和更新(插入、删除、修改)。DML分成交互型DML
---和嵌入型DML两类。依据语言的级别,DML又可分成过程性DML和非过程性DML两种。如---
insert,delete,update,select(插入、删除、修改、检索)等都是DML.
Oracle 异常
最新推荐文章于 2022-02-18 11:12:32 发布