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;

如果你过程执行中仅会出现“没查询到记录”这一种情况,你不用数组也能够实现,而且仅扫描workflow_currentoperator 表一遍,性能会提高

过程里直接根据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个表也是类似的

参考技术A select nvl(a.requestid,0) into requestids(1) from formtable_main_206 a,workflow_currentoperator b追问

这个方法我试过,没用 查不到数据也不是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问题

请教关于oracle中写存储过程时 select into 语句报错的问题

mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析

oracle存储过程select语句必须带into吗

Oracle存储过程merge into