oracle 存储过程 into 没找到数据 解决办法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 存储过程 into 没找到数据 解决办法相关的知识,希望对你有一定的参考价值。
需要查询到10个不同的表,根据条件分别查询到每个表里的一个字段requestid的数据。我是将查询到的数据保存在数组里, 但是如果有个表里没有数据,将会出现异常。求解决办法!如果有其他更好的方法可以保存这10个表里的数据更好!
附上部分代码:
create or replace procedure proc_test(
client_no varchar2
) is
TYPE requestid_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
requestids requestid_array;
begin
FOR i IN 1..12 LOOP
requestids(i):=1;
END LOOP;
select a.requestid into requestids(1) from formtable_main_206 a,workflow_currentoperator b
where a.requestid=b.requestid and b.isremark=0 and a.clientno=client_no;
raise_application_error(-20000, 'z');--如果没查询到记录,将不会执行这条语句
select a.requestid into requestids(2) from formtable_main_240 a,workflow_currentoperator b
where a.requestid=b.requestid and b.isremark=0 and a.clientno=client_no;
select a.requestid into requestids(3) from formtable_main_222 a,workflow_currentoperator b
where a.requestid=b.requestid and b.isremark=0 and a.clientno=client_no;
FOR i IN 1..requestids.count LOOP
update workflow_currentoperator t set t.userid=user_id where requestid=requestids(i) and t.isremark =0;
END LOOP;
end proc_test;
过程里直接根据10个表更新workflow_currentoperator ,如下:
update workflow_currentoperator t set t.userid=(select user_id from formtable_main_206 a
where a.requestid=t.requestid and a.clientno=client_no)
where t.isremark=0;
......追问
但是有10个表,我需要从10个表里找到他们分别条件满足的requestid 然后再把找到的requestid作为条件来更新workflow_currentoperator。 你说直接根据10个表更新是什么意思。。没看懂、
追答根据formtable_main_*这样的10个表更新,你只要写10个update就可以了,没有必要用数组和for循环
update workflow_currentoperator t set t.userid=(select user_id from formtable_main_206 a
where a.requestid=t.requestid and a.clientno=client_no)
where t.isremark=0;
update workflow_currentoperator t set t.userid=(select user_id from formtable_main_240 a
where a.requestid=t.requestid and a.clientno=client_no)
where t.isremark=0;
update workflow_currentoperator t set t.userid=(select user_id from formtable_main_222 a
where a.requestid=t.requestid and a.clientno=client_no)
where t.isremark=0;
下面还有7个表也是类似的
这个方法我试过,没用 查不到数据也不是null
追答那你加个异常
begin
select a.requestid into requestids(1) from formtable_main_206 a,workflow_currentoperator b
where a.requestid=b.requestid and b.isremark=0 and a.clientno=client_no;
exception
null;
end;
加异常,就不会执行update的操作了
关于oracle存储过程select into 未找到数据问题
参考技术A 第一张图的update不会执行,因为select。。into报错就直接到exception上了
第二张图可以执行update,但是如果select没有exception,你的update也就不会执行了。
exception有些象过程语言的goto语句,但它只在出现例外时才执行update,没有例外就不执行
以上是关于oracle 存储过程 into 没找到数据 解决办法的主要内容,如果未能解决你的问题,请参考以下文章
关于oracle存储过程select into 未找到数据问题
请教关于oracle中写存储过程时 select into 语句报错的问题