Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

sai số hoặc loại đối số trong lệnh gọi đến P_AA

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trong PL / SQL, làm thế nào để bạn cập nhật một hàng dựa trên hàng tiếp theo?

  2. ORA-00604 ORA-12705

  3. oracle động sql đánh giá biểu thức trong mệnh đề where

  4. hai khóa ngoại cho cùng một kiểu dữ liệu số và tham chiếu nó đến hai bảng

  5. if-elseif-else 'điều kiện' trong SQL oracle