2017-05-29 54 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; 
/

您能否告訴我爲什麼它在識別標題或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; 
/
相關問題