Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如果包含空值的列,则未找到提供数据的游标_Oracle_Plsql_Cursor - Fatal编程技术网

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;