【发布时间】:2017-06-19 13:38:39
【问题描述】:
我在Oracle中写了这个存储过程:
CREATE OR REPLACE FUNCTION GET_SOLVER_ID(username_in IN VARCHAR2)
RETURN NUMBER
IS
solver_id number(19);
system_user_id number(19);
BEGIN
SELECT id
INTO solver_id
FROM usr_solver
WHERE username = username_in;
select ID into system_user_id from USR_USER where USER_TYPE = 'X';
solver_id := nvl(solver_id, system_user_id);
RETURN(solver_id);
END;
当我使用表 usr_solver 中不存在的用户名调用函数时,结果为 null。我希望得到 system_user_id。
似乎 begin 块中的其他 select 语句和 nvl 函数没有执行。
你能帮忙吗,我看不出原因......
谢谢,
错别字
【问题讨论】:
-
如果用户名不存在,您的第一个选择将引发 NO_DATA_FOUND 异常,第二个选择将不会运行。您需要捕获该异常并适当地处理它。
-
我很惊讶您没有收到
ORA-01403: no data found异常。 -
@Nitish 如果在 select 语句中调用函数,他们不会这样做。
-
Tony Andrews 完全正确:如果 SELECT 语句不返回任何行,则第一个 SELECT ... INTO ... 会导致错误。并且当在 SELECT 语句中调用该函数时,该错误不会出现在 SQL 语句中(Oracle 一定有这种奇怪行为的原因)。在这种情况下,比引发错误更好的是在代码本身中处理这种可能性。
标签: oracle stored-procedures plsql