KingbaseES V8 JDBC调用array参数存储过程

概述

之前遇到某项目迁移Oracle至KingbaseES V8, 应用为java开发,用到了java调用存储过程批量插入数据,数据以数组的形式通过存储过程的入参传入,kingbase官方文档没有发现关于java操作数组参数的相关文档及用例,本人摸索调试成功java调用带数组类型入参的存储过程,分享给大家。

环境

数据库服务器操作系统:CentOS 7
数据库版本:KingbaseES V8R6
java环境:jdk 1.8

测试表及存储过程

create table t_cash_batch(batch_no varchar,record_time date);

\set SQLTERM /
create or replace procedure PROC_FORALL_CASHBATCH4TRANS2(
       para1  text[],
       para2  date[]as
begin	
forall i in 1.. array_length(para1,1)
INSERT INTO T_CASH_BATCH(
       BATCH_NO,RECORD_TIME)
VALUES(para1[i],para2[i]);
END PROC_FORALL_CASHBATCH4TRANS2;
/
\set SQLTERM ;

KingbaseES 数组类型

KingbaseES允许一个表中的列定义为变长多维数组。可以创建任何内建或用户定义的基类、枚举类型、组合类型或者域的数组。

数组类型的定义:
为了展示数组类型的使用,我们创建这样一个表:

CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);

如上所示,一个数组数据类型可以通过在数组元素的数据类型名称后面加上方括号( [] )来命名。上述命令将创建一个名为 sal_emp 的表,它有一个类型为 text 的列( name ),一个表示雇员的季度工资的一维 integer 类型数组( pay_by_quarter ),以及一个表示雇员每周日程表的二维 text 类型数组( schedule )。

JDBC接口数组类型:java.sql.Array
kingbase的 jdbc接口数组实现:com.kingbase8.jdbc.KbArray
KBConnection类带有数据元素初始化方法:
Array createArrayOf(String typeName, @Nullable Object elements)
参数typeName为数据元素类型;
参数elements为数据元素值;

测试程序示例

package bindarrayTest;

import java.sql.Array;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;

import com.kingbase8.jdbc.KbArray;

public class BindArrayTest {

	protected String Driver = "com.kingbase8.Driver";
    
    protected Connection connection = null;
    
    protected void Driver() throws ClassNotFoundException
    {
        Class.forName(Driver);
    }
       
    
	public static void main(String[] args) throws ClassNotFoundException,SQLException,InterruptedException{
		// TODO Auto-generated method stub
		BindArrayTest atest=new BindArrayTest();
		atest.Driver();
		
		String url = "jdbc:kingbase8://192.168.40.100:54321/test";
		Connection conn=DriverManager.getConnection(url, "system", "111111");
		if(conn != null)
    	{
    		System.out.println("connection sucessful!");
    	}else{
    		System.out.println("connection fail!");
    	}
		String[] a= {"Beijing","Shanghai","Tianjin"};
		Timestamp[] b= {Timestamp.valueOf("2022-11-21 12:21:23"),Timestamp.valueOf("2021-12-14 15:21:34"),Timestamp.valueOf("2020-12-14 12:21:34")};
		Array aArray=conn.createArrayOf("text", a);
		Array bArray=conn.createArrayOf("Date", b);
		
		String insertPro="{call PROC_FORALL_CASHBATCH4TRANS2(?,?)}";
		PreparedStatement cstmt=conn.prepareCall(insertPro);
		conn.setAutoCommit(false);
		cstmt.setObject(1, aArray);
		cstmt.setObject(2, bArray);
		
		cstmt.execute();
		conn.commit();
		conn.setAutoCommit(true);

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值