java - 在java中获取pl/sql数组返回值

标签 java oracle jdbc plsql

在 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();

最佳答案

我没有用 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);
                }
            }
        }

试试这个人,然后告诉我是否可行。

编辑:

这些字符 ? 代表一个你要设置的参数(它被命名为参数化)。 所以这个:

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

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


编辑 2:

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

关于java - 在java中获取pl/sql数组返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785459/

相关文章:

oracle - 使用 OraOLEDB 提供商部署应用程序

java - android直接使用mysql-connector连接mysql数据库

java - 修改类中类的变量

java - 从方法中获取实例

c# - 为什么这个 RETURNING INTO 子句会返回一个错误?

java - JDBC 使用 url 进行连接

java - 如何将 Timestamp 转换为 Date 或 DateTime 对象?

java - 如果在 xml 中它是空的,为什么 simplexml 将 NULL 设置为字段?

java - 骰子滚动战斗系统

java - 更新 ResultSet 中的行会生成错误 : 'Value conflicts occurs'