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

Hàm bảng với bộ sưu tập hàng loạt ném loại dữ liệu không hợp lệ

Bạn đang cố gắng sử dụng các kiểu cấp độ gói trong SQL thuần túy, điều này không được phép. Các kiểu được khai báo trong gói không hiển thị hoặc không hợp lệ bên ngoài PL / SQL (hoặc thậm chí trong các câu lệnh SQL thuần túy bên trong PL / SQL). Phiên bản rút gọn của những gì bạn đang làm:

create or replace package types as
    type my_rec_type is record (dummy dual.dummy%type);
    type my_table_type is table of my_rec_type index by binary_integer;
end types;
/

create or replace package p42 as
    function get_table return types.my_table_type;
end p42;
/

create or replace package body p42 as
    function get_table return types.my_table_type is
        my_table types.my_table_type;
    begin
        select * bulk collect into my_table from dual;
        return my_table;
    end get_table;
end p42;
/

select * from table(p42.get_table);

SQL Error: ORA-00902: invalid datatype

Ngay cả trong gói, nếu bạn có một thủ tục cố gắng sử dụng hàm bảng, nó sẽ bị lỗi. Nếu bạn đã thêm:

    procedure test_proc is
    begin
        for r in (select * from table(get_table)) loop
            null;
        end loop;
    end test_proc;

... quá trình biên dịch nội dung gói sẽ không thành công với ORA-22905: cannot access rows from a non-nested table item .

Bạn cần khai báo các kiểu ở cấp giản đồ, không phải trong một gói, vì vậy hãy sử dụng SQL create type lệnh :

create type my_obj_type is object (dummy varchar2(1));
/

create type my_table_type is table of my_obj_type;
/

create or replace package p42 as
    function get_table return my_table_type;
end p42;
/

create or replace package body p42 as
    function get_table return my_table_type is
        my_table my_table_type;
    begin
        select my_obj_type(dummy) bulk collect into my_table from dual;
        return my_table;
    end get_table;
end p42;
/

select * from table(p42.get_table);

DUMMY
-----
X


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhà cung cấp dữ liệu Oracle chốt quy trình công nhân IIS khi trang web bị dừng

  2. Mở hộp thoại phương thức thông qua JavaScript Oracle APEX

  3. Làm thế nào để triển khai tìm nạp hàng loạt với Fluent NHibernate khi làm việc với Oracle?

  4. Lịch sử bản ghi Oracle sử dụng tính đến dấu thời gian trong một phạm vi

  5. Xóa đột ngột mất nhiều thời gian