簡體   English   中英

如何將整數數組傳遞給 Informix 存儲過程

[英]How to pass array of integer to Informix stored procedure

在 Java 中,如何將類型集的值傳遞給過程。 這似乎太基本了,但我無法解決,我花了幾天時間搜索示例 Java 代碼,了解如何將設置值傳遞給 Informix 過程。

工具

IBM Informix Dynamic Server Version 12.10.FC13
JDBC 4.10.14, 4.50.7
Java version "1.8.0_172"

Informix 程序

create procedure sp_demo_set_arg(
    arg1 set(integer not null)
)
...
end procedure

Java代碼

@Override
public Integer callProcedure(List<Integer> listOfId) {
    String sql = "{ call sp_demo_set_arg(?) }";
    
    @SuppressWarnings("rawtypes")
    java.util.HashSet arg1 = new HashSet();
    Integer intObject;
    int i;
    for (i=1; i <= 3; i++)
    {
        intObject = new Integer(i);
        arg1.add(intObject);
    }       
    
    Connection conn = null;
    try {
        conn = dataSource.getConnection();

        CallableStatement stmt = conn.prepareCall(sql);
        stmt.setObject(1, arg1); 
        stmt.executeUpdate();
        return 0;
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return 1;
}

堆棧跟蹤

...
java.sql.SQLException: Routine (sp_demo_set_arg) can not be resolved.
        at com.informix.jdbc.IfxSqli.addException(IfxSqli.java:3133)
        at com.informix.jdbc.IfxSqli.receiveError(IfxSqli.java:3417)
        at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2324)
        at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2249)
        at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.java:850)
        at com.informix.jdbc.IfxResultSet.executeUpdate(IfxResultSet.java:230)
        at com.informix.jdbc.IfxStatement.executeUpdateImpl(IfxStatement.java:1054)
        at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:396)
        at 
...

您的 Java 代碼可能會因 -674“無法解析例程”錯誤而失敗,因為服務器在執行時可能不知道參數類型。 試着給它一些“提示”改變“?” 對於 '?::SET(integer not null)'

就像是:

D:\Infx\work\Java>cat t2.java
import java.sql.*;
import java.util.*;

public class t2 {

 public static void main( String [] args ) {

 Connection conn = null;
 ResultSet dbRes = null;
 Statement is = null;

 try {
    Class.forName("com.informix.jdbc.IfxDriver");

   conn = DriverManager.getConnection("jdbc:informix-sqli://420ito:9091/stores7:INFORMIXSERVER=ids1410;user=informix;password=passw;SQLIDEBUG=pp;");

    is = conn.createStatement();
    is.executeUpdate("drop table t2; create table t2 (c1 SET(integer not null) );");

    java.util.HashSet arg1 = new HashSet();
    Integer intObject;
    int i;
    for (i=1; i <= 3; i++)
    {
        intObject = new Integer(i);
        arg1.add(intObject);
    }

    try {
        //CallableStatement stmt = conn.prepareCall("{ CALL p2(?)}");
        CallableStatement stmt = conn.prepareCall("{ CALL p2(?::SET(integer not null))}");
        stmt.setObject(1, arg1);
        stmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM t2");
    while (rs.next()) {
        java.util.HashSet set = (HashSet) rs.getObject(1);
        Iterator it = set.iterator();
        Object obj;
        i = 0;
        while (it.hasNext())
        {
            obj = it.next();
            System.out.println("    element[" + i + "] = " +   obj.toString());
            i++;
        }
    }
    rs.close();
    conn.close();
  }
  catch ( Exception e ) {
    System.err.println(e);
        e.printStackTrace();
   }
 }
}


D:\Infx\work\Java>javac t2.java
Note: t2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

D:\Infx\work\Java>java t2
    element[0] = 1
    element[1] = 2
    element[2] = 3

D:\Infx\work\Java>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM