sql - 在错误抛出的上下文中 oracle 调用和执行之间的区别

标签 sql database oracle plsql

我有一些用 Oracle 编写的程序。不幸的是我无法显示它的代码。它里面的某个地方是 select 由于缺少所需数据而导致执行崩溃的地方。看起来像这样

select value into l_value
        from config
       where code = upper(p_code);

所以当我这样调用这个过程时(在 SqlDeveloper 中)

execute some_package.some_procedure('CODE');

它抛出

Error report -
ORA-01403: no data found
ORA-06512: at "XXXXXXXXXXXXXXXXXXX", line 111
ORA-06512: at "XXXXXXXXXXXXXXXXXXX", line 111
ORA-06512: at line 1
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.

但是当我这样调用它的时候

call some_package.some_procedure('CODE');

它在同一个地方崩溃(正如我从结果中建议的那样,存储在数据库中),但它不会抛出异常。

some_package.some_procedure('CODE') succeeded.

会发生什么?为什么会有这样的差异?

最佳答案

NO_DATA_FOUND异常行为是特殊的。它默认在 SQL 上下文中处理,但在 PL/SQL 中不处理。在 SQL 中,没有找到数据不被认为是错误,一直都在发生没有满足特定条件的数据。

CALL是 SQL 命令,而 EXECBEGIN <code> END; 的快捷方式这是 PL/SQL。

关于sql - 在错误抛出的上下文中 oracle 调用和执行之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34089573/

相关文章:

oracle - PL/SQL 创建带有检查约束参数的函数

java - 关于可序列化事务的一些疑问?

php - 这与 sql_mode=only_full_group_by 不兼容

Mysql - 汇款 : Transfer data from one field to another in the same table

mysql - 如何更新 mysql 文件中指定的用户?

mysql - 将列与条件相加并显示在行中

MySQL 在插入时自动增加第二列中的复制值

sql - 在 Visual C# 中连接到 SQL Server

SQL Server、LINQ-to-SQL 和表示容器类中的多个组件

java - 如何使用 TO_DATE 将 Oracle 中的变量转换为日期类型