आपकी प्रक्रिया इस प्रकार पैरामीटर को परिभाषित करती है:
serv in t45
तो t45
पैरामीटर का परिभाषित डेटाटाइप है।
अब जब आप उस प्रक्रिया को कहते हैं जिसे आप एक चर v
. में पास करते हैं . और कैसा है v
परिभाषित?
type t1 is table of number;
...
v t1;
t1
t45
. से भिन्न प्रकार है . भले ही उनके पास समान संरचनाएं हों वे विभिन्न प्रकार के हैं . और इसीलिए आपको PLS-00306 मिलता है। समाधान काफी सरल है:परिभाषित करें v
t45
. के रूप में ।
आपको संग्रह को प्रारंभ करने की आवश्यकता है। आप इस प्रकार के डिफॉल्ट कंस्ट्रक्टर का उपयोग करते हैं, या तो प्रोग्राम की शुरुआत में ...
v := t45();
... या जब आप इसकी घोषणा करते हैं:
v t45 := t45();
एक बार जब आप इससे आगे निकल जाएंगे तो आप पाएंगे कि आपका असाइनमेंट तर्क गलत है:काउंटर बढ़ाने या सरणी का विस्तार करने से पहले आप संग्रह के एक तत्व में ला रहे हैं। तो आपको यह चाहिए:
declare
cursor c1 is select serv_item_id from serv_item;
n number:=0;
v t45 := t45();
x number;
begin
open c1;
loop
fetch c1 into x;
exit when c1%notfound;
n:=n+1;
v.extend();
v(n) := x;
end loop;
close c1;
p_aa(v);
end;
/
वैकल्पिक रूप से कम वर्बोज़ बल्क कलेक्ट का उपयोग करें, जो सभी लूपिंग और टाइप प्रबंधन को निहित रूप से संभालता है:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
यह रहा a db<>fiddle डेमो दोनों तरीकों को काम करते हुए दिखा रहा है।