返回首页

gbase数据、南大通用产品文档:GBase8a集群所有节点上进行本地文件加载

更新日期:2024年09月11日

使用file://+abs_path 指定file_list 信息。多个file://+abs_path 之间使用逗号分隔。
URL 的定义格式如下:
file:// +abs_path[,file:// +abs_path]
示例
LOAD DATA INFILE ‘file:///var/ftp/pub/line5*.tbl, file:///home/gbase/lineitem.*’
INTO TABLE test.t FIELDS TERMINATED BY ‘|’;

您还可选取基于非索引列的行,如下例所示:
DELETE FROM customer WHERE company = 'Druid Cyclery';
由于被测试的列没有唯一约束,因此此语句可能删除多行。(Druid Cyclery 可能有两个商
店,两个商店的名称相同但客户编号不一样。)
要了解 DELETE 语句影响多少行,
请从 customer 表中为 Druid Cyclery 选择符合条件的行
计数。
SELECT COUNT(*) FROM customer WHERE company = 'Druid Cyclery';
您还可选择这些行并显示它们,以确保它们是您想要删除的那些行。
然而,
当数据库对于多个用户同时可用时,
使用 SELECT 语句作为测试只是一种近似的方
法。在您执行 SELECT 语句与后续的 DELETE 语句之间的时间内,其他用户可能已修改
了该表并更改了结果。在此示例中,另一用户可能执行下列操作:

为名为 Druid Cyclery 的另一客户插入新行

在插入新行之前,删除一个或多个 Druid Cyclery 行

更新 Druid Cyclery 行以具有新的公司名称,或更新某个其他客户以具有名称
Druid Cyclery。
在这短短的时间间隔内,虽然其他用户不太可能执行这些操作,但确实存在这种可能性。
相同的问题也影响 UPDATE 语句。
在 并发和锁定 之下讨论解决此问题的方法,
且在 对多
用户环境编程 中讨论得更详细。
您可能遇到的另一个问题是,在该语句完成之前出现硬件或软件故障。在此情况下,数据
库可能还没删除行,可能已删除了一些行,或已经删除了所有指定的行。数据库的状态未
知,这是我们不想看到的。要防止此情况,请使用事务日志记录,如 中断了的修改 讨论的
那样。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 162 -

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() 方法定义的类型相匹配。