Thủ tục của bạn xác định tham số như sau:
serv in t45
Vì vậy, t45
là kiểu dữ liệu được xác định của tham số.
Bây giờ khi bạn gọi thủ tục, bạn chuyển vào một biến v
. Và v
như thế nào được định nghĩa?
type t1 is table of number;
...
v t1;
t1
là một loại khác với t45
. Ngay cả khi chúng có cấu trúc giống hệt nhau chúng là các loại khác nhau . Và đó là lý do tại sao bạn nhận được PLS-00306. Giải pháp khá đơn giản:xác định v
dưới dạng t45
.
Bạn cần khởi tạo bộ sưu tập. Bạn thực hiện việc này bằng cách sử dụng hàm tạo mặc định của loại, ở đầu chương trình ...
v := t45();
... hoặc khi bạn khai báo:
v t45 := t45();
Khi bạn vượt quá điều đó, bạn sẽ thấy logic gán của mình là sai:bạn đang tìm nạp vào một phần tử của tập hợp trước khi bạn tăng bộ đếm hoặc mở rộng mảng. Vì vậy, những gì bạn cần là đây:
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;
/
Ngoài ra, hãy sử dụng bộ sưu tập hàng loạt ít dài dòng hơn, xử lý ngầm định tất cả quản lý vòng lặp và kiểu:
declare
v t45;
begin
select serv_item_id
bulk collect into v
from serv_item;
p_aa(v);
end;
/
Đây là bản trình diễn db <> fiddle cho thấy cả hai phương pháp đều hoạt động.