可以用plsql函数返回对象

时间:2013-12-25 06:24:40

标签: 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 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 -

感谢您的预期帮助和支持。

2 个答案:

答案 0 :(得分:1)

请尝试以下操作,(将emp1()添加到您在函数内的选择查询中并返回emp5

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));

该函数返回一个Table,因此无法在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

答案 1 :(得分:1)

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

emp5 emp1 := emp1();