Java 如何使用关联数组调用PL/SQL过程?

Java 如何使用关联数组调用PL/SQL过程?,java,oracle,jdbc,plsql,Java,Oracle,Jdbc,Plsql,我正在调用一个PL/SQL过程,其中包含一个关联数组,如下所示 然而,我得到了一个异常数组绑定类型必须与PL/SQL表行类型匹配,尽管我相信这就是我要传递的 具体来说,我有一个表、PL/SQL包和JDBC代码,如下所示: 表雇员 打包服务包SP员工 包体包装件SP员工 JDBC代码 Java异常 在查看之后,我发现Oracle JDBC驱动程序支持VARCHAR和NUMBER类型的PL/SQL关联数组。这是否意味着它将不支持我的代码中所示的复杂类型的关联数组?请解释您试图如何解决此问题

我正在调用一个PL/SQL过程,其中包含一个关联数组,如下所示

然而,我得到了一个异常
数组绑定类型必须与PL/SQL表行类型匹配,尽管我相信这就是我要传递的

具体来说,我有一个表、PL/SQL包和JDBC代码,如下所示:


表雇员
打包服务包SP员工
包体包装件SP员工
JDBC代码
Java异常
在查看之后,我发现Oracle JDBC驱动程序支持VARCHAR和NUMBER类型的PL/SQL关联数组。这是否意味着它将不支持我的代码中所示的复杂类型的关联数组?

请解释您试图如何解决此问题。不要只是复制粘贴你的代码,并期望有人会进行调试…我试着在这里遵循Oracle文档-。上面提到的Oracle JDBC驱动程序支持VARCHAR和NUMBER类型的PL/SQL关联数组。这是否意味着它将不支持代码中所示的复杂类型的关联数组?我当然是这样理解的。我建议您不要试图传回复杂类型,而应该从数据中形成类似逗号分隔值字符串的内容,并返回该字符串或其他类似内容。祝您好运。修复了代码格式并在…问题中添加了一个问题。您是正确的--您仅限于像
String[]
BigDecimal[]
这样的简单数组。您是否能够仅使用简单阵列就完成所需的工作?请解释您试图如何解决此问题。不要只是复制粘贴你的代码,并期望有人会进行调试…我试着在这里遵循Oracle文档-。上面提到的Oracle JDBC驱动程序支持VARCHAR和NUMBER类型的PL/SQL关联数组。这是否意味着它将不支持代码中所示的复杂类型的关联数组?我当然是这样理解的。我建议您不要试图传回复杂类型,而应该从数据中形成类似逗号分隔值字符串的内容,并返回该字符串或其他类似内容。祝您好运。修复了代码格式并在…问题中添加了一个问题。您是正确的--您仅限于像
String[]
BigDecimal[]
这样的简单数组。您是否能够仅使用简单阵列就完成所需的工作?
CREATE TABLE EMPLOYEE 
(   
"EMPLOYEE_NUMBER" VARCHAR2(20 BYTE), 
"EMPLOYEE_NAME" VARCHAR2(80 BYTE), 
"EMPLOYEE_DEPT" VARCHAR2(40 BYTE)
);
create or replace PACKAGE PKG_SP_EMPLOYEE
AS
TYPE tbl_employees_in
IS
TABLE OF EMPLOYEE%ROWTYPE INDEX BY PLS_INTEGER;

PROCEDURE main(
    p_employee IN PKG_SP_EMPLOYEE.tbl_employees_in,
    x_status OUT VARCHAR 
);
END PKG_SP_EMPLOYEE;
create or replace PACKAGE BODY PKG_SP_EMPLOYEE
AS

PROCEDURE main(
    p_employee IN PKG_SP_EMPLOYEE.tbl_employees_in,
    x_status OUT VARCHAR
    )
IS
BEGIN 
FOR i in 1..p_employee.count

    loop
    INSERT INTO "EMPLOYEE"
           (
           EMPLOYEE_NUMBER, 
           EMPLOYEE_NAME, 
           EMPLOYEE_DEPT
           )
    VALUES (
           p_employee(i).EMPLOYEE_NUMBER,
           p_employee(i).EMPLOYEE_NAME,
           p_employee(i).EMPLOYEE_DEPT
           );

    end loop;

    dbms_output.put_line('Success');
    x_status  := 'Success';

EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('Failure');
        x_status  := 'Failure';           

END main;
END PKG_SP_EMPLOYEE;
Connection con= null;
OracleCallableStatement cstmt = null;

try {

    Class.forName("oracle.jdbc.driver.OracleDriver");
    con=DriverManager.getConnection("jdbc:oracle:thin:@test.com:1521:TESTAD",
                    "user","password");

    cstmt = (OracleCallableStatement)con.prepareCall (
                "begin PKG_SP_EMPLOYEE.MAIN (?,?); end;"); 

    String[] values = { "1", "John Doe", "HR" };

    cstmt.setPlsqlIndexTable (1, values, values.length, values.length, OracleTypes.VARCHAR, 3);

    cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); 

    cstmt.execute ();

//...
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'MAIN'
ORA-06550: line 1, column 43:
**PLS-00418: array bind type must match PL/SQL table row type**
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored