oracle存储过程中if条件后的sql没有执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程中if条件后的sql没有执行相关的知识,希望对你有一定的参考价值。

create procedure proc_kaoqin
as
v_id int;
v_id2 int;
v_inprout varchar2(20);
v_inprout1 varchar2(20);
begin
select min(id) into v_id from kaoqin_temp;
select max(id) into v_id2 from kaoqin_temp;
while v_id+1<=v_id2
loop
select in_or_out into v_inprout from kaoqin_temp where id=v_id;
select in_or_out into v_inprout1 from kaoqin_temp where id=v_id+1;
dbms_output.put_line(v_id);
dbms_output.put_line(v_inprout);
dbms_output.put_line(v_inprout1);
if trim(v_inprout)=trim(v_inprout1) then
dbms_output.put_line('hehe');
delete from kaoqin_temp where door='部门门' and id in(v_id,v_id+1);
update kaoqin_temp set id=v_id+1 where door='正大门';
dbms_output.put_line('haha');
end if;
v_id:=v_id+1;
end loop;

dbms_output.put_line('hehe');dbms_output.put_line('haha'); 都执行了,但中间的两条sql语句没有执行,这是为什么
下面是表kaoqin_temp中的数据:
id time name card_num door in_or_out
1 01-AUG-16 06.35.00.000000 PM 张小平 1111111 部门门 正常出门
2 01-AUG-16 06.45.00.000000 PM 张小平 1111111 正大门 正常出门
3 01-AUG-16 07.45.00.000000 PM 张小平 1111111 正大门 正常进门
4 01-AUG-16 07.55.00.000000 PM 张小平 1111111 部门门 正常进门
提示的错误是第12行代码会返回多行数据。还有我测试的时候发现if条件里的sql语句没有执行。

参考技术A 你把你这两个 dbms输出的语句注释掉试下,你这两个语句后面都有封号,不是代表if语句已经结束了吗追问

没有用的,这句dbms_output.put_line('haha');
都执行了

追答

因为这句后面有个封号...

追问

我删除了所有的输出语句后,结果还是一样的。
我补充了问题 你看看

参考技术B 应该是执行了,只是没有符合条件的数据。查看你的SQL条件,有满足的数据么?追问

1 1 01-AUG-16 06.35.00.000000 PM 张小平 1111111 卫星导航事业部 部门门 正常出门
2 2 01-AUG-16 06.45.00.000000 PM 张小平 1111111 卫星导航事业部 正大门 正常出门

这是表里面的数据

追答

update kaoqin_temp set id=v_id+1 where door='正大门';
你的id 应该是主键吧, 这个update的语句 满足条件的有多条数据, 所以update不能成功执行。 根据你要更新的数据,再添加限制条件

追问

是的,非常感谢您。

oracle存储过程连续执行结果不同

pl/sql里执行存储过程,f8执行后查看结果集,每次都累加.必须把窗口关闭重新测试.

这是pl/sql本来就这样的吗,还是我存储过程写的不对??
存储过程:

http://hi.baidu.com/sordhmbreabivzq/item/a1626cca2873c3ce994aa05b

存储过程是别人写的,我完全不懂,能帮我瞅一眼么??? 是不临时表没清空啥的啊?

楼主,再细心检查下,如果存储过程没有对表数据做修改,删除处理,最后得到的结果都一样。本身pl/sql这样执行存储过程是没有问题的。那个存储过程,是有insert这个插入处理的,会导致你数据一直在增加,增加完再查询所以出来的结果就一直增加且重复了。追问

麻烦帮忙看下,存储过程完全不懂,上面是连接,谢谢

追答

那个存储过程,是有insert这个插入处理的,会导致你数据一直在增加,增加完再查询所以出来的结果就一直增加且重复了。

那个存储过程,是有insert这个插入处理的,会导致你数据一直在增加,增加完再查询所以出来的结果就一直增加且重复了。

追问

但是 我该肿么办呢??

追答

你为嘛要怎么办呢?如果你只是要查询当前的数据,就去掉那段insert语句,主要是看你自己是什么样的需求,要做什么样的业务,就得按自己的逻辑去做程序。

参考技术A 这肯定不是PL/SQL的原因,具体是什么问题需要分析存储过程本身才知道。追问

麻烦帮忙看下,存储过程完全不懂,上面是连接

追答

很奇怪,这个存储过程应该是关掉窗口重新测试同样会累加的,除非你在另外执行了什么操作清空了J2131_Z_J213_R_TMP这个表。要做到在J213_R这个表不变的情况下每次执行存储过程的结果一样,需要在存储过程的最前面也就是begin之后,INSERT INTO J2131_Z_J213_R_TMP之前加一行:
truncate table J2131_Z_J213_R_TMP;

追问

是啊,J2131_Z_J213_R_TMP不是一张物理表么,我感觉也很奇怪. 你说的语法好像有点问题:

 begin

      truncate table J2131_Z_J213_R_TMP

INSERT INTO J2131_Z_J213_R_TMP(

pl/sql提示:

追答

少写了一个分号

本回答被提问者采纳
参考技术B 和plsql没什么关系,和你写的程序以及你要完成的功能有关系。追问

麻烦帮忙看下,存储过程完全不懂,上面是连接

以上是关于oracle存储过程中if条件后的sql没有执行的主要内容,如果未能解决你的问题,请参考以下文章

VB调用SQL存储过程异步执行问题

sql 存储过程如何动态拼接where后面的条件

oracle 用if sqlcode != 0 来判断sql语句是不是成功 sqlserver 存储过程 怎样判断一条sql语句执行成功了没有

oracle储存过程中,if条件为某变量不等于1,怎么写

oracle存储过程

oracle if 后可以给多个条件不?