यदि आप PL/SQL का उपयोग SQL के रूप में करते हैं और अन्य भाषाओं की तरह नहीं तो यह बहुत आसान है। यह काफी विशिष्ट है और कभी-कभी ठीक इसी वजह से बहुत अच्छा होता है।
कभी-कभी मैं वास्तव में पीएल/एसक्यूएल से नफरत करता हूं, लेकिन यह मामला बिल्कुल प्यार का है।
देखें कि यह कितना आसान है:
create type it as object (
iter number,
stringval varchar2(100),
intval integer
);
create type t_it as table of it;
declare
t t_it := new t_it();
tmp1 varchar2(32767);
tmp2 varchar2(32767);
begin
t.extend(4);
t(1) := new it(1,'Oslo',40);
t(2) := new it(2,'Berlin',74);
t(3) := new it(3,'Rome',25);
t(4) := new it(4,'Paris',10);
select listagg(stringval,', ') within group (order by stringval),
listagg(stringval,', ') within group (order by intval)
into tmp1, tmp2
from table(t);
dbms_output.put_line(tmp1);
dbms_output.put_line(tmp2);
end;
/
drop type t_it;
drop type it;
यहां आप समस्या देख सकते हैं कि आपको वैश्विक प्रकार बनाना चाहिए, और यही वह है जिसके लिए मुझे इससे नफरत है। लेकिन वे कहते हैं कि Oracle 12 में यह स्थानीय रूप से परिभाषित प्रकारों के साथ किया जा सकता है इसलिए मैं इसका इंतजार कर रहा हूं :)
आउटपुट है:
Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin
संपादित करें
जहाँ तक आप शुरुआत से ही पुनरावृत्तियों की मात्रा नहीं जानते हैं, प्रत्येक पुनरावृत्ति पर विस्तार करने का एकमात्र तरीका है (यह केवल विस्तार का उदाहरण है):
declare
iterator pls_integer := 1;
begin
/* some type of loop*/ loop
t.extend();
-- one way to assign
t(t.last) := new it(1,'Oslo',40);
-- another way is to use some integer iterator
t(iterator) := new it(1,'Oslo',40);
iterator := iterator + 1;
end loop;
end;
मैं दूसरा तरीका पसंद करता हूं क्योंकि यह तेज़ है (.last
की गणना नहीं करता है) प्रत्येक पुनरावृत्ति पर)।