2013-05-14 15 views
6

わかりませんが、比較的少数のStrings/Varchar2をパラメータとして処理できるPL/SQLプロシージャを作成しようとしています。 Javaで同等の可変引数を使用することができます:連想配列を使用することが適切な選択であると思われるが、私は確かではないよOracleのdocumentation on Collections and Recordsを見てみると JavaのVarargsに相当するOracle

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

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

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

おかげ

+0

http://www.orafaq.com/usenet/comp .databases.oracle.misc/2007/02/24/0435.htm – devnull

答えて

4
create or replace type strings_type as table of varchar2(50); 
select * from table (strings_type ('DD','CC','EE')); 
+3

これは、 'strings_type'がグローバルスコープで作成されている場合にのみ機能することに注意してください。型をブロック内に宣言して(おそらくパッケージ本体内にも)、 'table()'を使用しようとすると、それは機能しません。 – FrustratedWithFormsDesigner

10

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

  1. (標準)、オプションの仮パラメータの「十分な」数を定義
  2. 手続きパラメータとして連想配列を使用し
  3. 定義済みの区切り文字で1つの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)(MAX。 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!;'); 
/* ... */ 
関連する問題