2017-05-29 26 views
0
declare 
    v_title movie.title%type; 
    v_release movie.release_date%type; 
begin 
    for i in 121..500 loop 
     select a.title, a.release_date into v_title, v_release 
     from movie a 
     where a.running_time=i; 

     if a.genre_id=015 then 
      dbms_output.put_line(v_title|| ' '||v_release); 
     end if; 
    end loop; 
end; 
/

titleまたはrelease_dateを認識しているときにgenre_idが認識されない理由を教えてください。私は自分のテーブルをチェックしていて、タイプミスはありません。テーブルにgenre_idが存在します。識別子は宣言する必要がありますか? PLS-00201

答えて

1

a.genre_idは、表中の列である。あなたがIFで、その後、PLSQLのために、それは有効な変数ではないことを使用している場合は/コードの

と仮定すると、残りの部分は正しいです、他の変数

declare 
    v_title movie.title%type; 
    v_release movie.release_date%type; 
    v_genre_id movie.genre_id%type; 
begin 
    for i in 121..500 loop 
     select a.title, a.release_date , a.genre_id into v_title, v_release , v_genre_id 
     from movie a 
     where a.running_time=i; 

     if v_genre_id=015 then 
      dbms_output.put_line(v_title|| ' '||v_release); 
     end if; 
    end loop; 
end; 
/
0

aを追加することのために定義されたテーブルの別名であり、クエリ:

select a.title, a.release_date into v_title, v_release 
    from movie a 
    where a.running_time = i; 

このクエリの外部には定義されていません。したがって、a.genre_idはわかりません。ジャンルをキャプチャしたい場合は、変数でキャプチャする必要があります。

1

変数v_genre_idを宣言して選択に追加することもできますが、はるかに高速な方法があります。あなたのコードは同じクエリを380回実行し、一度だけ実行する必要があります:

BEGIN 
    FOR cur IN (
    SELECT a.title, a.release_date 
     FROM movie a 
    WHERE a.running_time BETWEEN 121 AND 500 
     AND a.genre_id = 15 
    ORDER BY a.running_time 
) 
    LOOP 
    dbms_output.put_line(cur.title || ' ' || cur.release_date); 
    END LOOP; 
END; 
/
関連する問題