Вашата процедура дефинира параметъра по следния начин:
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;
/
Ето db<>демонстрация на fiddle показващи работещи и двата подхода.