2017-02-07 28 views
0

質問があります。動的な方法や関数を実行するためのPLSQLコードを作成しています。 私はこのように実行する要素のSQLを知るためにメタデータテーブルを使用しています。USING句PLSQLの動的パラメータ

プロセスいくつかのコードは、同様のブロック構築するために情報を回復するために:

V_COMMAND := 'BEGIN PROC_EX(:1,:2,:3,:4); END;'; 

をしかし、問題は、私は動的な方法をUSING句にバインド変数を必要とするので、コマンドが即時実行適用です。私はすべてのパラメータを格納するString変数を作成しようとしましたが、実行時にoraエラーORA-01008を受け取りました。

私は、ストレージのparamsへの一時的なVAR作成:

V_PARAMS := 'IN P_TABLE, IN P_WHERE, OUT O_MESSAGE, OUT O_CODE'; 

P_TABLEP_WHEREO_MESSAGEO_CODEが始まるコードで宣言された変数です。

そして、私はコマンドをこのように実行:

EXECUTE IMMEDIATE V_COMMAND USING V_PARAMS; 

はそれが句を使用して動的な方法の可能なマッピング変数ですか?

+0

おかげで、私は、コードのスタイルにテキストを変更しない方法を知りません。 – rbarbalho

答えて

1

あなたは、あなたのニーズに合った使い方のDBMS_SQL

例を探しています:編集私の質問のための

CREATE OR REPLACE PROCEDURE foo (n NUMBER, square OUT NUMBER) IS 
     BEGIN square := n * n; END;/ 

     CREATE OR REPLACE PROCEDURE bulk_plsql 
     (n DBMS_SQL.NUMBER_TABLE, square OUT DBMS_SQL.NUMBER_TABLE) IS 
     c NUMBER; 
     r NUMBER; 
     BEGIN 
     c := DBMS_SQL.OPEN_CURSOR; 
     DBMS_SQL.PARSE(c, 'BEGIN foo(:bnd1, :bnd2); END;', DBMS_SQL.NATIVE); 
     DBMS_SQL.BIND_ARRAY(c, 'bnd1', n); 
     DBMS_SQL.BIND_ARRAY(c, 'bnd2', square); 
     r := DBMS_SQL.EXECUTE(c); 
     DBMS_SQL.VARIABLE_VALUE(c, 'bnd2', square); 
    END; 
    /
+0

あなたの答えをありがとう。 – rbarbalho