我已经在包规范中定义了记录类型、表类型和函数。
TYPE name_RECORD IS RECORD (
name VARCHAR2(244),
surname VARCHAR2(244) );
TYPE name_TABLE IS TABLE OF name_RECORD;
function f_deps
(i_id_dept IN employees.id_department%type)
return name_TABLE;
并在包体中编写返回表类型的函数。
function f_deps
(i_id_dept IN employees.id_department%type)
return name_TABLE is
CURSOR c1 IS (select * from employees );
t_name name_TABLE;
rec_name name_RECORD;
BEGIN
t_name := name_TABLE();
for i in c1
LOOP
select name, surname BULK COLLECT INTO t_name from employees where id_department = i_id_dept ;
END LOOP;
return t_name;
END f_deps;
函数编译正常,但是当我尝试像这样执行函数时:
select * from table( PACKAGE_employees.f_deps ('6')) ;
我收到这个错误:
ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
*Cause:
*Action:
Error at Line: 29 Column: 22
更新:我已经在命令行中使用 CREATE TYPE 语句定义了类型,就像 Bob Jarvis 所建议的那样,但我仍然收到相同的错误消息
create or replace type name_RECORD as object (
name VARCHAR2(244),
surname VARCHAR2(244) );
create or replace type name_TABLE AS TABLE OF name_RECORD;
最佳答案
看来您不能像这样直接在 SQL 中选择使用该函数:
select * from table( PACKAGE_employees.f_deps ('6')) ;
但是你可以这样做:
declare
coll package_employees.name_table;
begin
coll := package_employees.f_deps ('6');
for r in (select * from table(coll)) loop
dbms_output.put_line(r.name);
end loop;
end;
你的函数代码不对,应该是这样的:
function f_deps
(i_id_dept IN integer)
return name_TABLE is
t_name name_TABLE;
rec_name name_RECORD;
BEGIN
select name_record(name, surname)
BULK COLLECT INTO t_name
from employees where id_department = i_id_dept ;
return t_name;
END f_deps;
即
- 不需要游标和循环
- 您需要构造一个
name_record
类型的值以批量收集到name_record
的集合中。
关于sql - 无法从函数 PLSQL 返回表类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45589693/