sql - 无法从函数 PLSQL 返回表类型

标签 sql oracle plsql oracle-sqldeveloper oracle12c

我已经在包规范中定义了记录类型、表类型和函数。

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/

相关文章:

oracle - 为什么 View 列的类型与相应的函数结果类型不匹配?

sql - 选择具有 2 列相等值的行

sql - 在 UNION 中排序

oracle - 从 oracle 转储导入时表的顺序是否相关?

Oracle案例运行所有提示

java - Oracle ORA-29536 关于 DDL-将 java 源加载到数据库中

php - 何时使用 transient ,何时不使用?

mysql - 如何声明变量、运行循环和进行其他自动化

mysql - 连接表以查找对应的列 SQL

sql - Oracle SQLPlus : How to display the output of a sqlplus command without having to first issue the spool off command?