必须声明标识符? PLS-00201

时间:2017-05-29 11:03:36

标签: sql plsql

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存在于表格中。

3 个答案:

答案 0 :(得分: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;
/ 

答案 1 :(得分: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;
/

答案 2 :(得分:0)

a是为查询定义的表别名:

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

未在此查询之外定义。因此,a.genre_id不被理解。如果你想捕捉类型,你需要在变量中捕获它。