VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

匿名块支持JDBC绑定变量输入输出

功能描述

该功能实现了JDBC驱动程序在使用匿名代码块的时候可以绑定变量作为输入输出参数。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
  • 只有使用配套的JDBC才可以实现该功能。
  • 输入类型支持数值/字符串/日期等数据库常用数据类型。
  • 内核输出类型只支持text,JDBC端支持ROWID类型输出。
  • 不支持自治事务匿名块绑定变量输入输出。

使用流程

1、创建并切换至兼容模式为Oracle的数据库db_oracle。

CREATE DATABASE db_oracle dbcompatibility='A';    
\c db_oracle

2、在数据库中建表。

create table t_rowid(a varchar,b int,c float8,d timestamp,e varchar,f varchar);

3、JAVA端正常连接数据库后进行如下操作。

(1)匿名块+绑定变量SQL语句。

String sql=
  "begin\r\n"+
  "  insert into t_rowid values(?,?,?,?,?,?) returning rowid into ?;\r\n"+
  "insert into t_rowid values(?) returning rowid into ?;\r\n"+
  "select ? into ?;\r\n""+
  "end";

(2)输入输出参数声明并执行。

try(CallableStatement pstmt = connection.prepareCall(sql)){
      pstmt.setString(1, "hello");
      pstmt.setInt(2, 666);
      pstmt.setDouble(3, 66.66)
      pstmt.setTimestamp(4, new java.sql.Timestamp(new Date() getTime())); pstmt.setString(5, null); 
      pstmt.setString(6, "0");
      pstmt.registerOutParameter(7,Types.VARCHAR); 
      pstmt.setString(8, "你好");
      pstmt.registerOutParameter(9,Types.VARCHAR); 
      pstmt.setString(10, "hello world");
      pstmt.registerOutParameter(11,Types.VARCHAR);
      pstmt.execute();
      String value =pstrmt.getString(7); 
      System.out.println("value:"+value); 
      String val = pstmt.getString(9); 
      System.out.println("value:"+val); 
      String valu = pstmt.getString(11); 
      System.out.println("value:"+valu)
}

3、在数据库中执行结果查询。

select * from t_rowid;

返回结果为:

  a   |   b   |    c  |          d           |    e | f

------+-------+-------+----------------------+------+---
hello |  666  | 66.66 | 2022-01-06 18:23:31:34|     | 0
你好
(2 rows)

4、JAVA端接受的结果。

value:0EQAAA==AAAAAA==BAA=
value:0EQAAA==AAAAAA==BQA=
value:hello world