0

myProc(variable varchar2); というプロシージャがあるとします。

それから私はそれを呼びます:

exec myProc(actionVariable);

プロシージャ myProc で「actionVariable」を文字列として取得する方法はありますか? したがって、プロシージャを別の方法で使用すると、次のようになります。

exec myProc(anotherVariable);

プロシージャ myProc で「anotherVariable」を文字列として取得します。

ありがとう。「select argument_name from user_arguments ....」で元の変数名を取得できることがわかりました。

4

1 に答える 1

1

呼び出し元が渡した変数に割り当てた名前を特定することはできません (私の知る限り、PL/Scope で何かをハッキングできるかもしれませんが、それは恐ろしいことです)。

必要なバリエーションの数に応じて、3 つのオプションが表示されます。あなたのコメントから、名前がプロシージャがどのテーブルに対して機能するかに影響を与えるということはあまりないと思います。

変数名または関心のあるビットを別のパラメーターとして渡すことができます。

procedure myProc(variable varchar2, variable_name varchar2) ...
exec myProc(varIDShop, 'Shop');

各バリアントのラッパー プロシージャを使用して、少し工夫することができます。

procedure myProc(variable varchar2, variable_name varchar2) ...
procedure myProcShop(variable varchar2) is
begin
  myProc(variable, 'Shop');
end;
/
exec myProcShop(varIDShop);

...そのため、呼び出しは、呼び出す関連するラッパー関数を選択するだけで済みます。

または、バリアントごとに 1 つずつ、複数の変数を宣言し、関連するものだけを設定することもできます。

procedure myProc(shop_variable varchar2, office_variable varchar2, ...) ...
exec myProc(shop_variable => varIDShop);

...そして、プロシージャ内で設定されているものをテストします。

最後の 2 つはどちらも、呼び出しに引数が 1 つしかないことを意味しますが、もう少し複雑であり、間違った変数名またはプロシージャ名を使用する可能性があります (カット アンド ペースト エラー)。最初もそうだと思いますが。

ただし、呼び出し元で変数名を直接使用するものはありません。しかし一方で、変数をまったく宣言することなく、文字列リテラルを渡すだけで、テストなどのためにそれらのいずれかを呼び出すことができます。

exec myProc('Tesco', 'Shop');
exec myProc(shop_variable => 'Sainsbury');
exec myProcShop('Asda');
于 2013-10-09T09:40:29.340 に答える