Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

equivalente Oracle do Varargs do Java


você tem pelo menos 3 opções:
  1. (padrão) use um array associativo como parâmetro de procedimento
  2. defina um número 'suficiente' de parâmetros formais opcionais
  3. use um único parâmetro varchar com um caractere separador definido

código de exemplo 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 );
/* ... */

código de amostra 2.) (máx. 5 parâmetros)
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' );
/* ... */

código de amostra 3.) (caracter especial sendo ';' - não deve ocorrer dentro dos dados de carga útil)
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!;' );
/* ... */