2013-05-14 14 views
6

Próbuję utworzyć procedurę PL/SQL, która może obsłużyć nieznaną, ale stosunkowo niewielką liczbę ciągów/Varchar2 jako parametr. Równowartość w Javie może być użycie varargs:Oracle odpowiednik Java Varargs

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

Patrząc na Oracle documentation on Collections and Records wydaje się, że za pomocą tablicy asocjacyjnej jest odpowiednim wyborem, ale nie jestem pewna.

Czy możesz mi powiedzieć, czy Asocjacyjna macierz jest właściwą drogą?

Czy podczas wywoływania procedury można przekazać anonimową tablicę asocjacyjną?

Dzięki

+0

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

Odpowiedz

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

Należy zauważyć, że zadziała to tylko wtedy, gdy zostanie utworzony "typ_skings" o zasięgu globalnym. Jeśli zadeklarujesz typ wewnątrz bloku (i prawdopodobnie również w treści pakietu) i spróbujesz użyć 'table()' na tym, to nie zadziała. – FrustratedWithFormsDesigner

10

masz co najmniej 3 opcje:

  1. (standard) wykorzystać tablicę asocjacyjną jako parametr procedury
  2. zdefiniować 'wystarczające' szereg opcjonalnych parametrów formalnych
  3. użyj pojedynczego parametru varchar z określonym znakiem separatora

Kod próbki 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); 
/* ... */ 

Kod próbki 2) (maks. 5 parametrów)

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'); 
/* ... */ 

kod próbka 3) (znak specjalny jest ';' - nie może dojść do wewnątrz danych użytkowych)

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!;'); 
/* ... */