有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的oracle Fetch pl/sql数组返回值

在Java中,如何从返回数组的pl/sql函数中获取值

如果我的pl/sql函数返回名为myArray的数组,那么在java中是否可以获取值 使用callablestatementmyArray转换为java对象

谢谢

更新1

我调用函数的Java代码,但遇到异常

PLS-00306: wrong number or types of arguments in call to 'myfunc'




connection = con.getConnection();
        callablestatement = connection.prepareCall("{call myfunc(?,?,?}");
        callablestatement.setInt(1, param1);
        callablestatement.setInt(2, param2);
        callablestatement.setString(3, param3);
        callablestatement.registerOutParameter(4, Types.ARRAY);
        callablestatement.execute();        
        resultSet = callablestatement.getArray(4).getResultSet();

更新2

private final String PRODECURE_NAME = "{? = call myfunc(?,?,?)}";

connection = con.getConnection();
    callablestatement = connection.prepareCall(PRODECURE_NAME);
    callablestatement.registerOutParameter(1, Types.ARRAY);
    callablestatement.setInt(2, param1);
    callablestatement.setInt(3, param2);
    callablestatement.setString(4, param3);

    callablestatement.execute();

create or replace type dates
       is varray(100) of varchar2(32);

功能

CREATE OR REPLACE function myfunc (    
    p_id    IN number,
    p_c_id     IN number,
    p_co_no     IN number

)
    RETURN dates
AS
    myarray contract_dates;
    par1        VARCHAR2 (32);
    par2        VARCHAR2 (32);

修正更新3

connection = con.getConnection();
        callablestatement = 
                connection.prepareCall("begin ? :=myfunc(?,?,?); end;");
        callablestatement.registerOutParameter(1, OracleTypes.ARRAY, "DATES");
        callablestatement.setInt(2, param1);
        callablestatement.setInt(3, param2);
        callablestatement.setString(4, param3);
        callablestatement.execute();

共 (5) 个答案

  1. # 2 楼答案

    我没有用ARRAY来做这件事,但它应该可以工作。首先,必须注册函数的out参数。所以可以是这样

    private final String PRODECURE_NAME = "{? = call <ProcedureName>(?,?,?)}";
    
    Connection con = null;
    CallableStatement cs = null;
    
           try {
                con = DAOFactory.getDatabaseConnection();
                cs = con.prepareCall(PRODECURE_NAME);
                cs.registerOutParameter(1, java.sql.Types.ARRAY);
                cs.setYourType(2, <yourData>);
                cs.setYourType(3, <yourData>);
                cs.setYourType(4, <yourData>);
                cs.execute();
                Array arr = cs.getArray(1);
                if (arr != null) {
                   String[] data = (String[]) arr.getArray();
                }
            } 
            catch (SQLException ex) {
                Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
                try {
                    con.rollback();
                }
            }
            finally {
                if (con != null) {
                    try {
                        con.close();
                    } 
                    catch (SQLException ex) {
                        Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
    

    试试这个男人,然后告诉我是不是这样

    编辑:

    这些是什么表示一个要设置的参数(称为Parameterized)。 因此:

    cs.setYourType(2, <yourData>);
    cs.setYourType(3, <yourData>);
    cs.setYourType(4, <yourData>);
    

    也就是说,你设置了三个参数(?),方法的第一个参数是列索引,第二个参数是特定类型的数据


    编辑2:

    很抱歉,我编写了错误的解决方案,已经更新了,所以现在检查代码并尝试一下

  2. # 3 楼答案

    {a1}包含一整节(16.5),专门用于处理数组。你可能想看看

  3. # 4 楼答案

    是的,您需要registerOutParameter类型Types.ARRAY
    参见示例here

  4. # 5 楼答案

    从PL/SQL返回的myArray类型为java。sql。数组。您可以对其调用getArray(),然后键入cast以获得java数组

    String[] array = (String[]) myArray.getArray();