Oracle 未执行begin块中的第二条语句
我在Oracle中编写了以下存储过程: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
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必须有其这种奇怪行为的原因)。在这种情况下,最好是在代码本身中处理这种可能性。