Oracle 未执行begin块中的第二条语句

Oracle 未执行begin块中的第二条语句,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我在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 s

我在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。我希望获得系统用户id。
似乎begin块中的另一个select语句和nvl函数没有执行。
你能帮忙吗,我不明白为什么

谢谢,

不匹配

这应该可以满足您的需要

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;

如果用户名不存在,第一次选择将引发“未找到数据”异常,第二次选择将不会运行。您需要捕获该异常并进行适当处理。我很惊讶您没有得到
ORA-01403:未找到任何数据
异常。@如果在select语句中调用该函数,则不会出现异常。Tony Andrews完全正确:第一个select。。。进入如果SELECT语句不返回任何行,则会导致错误。当在SELECT语句中调用该函数时,该错误不会引发到SQL语句中(Oracle必须有其这种奇怪行为的原因)。在这种情况下,最好是在代码本身中处理这种可能性。