Oracle plsql函数能否返回对象

Oracle plsql函数能否返回对象,oracle,plsql,Oracle,Plsql,我在编写以下代码时遇到问题: create or replace function getashish(dept varchar2) return emp3 as emp5 emp3; str varchar2(300); begin str := 'select e.last_name,l.city,e.salary from employees e join departments d on e.department_id = d.department_id join locat

我在编写以下代码时遇到问题:

create or replace function getashish(dept varchar2) return emp3 as

emp5 emp3;

str varchar2(300);

begin

str := 'select e.last_name,l.city,e.salary from employees e join departments d 

on e.department_id = d.department_id join locations l on d.location_id=l.location_id where 

d.department_name = :dept';

execute immediate str bulk collect into emp5  using dept;

end;
emp 3是如下定义的对象表:

create or replace type emp1 as object (lname varchar2(10),city varchar2(10),sal number(10));

create or replace type emp3 as table of emp1;
我在执行函数时遇到以下错误:SQL错误:

ORA-00932: inconsistent datatypes: expected - got -
感谢您预期的帮助和支持。

请尝试以下操作(将
emp1()
添加到select查询内部函数,并返回
emp5

和调用程序块

SELECT * FROM TABLE( CAST(getashish('IT') AS emp3))
UNION
SELECT * FROM TABLE( CAST(getashish('FINANCE') AS emp3));
该函数返回一个表,因此不能在
SELECT
子句中使用,因为如果必须在
SELECT
中使用,它应该只返回一行。希望你了解这个概念

编辑:无论我做了什么

create table employees 
(last_name varchar2(10),salary number,department_id varchar2(10));

create table locations
(location_id varchar2(10),city varchar2(10));
drop table employees;

create table departments
(department_id varchar2(10),location_id varchar2(10),department_name varchar2(10));

insert into employees values ('ASHISH',6000000,'D1');
insert into employees values ('MAHESH',5000000,'D2');

insert into departments values('D1','L1','IT');
insert into departments values('D2','L2','FINANCE');

insert into locations values('L1','Gurgoan');
insert into locations values('L2','Chennai');

commit;

create or replace type emp1 as object (lname varchar2(10),city varchar2(10),sal number(10));
/

create or replace type emp3 as table of emp1;
/

CREATE OR REPLACE FUNCTION getashish(
    dept VARCHAR2)
  RETURN emp3
AS
  emp5 emp3 := emp3();
  str VARCHAR2(300);
BEGIN
  str := 'select emp1(e.last_name,l.city,e.salary) from employees e join departments d 
on e.department_id = d.department_id join locations l on d.location_id=l.location_id where 
d.department_name = :dept';
  EXECUTE immediate str bulk collect INTO emp5 USING dept;
  RETURN emp5;
END;
/

SELECT * FROM TABLE( CAST(getashish('IT') AS emp3))
UNION
SELECT * FROM TABLE( CAST(getashish('FINANCE') AS emp3));

SQL> SELECT * FROM TABLE( CAST(getashish('IT') AS emp3))
  2  UNION
  3  SELECT * FROM TABLE( CAST(getashish('FINANCE') AS emp3));

LNAME      CITY              SAL
---------- ---------- ----------
ASHISH     Gurgoan       6000000
MAHESH     Chennai       5000000

尝试将emp5声明为emp1的数据类型

emp5 emp1 := emp1();

是的,您可以返回对象,但是您可以在SQL或PL/SQL中使用它来调用,您可以向我们展示该代码段吗?是的,从dual中选择getashish('it');从表中选择*(getashish('IT');Than k you我回答得有点快了它的工作原理不是代码段问题错误是由于函数中使用的数据类型造成的SQL错误:ORA-00932:不一致的数据类型:expected-get-ORA-06512:在“HR.GETASHISH”处,第8行错误从命令中的第2行开始:SELECT*FROM TABLE(将(GETASHISH('IT')转换为emp3))错误报告:SQL错误:ORA-00932:不一致的数据类型:应为-got-ORA-06512:位于“HR.GETASHISH”第8行。错误保持不变,它不起作用,我们需要使用方法来调用它,我想请阅读我的答案。你应该错过一些东西。
emp5 emp1 := emp1();