Пожалуйста, попробуйте ниже (добавлено 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
Да, вы можете возвращать объекты, но вы используете их в SQL или PL/SQL для вызова, можете ли вы показать нам этот фрагмент? –
yes select getashish ('IT') от dual; –
выберите * из таблицы (getashish ('IT')); –