【问题标题】:Identifier must be declared? PL/SQL error必须声明标识符? PL/SQL 错误
【发布时间】:2012-03-25 07:48:17
【问题描述】:

这是我写的程序:

set serveroutput on;
declare
  b empl.name1%type;
  r varchar;   --can i change this to r empl.designation%type; ?
begin
  r:=&designation;                      --getting input for the designation
  dbms_output.put_line('hello');            --random output to check for errors
  select name1 into b from empl where designation=r;   --i want all the names from the table
  dbms_output.put_line('name'||b);                   --employee where designation is as entered
  dbms_output.put_line(' closed');                 --by user,should i loop this statement?
end;

当我输入名称为“a”(已在表中输入)时,我收到一个错误 identifier 'a' is not declared。这意味着什么? 选择语句一次占用一行吗?所以如果我循环它会得到所有的行吗?或者我应该使用光标? 为什么 SQL Developer 不接受%rowtype

我把我的程序改成了这样:

set serveroutput on;
declare
  cursor cempl is select name1,designation from empl;
  b empl.name1%type;
  des empl.designation%type;
  r empl.designation%type;
begin
  r:='meow';
  dbms_output.put_line('hello');
  open cempl;
  if cempl%ISOPEN then
    loop
      fetch cempl into b,des;
      if des=r then
        dbms_output.put_line('name'||b);
      end if;
      exit when cempl%notfound;
    end loop;
    close cempl;
    dbms_output.put_line(' closed');
  end if;
end;

每当我收到r:=&r 之类的输入并想象我输入“a”时,它都会显示 必须声明标识符“a”,但它是表中的值!为什么要声明它,但如果它在上面的程序中给出,它不会给出错误。相反,它重复最后一行两次!

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这里有几个问题需要回答:

    • “未找到标识符”错误:&designation 是 SQL*Plus 替换变量。当您输入&designation 的值时,SQL*Plus 将&designation 替换为您输入的文本。所以,如果你输入值a,那一行

      r:=&designation;
      

      变成

      r:=a;
      

      出现错误是因为 Oracle 不知道任何名为 a 的内容。您还没有声明一个名为a 的变量,并且没有一个过程或函数或任何其他名称为a 的东西。如果您希望最终结果为r:='a';,则需要编写r:='&designation';

    • SELECT ... INTO ... 仅在查询恰好返回一行时才有效。如果没有返回任何行,您将收到no data found 错误,如果返回多行,您将收到too many rows 错误。如果您知道只有一个结果,您应该只使用SELECT ... INTO ...。如果可能有多个结果,则应使用游标。

    • '为什么 SQL Developer 不接受%rowtype'?应该可以 - 你能想出一个给你带来问题的例子吗?

    • 在您的第二个示例中,您将重复最后一行,因为您没有在光标找不到更多行后立即退出循环。您应该将exit when 行移到fetch 行的正下方。

    【讨论】:

      【解决方案2】:

      查看了你的第一个脚本:

      set serveroutput on;
      declare
        b empl.name1%type;
        r empl.designation%type;   -- made a change here 
      begin
        r:='&designation';                      --made a change here
        dbms_output.put_line('hello');            
        select name1 into b from empl where designation=r;   
        dbms_output.put_line('name'||b);                  
        dbms_output.put_line(' closed');                 
      end;
      
      1. 如果您将 r 声明为 varchar2 那么您需要设置长度,即-varchar2(32)
      2. 当您为 r 赋值时,它需要包含 ',因此您可以将其放入脚本中(如上面的代码中所示,或者您可以为 designation 分配一个包含 ' 的值,例如如'a'

      我从 sql*plus 尝试了上面的代码,它可以工作


      当你把a 换成&designation(没有')之后,你的代码会变成这样:

      r:=a;
      

      因为没有标识符 a 它会触发异常

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多