2013-05-14 14 views
6

Bilinmeyen ancak göreceli olarak az sayıda Dizge/Varchar2 değerini bir parametre olarak ele alabilen bir PL/SQL Prosedürü oluşturmaya çalışıyorum. Java eşdeğer varargs kullanmak olabilir: bir ilişkisel dizi kullanarak, uygun bir seçimdir olduğu gibi görünüyor, ama emin değilim, Oracle en documentation on Collections and Records baktığımızda Java's Varargs'ın Oracle eşdeğeri

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

.

İlişkisel Dizinin doğru yol olup olmadığını söyleyebilir misiniz?

Anlatım Çağrısı çağrılırken anonim bir İlişkilendirme Dizisi iletmek mümkün mü?

sayesinde

+0

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

cevap

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

Bunun, yalnızca global kapsamda 'strings_type' oluşturulduğunda çalışacağına dikkat edilmelidir. Bir blok içinde (ve muhtemelen bir paket gövdesi dahilinde) türünü bildirirseniz ve üzerinde 'table()' kullanmayı denerseniz, işe yaramaz. – FrustratedWithFormsDesigner

10

sahip en az 3 seçenekleri:

  1. (standart) isteğe bağlı yasal parametrelerin
  2. bir 'yeterli' sayısını tanımlayan bir prosedür parametre olarak
  3. ilişkilendirilebilir bir dizi kullanımı
  4. tanımlı ayırıcı ile tek bir varchar parametresi kullanın

örnek kod 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); 
/* ... */ 

örnek kod 2.) (mak. 5 parametreleri)

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

örnek kod 3.) (özel char Being ';' - yük veri içinde meydana gelmemelidir)

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