Bạn có thể sử dụng các đối tượng SQL bên trong gói của mình hoặc sử dụng các hàm pipelined (được thử nghiệm với 10gr2). Việc sử dụng các đối tượng SQL rất đơn giản, chức năng thực tế của bạn có thể được sử dụng như bên trong một gói.
Đây là cách bạn có thể sử dụng một hàm pipelined với loại RECORD:
SQL> CREATE OR REPLACE PACKAGE my_pkg IS
2 TYPE t_col IS RECORD(
3 i NUMBER,
4 n VARCHAR2(30));
5 TYPE t_nested_table IS TABLE OF t_col;
6 FUNCTION return_table RETURN t_nested_table PIPELINED;
7 END my_pkg;
8 /
Package created
SQL> CREATE OR REPLACE PACKAGE BODY my_pkg IS
2 FUNCTION return_table RETURN t_nested_table PIPELINED IS
3 l_row t_col;
4 BEGIN
5 l_row.i := 1;
6 l_row.n := 'one';
7 PIPE ROW(l_row);
8 l_row.i := 2;
9 l_row.n := 'two';
10 PIPE ROW(l_row);
11 RETURN;
12 END;
13 END my_pkg;
14 /
Package body created
SQL> select * from table(my_pkg.return_table);
I N
---------- ------------------------------
1 one
2 two
Điều gì xảy ra đằng sau hiện trường là Oracle hiểu rằng vì bạn muốn sử dụng hàm của mình trong một truy vấn (vì từ khóa PIPELINED), bạn sẽ cần các đối tượng SQL, vì vậy những đối tượng đó được tạo sau cảnh cho bạn:
SQL> select object_name
2 from user_objects o
3 where o.created > sysdate - 1
4 and object_type = 'TYPE';
OBJECT_NAME
--------------------------------------------------------------------------------
SYS_PLSQL_798806_24_1
SYS_PLSQL_798806_DUMMY_1
SYS_PLSQL_798806_9_1
SQL> select text from user_source where name='SYS_PLSQL_798806_9_1';
TEXT
--------------------------------------------------------------------------------
type SYS_PLSQL_798806_9_1 as object (I NUMBER,
N VARCHAR2(30));