【问题标题】:Can not return table type from a function PLSQL不能从函数 PLSQL 返回表类型
【发布时间】:2018-01-17 06:50:42
【问题描述】:

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

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;

【问题讨论】:

  • 在包中创建的类型不能在 SELECT 语句中使用。 SELECT 语句只能使用使用 CREATE TYPE 创建的类型。祝你好运。
  • 好的,谢谢你的回答。
  • 在 12C 中并非如此 - 但类型需要在包 规范 而非正文中定义。但我认为只在 PL/SQL 内部,而不是从命令行。
  • 封装规范中定义了类型,我忘记写了。

标签: sql oracle plsql oracle-sqldeveloper oracle12c


【解决方案1】:

您似乎无法像这样直接在 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 的集合中。

【讨论】:

  • 好的,谢谢你的回答。但是有什么方法可以从查询结果中的函数中查看表类型,就像数据库中的普通表一样?
  • 是的 - 但你的功能代码是错误的。请参阅我的更新答案。
  • 我对代码进行了更改,但是当我编译它时,我收到错误消息:Error(195,4): PL/SQL: ORA-00913: too many values
  • 答案和你的一样。我已经在包规范和命令行中定义了类型,比如对象类型。
  • 谢谢,它现在可以工作了,我可以像普通表一样从函数中选择表类型。我不得不从包规范中删除类型的定义。
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
相关资源
最近更新 更多