Я запустил ваш DDL в базе данных Oracle 12c, заменив почтенную таблицу EMP
на вашу таблицу usuario
, и она, похоже, сработала.
Таблицы Oracle EMP и DEPT
Единственная потенциальная ошибка, которую я заметил, заключалась в том, что вы включили from usuario
дважды в свой запрос: один раз для мультимножества и один раз как источник внешнего SELECT
.В конце запроса я заменил from dual
на from usuario
.
Для удобства я удалил предложение WHERE
;Я предполагаю, что вы сохраните его.
Убедитесь, что тип NESTED_FILA_USUARIO
принадлежит той же схеме, что и процедура outnested
, иначе вам придется включить префикс имени схемы и убедиться, чтосуществует прямое разрешение от владельца NESTED_FILA_USUARIO
на схему outnested
(роли не работают в скомпилированном PL / SQL).
create or replace TYPE FILA_USUARIO as object
(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);
create or replace type NESTED_FILA_USUARIO as table of FILA_USUARIO;
Вотанонимный блок:
DECLARE
FILAUSU NESTED_FILA_USUARIO;
BEGIN
select cast( multiset(select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP) as
NESTED_FILA_USUARIO)
into FILAUSU
from dual;
DBMS_OUTPUT.PUT_LINE(FILAUSU(1).EMPNO||','||FILAUSU(1).ENAME||','||
FILAUSU(1).JOB);
END;
Вот хранимая процедура с тестом:
create or replace PROCEDURE outnested(FILAUSU OUT NESTED_FILA_USUARIO)
AS
BEGIN
select cast( multiset(select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP) as
NESTED_FILA_USUARIO)
into FILAUSU
from dual;
END;
/
declare
filausu NESTED_FILA_USUARIO;
begin
outnested(filausu);
DBMS_OUTPUT.PUT_LINE(FILAUSU(1).EMPNO||','||FILAUSU(1).ENAME||','||
FILAUSU(1).JOB);
end;
/
Вывод был такой:
7839, KING, PRESIDENT
И это ожидается для этого запроса.