如果子查询 returns 没有结果则引发错误

Raise an error if a subquery returns no result

在 DB2 中,如果子查询 returns 在合并和 raise_error 标量函数的帮助下没有结果,则可能会引发错误。但是如何在oracle中做到这一点?

到目前为止我检查了标量函数,但没有引发错误的函数。

db2 示例(注意:子查询需要替换为有意义的内容...):

SELECT 
    COALESCE(
        (SELECT 1 FROM SYSIBM.SYSDUMMY1 LIMIT 0), 
        RAISE_ERROR('70NUL', 'Value is missing')) 
FROM 
    SYSIBM.SYSDUMMY1;

更新 1:

该用例是关于在导出数百万条记录期间在另一个 table 中找到匹配值。这个想法是在没有匹配值的情况下引发错误,以便尽早检测到而不是事后检测到。

在 Oracle 中,您将使用类似的查询:

SQL> select coalesce((select dummy from dual where 1 = 2), 'Value is missing') result from dual;

RESULT
----------------
Value is missing

SQL> select coalesce((select dummy from dual where 1 = 1), 'Value is missing') result from dual;

RESULT
----------------
X

SQL>

我不会说 MS SQL 服务器所以我不能评论它。

您可以使用oracle的RAISE_APPLICATION_ERROR特性来解决您的问题。您可以声明一个过程并定义何时在该过程中引发异常。只需调用该过程来执行您的任务,只要您给定的条件满足,它就会引发错误。

详细了解请看trapping user defined exceptions section of oracle documentation with example.

您描述的方式听起来好像您需要根据 table 中存在的某些值来标记多条记录。如果 PLSQL 是一个选项,您可以只使用 no_data_found 异常:

invalid_data CONSTANT NUMBER := -70;
    
   DECLARE
     l_var NUMBER;
   BEGIN
     SELECT 1
       INTO l_var
       FROM dual
      WHERE 1 <> 1;
 
   EXCEPTION WHEN no_data_found THEN
     /* do your updating or error handling */  RAISE_APPLICATION_ERROR(invalid_data ,'Value is missing');
   END;

@Gnqz 解决方案的替代方案是围绕 raise_application_error() 结合 coalesce 编写用户函数包装器。

    CREATE OR REPLACE FUNCTION raise_error 
    RETURN NUMBER
    IS
    BEGIN 
        raise_application_error(-70, 'Mapping value is missing');
        RETURN(0); 
    END;

    select coalesce((select 5 AS result from dual fetch first 1 row only), raise_error()) AS result from dual;