2016-03-25 49 views
0

請檢查我的程序。當我嘗試將字符串傳遞給過程時出現錯誤。如果我傳遞數字,它工作正常。PLS-00201:標識符 'd' 必須聲明爲

DECLARE 
    x number(2); 
    name varchar2(333); 
    PROCEDURE hello(id IN OUT Number, name in varchar2) 
    IS 
     i number(2):= 1; 
     mName varchar2(3000):='jjjj'; 
    BEGIN 
     dbms_output.put_line('This line is in procedure'); 
     while i < id 
     loop 
      mName:= '' || ' ohlla';   
      dbms_output.put_line('Id is ' || i || ' name ' || mName); 
      i:=i+1; 
     end loop; 
    END; 
BEGIN 
    x := &id; 
    name:= &somename; 
    hello(x, name); 
    dbms_output.put_line('Last line is id= ' || x || ' Finished '); 

END; 
/

回答

2

您在分配給字符串變量時缺少引號;請嘗試:

name:= '&somename'; 

這樣它可以使用數字ID和文字名稱;如果你需要的文字標識,你需要改變變量x的類型和分配給x添加引號了。

0

的首選解決方案是使你的代碼通過Aleksej建議的改變(加引號& somename的分配)。

解決方法,如果您無法更改過程(例如,如果您不擁有該過程,或者其他過程可能依賴於此過程並且如果進行更改可能會中斷,則可能需要該解決方法 - 即使的變化是爲了使這個過程更好)是將字符串傳遞給過程WITH QUOTES,像這樣:

SQL>爲& somename輸入值:

替換變量'取代瑪麗逐字,因此您需要varchar2的引號(在一個且只有一個地方,無論是在代碼中還是在在過程之外賦值給替代變量& somename)。

這是你寫的實際過程或您使用它只是作爲一個例子嗎?我問,因爲我沒有看到你在內部程序中使用輸入變量「name」的位置。

並澄清錯誤消息:如果您傳遞瑪麗(不帶引號),當編譯到達違規賦值時,編譯器會假定瑪麗是另一個變量的名稱(因爲不是字符文字)。但它知道沒有名爲mary的變量,所以它引發了你看到的異常。編譯器不會正確猜測實際錯誤是什麼(缺少引號)。

相關問題