#sql #oracle #plsql
Как сделать селект в в коллекцию с пользовательским типом данных?
Например, есть таблица:
create table emp (
empno number(4,0),
ename varchar2(10),
job varchar2(9),
mgr number(4,0),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2,0),
constraint pk_emp primary key (empno),
constraint fk_deptno foreign key (deptno) references dept (deptno)
)
Cоздаю пользовательский тип:
CREATE OR REPLACE TYPE typ_emp as OBJECT (
name VARCHAR2(20),
deptno VARCHAR2(20)
);
CREATE OR REPLACE TYPE emp_tbl AS TABLE OF typ_emp;
Пишу функцию:
CREATE OR REPLACE FUNCTION getEmpl
RETURN emp_tbl
AS
tbl emp_tbl ;
BEGIN
SELECT e.ENAME, e.DEPTNO INTO tbl FROM EMP e;
RETURN tbl;
END;
Компиляция с ошибками:
PL/SQL: ORA-00947: not enough values
PL/SQL: SQL Statement ignored
Ответы
Ответ 1
Вам надо обернуть результат запроса в нужный тип и извлекать через bulk collect into. CREATE OR REPLACE FUNCTION getEmpl RETURN emp_tbl AS tbl emp_tbl ; BEGIN SELECT typ_emp(e.ENAME, e.DEPTNO) BULK COLLECT INTO tbl FROM EMP e; END; Чуть больше примеров на en-so. И сейчас ваша функция не возвращает никакого результат, это странно.Ответ 2
Так можно обойтись только с INTO: create or replace function getEmpl return emp_tbl as ret emp_tbl; begin select cast (multiset (select e.name, e.deptno from emp e) as emp_tbl) into ret from dual ; return ret; end; / Не рекомендуется для больших коллекций, т.к. создаются временные объекты в sql контехте и поэтому уступит по быстродействию bulk collect. И кроме того, fetch ... limit, если потребуется, в данном случае не возможен.
Комментариев нет:
Отправить комментарий