简体   繁体   English

Java中的C#等效项,用于向命令参数添加关联数组

[英]C# Equivalent in Java for adding associative arrays to command parameter

I am using bind variables in a merge statement and it contains associative arrays. 我在合并语句中使用绑定变量,它包含关联数组。 What would be the equivalent Java code. 什么是等效的Java代码。 I tried using PreparedStatement and callable statement but they won't work for arrays. 我尝试使用PreparedStatement和Callable语句,但它们不适用于数组。

comm.Parameters.Add(new OracleParameter(":student_id", OracleDbType.Varchar2, arrayCount, studentId, System.Data.ParameterDirection.Input));
comm.Parameters.Add(new OracleParameter(":first_name", OracleDbType.Varchar2, arrayCount, firstName, System.Data.ParameterDirection.Input));
comm.Parameters.Add(new OracleParameter(":last_name", OracleDbType.Varchar2, arrayCount, lastName, System.Data.ParameterDirection.Input));
comm.Parameters.Add(new OracleParameter(":created_by", OracleDbType.Varchar2, arrayCount, createdBy, System.Data.ParameterDirection.Input));
comm.Parameters.Add(new OracleParameter(":modified_by", OracleDbType.Varchar2, arrayCount, modifiedBy, System.Data.ParameterDirection.Input));

if(conn.State != ConnectionState.Open)
    conn.Open();
comm.ArrayBindCount = arrayCount;
comm.BindByName = true;

Here is my merge statement 这是我的合并声明

MERGE INTO STUDENT USING DUAL ON(student_id = :student_id) 
WHEN MATCHED THEN 
    UPDATE SET modified_by = :modified_by, 
               first_name = :first_name, 
               last_name = :last_name 
WHEN NOT MATCHED THEN 
    INSERT (student_id, first_name, last_name, created_by, modified_by) 
    VALUES (:student_id, :first_name,:last_name,:created_by,:modified_by) 
LOG ERRORS INTO ERR$_STUDENT ('MERGE') REJECT LIMIT UNLIMITED

Sample Java Code 示例Java代码

        conn = DriverManager.getConnection(jdbcUrl,connProps);
        conn.setAutoCommit(false);
        stmt = conn.createStatement();          
          int arrayCount = 3;
          String[] studentId = new String[arrayCount];
          String[] firstName = new String[arrayCount];
          String[] lastName = new String[arrayCount];
          String[] createdBy = new String[arrayCount];
          String[] modifiedBy = new String[arrayCount];
          for (int i = 0; i < arrayCount; i++)
          {
              studentId[i] = String.valueOf(i + 1);
              firstName[i] = "Alan" + (i + 1);
              lastName[i] = "King" + (i + 1);
              createdBy[i] = "Scott" + (i + 1);
              modifiedBy[i] = "Victor" + (i + 1);
          }                             
        String sql = GetArrayMergeSQL();            
        PreparedStatement mergeStatement = conn.prepareStatement(sql);  
        NamedParameterStatement p = new NamedParameterStatement(conn,sql);
        CallableStatement merge = (CallableStatement) conn.createStatement();
        merge.setNString(":student_id", studentId);
        int count = stmt.executeUpdate(sql);    
        conn.commit();

I think that you want to execute the same statement with a set of different parameters. 我认为您想使用一组不同的参数执行同一条语句。 In JDBC it is implemented using batching 在JDBC中,它是使用批处理实现的

So your result code will look like this: 因此,您的结果代码将如下所示:

Connection conn = DriverManager.getConnection(jdbcUrl, connProps);
conn.setAutoCommit(false);
String sql = GetArrayMergeSQL();
PreparedStatement mergeStatement = conn.prepareStatement(sql);
int arrayCount = 3;
for (int i = 0; i < arrayCount; i++)
{
    mergeStatement.setString(1, "Victor" + (i + 1));
    mergeStatement.setString(2, "Alan" + (i + 1));
    mergeStatement.setString(3, "King" + (i + 1));
    mergeStatement.setInt(4, i + 1);
    mergeStatement.setString(5, "Alan" + (i + 1));
    mergeStatement.setString(6, "King" + (i + 1));
    mergeStatement.setString(7, "Scott" + (i + 1));
    mergeStatement.setString(8, "Victor" + (i + 1));
    mergeStatement.addBatch();
}
int[] count = mergeStatement.executeBatch();
conn.commit();

Also JDBC does not support named parameters - you have to replace them with ? 而且JDBC不支持命名参数-您必须将其替换为? marks and reference them by position: 标记并按位置引用它们:

 MERGE INTO STUDENT USING DUAL ON(student_id = :student_id)
 WHEN MATCHED THEN
    UPDATE SET  modified_by = ? /*:modified_by*/,
                first_name = ? /*:first_name*/,
                last_name = ? /*:last_name*/
 WHEN NOT MATCHED THEN
    INSERT (student_id, first_name, last_name, created_by, modified_by)
    VALUES (? /*:student_id*/, ? /*:first_name*?, ? /*:last_name*/,? /*:created_by*/, ? /*:modified_by*/)
 LOG ERRORS INTO ERR$_STUDENT ('MERGE') REJECT LIMIT UNLIMITED

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM