2013-05-14 9 views
6

मैं एक पीएल/एसक्यूएल प्रक्रिया बनाने की कोशिश कर रहा हूं जो एक अज्ञात, लेकिन अपेक्षाकृत छोटी, स्ट्रिंग्स/वर्चर्स 2 को पैरामीटर के रूप में संभाल सकता है। जावा में बराबर varargs उपयोग करने के लिए हो सकता है:ओरेकल जावा के वरग्स के समकक्ष

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

Oracle की documentation on Collections and Records को देखते हुए यह प्रतीत होता है कि एक साहचर्य सरणी का उपयोग कर एक उपयुक्त विकल्प है, लेकिन मैं कुछ नहीं कर रहा हूँ।

क्या आप कृपया मुझे बता सकते हैं कि एसोसिएटिव ऐरे जाने का सही तरीका है या नहीं?

यदि प्रक्रिया में कॉल का आह्वान करते समय अज्ञात सहयोगी ऐरे में गुजरना संभव है?

धन्यवाद

+0

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

उत्तर

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

यह ध्यान दिया जाना चाहिए कि यह केवल तभी काम करेगा जब वैश्विक स्कोप के साथ 'स्ट्रिंग्स_ टाइप' बनाया गया हो। यदि आप किसी ब्लॉक (और शायद पैकेज पैकेज के भीतर) के प्रकार को घोषित करते हैं और उस पर 'टेबल()' का उपयोग करने का प्रयास करते हैं, तो यह काम नहीं करेगा। – FrustratedWithFormsDesigner

10

आपके पास कम से कम 3 विकल्प:

  1. (मानक) एक प्रक्रिया पैरामीटर के रूप में एक साहचर्य सरणी का उपयोग
  2. वैकल्पिक औपचारिक पैरामीटर
  3. के 'पर्याप्त' संख्या को परिभाषित
  4. परिभाषित विभाजक चार
के साथ एक एकल वर्कर पैरामीटर का उपयोग करें

नमूना कोड 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!;'); 
/* ... */ 
संबंधित मुद्दे