Java 如何在oracle存储过程中返回自己的类型数据?
我在oracle中为一个过程创建了一个类型数据 程序: 创建或替换类型行\用户作为对象 身份证号码4, 角色编号1, 第一个名称VARCHAR260字节, 第二个名称VARCHAR260字节, FIRST_LAST_NAME VARCHAR260字节, 第二个姓氏VARCHAR260字节, CC编号10,0, 电子邮件VARCHAR260字节 ; 以及: 当我在匿名块中使用这种类型的数据时,它就起作用了 打开服务器输出; 声明 ROWUSR嵌套的用户; 开始 选择cast multisetselect id、ROLES\u id、FIRST\u NAME、SEGUNDO\u NOMBRE、, 第一个姓,第二个姓,抄送,来自id=1的用户的电子邮件 嵌套的\u行\u用户 进入ROWUSR 来自用户; DBMS|u OUTPUT.PUT_LINEROWUSR1.id | |','| | ROWUSR1.ROLES|id | |','| | ROWUSR1.第一个名称; 终止 块结果:Java 如何在oracle存储过程中返回自己的类型数据?,java,oracle,stored-procedures,nested-table,oracle-objects,Java,Oracle,Stored Procedures,Nested Table,Oracle Objects,我在oracle中为一个过程创建了一个类型数据 程序: 创建或替换类型行\用户作为对象 身份证号码4, 角色编号1, 第一个名称VARCHAR260字节, 第二个名称VARCHAR260字节, FIRST_LAST_NAME VARCHAR260字节, 第二个姓氏VARCHAR260字节, CC编号10,0, 电子邮件VARCHAR260字节 ; 以及: 当我在匿名块中使用这种类型的数据时,它就起作用了 打开服务器输出; 声明 ROWUSR嵌套的用户; 开始 选择cast multisetsel
Process PL/SQL exited successfully.
1,1,DIEGO
但是当我在存储过程中使用它来返回它时,我会得到一个错误
程序:
创建或替换过程outnestedROWUSR OUT NESTED_ROW_USR
像
开始
选择cast multisetselect id、ROLES\u id、FIRST\u NAME、SECOND\u NAME、,
第一个姓,第二个姓,抄送,来自id=1的用户的电子邮件
嵌套的\u行\u用户
进入ROWUSR
来自用户;
终止
错误:
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;
我在Oracle12c数据库中运行了您的DDL,用古老的EMP表替换了您的usuario表,它似乎起了作用 我注意到的唯一潜在错误是,您在查询中包含了两次usuario:一次用于multiset,另一次作为外部SELECT的源。 在查询结束时,我将dual中的from替换为usuario中的from 为了方便起见,我删除了WHERE条款;我想你会保留它的 请确保嵌套的\u FILA\u USUARIO类型与outnested过程属于同一架构,否则您必须包含架构名称前缀,并确保嵌套的\u FILA\u 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,国王,总统
这是本次查询的预期结果。谢谢您的回答。集合的列数与usarios表的列数不同。我运行了你的建议,但它抛出了相同的错误:“组件”嵌套的行用户必须声明为“@DiegoF-我很困惑。根据您的问题,对象类型与您选择的列集相同。我假设usarios表中存在所有8列。集合只是对象类型的集合。你确定这个问题与西班牙语-英语翻译无关吗?谢谢你的回答。我使用11c和usuario的两次用于匿名块,这样就可以在存储过程中工作。我尝试去掉WHERE子句,但得到了相同的错误。
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;
/