怎么把存储过程的insert语句打印出来

如题,我的一个方法需要调用别人的存储过程,但是报错了ORA-20001:ORA-01002:提取违反顺序。然后我去网上查了下,是因为便利游标的时候,有插入语句的同时,有commit或者rollback.然后我就去查了,确实是insert的时候,报错了,导致调用了rollback,但是我看不出来这个insert哪里有问题。能像java那样在控制台打印吗
图片描述

阅读 3.8k
3 个回答

sql本身没问题,但可能是数据的问题,比如字段过长,类型不匹配,必填项缺失等

1.优先检查你的sql逻辑
1.存储过程循环插入的时候,建议将sql的自动提交关闭,避免commit和insert的冲突
2.如果是插入数据不合规的情况导致rollback,可以查看数据库日志,或者执行的sql历史,同时加入Exception,用于处理实际执行中出问题的情况,并输出相关信息,同时可以使用RAISE_APPLICATION_ERROR,这样JAVA调用的时候,可以通过catch SQLException来看

应该不是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()输出查看。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏