必须声明标识符? PL / SQL错误

时间:2012-03-25 07:48:18

标签: oracle plsql

这是我写的程序:

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。那是什么意思? select语句一次只占一行吗?所以,如果我循环它将获得所有行?或者我应该使用光标? 为什么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',但它是表中的值!为什么要声明它,但如果它在程序中给出如上所述它不会给出错误。相反,它重复最后一行两次!

2 个答案:

答案 0 :(得分:8)

这里有几个问题要回答:

  • '未找到标识符'错误:&designation是SQL * Plus替换变量。输入&designation的值时,SQL * Plus会将&designation替换为您输入的内容。因此,如果您输入vaue 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行的正下方。

答案 1 :(得分:3)

看着你的第一个脚本:

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'
  3. 我从sql * plus尝试了上面的代码并且它可以正常工作


    a &designation '之后(没有r:=a; ),您的代码如下所示:

    a

    因为没有标识符{{1}},所以它会触发异常