如果子查询 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;
在 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;