1

入力
パッケージ名 (IN)
プロシージャー名 (または関数名) (IN)
整数で索引付けされたテーブル。プロシージャー (IN/OUT) の実行に使用される値が含まれます。

たとえば
、以下の手順を実行するとします。

utils.get_emp_num(emp_name IN VARCHAR
                  emp_last_name IN VARCHAR
                  emp_num OUT NUMBER
                  result  OUT VARCHAR);

作成するプロシージャには、入力として次のものがあります。

package_name = utils
procedure_name = get_emp_num
table = T[1] -> name
        T[2] -> lastname
        T[3] -> 0   (any value) 
        T[4] -> N   (any value)

run_procedure(package_name,
              procedure_name,
              table)

メイン プロシージャは、入力で設定されたものと同じテーブルを返す必要がありますが、プロシージャの実行結果が含まれます。

table =  T[1] -> name
         T[2] -> lastname
         T[3] -> 78734 (new value)
         T[4] -> F     (new value)

何か考えはありますか?

4

2 に答える 2

1

EXECUTE IMMEDIATE で実現できます。基本的に、次の形式の SQL ステートメントを作成します。

sql := 'BEGIN utils.get_emp_num(:1, :2, :3, :4); END;';

次に、それを実行します。

EXECUTE IMMEDIATE sql USING t(1), t(2), OUT t(3), OUT t(4);

ここで、注意が必要な部分があります。パラメーターの数と IN/OUT の組み合わせごとに、個別の EXECUTE IMMEDIATE ステートメントが必要です。パラメータの数とその方向を把握するには、最初に ALL_ARGUMENTS テーブルをクエリする必要があります。

テーブル要素ごとに個別のバインド引数ではなく、テーブル全体をバインド引数として渡すことで、単純化できる場合があります。しかし、私はあなたがそれをどのように行うかを完全には理解していません。

次に考慮すべきこと: 使用するテーブル T の要素には、VARCHAR、NUMBER などの型があります。そのため、数値と文字列の両方を持つ現在の混合は機能しません。

ところで: とにかく、なぜそのような動的な呼び出しメカニズムが必要なのですか?

于 2013-09-19T20:46:01.993 に答える
0

all_arguments テーブルから、argument_name、data_type、in_out、および position を取得します。

PLSQL ブロックを構築する

DECLARE
    loop over argument_name and create the declare section
    argument_name data_type if in_out <> OUT then := VALUE OF THE INPUT otherwise NULL
BEGIN

--In the case of function create an additional argument 
function_var:= package_name.procedure_name( loop over argument_name);

--use a table of any_data, declare it as global in the package

if function then
    package_name.ad_table.EXTEND;
    package_name.ad_table(package_name.ad_table.LAST):= function_var;
end if

--loop over argument_name IF IN_OUT <> IN
package_name.ad_table.EXTEND;
package_name.ad_table(package_name.ad_table.LAST):= 

if data_type = VARCHAR2 then := ConvertVarchar2(argument_name)
else if NUMBER then ConvertNumber 
else if DATE then ConvertDate
...

END;

結果はテーブルに格納されます。値を取得するには、Access* 関数を使用します

于 2013-10-10T08:22:38.917 に答える