Java 如何在oracle存储过程中返回自己的类型数据?

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

我在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.第一个名称; 终止 块结果:

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;
/