2013-12-25 7 views
1

я столкнулся с проблемой при написании следующего кода:может 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; 

эх 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 - 

Благодарим вас за помощь и поддержку.

+0

Да, вы можете возвращать объекты, но вы используете их в SQL или PL/SQL для вызова, можете ли вы показать нам этот фрагмент? –

+0

yes select getashish ('IT') от dual; –

+0

выберите * из таблицы (getashish ('IT')); –

ответ

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

функция возвращает таблицу, и, следовательно, не может использоваться в предложении SELECT, так как предполагается, что он должен возвращать только одну строку, если ее необходимо использовать в SELECT. Надеюсь, у вас есть концепция!

EDIT: Что бы я ни делал!

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 
+0

проблема не в том, что ошибка связана с типами данных, используемыми в функции SQL Ошибка: ORA-00932: непоследовательные типы данных: ожидается - получено - ORA-06512: в разделе «HR.GETASHISH», строка 8 –

+0

вы можете увидеть мои новый обновленный ответ? начиная –

+0

Ошибка в строке 2 в команде: SELECT * FROM TABLE (CAST (getashish ('IT'), как emp3)) отчета Error: SQL Error: ORA-00932: несовместимые типы данных: ожидается - получил - ORA- 06512: на странице «HR.GETASHISH», строка 8. Ошибка остается той же, что и не работает, нам нужно использовать метод, чтобы вызвать это, я думаю, –

1

Попробуйте объявить emp5 как тип данных emp1.

emp5 emp1 := emp1(); 
+0

Благодарим за помощь –

Смежные вопросы