返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

GBA-02EX-0007
错误码
错误标识
错误信息
GBA-02EX-0007
ER_EXECUTOR_QU
ERY
Failed to fork a child process
错误出现原因
创建子进程失败

GBase 8a MPP Cluster 产品手册
7 附录
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1668
分析与建议
创建子进程失败


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 199 -
可以选择禁用消息链接。
在禁用消息链接之前,请考虑以下情况:

一些 SQL 语句需要立即回复。如果禁用消息链接,请在限制的 SQL 语句完成后重
新启动 OPTMSG 功能。

如果执行调试。可以在试图确定每个 SQL 语句应答时禁用 OPTMSG 功能。

如果启用 OPTMSG,该消息会在数据库服务器中列队,但是不会发送进行处理。考
虑在程序中的最后一条 SQL 语句之前禁用消息链接,
以确保数据库服务器在应用程
序退出之前处理所有消息。

如果禁用消息链接,必须在需要它的 SQL 语句之后立即重置
SQL_INFX_ATTR_OPTMSG 属性,来避免意外链接。
以下示例显示如何禁用消息链接,通过在 DELETE 语句之后放置
SQL_INFX_ATTR_OPTMSG 属性。如果将该属性放在删除语句后,则驱动程序可以
在下一条 SQL 语句之前时,刷新所有排队的消息:
SQLSetStmtOption(hstmt, SQL_INFX_ATTR_OPTMSG, 1);
SQLExecDirect(hstmt, (unsigned char *)
"delete from customer", SQL_NTS);
SQLSetStmtOption(hstmt, SQL_INFX_ATTR_OPTMSG, 0);
SQLExecDirect(hstmt, (unsigned char *)
"create index ix1 on customer (zipcode)", SQL_NTS);
意外消息链接会使其很难确定哪一个链接的语句失败。
在 CREATE INDEX 语句中,驱动程序将 DELETE 和 CREATE INDEX 语句发送
到数据库服务器。

命名的行的 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 的
每一成员,并写至流内。