【问题标题】:SQL Developer not failing on stored procedure errorSQL Developer 未因存储过程错误而失败
【发布时间】:2021-10-18 16:48:06
【问题描述】:

我有一个存储过程,里面有一个查询

v_sql : = 'select col1 from table1 where col2 = ' || inputArg1;
execute immediate v_sql into tempCol;

通过 jdbc 调用调用存储过程时,当上述查询返回 0 条记录时,它会失败并返回错误 ORA-01403: no data found.

但是,当我从 sqldeveloper 或 sqlplus 执行相同的存储过程时,没有出现相同的错误。我可以传递任何设置(sqldeveloper)或参数(sqlplus)来显示此类错误吗?

【问题讨论】:

  • 两个客户端都会抛出异常,除非您使用 when others 捕获来抑制它。你是如何执行它的?你确定你在调用同一个过程 - 在同一个模式中 - 并且一直访问同一个表吗?

标签: oracle jdbc plsql oracle-sqldeveloper sqlplus


【解决方案1】:

如果此代码是您真正执行的(除了修改的表和列名),那么您不需要动态 SQL,因为这里没有任何动态。等于

select col1 
  into tempCol
  from table1
  where col2 = inputArg1;

你问

我可以传递任何设置 (sqldeveloper) 或参数 (sqlplus) 来显示此类错误吗?

如果这意味着您希望通过 ORA-01403 (no_data_found) 使过程失败,则很容易 - 传递 col2 列中不存在的值。例如(基于 Scott 的示例模式):

SQL> create or replace procedure p_test (inputArg1 in number) is
  2    tempCol number;
  3  begin
  4    select sal
  5      into tempCol
  6      from emp
  7      where empno = inputArg1;
  8  end;
  9  /

Procedure created.

传递存在的empno(它是Smith):

SQL> exec p_test(7369);

PL/SQL procedure successfully completed.

传递无效empno

SQL> exec p_test(-1);
BEGIN p_test(-1); END;

*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at "SCOTT.P_TEST", line 4----
ORA-06512: at line 1


SQL>

最后:因为过程在 SQL Developer 中可以正常工作,但不能通过 JDBC,是吗

  • 连接到同一个数据库中的同一个用户(你应该有,否则你不能指望它产生相同的结果)(正如 Alex 评论的那样)
  • 如果您刚刚创建了table1 表和/或在其中插入了行,您是否提交?如果没有,只有您当前的会话才能看到这些行。 JDBC 是“另一个”会话,在您提交之前什么都看不到。

【讨论】:

  • “等于” - 除非您将 SQL 注入作为值传递。如果它需要是动态的,它应该使用绑定变量:execute immediate v_sql into tempCol using inputArg1
  • 我必须动态构建查询,所以我按照原帖中提到的方式构建它。我保持简单,以便在此处发布。当我使用 call 而不是 exec(sqldeveloper 或 sqlplus)调用存储过程时,不会出现错误。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多