2

私は次のように手順を作成しました

 create or replace procedure "GETCUSTNAMEZZz"
(cust_identifier1 IN NVARCHAR2(10))
is
begin
DBMS_OUTPUT.PUT_LINE (FNAME || ' ' || LNAME FROM customer WHERE  cust_id=cust_identifier1)
end;

次に、プロシージャを呼び出してみます

BEGIN

GETCUSTNAMEZZz('C2')  ;  


END;

この sql は、識別子 'GETCUSTNAMEZZZ' を宣言する必要があるというエラーを表示します ORA-06550: 行 3、列 5: PL/SQL: ステートメントは無視されました"

これは私が作成した正確な手順であり、パラメーターは正しいです。

識別子を正確に宣言するにはどうすればよいですか??

前もって感謝します。

4

2 に答える 2

8

「識別子を宣言する必要があります」というエラーの理由は、大文字と小文字の区別です。

通常、Oracle 識別子は自動的にすべて大文字に変換されますが、二重引用符で囲むと大文字と小文字が保持されます。したがって、この:

create or replace procedure "GETCUSTNAMEZZz"

これは、正確な名前「GETCUSTNAMEZZz」でプロシージャを作成します。

create or replace procedure GETCUSTNAMEZZz

正確な名前「GETCUSTNAMEZZZ」(すべて大文字)のプロシージャを作成します。

プロシージャを呼び出すときに引用符を使用していません。「GETCUSTNAMEZZz」として作成したため、存在しない「GETCUSTNAMEZZZ」を探しています。

原則として、二重引用符を完全に避けることをお勧めします。二重引用符は、この種の混乱を引き起こすだけで、あまりメリットがありません。悲しいことに、コードを生成するための多くのツールは、それらをあらゆる場所に貼り付けたいと思っています。

(これは文字列値ではなく識別子に関するものであることに注意してください。文字列値(「これは文字列です」など)や変数(VARCHAR2型の変数など)を比較する場合、大文字と小文字は常に重要です。)

于 2013-05-06T20:27:07.963 に答える
2

このプロシージャはコンパイルされません。したがって、呼び出すことはできません。また、追加SET SERVEROUTPUT ONしないと表示されませんDBMS_OUTPUT.PUT_LINE

別の変数SELECTを表示したいでしょう。INTOその後、複数の結果が得られた場合でも失敗する可能性があります。そのため、カーソルを使用することをお勧めします。

create or replace procedure GETCUSTNAMEZZz
(cust_identifier1 IN NVARCHAR2(10))
is
begin
  for c in (SELECT FNAME || ' ' || LNAME as flname FROM customer WHERE  cust_id=cust_identifier1) 
  loop 
    DBMS_OUTPUT.PUT_LINE (c.flname);
  end loop;
end getcustnamezzz;

次に、で実行できます

set serverouput on
BEGIN
  GETCUSTNAMEZZz('C2')  ;  
END;

編集: Dave Costa が、引用符によって実際にはプロシージャ名の大文字と小文字が区別されることを指摘したことに言及する価値がありますが、Oracle は通常、すべてを自動的に大文字に変換し、これが機能しなかった理由でもあります。

于 2013-05-06T19:53:54.453 に答える