2016-03-25 28 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とリテラル名で動作します。リテラルIDが必要な場合は、変数xのタイプを変更し、割り当て内の引用符をxに追加する必要があります。

0

あなたのコードでAleksejによって提案された変更を行うことをお勧めします(割り当て内に& somenameを引用符で囲みます)。

プロシージャを変更できない場合(たとえば、自分が所有していない場合や、他のプロシージャがこのプロシージャに依存する可能性があり、変更した場合に破損する可能性がある場合など)変更)は、より良い、この手順を行うことがあるので、同じように、引用符でプロシージャに文字列を渡すことです:

SQL>を& somenameのために値を入力します:「メアリー

置換変数が置換されています逐語的なので、varchar2の引用符が必要です(コード内または置換変数& somenameへの代入、手順外)。

これはあなたが書いた実際の手順ですか、まさに例として使用していますか?内部の手続きで入力変数 "name"をどこで使用しているかわからなかったので私は尋ねます。

エラーメッセージを明確にするために、次のようにします。mary(引用符なし)を渡すと、コンパイルが問題の割り当てになると、コンパイラはmaryを別の変数の名前とみなします(文字リテラルではないため)。しかし、それはmaryという名前の変数がないことを知っているので、あなたが見た例外が発生します。コンパイラは実際のエラーが何であるかを正確に推測しません(引用符がありません)。