2013-05-14 71 views
6

我試圖創建一個PL/SQL過程,它可以處理一個未知的,但相對較小的數量的Strings/Varchar2s作爲參數。 Java中的等價物可使用的可變參數:Oracle的等效Java的可變參數

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

縱觀甲骨文的documentation on Collections and Records它似乎是使用關聯數組是一個合適的選擇,但我不能肯定。

你可否告訴我,關聯數組是否是正確的方法?

如果在調用過程調用時可能傳入匿名關聯數組?

由於

+0

http://www.orafaq.com/usenet/comp .databases.oracle.misc/2007/02/24/0435.htm – devnull 2013-05-14 08:48:10

回答

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 2013-05-14 14:14:14

10

至少有3個選項:

  1. (標準)使用關聯數組作爲過程參數
  2. 定義可選形式參數
  3. 的 '足夠' 數量的
  4. 使用帶有定義分隔符的單個varchar參數char

示例代碼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!;'); 
/* ... */