Любой альтернативный способ вызвать процедуру db2, у которой есть тип строки массива входного параметра? - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь передать массив типа строки в качестве входных данных для сохранения процедуры из jdbc.

Написал код ниже, и получение «Метод createStruct» не поддерживается в соединении.

Таблица:

create table wspout.test (username varchar(100),location varchar(100),status varchar(100));

Тип строки:

CREATE OR REPLACE TYPE TEST_ROW AS ROW ANCHOR ROW OF test;

Тип строки массива:

CREATE OR REPLACE TYPE TEST_ROW_ARRAY AS TEST_ROW ARRAY[];

Имя процедуры хранения:

CREATE OR REPLACE PROCEDURE TEST_PROC (IN p_test_row_array TEST_ROW_ARRAY)
P1: BEGIN
DECLARE i INTEGER;
DECLARE v_test_row TEST_ROW;
SET i = 1;
WHILE i < CARDINALITY(p_test_row_array) DO
    SET v_test_row = p_test_row_array[i];
    insert into test values(v_test_row.username,v_test_row.location,v_test_row.status);
    set i = i + 1;
END WHILE;
END P1@

my javaкласс: отсюда вызов процедуры магазина

package Test;

import java.sql.Array;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Struct;
import java.util.ArrayList;
import java.util.List;

public class TestJdbc{

  public static void main(String[] args) {

    try {
      Class.forName("com.ibm.db2.jcc.DB2Driver");
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
        return;
    }
    System.out.println("DB2 driver is loaded successfully");
    Connection conn = null;
    PreparedStatement pstmt = null;
    try {
        conn = DriverManager.getConnection("jdbc:db2://localhost:40000/db2inst1","test","test123");
        if (conn != null)
        {
        System.out.println("DB2 Database Connected");


        List<Object> test_row_List = new ArrayList<>();
        Struct test_row[] = new java.sql.Struct[3];
        Array test_row_arr;        

        test_row[0] = conn.createStruct("TEST_ROW", new Object[] { "user1","Location1", "status1"});
        test_row_List.add(test_row[0]);

        test_row[1] = conn.createStruct("TEST_ROW", new Object[] { "user2","Location2", "status2"});
        test_row_List.add(test_row[1]);

        test_row[2] = conn.createStruct("TEST_ROW", new Object[] { "user3","Location3", "status4"});
        test_row_List.add(test_row[2]);

        test_row_arr = conn.createArrayOf("TEST_ROW", test_row_List.toArray());

        System.out.println("Array value" + test_row_arr);

        pstmt = conn.prepareCall("CALL TEST_PROC(?)");                      
        pstmt.setArray(1, test_row_arr);
        pstmt.execute();
        }
    } catch (SQLException e) {
        System.out.println("DB2 Database connection e");
        e.printStackTrace();
        return;
    }


  }

во время работы я получаю ниже исключения.

*DB2 driver is loaded successfully
DB2 Database Connected
DB2 Database connection e
com.ibm.db2.jcc.am.SqlFeatureNotSupportedException: [jcc][t4][10181][12052][4.11.69] Method createStruct is not supported. ERRORCODE=-4450, SQLSTATE=0A504*
    at com.ibm.db2.jcc.am.gd.e(gd.java:605)
    at com.ibm.db2.jcc.am.gd.c(gd.java:625)
    at com.ibm.db2.jcc.am.lb.createStruct(lb.java:6761)
    at Test.TestJdbc.main(TestJdbc.java:38)

1 Ответ

0 голосов
/ 30 января 2019

Согласно Вызов хранимых процедур с параметрами ARRAY of ROW в приложениях JDBC :

...
//PreparedStatement pstmt = null;
CallableStatement pstmt = null;
...
//java.util.List<Object> test_row_List = new java.util.ArrayList<>();
// Actually it's not needed at all
java.util.List<Object> test_row_List = new java.util.ArrayList<Object>();
...
//test_row_arr = con.createArrayOf("TEST_ROW", test_row_List.toArray());
test_row_arr = con.createArrayOf("TEST_ROW", test_row);
...

И вам следует использовать следующее, если вы действительно не хотите вставить все строки вмассив, но последний.

WHILE i <= </strong> CARDINALITY (p_test_row_array)

...