如题,我的一个方法需要调用别人的存储过程,但是报错了ORA-20001:ORA-01002:提取违反顺序。然后我去网上查了下,是因为便利游标的时候,有插入语句的同时,有commit或者rollback.然后我就去查了,确实是insert的时候,报错了,导致调用了rollback,但是我看不出来这个insert哪里有问题。能像java那样在控制台打印吗
如题,我的一个方法需要调用别人的存储过程,但是报错了ORA-20001:ORA-01002:提取违反顺序。然后我去网上查了下,是因为便利游标的时候,有插入语句的同时,有commit或者rollback.然后我就去查了,确实是insert的时候,报错了,导致调用了rollback,但是我看不出来这个insert哪里有问题。能像java那样在控制台打印吗
应该不是insert语句本身的问题,像下面的例子,循环中第一次commit之后,再执行隐式游标的FETCH动作取下一条记录,就会出现ORA-01002的错误
create or replace procedure SP_TEST is
begin
FOR test1_row IN (SELECT * FROM test1 FOR UPDATE)
LOOP
UPDATE test1
SET uname = uname || '*'
WHERE id = test1_row.id;
COMMIT;
END LOOP;
end SP_TEST;
在存储过程中写的就是SQL语句,不需要再打印了吧,变量可以用DBMS_OUTPUT.PUT_LINE()输出查看。
15 回答6.9k 阅读
2 回答3.3k 阅读✓ 已解决
3 回答7k 阅读✓ 已解决
3 回答3.1k 阅读✓ 已解决
5 回答4.7k 阅读
3 回答5.1k 阅读
4 回答2.3k 阅读
sql本身没问题,但可能是数据的问题,比如字段过长,类型不匹配,必填项缺失等
1.优先检查你的sql逻辑
1.存储过程循环插入的时候,建议将sql的自动提交关闭,避免commit和insert的冲突
2.如果是插入数据不合规的情况导致rollback,可以查看数据库日志,或者执行的sql历史,同时加入Exception,用于处理实际执行中出问题的情况,并输出相关信息,同时可以使用RAISE_APPLICATION_ERROR,这样JAVA调用的时候,可以通过catch SQLException来看