[英]How can I return a own type data in oracle stored procedure?
我在oracle中為過程創建類型數據。
程序:
create or replace TYPE ROW_USER as object
(
ID NUMBER(4),
ROLES_ID NUMBER(1),
FIRST_NAME VARCHAR2(60 BYTE),
SECOND_NAME VARCHAR2(60 BYTE),
FIRST_LAST_NAME VARCHAR2(60 BYTE),
SECOND_LAST_NAME VARCHAR2(60 BYTE),
CC NUMBER(10,0),
EMAIL VARCHAR2(60 BYTE)
);
和:
create or replace type NESTED_ROW_USER as table of ROW_USER;
當我在匿名塊中使用這種類型的數據時,它就可以工作。
set serveroutput on;
DECLARE
ROWUSR NESTED_ROW_USER;
BEGIN
select cast( multiset(select id, ROLES_ID, FIRST_NAME, SEGUNDO_NOMBRE,
FIRST_LAST_NAME, SECOND_LAST_NAME, CC, EMAIL from USERS where id = 1) as
NESTED_ROW_USER)
into ROWUSR
from users;
DBMS_OUTPUT.PUT_LINE(ROWUSR(1).id||','||ROWUSR(1).ROLES_ID||','||
ROWUSR(1).FIRST_NAME);
END;
封鎖結果:
Process PL/SQL exited successfully.
1,1,DIEGO
但是,當我在存儲過程中使用它返回它時,會出現錯誤。
程序:
create or replace PROCEDURE outnested(ROWUSR OUT NESTED_ROW_USR)
AS
BEGIN
select cast( multiset(select id, ROLES_ID, FIRST_NAME, SECOND_NAME,
FIRST_LAST_NAME, SECOND_LAST_NAME, CC, EMAIL from USERS where id = 1) as
NESTED_ROW_USER)
into ROWUSR
from users;
END;
錯誤:
ORA-06550: line 5, column 16:
PLS-00302: component 'NESTED_ROW_USER' must be declared
ORA-06550: line 5, column 11:
PL/SQL: Item ignored
ORA-06550: line 14, column 16:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 10, column 3:
PL/SQL: Statement ignored
為什么不返回值?
您是否真的要生成一個集合,該集合具有與usarios
表相同的行數,並且該集合的每個元素中的對象值都相同? 好像很奇怪
我的猜測是您真的想要這樣的東西
create or replace PROCEDURE outnested(p_FILAUSU OUT NESTED_FILA_USUARIO)
AS
BEGIN
select FILA_USUARIOr( id,
ROLES_ID,
PRIMER_NOMBRE,
SEGUNDO_NOMBRE,
PRIMER_APELLIDO,
SEGUNDO_APELLIDO,
CC,
EMAIL )
bulk collect into p_FILAUSU
from USUARIOS
where id = 1;
END;
我在Oracle 12c數據庫中運行了DDL,將古老的EMP
表替換為您的usuario
表,它似乎可以正常工作。
我注意到的唯一潛在錯誤是您在查詢中兩次from usuario
中包含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,總裁
這是該查詢所期望的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.