2013-05-14 20 views
6

Sto provando a creare una procedura PL/SQL in grado di gestire un numero sconosciuto, ma relativamente piccolo, di stringhe/Varchar2 come parametro. L'equivalente in Java potrebbe essere quella di utilizzare varargs:Oracle equivalente di Varargs Java

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

Guardando Oracle documentation on Collections and Records sembrerebbe che utilizzando un array associativo è una scelta adatta, ma non ne sono certo.

Potete dirmi se l'array associativo è la giusta via da percorrere?

Se è possibile passare un array associativo anonimo quando si richiama la chiamata alla procedura?

Grazie

+0

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

risposta

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

Va notato che questo funzionerà solo se 'strings_type' viene creato con scope globale. Se dichiari il tipo all'interno di un blocco (e probabilmente anche all'interno di un corpo del pacchetto) e provi ad usare 'table()', non funzionerà. – FrustratedWithFormsDesigner

10

di avere almeno 3 opzioni:

  1. (standard) utilizzare un array associativo come parametro procedura di
  2. definire un numero 'sufficiente' di parametri formali opzionali
  3. utilizzare un singolo parametro varchar con un separatore definito char

codice di esempio 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); 
/* ... */ 

codice di esempio 2.) (max. 5 parametri)

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

codice di esempio 3.) (speciale char essere '' - non deve verificare all'interno del carico utile di dati)

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