0

テーブルの 1 つに行を挿入する手順があります。

プロシージャの INSERT の後、すべての行を別のテーブルに検索してから、2 番目のテーブルの挿入プロシージャを呼び出します。

だから私はうまくいくすべての最初の手順を持っています

P_INSERT_TABLE1

INSERT INTO TABLE1

...
COMMIT;

FOR record_po IN (SELECT C3, ...
                    FROM T_TABLE2
                    WHERE id = v_id)
LOOP
      P_INSERT_TABLE2(record_po.C3, ...);
END LOOP;

P_INSERT_TABLE2 のすべての「パラメータ」は VARCHAR2 であるため、各列の「to_char」は varchar2 ではありません。

P_INSERT_TABLE2(pi_id,
                      record_po.C3,
                      record_po.C4,
                      record_po.C5,
                      record_po.C6,
                      record_po.C7,
                      to_char(record_po.C8, 'DD/MM/YYYY');

ここで、pi_id は、VARCHAR2 の P_INSERT_TABLE1 の in パラメータの 1 つです。

だから今、私はこのエラーメッセージを持っています:

Erreur(357,1): PLS-00306: number or args types wrong in the call of P_INSERT_TABLE2

P_INSERT_TABLE2 がパラメーターを受け入れないのに、すべての適切な型が適切な順序で配置されている理由がわかりません。

" " のようなプロシージャを呼び出すと、次のようcall P_INSERT_TABLE2(...)なエラーが発生します。

Erreur(357,9): PLS-00103: Symbol "P_INSERT_TABLE2" instead one of this symbols :     := . ( @ % ; immediate Symbole ":=" 

create or replace
PROCEDURE P_INSERT_TABLE2 (
  pi_id          IN VARCHAR2
  ,pi_C3         IN VARCHAR2
  ,pi_C4         IN VARCHAR2
  ,pi_C5         IN VARCHAR2
  ,pi_C6         IN VARCHAR2
  ,pi_C7         IN VARCHAR2
  ,pi_C8         IN VARCHAR2
  ,pmessage      OUT NOCOPY VARCHAR2  
) 

助けてくれてありがとう。

4

1 に答える 1

3

の宣言P_INSERT_TABLE2は無効です。5 つの入力パラメータをすべて という名前にすることはできませんpi_C4。そのプロシージャを作成してもコンパイル エラーが発生しないため、これは実際にコードに含まれているものではなく、ここに質問を投稿して導入されたバグであると推測します。

の宣言によるとP_INSERT_TABLE2、プロシージャは 7 つの入力パラメータと 1 つの出力パラメータを取ります。投稿したコードでは、7 つの入力パラメーターを渡しているように見えますが、出力パラメーターの変数を渡していません。次のようなものが必要なようです

P_INSERT_TABLE2(pi_id,
                record_po.C3,
                record_po.C4,
                record_po.C5,
                record_po.C6,
                record_po.C7,
                to_char(record_po.C8, 'DD/MM/YYYY'),
                <<some local variable for the output parameter>> );

DATE構文エラーを超えて、誰かが完全に良い を取得し、それを文字列にキャストしてから、それをプロシージャに渡すのを見ると、私は非常に疑わしくなります。これP_INSERT_TABLE2は、文字列を元に戻して日付に変換することを意味します。つまり、余分な作業を行って変換が失敗する可能性のある追加のポイントを導入したことを意味します。または、テーブルにデート。これらの意味はどちらも良くありません。

OUTという名前のパラメーターを持つプロシージャーについても非常に疑わしいですpMessage。これは、例外を適切に使用しておらず、コードでエラーが発生した場合に例外をスローするのではなく、エラー メッセージを返していることを意味する傾向があります。これは事実上常に、適切な例外を使用する場合よりもはるかに脆弱なコードになり、デバッグがはるかに困難になります。

于 2013-03-19T14:24:04.533 に答える