【问题标题】:Second statement in begin block is not executedbegin 块中的第二条语句未执行
【发布时间】: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


【解决方案1】:

这应该做你想做的事

CREATE OR REPLACE FUNCTION GET_SOLVER_ID(
        username_in IN VARCHAR2)
    RETURN NUMBER
IS
    some_id NUMBER(19);
BEGIN
    BEGIN
        SELECT id
        INTO some_id
        FROM usr_solver
        WHERE username = username_in;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
        SELECT ID
        INTO some_id
        FROM USR_USER
        WHERE USER_TYPE = 'X';
    END;
    RETURN(some_id);
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多