質問

すべて、

私は一般にストアドプロシージャは初めてですが、特にOracleのストアドプロシージャと格闘しています。私が達成しようとしていることの非常に単純な例を作成しましたが、この簡易バージョンでも同じエラーが発生します。

ストアドプロシージャの例は次のとおりです。

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

CALL ashish_test()を使用して上記のストアドプロシージャを呼び出すと、次のようになります:

エラーメッセージhttp://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

この記事(例7-1を参照)、 USING キーワードは、 v_strSQL 内の番号付きプレースホルダー(:1 )を保存されている値に置き換える必要があります v_tab で。ただし、無効なテーブルエラーが発生し続けます。 EXECUTE IMMEDIATE が何らかの理由でプレースホルダーを値に置き換えることができないためだと思いますが、なぜそうなのかわかりません。ここでバカなことをしているかどうかは誰にもわかりますか?

これをOracle 10gデータベースで実行しています& PL / SQL Developerを使用します。

役に立ちましたか?

解決

USING句は、テーブル名ではなくバインド変数(つまり、selectステートメントで列名を使用する場所)専用です。典型的な使用法は次のようになります。

Select col1 from table1 where col2 = :a

変数テーブル名を使用する場合は、次のようなものを使用します。

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top