南大通用GBase 8s JDBC 中 ROW 类型的应用

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

GBase 8s 提供了对 ROW 类型的支持,这使得在 JDBC 中处理嵌套数据结构变得更为灵活。

ROW 类型是一种复合数据类型,可以包含多个字段,每个字段都有自己的数据类型。在 GBase 8s 中,ROW 类型可以用于定义表的列、程序变量、语句变量以及例程返回值。通过 ROW 类型,可以更直观地表示和操作复杂的数据结构。

准备各个row类型:

sql 复制代码
CREATE ROW TYPE r1_t (i INT, b BOOLEAN);
CREATE ROW TYPE r2_t (f FLOAT, s MULTISET(INT8 NOT NULL), i INT);
CREATE ROW TYPE fullname_t (first CHAR(20), last CHAR(20));
CREATE ROW TYPE person_t (id INT, name fullname_t, age INT);

对应的几个SQLData实现类(只放核心代码)

typescript 复制代码
public class r1_t implements SQLData {
   int     int_col;
   boolean bool_col;
   public String toString() {
       String str = "int_col: " + int_col + "    bool_col: " + bool_col;
       return (str);
   }
}
ini 复制代码
public class r2_t implements SQLData {
   double     dbl_col;
   int        int_col;
   Collection  mset_col;
public void readSQL(SQLInput stream, String typeName) throws SQLException {
       dbl_col = stream.readDouble();
       mset_col = (Collection) ((IfmxComplexSQLInput) stream).readObject();
       int_col = stream.readInt();
   }
   public void writeSQL(SQLOutput stream) throws SQLException {
       stream.writeDouble(dbl_col);
       ((IfmxComplexSQLOutput) stream).writeObject(mset_col);
       stream.writeInt(int_col);
   }
public String toString() {
       String str = "dbl_col: " + dbl_col + "\n";
       str += "                int_col: " + int_col + "\n";
       str += "                mset_col: \n";
       Iterator it = mset_col.iterator();
       Object element;
       while (it.hasNext()) {
           element = it.next();
           str += "\t\t\telement: " + element + "\n";
       }
       return (str);
   }
}
typescript 复制代码
public class fullname implements SQLData {
   public String  first;
   public String  last;
}
public class person implements SQLData {
   public int      id;
   public fullname name;
   public int      age;
   public void readSQL(SQLInput stream, String type) throws SQLException {
   sql_type = type;
   id = stream.readInt();
   name = (fullname) stream.readObject();
   age = stream.readInt();
}
public void writeSQL(SQLOutput stream) throws SQLException {
   stream.writeInt(id);
   stream.writeObject(name);
   stream.writeInt(age);
}
public String toString() {
         String s = "person:";
         s += "id: " + id + "\n";
         s += "     name: " + name.toString() + "\n";
         s += "     age: " + age + "\n";
         return s;
     }
}

例1:

ini 复制代码
fetching a named row into a SQLData object
s = "create table teachers (person person_t, dept char (20))";
stmt.executeUpdate(s);
s = "insert into teachers values ('row(100, row(Bill, Smith), 27)', 'physics')";
stmt.executeUpdate(s);
java.util.Map map = conn.getTypeMap();
map.put("fullname_t", Class.forName("com.jdbc.demo.fullname"));
map.put("person_t", Class.forName("com.jdbc.demo.person"));
pstmt = conn.prepareStatement("select person from teachers");
rs = pstmt.executeQuery();
while (rs.next()) {
   person who = (person) rs.getObject(1);    
   System.out.println("row: " + who.toString());
}

输出:

sql 复制代码
row: person:id: 100
   name: fullname: first: Bill                 last: Smith               
   age: 27

例2:

ini 复制代码
insert java object(SQLData) into a named row column
s = "create table teachers (person person_t, dept char (20))";
stmt.executeUpdate(s);
java.util.Map map = conn.getTypeMap();
map.put("fullname_t", Class.forName("com.jdbc.demo.fullname"));
map.put("person_t", Class.forName("com.jdbc.demo.person"));
person who = new person();
fullname name = new fullname();
name.last = "Jones";
name.first = "Sarah";
who.id = 567;
who.name = name;
who.age = 17;
String s = "insert into teachers values (?, 'physics')";
pstmt = conn.prepareStatement(s);
pstmt.setObject(1, who);
int rowcount = pstmt.executeUpdate();
pstmt = conn.prepareStatement("select person::lvarchar from teachers");
rs = pstmt.executeQuery();
while (rs.next()) {
   String s = rs.getString(1);
System.out.println("lvarchar: " + s);
}

输出:

css 复制代码
lvarchar: ROW(567        ,ROW('Sarah               ','Jones               '),17         )

例3:

ini 复制代码
fetch a unnamed SQLROW column into a Struct object
s = "create table teachers (person row(id int, name row(first char(20), last char(20)), age int),dept char (20))";
stmt.executeUpdate(s);
s = "insert into teachers values ('row(100, row(Bill, Smith), 27)', 'physics')";
stmt.executeUpdate(s);
pstmt = conn.prepareStatement("select person from teachers");
rs = pstmt.executeQuery();
rs.next();
Struct person = (Struct) rs.getObject(1);
String personRowType = person.getSQLTypeName();
System.out.println("person row description: " + personRowType);
Integer id;
Struct name;
Integer age;
Object[] elements;
elements = person.getAttributes();
id = (Integer) elements[0];
name = (Struct) elements[1];
age = (Integer) elements[2];
System.out.println("person.id: " + id);
System.out.println("person.age: " + age);
String nameRowType = name.getSQLTypeName();
System.out.println("name row description: " + nameRowType);
String first = (String) elements[0];
String last = (String) elements[1];
System.out.println("name.first: " + first);
System.out.println("name.last: " + last);

输出:

sql 复制代码
person row description:  row ( id int , name row ( first char(20) , last char(20) ) , age int ) 
person.id: 100
person.age: 27
name row description: name row ( first char(20) , last char(20) )  // row前的name是列名
name.first: Bill                
name.last: Smith  

例4:

ini 复制代码
inserting a Struct object into a named row
public class GenericStruct implements java.sql.Struct {
   private Object[] attributes = null;
   private String   typeName   = null;
   
   GenericStruct() {
   }
   GenericStruct(String name, Object[] obj) {
       typeName = name;
       attributes = obj;
   }
   public String getSQLTypeName() {
       return typeName;
   }
   public Object[] getAttributes() {
       return attributes;
   }
   public Object[] getAttributes(Map map) throws SQLException {
       return attributes;
   }
   public void setAttributes(Object[] objArray) {
       attributes = objArray;
   }
   public void setSQLTypeName(String name) {
       typeName = name;
   }
}
s = "create table teachers (person person_t, dept char (20))";
stmt.executeUpdate(s);
PreparedStatement pstmt;
ResultSet rs;
GenericStruct gs;
String rowType;
pstmt = conn.prepareStatement("insert into teachers values (?, 'Math')");
Object[] name = new Object[2];
name[0] = new String("Jane");
name[1] = new String("Smith");
rowType = "row(first char(20), last char(20))";
gs = new GenericStruct(rowType, name);
Object[] person = new Object[3];
person[0] = new Integer(99);
person[1] = gs;
person[2] = new Integer(56);
rowType = "row(id int, name row(first char(20), last char(20)), age int)";
gs = new GenericStruct(rowType, person);
pstmt.setObject(1, gs);
pstmt.executeUpdate();
pstmt.close();
pstmt = conn.prepareStatement("select person::lvarchar from teachers");
rs = pstmt.executeQuery();
while (rs.next()) {
   String s = rs.getString(1);
System.out.println("lvarchar: " + s);
}

输出:

css 复制代码
lvarchar: ROW(99         ,ROW('Jane                ','Smith               '),56         )

例5:

ini 复制代码
Fetching and inserting a row(i int, b boolean) column
s = "create table row_tab (int_col int, row_col r1_t)";
stmt.executeUpdate(s);
s = "insert into row_tab (int_col, row_col) values (?, ?)";
pstmt = conn.prepareStatement(s);
java.util.Map customtypemap = conn.getTypeMap();
customtypemap.put("r1_t", Class.forName("com.jdbc.demo.r1_t"));
r1_t row = new r1_t(99, true);
pstmt.setInt(1, 1);
pstmt.setObject(2, row);
pstmt.executeUpdate();
// Select (i) -
// Fetch data using getObject() with customized type maping
s = "select int_col, row_col from row_tab order by int_col";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
rs.next();
int intret = rs.getInt("int_col");
row = (r1_t) rs.getObject("row_col");
System.out.println(row); // 输出:int_col: 99    bool_col: true
// ---------------------------------
// Selecting data as java.sql.Struct 
// ---------------------------------
Vector objVector = new Vector();
String s = "select int_col, row_col from row_tab order by int_col";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
rs.next();
Struct row = (Struct) rs.getObject("row_col", null);
Object[] objArray = row.getAttributes();
for (int i = 0; i < objArray.length; i++) {
   System.out.println("\t\tfield: " + objArray[i]);
}

输出:

ini 复制代码
        field: 99
        field: true
// -------------------------------------------------------
// Insert data using java.sql.Struct objects from previous select.
// -------------------------------------------------------
// 清空之前数据,略
s = "insert into row_tab values (?, ?)";
pstmt = conn.prepareStatement(s);
for (int i = 0; i < objVector.size(); i++) {
   pstmt.setInt(1, i);
   pstmt.setObject(2, objVector.get(i));
   pstmt.executeUpdate();
}
String s = "select int_col, row_col::lvarchar from row_tab order by int_col";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
rs.next();
System.out.println(rs.getString(2)); // 输出:row_col       ROW(99         ,'t')

例6:

ini 复制代码
s = "create table row_tab (int_col int, row_col r2_t)";
stmt.executeUpdate(s);
java.util.Map customtypemap = conn.getTypeMap();
customtypemap.put("r2_t", Class.forName("r2_t"));
String s = "insert into row_tab (int_col, row_col) values (?, ?)";
pstmt = conn.prepareStatement(s);
TreeSet set = new TreeSet();
set.add(new Long(1234567890));
set.add(new Long(-1234567890));
set.add(new Long(5));
row = new r2_t(1.67e30, set, 99);
pstmt.setInt(1, 1);
pstmt.setObject(2, row);
pstmt.executeUpdate();
String s = "select int_col, row_col from row_tab order by int_col";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
rs.next();
r2_t row = (r2_t) rs.getObject("row_col");
System.out.println(row);

输出:

yaml 复制代码
dbl_col: 1.67E30
int_col: 99
mset_col: 
    element: -1234567890
    element: 5
    element: 1234567890

例7:

ini 复制代码
s = "create table row_tab (int_col int, row_col row(f float, l list(lvarchar not null), i int))";
stmt.executeUpdate(s);
s = "insert into row_tab (int_col, row_col) values (?, ?)";
pstmt = conn.prepareStatement(s);
GenericStruct struct = null; // 同例4的GenericStruct 
Object[] objArray = null;
ArrayList list = null;
list = new ArrayList();
list.add(new String("John Smith"));
list.add(new String("Granny Apple"));
list.add(new String("Barry White"));
objArray = new Object[3];
objArray[0] = new Double(1.67e30);
objArray[1] = list;
objArray[2] = new Integer(99);
struct = new GenericStruct(rowDesc, objArray);
pstmt.setInt(1, 1);
pstmt.setObject(2, struct);
pstmt.executeUpdate();
s = "select int_col, row_col from row_tab order by int_col";
rs = stmt.executeQuery(s);
rs.next();
Struct row = (Struct) rs.getObject("row_col");
System.out.println("Class: " + row.getClass().getName());
System.out.println("SQLTypeName: " + row.getSQLTypeName());
Object[] objArray = row.getAttributes();
for (int i = 0; i < objArray.length; i++) {
   System.out.println("field: " + objArray[i]);
}

输出:

yaml 复制代码
Class: com.gbasedbt.jdbc.IfxStruct
SQLTypeName:  row ( f float , l list (  lvarchar not null) , i int ) 
field: -1.67E30
field: [Roger Jones, Jeff Brown]
field: -99

本文通过一系列示例展示介绍了如何在 GBase 8s 的 JDBC 环境中使用 ROW 类型。如果你在实践中遇到任何问题,欢迎随时在社区中提问,我们在这里为你提供支持!

原文链接:www.gbase.cn/community/p...

更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
likangbinlxa2 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k3 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.5 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存