7

未知の、しかし比較的少数の文字列/Varchar2 をパラメータとして処理できる PL/SQL プロシージャを作成しようとしています。Java での同等の方法は、Varargs を使用することです。

public void foo(String... bar) {
}

コレクションとレコードに関するOracle のドキュメントを見ると、連想配列を使用するのが適切な選択のように見えますが、確かではありません。

連想配列が正しい方法かどうか教えてください。

プロシージャへの呼び出しを呼び出すときに、匿名の連想配列を渡すことができる場合は?

ありがとう

4

2 に答える 2

11

少なくとも 3 つのオプションがあります。

  1. (標準) プロシージャーのパラメーターとして連想配列を使用する
  2. 「十分な」数のオプションの仮パラメータを定義する
  3. 区切り文字が定義された単一の varchar パラメータを使用する

サンプルコード 1.)

TYPE t_map IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);

CREATE OR REPLACE PROCEDURE demo_1 ( vararg IN t_map ) IS
BEGIN
   /* whatever */
   NULL;
END demo_1;

/* ... somewhere else ... */
my_var t_map;

my_var('first') := 'this';
my_var('next')  := ' is a ';
my_var('last')  := 'demo';

demo_1 ( my_var );
/* ... */

サンプルコード 2.) (最大 5 つのパラメーター)

CREATE OR REPLACE PROCEDURE demo_2 (
      vararg1 IN  VARCHAR2 DEFAULT NULL
    , vararg2 IN  VARCHAR2 DEFAULT NULL
    , vararg3 IN  VARCHAR2 DEFAULT NULL
    , vararg4 IN  VARCHAR2 DEFAULT NULL
    , vararg5 IN  VARCHAR2 DEFAULT NULL
) IS
BEGIN
   /* whatever */
   NULL;
END demo_2;

/* ... somewhere else ... */
demo_2 ( 'this', ' is a ', 'demo' );
/* ... */

サンプルコード 3.) (「;」である特殊な文字 - ペイロードデータ内で発生してはなりません)

CREATE OR REPLACE PROCEDURE demo_3 (
      vararg IN  VARCHAR2
) IS
   l_arg2 VARCHAR2(50);
   l_arg5 VARCHAR2(50);
BEGIN
   l_arg2 := SUBSTR(REGEXP_SUBSTR(vararg, ';[^;]*', 1, 2), 2);
   l_arg5 := SUBSTR(REGEXP_SUBSTR(vararg, ';[^;]*', 1, 5), 2);
   /* whatever */
END demo_3;

/* ... somewhere else ... */
demo_3 ( ';this; is a ;demo;;really!;' );
/* ... */
于 2013-05-14T09:42:09.417 に答える
6
create or replace type strings_type as table of varchar2(50);
select * from table (strings_type ('DD','CC','EE'));
于 2013-05-14T09:05:54.600 に答える