返回首页

gbase数据、南大通用产品文档:GBase8sStruct 接口

更新日期:2024年09月11日

JDBC 资料未指定 Struct 对象可作为 PreparedStatement.setObject() 方法的参数。
然而,
GBase
8s JDBC Driver 可处理实现 java.sql.Struct接口
的 PreparedStatement.setObject() 或 ResultSet.getObject() 方法处理的任何对象。
必须使用 Struct 接口来访问未命名的行。
无需创建自己的类来实现 java.sql.Struct 接口。然而,在您可插入或更新 ROW 数据之前,
必须执行访存来检索 ROW 数据和类型信息。GBase 8s JDBC Driver 自动地调
用 getSQLTypeName() 方法,其返回命名的行的类型名称,或未命名的行的行定义。
如果创建自己的类来实现 Struct 接口,则您创建的类必须实现所有 java.sql.Struct 方法,包
括 getSQLTypeName() 方法。您可选择getSQLTypeName() 方法返回什么。
虽然必须返回未命名的行的行定义,但是,您可返回命名的行的行名称或行定义。每一个
都有优点:

行定义。驱动程序无需为了类型信息查询数据库服务器。此外,返回的行定义不必
与命名的行定义完全匹配,
因为数据库服务器提供强制转型,
如果需要的话。
例如,
如果想要使用字符串来插入至行中的 opaque 类型,则这是有用的。

行名称。如果用户定义的例程采用命名的行作为参数,则签名必须匹配,因此,您
必须在命名的行中传递。
要获取关于用户定义的例程的更多信息,
请参数下列出版物:J/Foundation 开发者指南
(特
定于 Java™ 的信息);GBase 8s 用户定义的例程和数据类型开发者指南 和 GBase 8s SQL
指南:参考(都是关于用户定义的例程的通用信息);GBase 8s SQL 指南:语法(创建和
调用用户定义的例程的语法)。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 128 -

重要: 如果为命名的行使用 Struct 接口,并为命名的行提供类型映射信息,则当调
用 ResultSet.getObject() 方法时,
会产生 ClassCastException 信息,
因为 Java 不可在 SQLData 对
象与 Struct 对象之间强制转型。
Struct 示例
本部分中所有示例的完整版本位于安装了驱动程序处的 demo/complex-types 目录中。要获
取更多信息,请参阅 示例代码文件。
此示例访存未命名的 ROW 列。这里是样例数据库模式:
CREATE TABLE teachers
(
person row(
id int,
name row(first char(20), last char(20)),
age int
),
dept char(20)
);
INSERT INTO teachers VALUES ("row(100, row('Bill', 'Smith'), 27)", "physics");
这是该示例的剩余部分:
PreparedStatement pstmt;
ResultSet rs;
pstmt = conn.prepareStatement("select person from teachers");
System.out.println("prepare ...ok");
rs = pstmt.executeQuery();
System.out.println("executetQuery()...ok");

rs.next();
Struct person = (Struct) rs.getObject(1);
System.out.println("getObject()...ok");
System.out.println("\nData fetched:");

Integer id;
Struct name;
Integer age;
Object[] elements;

/* Get the row description */
String personRowType = person.getSQLTypeName();

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 129 -

System.out.println("person row description: " + personRowType);
System.out.println("");

/* Convert each element into a Java object */
elements = person.getAttributes();

/*
* Run through the array of objects in 'person' getting out each structure
* field. Use the class Integer instead of int, because int is not an object.
*/
id = (Integer) elements[0];
name = (Struct) elements[1];
age = (Integer) elements[2];
System.out.println("person.id: " + id);
System.out.println("person.age: " + age);
System.out.println("");

/* Convert 'name' as well. */
/* get the row definition for 'name' */
String nameRowType = name.getSQLTypeName();
System.out.println("name row description: " + nameRowType);

/* Convert each element into a Java object */
elements = name.getAttributes();

/*
* run through the array of objects in 'name' getting out each structure
* field.
*/
String first = (String) elements[0];
String last = (String) elements[1];
System.out.println("name.first: " + first);
System.out.println("name.last: " + last);
pstmt.close();
如果列 1 是 ROW 类型,
且没有扩展的数据类型名称
(如果它是命名的行的话)

则 Struct
person = (Struct) rs.getObject(1) 语句实例化一个 Struct 对象。
elements = person.getAttributes(); 语句执行下列活动:

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 130 -


以正确的元素数分配一个 java.lang.Object 对象的数组

将该行中每一元素转换为一 Java™ 对象
如果该元素为 opaque 类型,则必须在 Connection 对象中提供类型映射,或在
对 getAttributes() 方法的调用中传递一个java.util.Map 对象。
String personrowType = person.getSQLTypeName(); 语句返回行类型信息。
如果此类型为命名
的行,则该语句返回名称。由于类型不是命名的行,因此,该语句返回行定义:row(int id,
row(first char(20), last char(20)) name, int age).
然后,该示例进入未命名的行 name 的后续步骤,如同对未命名的行 person 一样。
下列示例使用用户创建的类 GenericStruct,其实现 java.sql.Struct 接口。作为替代,您可使
用从 ResultSet.getObject() 方法返回的 Struct 对象,而不是 GenericStruct 类。
import java.sql.*;
import java.util.*;
public class GenericStruct implements java.sql.Struct
{
private Object [] attributes = null;
private String typeName = null;

/*
* Constructor
*/
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
{

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 131 -

// this class shouldn't be used if there are elements
// that need customized type mapping.
return attributes;
}
public void setAttributes(Object [] objArray)
{
attributes = objArray;
}
public void setSQLTypeName(String name)
{
typeName = name;
}
}
下列 Java 程序插入一 ROW 列:
PreparedStatement pstmt;
ResultSet rs;
GenericStruct gs;
String rowType;

pstmt = conn.prepareStatement("insert into teachers values (?, 'Math')");
System.out.println("prepare insert...ok\n");

System.out.println("Populate name struct...");
Object[] name = new Object[2];

// populate inner row first
name[0] = new String("Jane");
name[1] = new String("Smith");

rowType = "row(first char(20), last char(20))";
gs = new GenericStruct(rowType, name);
System.out.println("Instantiate GenericStructObject...okay\n");

System.out.println("Populate person struct...");
// populate outer row next
Object[] person = new Object[3];
person[0] = new Integer(99);
person[1] = gs;

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 132 -

person[2] = new Integer(56);

rowType = "row(id int, " +
"name row(first char(20), last char(20)), " +
"age int)";
gs = new GenericStruct(rowType, person);
System.out.println("Instantiate GenericStructObject...okay\n");

pstmt.setObject(1, gs);
System.out.println("setObject()...okay");
pstmt.executeUpdate();
System.out.println("executeUpdate()...okay");
pstmt.close();
在此示例中的 pstmt.setObject(1, gs) 语句处,GBase 8s JDBC Driver 确定要从客户机传至数
据库服务器的信息作为 ROW 列,因为GenericStruct 对象是 java.sql.Struct 接口的一个实例。

序列化数组中的每一元素,核实每一元素与由 getSQLTypeName() 方法定义的类型相匹配。

macaddr
macaddr 类型存储MAC 地址,也就是以太网卡硬件地址(尽管MAC 地址还用于其它
用途)
。可以接受下列格式:
'08:00:2b:01:02:03'
'08-00-2b-01-02-03' '08002b:010203' '08002b-010203' '0800.2b01.0203'
'08002b010203'
这些示例都表示同一个地址。对于数据位a 到f,大小写都行。输出时都是以第一种形
式展示。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
69


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 9 -
GBase 8s ODBC Driver 包括四个组件。
GBase 8s ODBC Driver 包括下列组件:

环境变量

标头文件

数据类型