PLS-00306 カーソルの呼び出し時にエラーが発生しました
質問
ここで何かが欠けているかもしれないと思います。トリガーの関連部分は次のとおりです。
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: wrong number or types of arguments in call to 'COLUMNNAMES' 27/2 PL/SQL: Statement ignored
ドキュメントを正しく理解していればうまくいくはずですが、そうではないので、何か間違ったことをしているに違いありません。何か案は?
@マシュー - 助けには感謝しますが、私が混乱しているのは、この部分のコードが機能せず、参照されているエラーが発生しているためです。データベースには他のトリガーもあり、そのコードはほぼ同じなので、何か間違ったことをしたのか、それともトリガーの保存方法に問題があるのかなどわかりません。
@マシュー - そうですね、恥ずかしくなってきました。提供されたコードをコピーして新しいトリガーに貼り付けましたが、正常に動作しました。そこで、元のトリガーに戻って試してみると、再びエラーメッセージが表示されました。ただし、今回はトリガーから内容を削除し始め、この行を削除した後、
FOR columnName IN columnNames LOOP
物事はうまく保存されました。つまり、エラーがあると思っていた場所が、実際にはエラーではなかったことがわかりました。
解決
@ロブ
ここにあるコードをカットアンドペーストすると機能しますか?
コードをどこでどのように呼び出していますか?それはトリガーの中ですよね?
ここに書いたクエリは、実際にエラーを生成するコード、または単なる例です(たとえば、上記のクエリでエラーを再現できますか)。
他のヒント
問題の原因を明確にするため。あなたが述べているように
OPEN 列名('TEMP');
働きながら
FOR 列名 IN 列名 LOOP
しなかった。FOR ステートメントは、次のようなパラメーターも含まれていれば正常に機能します。
FOR 列名 IN 列名('TEMP') ループ
行をフェッチするコードが示されていないため、目的はわかりませんが、私が作業している場所では、OPEN は最初の行 (この場合は、指定されたテーブルの最初の列名) をフェッチするために一般的に使用されます。 FOR は、返されたすべての行を反復処理するために使用されます。
@ロブのコメント。コメントすることはできないので、代わりにここで更新します。不足しているパラメータは上で説明したものです。FOR ループを削除しただけであるという応答を追加しました。当時、あなたはそれを削除することがなぜ変化をもたらすのか理解していないようでした。必要に応じて、FOR ループの方がより良い解決策になる可能性があるため、私が説明しようとしたのはこのためです。
私にとってはうまくいきます。
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