Oracle 如果包含空值的列,则未找到提供数据的游标
我有一个游标定义为Oracle 如果包含空值的列,则未找到提供数据的游标,oracle,plsql,cursor,Oracle,Plsql,Cursor,我有一个游标定义为 CURSOR all_movie_nominations IS SELECT a.title, a.award_year,n.people_id FROM award a JOIN nominee n ON a.award_id = n.award_id WHERE n.movie_id
CURSOR all_movie_nominations IS SELECT a.title, a.award_year,n.people_id FROM award a JOIN
nominee n ON
a.award_id = n.award_id
WHERE n.movie_id = (SELECT movie_id FROM movie WHERE movie_name = movieName);
光标正在向右打开和关闭
在以下代码中使用光标作为
FETCH all_movie_nominations INTO award_title, award_year,nominee_people_id;
WHILE all_movie_nominations%FOUND LOOP
SELECT given_name, family_name INTO first_name, last_name FROM people WHERE people_id=nominee_people_id;
IF first_name = '' THEN
DBMS_OUTPUT.PUT_LINE('The Movie was nominated for '||award_title||' for the year '||award_year);
ELSE
DBMS_OUTPUT.PUT_LINE(first_name||' '||last_name||' was nominated for '||award_title||' for the year '||award_year);
END IF;
FETCH all_movie_nominations INTO award_title, award_year, nominee_people_id;
END LOOP;
现在光标定义中的属性n.people\u id
。此列包含某些行的空值
在执行上述代码时,我得到了正确的输出,但在输出的末尾出现了“NO_DATA_FOUND”异常
如果我从光标中排除n.people\u id
,我不会得到任何异常
对可能出现的问题有什么建议吗?我不确定会发生什么,我认为not_found异常是由内部select语句引发的:
IF nominee_people_id is not null THEN
SELECT given_name, family_name INTO first_name, last_name FROM people WHERE
people_id=nominee_people_id;
END IF;
我会尝试设置一个条件,检查被提名人的id是否不为空,以执行senetence
我希望它对你有用
Redgards我不确定会发生什么,我认为not_found异常是由内部select语句引发的:
IF nominee_people_id is not null THEN
SELECT given_name, family_name INTO first_name, last_name FROM people WHERE
people_id=nominee_people_id;
END IF;
我会尝试设置一个条件,检查被提名人的id是否不为空,以执行senetence
我希望它对你有用
Redgards除非这是关于学习使用游标的学生代码,否则在现实生活中你永远不会用这种方式编写代码。循环构造中的SQL语句是一个红色标志。因为您正在以这种方式使用大量(奖励数量)检索单个用户的微小select语句来敲打数据库。这意味着PL/SQL引擎必须多次切换到SQL引擎,从而导致相对昂贵的上下文切换。如果使用联接,或者在您的情况下使用外部联接,则可以将上下文切换的数量减少到一个 备选方案的示例(当然未经测试):
除非这是关于学习使用游标的学生代码,否则在现实生活中你永远不会用这种方式编写代码。循环构造中的SQL语句是一个红色标志。因为您正在以这种方式使用大量(奖励数量)检索单个用户的微小select语句来敲打数据库。这意味着PL/SQL引擎必须多次切换到SQL引擎,从而导致相对昂贵的上下文切换。如果使用联接,或者在您的情况下使用外部联接,则可以将上下文切换的数量减少到一个 备选方案的示例(当然未经测试):
谢谢,亚历克西斯,这正是问题所在。我只是把注意力集中在光标上,没有注意选择。谢谢亚历克西斯,这正是出问题的地方。我只是把注意力集中在光标上,没有注意到选择。谢谢你指出这一点。是的,这是用于学习目的的学生代码。谢谢你在这里分享这个问题。我将相应地更新我的程序。还有,我不知道我们可以在
dbms\u输出中做case
。Thanks@MukulGoel-您在上面的答案中看到的是a,与a相似,但不完全相同。分享并享受。@BobJarvis感谢您提供的信息Bob.:)谢谢你指出这一点。是的,这是用于学习目的的学生代码。谢谢你在这里分享这个问题。我将相应地更新我的程序。还有,我不知道我们可以在dbms\u输出中做case
。Thanks@MukulGoel-您在上面的答案中看到的是a,与a相似,但不完全相同。分享并享受。@BobJarvis感谢您提供的信息Bob.:)当被提名人id为空时,这不是例外情况。这完全是一个合理的理由。无论如何,谢谢你的意见。(欢呼)当被提名人id为空时,这不是例外情况。这完全是一个合理的理由。无论如何,谢谢你的意见。(干杯)
Hi you can opt for exception block for that if you want to ignore IF--END IF BLOCK;
BEGIN
SELECT given_name, family_name INTO first_name, last_name FROM people WHERE people_id=nominee_people_id;
EXCEPTION WHEN NO_DATA_FOUND THEN
dbms_output.put_line('no data found for '||nominee_people_id);
END;