返回首页

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

更新日期:2024年09月11日

命名的行的 Java™ 类必须实现 SQLData 接口。对于命名的行中每一元素,该类必须有一
个成员,但除了这些之外可有其他成员。这些成员可以按任何顺序,且不要公开。
对于命名的行,Java 类必须实现 writeSQL()、readSQL() 和 getSQLTypeName() 方法,如
在 SQLData 接口中定义的那样,但可实现附加的方法。可使用 ClassGenerator 实用程序来
创建该类;要获取更多信息,请参阅 ClassGenerator 实用程序。
要以命名的行来链接此 Java 类,请使用 Connection.setTypeMap() 方法或 getObject() 方法,
来创建定制的类型映射。要获取关于类型映射的更多信息,请参阅 映射数据类型。
不可使用 SQLData 接口来访问未命名的行。
SQLData 示例
本部分中所有示例的完整版本位于安装了驱动程序处的 demo/complex-types 目录中。要获
取更多信息,请参阅 示例代码文件。
下列示例包括一个实现 java.sql.SQLData 接口的 Java™ 类。
这里是样例数据库模式:
CREATE ROW TYPE fullname_t (first char(20), last char(20));
CREATE ROW TYPE person_t (id int, name fullname_t, age int);
CREATE TABLE teachers (person person_t, dept char (20));
INSERT INTO teachers VALUES ("row(100, row('Bill', 'Smith'), 27)",
"physics");
这是 fullname Java 类:
import java.sql.*;
public class fullname implements SQLData

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 125
-
{
public String first;
public String last;
private String sql_type = "fullname_t";

public String getSQLTypeName()
{
return sql_type;
}
public void readSQL (SQLInput stream, String type) throws
SQLException
{
sql_type = type;
first = stream.readString();
last = stream.readString();
}
public void writeSQL (SQLOutput stream) throws SQLException
{
stream.writeString(first);
stream.writeString(last);
}
/*
* Function not required by SQLData interface, but makes
* it easier for displaying results.
*/
public String toString()
{
String s = "fullname: ";
s += "first: " + first + " last: " + last;
return s;
}
}
这是 person Java 类:
import java.sql.*;
public class person implements SQLData
{
public int id;

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 126
-
public fullname name;
public int age;
private String sql_type = "person_t";

public String getSQLTypeName()
{
return sql_type;
}
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;
}
}
这里是访存命名的行的示例:
java.util.Map map = conn.getTypeMap();
conn.setTypeMap(map);
map.put("fullname_t", Class.forName("fullname"));
map.put("person_t", Class.forName("person"));

...

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 127
-
PreparedStatement pstmt;
ResultSet rs;
pstmt = conn.prepareStatement("select person from teachers");
System.out.println("prepare ...ok");

rs = pstmt.executeQuery();
System.out.println("executetQuery()...ok");

while (rs.next())
{
person who = (person) rs.getObject(1);
System.out.println("getObject()...ok");
System.out.println("Data fetched:");
System.out.println("row: " + who.toString());
}
pstmt.close();
通过 Connection 对象,conn.getTypeMap() 方法从 java.util.Map 对象返回命名的行映射信
息。
map.put() 方法注册数据库服务器上嵌套的命名的行 fullname_t 与 Java 类 fullname 之间
的映射,以及数据库服务器上命名的行 person_t 与 Java 类 person 之间的映射。
person who = (person) rs.getObject(1) 语句将命名的行检索至 Java 对象 who 内。GBase 8s
JDBC Driver 承认此对象 who 是命名的行、distinct 类型或 opaque 类型,因为数据库服务
器发送的信息有扩展的名称 person_t。
驱动程序查找 person_t,
并发现它是命名的行。
驱动程序以键 person_t 调用 map.get() 方法,
其返回 person 类对象。实例化类 person 的一个对象。
person 类中的 readSQL() 方法调用定义在 SQLInput 接口中的方法,来将 ROW 列中每一
字段转换为 Java 对象,并将每一指定为 person 类中的一个成员。
下列展示一个方法,用于使用 setObject() 方法将 Java 对象插入至命名的行列内:
java.util.Map map = conn.getTypeMap();
map.put("fullname_t", Class.forName("fullname"));
map.put("person_t", Class.forName("person"));

...
PreparedStatement pstmt;
System.out.println("Populate person and fullname objects");
person who = new person();
fullname name = new fullname();

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 128
-
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);
System.out.println("prepared...ok");

pstmt.setObject(1, who);
System.out.println("setObject()...ok");

int rowcount = pstmt.executeUpdate();
System.out.println("executeUpdate()...ok");
pstmt.close();
通过 Connection 对象,conn.getTypeMap() 方法从 java.util.Map 对象返回命名的行映射信
息。
map.put() 方法注册数据库服务器上嵌套的命名的行 fullname_t 与 Java 类 fullname 之间
的映射,以及数据库服务器上命名的行 person_t 与 Java 类 person 之间的映射。
GBase 8s JDBC Driver 认可对象 who 实现 SQLData 接口,
因此,
它是命名的行、
distinct 类
型,
或 opaque 类型。
对于此对象,
GBase 8s JDBC Driver 调用 getSQLTypeName() 方法
(需
要类实现 SQLData 接口),其返回 person_t。驱动程序查找 person_t,并发现它是命名的
行。
对于类中的每一成员,
person 类中的 writeSQL() 方法调用对应的 SQLOutput.writeXXX() 方
法,将其每一都映射至命名的行 person_t 中的一个字段。该类中的 writeSQL() 方法包含
对 SQLOutput.writeObject(name) 和 SQLOutput.writeInt(id) 方法的调用。序列化类 person 的
每一成员,并写至流内。

GBA-02DR-0015

GBase 8a MPP Cluster 产品手册
7 附录
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1658
错误码
错误标识
错误信息
GBA-02DR-0015

Sync backup table failed
错误出现原因
更新备份表出错
分析与建议
同步工具报错,根据同步工具错误信息排除问题

功能描述
为当前事务做两阶段提交的准备。
在命令之后,事务就不再和当前会话关联了;
它的状态完全保存在磁盘上,它被提交成
功的可能性非常高,即使是在请求提交之前数据库发生了崩溃也如此。
一旦准备好了,一个事务就可以在稍后用COMMIT PREPARED 或ROLLBACK
PREPARED 命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初
执行事务的那个会话。
从发出命令的会话的角度来看,PREPARE TRANSACTION 不同于ROLLBACK:在执
行它之后,就不再有活跃的当前事务了,
并且预备事务的效果无法见到(在事务提交的时候
其效果会再次可见)。
如果PREPARE TRANSACTION 因为某些原因失败,
那么它就会变成一个ROLLBACK,
当前事务被取消。
注意事项
事务功能由数据库自动维护,不应显式使用事务功能。
在运行PREPARE TRANSACTION 命令时,必须在postgresql.conf 配置文件中增大
max_prepared_transactions 的数值。建议至少将其设置为等于max_connections,这样每个会
话都可以有一个等待中的预备事务。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1201
语法格式
PREPARE TRANSACTION transaction_id;
参数说明

transaction_id
待提交事务的标识符,用于后面在COMMIT PREPARED 或ROLLBACK PREPARED
的时候标识这个事务。它不能和任何当前预备事务已经使用了的标识符同名。
取值范围:标识符必须以字符串文本的方式书写,并且必须小于200 字节长。
相关命令
COMMIT PREPARED,ROLLBACK PREPARED