0

ここで何かが欠けているのではないかと思います。トリガーの関連部分は次のとおりです。

    CURSOR columnNames (inTableName IN VARCHAR2) IS 
       SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
    /* Removed for brevity */
    OPEN columnNames('TEMP');

そして、これが私が戻ってきたエラーメッセージです。

27/20 PLS-00306: 'COLUMNNAMES'のコールの引数の数またはタイプが間違っています
27/2 PL/SQL: ステートメントは無視されました

ドキュメントを正しく理解している場合はうまくいくはずですが、そうではないので、何か間違ったことをしているに違いありません。何か案は?


@ Matthew - 私は助けに感謝しますが、私が混乱している理由は、このコードがうまく機能せず、参照されているエラーが発生しているためです。データベースには他のトリガーがあり、コードはほぼ同じなので、それが私が間違っていたのか、トリガーを保存しようとしている方法などにあるのかはわかりません.


@ Matthew - さて、私は恥ずかしい思いをするようになりました。あなたが提供したコードをコピーして新しいトリガーに貼り付けたところ、うまくいきました。そこで、元のトリガーに戻って試してみたところ、エラー メッセージが再び表示されました。ただし、今回はトリガーから何かを削除し始め、この行を削除した後、

FOR columnName IN columnNames LOOP

物事はうまく保存されました。つまり、エラーがあると思っていた場所が、実際にはエラーではないことがわかりました。

4

2 に答える 2

2

問題の原因を明らかにするため。あなたが言うように

OPEN columnNames('TEMP');

働いている間

FOR columnName IN columnNames LOOP

しませんでした。FORステートメントは、次のようなパラメーターも含まれている場合は正常に機能します。

FOR columnName IN columnNames('TEMP')LOOP

行をフェッチする場所のコードを表示しないため、目的はわかりませんが、私が作業する場所では、最初の行(この場合は指定されたテーブルの最初の列名)をフェッチするためにOPENが一般的に使用されます。 FORは、返されたすべての行を反復処理するために使用されます。

@Robのコメント。コメントは許可されていないので、代わりにここで更新します。欠落しているパラメーターは、上記で説明したものです。FORループを削除しただけであるという応答を追加しました。当時、それを削除することが違いを生む理由を理解していたようには見えませんでした。必要に応じて、FORループの方が優れたソリューションになる可能性があるため、説明しようとしたのはそのためです。

于 2008-09-16T22:10:22.757 に答える
1

私にとってはうまくいきます。

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

anonymous block completed
于 2008-09-04T14:22:55.993 に答える