这是我写的程序:
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',但它是表中的值!为什么要声明它,但如果它在程序中给出如上所述它不会给出错误。相反,它重复最后一行两次!
答案 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;
varchar2(32)
'
,因此您可以将其放在脚本中(如上面的代码中所示,或者您可以将designation
分配给包含该值的值'
,例如'a'
我从sql * plus尝试了上面的代码并且它可以正常工作
在a
&designation
'
之后(没有r:=a;
),您的代码如下所示:
a
因为没有标识符{{1}},所以它会触发异常