0

重複の可能性:
動的テーブル名を持つテーブルへの UPSERT

次のプロシージャは、次のように宣言されています。

CREATE OR REPLACE  
PROCEDURE STUFF(tableToQuery VARCHAR2) AS  
BEGIN  
    MERGE INTO myTable m  
    USING (select * from tableToQuery)  t  
    ON (m.id = t.id)  
...  --other stuff
END STUFF;

テーブル名が無効であることを示す ORA-00903 エラーが表示されます。tableToQuery私の質問は、選択ステートメントの有効なテーブル名と同等の値を取得するにはどうすればよいですか? テーブル名が事前にわからないと仮定します。

アップデート

関数は現在コンパイルされていますが、現在、関数の最後に不明なキーワード エラーが表示されます。

4

1 に答える 1

3

動的SQLを使用する必要があります。つまり、SQLステートメントを文字列で作成し、その文字列をOracleに渡して、execute immediateステートメントを使用して実行します。

何かのようなもの

CREATE OR REPLACE  
PROCEDURE STUFF(tableToQuery IN VARCHAR2) AS
  s varchar2(100);
BEGIN
  s := 'MERGE INTO myTable m'
    || ' USING (select * from ' || tableToQuery || ')  t'
    || ' ON (m.id = t.id)';
  EXECUTE IMMEDIATE s;
  --other stuff
END STUFF;

あなたのためにトリックをする必要があります。

注意:エンドユーザー(特にWeb上のデータ)からの未確認のデータをパラメーターに渡さないでくださいtableToQuery。SQLインジェクションの脆弱性が発生します。

于 2012-07-24T14:35:04.327 に答える