2012-03-25 32 views
7

這是我寫的程序:標識符必須聲明? PL/SQL錯誤

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」必須聲明,但其在表中的值!爲什麼要聲明,但如果它在上面的程序中給出,它不會給出錯誤。相反,它會重複最後一行兩次!

回答

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行的下方。

+0

謝謝你,是的,我注意到它,並改變了它;) – LoveMeow 2012-03-25 08:56:51

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值containiing的''a'

我從SQL * Plus嘗試上面的代碼和它的作品


發生什麼事是你把後&designationa(不')您的代碼如下所示:

r:=a; 

因爲沒有標識a它引發了異常

+0

非常感謝你!它的工作;) – LoveMeow 2012-03-25 08:55:43

相關問題