返回首页

gbase数据、南大通用产品文档:GBase8sPreparedStatementsetXXX() 扩展的数据类型映射

更新日期:2024年09月11日

GBase 8s 介绍许多扩展数据类型。因此在 JDBC 或 Java™ 数据类型和 GBase 8s 数据类型
之间会有多个映射。
例如,可以使用 PreparedStatement.setAsciiStream() 插入 TEXT 列或 CLOB 列。同样,还
可以使用 PreparedStatement.setBinaryStream() 插入到 BYTE 列或 BLOB 列。由于实际的
列信息始终对 GBase 8s JDBC Driver 不可用,因此驱动程序在映射数据类型时可能会产生
歧义。
通常,在 INSERT 、SELECT 或 DELETE 语句中,列信息对驱动程序是可用的,因此驱
动程序可以确定如何将数据发送到数据库服务器。
但是,当在 UPDATE 语句或 WHERE 子句中引用数据时,GBase 8s JDBC Driver 不能访
问列信息。在这些情况下,除非您使用 GBase 8s 扩展,否则驱动程序使用在 GBase 8s 和
JDBC 数据类型之间映射的数据类型中第一个表列出的相应的 GBase 8s 数据类型映射这些
列。
对于PreparedStatement.setAsciiStream() 方法,
该驱动程序尝试映射到 TEXT 数据类型,
对于 PreparedStatement.setBinaryStream() 方法,它尝试映射到 BYTE 数据类型。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 268
-
映射扩展
要指示驱动程序映射到某个特定的数据类型
(因此 UPDATE 语句和 WHERE 子句中没有
歧义),您可使用扩展 PreparedStatement.setXXX() 方法。可能具有歧义的数据类型只有
boolean 、lvarchar 、text 、byte 、BLOB 和 CLOB。
要使用这些扩展方法,您必须将 PreparedStatement 引用转换为 IfmxPreparedStatement。
例如,
以下代码将语句变量 p_stmt 转换为IfmxPreparedStatement ,
以调用 IfxSetObject() 方
法,并将文件的内容作为 CLOB 类型的大对象插入。IfxSetObject() 定义为 I:
public void IfxSetObject(int i, Object x, int scale, int ifxType)
throws SQLException
public void IfxSetObject(int i, Object x, int ifxType) throws
SQLexception
代码为:
File file = new File("sblob_06.dat");
int fileLength = (int)file.length();
byte[] buffer = new byte[fileLength];
FileInputStream fin = new FileInputStream(file);
fin.read(buffer,0,fileLength);
String str = new String(buffer);

writeOutputFile("Prepare");
PreparedStatement p_stmt = myConn.prepareStatement
("insert into sblob_t20(c1) values(?)");

writeOutputFile("IfxSetObject");
((IfmxPreparedStatement)p_stmt).IfxSetObject(1,str,30,IfxTypes.IFX
_TYPE_CLOB);
对于 IfmxPreparedStatement.IfxSetObject 扩展,不能简单地使用添加的 ifxType 参数重载
方法签名。相反,您必须将该方法命名为IfxSetObject 。
不透明类型的扩展
处理不透明类型的扩展允许您的应用程序指定数据库服务器在将其返回给客户端之前将其
转换为不透明类型的返回类型。这被称为预先绑定返回值。方法是:

setBindColType(),它允许应用程序使用 java.sql.Types 的标准 JDBC 数据类型指定
结果集值的输出类型。

setBindColIfxType(),允许应用程序使用来自 com.gbasedbt.lang.IfxTypes 的 GBase
8s 数据类型指定结果集的输出类型

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 269
-
有关变量类型的更多信息,请参阅IfxTypes 类。

clearBindColType(),它重置通过前两个方法设置的值
在以下主题中:

colIndex 参数指定列:1 是第一列,2 是第二列,依此类推。

sqltype 参数是来自 java.sql.Types 的值:例如,Types.INTEGER。

ifxtype 参数是来自 IfxTypes 的值:例如,IfxTypes.IFX_TYPE_DECIMAL。

setBindColType() 方法
方法如下所示:
public void setBindColType(int colIndex, int sqltype) throws SQLException;
public void setBindColType(int colIndex, int sqltype, int scale)
throws SQLException;
public void setBindColType(int colIndex, int sqltype, String name)
throws SQLException;
第一个重载方法允许应用程序指定不透明类型为 java.sql.DECIMAL 或 java.sql.NUMERIC;
scale 参数指定小数点右边的位数。第二个重载方法允许应用程序通过将这些值分配
给 name 参数,来指定不透明类型为 java.sql.STRUCT 、java.sql.ARRAY 、
java.sql.DISTINCT 或java.sql.JAVA_OBJECT。

setBindColIfxType() 方法
方法如下所示:
public void setBindColIfxType(int colIndex, int ifxtype) throws SQLException;
public void setBindColIfxType(int colIndex, int ifxtype, int scale)
throws SQLException;
public void setBindColIfxType(int colIndex, int ifxtype, String name)
throws SQLException ;
第一个重载方法允许应用程序指定输出类型
为 IFX_TYPE_DECIMAL 或 IFX_TYPE_NUMERIC;scale 参数指定小数点右边的位数。第
二个重载方法允许应用程序通过将其中之一的值分配给 name 参数来指定输出类型
为 IFX_TYPE_LIST 、IFX_TYPE_ROW 、IFX_TYPE_MULTISET 、IFX_TYPE_SET、
IFX_TYPE_UDTVAR 或 IFX_TYPE_UDTFIXED。

clearBindColType() 方法

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 270
-
方法如下所示:
public void clearBindColType() throws SQLException;

Prebinding 示例
以下示例代码来自 udt_bindCol.java 样本程序,它预先将不透明类型绑定到 GBase
8s VARCHAR ,
然后绑定到标准的 Java™ Integer 类型。
此示例中使用的表具有一个 int 列
和一个不透明类型列,如下所示:
create table charattr_tab (int_col int, charattr_col charattr_udt)
在 charattr_col 列中选择和预绑定不透明类型的代码如下所示:
String s = "select int_col, charattr_col as cast_udt_to_lvc, " +
"charattr_col as cast_udt_to_int from charattr_tab order by 1";

pstmt = conn.prepareStatement(s);

((IfxPreparedStatement)pstmt).setBindColIfxType(2,IfxTypes.IFX_TYPE_LVARCH
AR);
((IfxPreparedStatement)pstmt).setBindColType(3,Types.INTEGER);

ResultSet rs = pstmt.executeQuery();

System.out.println("Fetching data ...");
int curRow = 0;
while (rs.next())
{
curRow++;
int intret = rs.getInt("int_col");
String strret = rs.getString("cast_udt_to_lvc");
int intret2 = rs.getInt("cast_udt_to_int");
} // end while
其它映射扩展
以下将列出剩余的方法与其应用条件。在每种情况中,GBase 8s 类型必须是标准
JDBC PreparedStatement.setXXX() 接口的最后一个参数。
IfmxPreparedStatement.setArray()
public void setArray(int parameterIndex, Array x, int ifxType)
throws SQLException

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 271
-
IfmxPreparedStatement.setAsciiStream()
public void setAsciiStream(int i, InputStream x, int length, int
ifxType) throws SQLException
当应用程序将一个很大的 ASCII 值插入到 LONGVARCHAR 列中时,使
用 java.io.InputStream 会更高效地将 ASCII 值发送到服务器。
IfmxPreparedStatement.setBigDecimal()
public void setBigDecimal(int i, BigDecimal x, int ifxType)
throws SQLException
IfmxPreparedStatement.setBinaryStream()
public void setBinaryStream(int i, InputStream x, int length, int
ifxType) throws SQLException
当应用程序插入一个很大的二进制值到 LONGVARbinary 列时,使
用 java.io.InputStream 将会更高效地将二进制值发送到服务器。
IfmxPreparedStatement.setBlob()
public void setBlob(int parameterIndex, Blob x, int ifxType)
throws SQLException
IfmxPreparedStatement.setBoolean()
public void setBoolean(int i, boolean x, int ifxType) throws
SQLException
IfmxPreparedStatement.setByte()
public void setByte(int i, byte x, int ifxType) throws
SQLException
IfmxPreparedStatement.setBytes()
public void setBytes(int i, byte x[], int ifxType) throws
SQLException
IfmxPreparedStatement.setCharacterStream()
public void setCharacterStream(int parameterIndex, Reader reader,
int length, int ifxType) throws SQLException
当应用程序将 LONGVARCHAR 参数设置为一个很大的 UNICODE 值时,使
用 java.io.Reader 会更高效率地将 UNICODE 值发送到服务器。
IfmxPreparedStatement.setClob()
public void setClob(int parameterIndex, Clob x, int ifxType)

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 272
-
throws SQLException
IfmxPreparedStatement.setDate()
public void setDate(int i, Date x, int ifxType) throws
SQLException
public void setDate(int parameterIndex, Date x, Calendar Cal,
int ifxType) throws SQLException
IfmxPreparedStatement.setDouble()
public void setDouble(int i, double x, int ifxType) throws SQ
LException
IfmxPreparedStatement.setFloat()
public void setFloat(int i, float x, int ifxType) throws
SQLException
IfmxPreparedStatement.setInt()
public void setInt(int i, int x, int ifxType) throws SQLException
IfmxPreparedStatement.setLong()
public void setLong(int i, long x, int ifxType) throws
SQLException
IfmxPreparedStatement.setNull()
public void setNull(int i, int sqlType, int ifxType) throws
SQLException
IfmxPreparedStatement.setShort()
public void setShort(int i, short x, int ifxType) throws
SQLException
IfmxPreparedStatement.setString()
public void setString(int i, String x, int ifxType) throws
SQLException
IfmxPreparedStatement.setTime()
public void setTime(int i, Time x, int ifxType) throws
SQLException
public void setTime(int parameterIndex, Time time, Calendar Cal,
int ifxType) throws SQLException
IfmxPreparedStatement.setTimestamp()

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 273
-
public void setTimestamp(int i, Timestamp x, int ifxType) throws
SQLException
public void setTimestamp(int parameterIndex, Timestamp x, Calendar
Cal) throws SQLException
IfxTypes 类
扩展的 IfmxPreparedStatement 方法要求您传入要映射到其中的 GBase 8s 数据类型。这些类
型是 com.gbasedbt.lang.IfxTypes 类的一部分。
下表显示了 IfxTypes 常量和对应的 GBase 8s 数据类型。
IfxTypes 常量
GBase 8s 数据类

IfxTypes.IFX_TYPE_BIGINT
BIGINT
IfxTypes.IFX_TYPE_BIGSERIAL
BIGSERIAL
IfxTypes.IFX_TYPE_CHAR
CHAR
IfxTypes.IFX_TYPE_SMALLINT
SMALLINT
IfxTypes.IFX_TYPE_INT
INT
IfxTypes.IFX_TYPE_FLOAT
FLOAT
IfxTypes.IFX_TYPE_SMFLOAT
SMALLFLOAT
IfxTypes.IFX_TYPE_DECIMAL
DECIMAL
IfxTypes.IFX_TYPE_SERIAL
SERIAL
IfxTypes.IFX_TYPE_DATE
DATE
IfxTypes.IFX_TYPE_MONEY
MONEY
IfxTypes.IFX_TYPE_NULL
NULL
IfxTypes.IFX_TYPE_DATETIME
DATETIME
IfxTypes.IFX_TYPE_BYTE
BYTE
IfxTypes.IFX_TYPE_TEXT
TEXT
IfxTypes.IFX_TYPE_VARCHAR
VARCHAR

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

IfxTypes.IFX_TYPE_INTERVAL
INTERVAL
IfxTypes.IFX_TYPE_NCHAR
NCHAR
IfxTypes.IFX_TYPE_NVARCHAR
NVARCHAR
IfxTypes.IFX_TYPE_INT8
INT8
IfxTypes.IFX_TYPE_SERIAL8
SERIAL8
IfxTypes.IFX_TYPE_SET
SQLSET
IfxTypes.IFX_TYPE_MULTISET
SQLMULTISET
IfxTypes.IFX_TYPE_LIST
SQLLIST
IfxTypes.IFX_TYPE_ROW
SQLROW
IfxTypes.IFX_TYPE_COLLECTION
COLLECTION
IfxTypes.IFX_TYPE_UDTVAR
UDTVAR
IfxTypes.IFX_TYPE_UDTFIXED
UDTFIXED
IfxTypes.IFX_TYPE_REFSER8
REFSER8
IfxTypes.IFX_TYPE_LVARCHAR
LVARCHAR
IfxTypes.IFX_TYPE_SENDRECV
SENDRECV
IfxTypes.IFX_TYPE_BOOL
BOOLEAN
IfxTypes.IFX_TYPE_IMPEXP
IMPEXP
IfxTypes.IFX_TYPE_IMPEXPBIN
IMPEXPBIN
IfxTypes.IFX_TYPE_CLOB
CLOB
IfxTypes.IFX_TYPE_BLOB
BLOB
扩展总结
本节中的表列出了 GBase 8s JDBC Driver 支持的非扩展数据类型和 GBase 8s 扩展数据类型
的 PreparedStatement.setXXX() 方法。

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 275
-
非扩展数据类型
下表列出了 GBase 8s JDBC Driver 支持的非扩展数据类型的 PreparedStatement.setXXX() 方
法。首先列出了 java.sql.Types 类中定义的标准 JDBC API 数据类型。它们会转换为特定
的 GBase 8s 数据类型,
如在扩展类型和 Java 和 JDBC 类型之间映射数据类型中的表所示。
下一个表列出了可用于写入特定 JDBC API 数据类型的数据的 setXXX() 方法。大写和粗
体 X 表示推荐与 GBase 8s JDBC Driver 一起使用的 setXXX() 方法;小写x 表示 GBase 8s
JDBC Driver 支持的其它方法。
数值型 JDBC API 数据类型
表 1. 来自 java.sql.Types 的数值型 JDBC API 数据类型
setXXX() 方法
TINYINT
SMALLINT
INTEGER
BIGINT
setByte()
X
x
x
x
setShort()
x
X
x
x
setInt()
x
x
X
x
setLong()
x
x
x
X
setFloat()
x
x
x
x
setDouble()
x
x
x
x
setBigDecimal()
x
x
x
x
setBoolean()
x
x
x
x
setString()
x
x
x
x
setObject()
x
x
x
x
表 2. 来自 java.sql.Types 的数值型 JDBC API 数据类型(续)
setXXX() 方法
REAL
FLOAT
DOUBLE
DECIMAL
NUMERIC
setByte()
x
x
x
x
x
setShort()
x
x
x
x
x
setInt()
x
x
x
x
x
setLong()
x
x
x
x
x
setFloat()
X
x
x
x
x

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 276
-
表 2. 来自 java.sql.Types 的数值型 JDBC API 数据类型(续)
setXXX() 方法
REAL
FLOAT
DOUBLE
DECIMAL
NUMERIC
setDouble()
x
X
X
x
x
setBigDecimal()
x
x
x
X
X
setBoolean()
x
x
x
x
x
setString()
x
x
x
x
x
setObject()
x
x
x
x
x
字符型和时间型 JDBC API 数据类型

表 3. 来自 java.sql.Types 的字符型和时间型 JDBC API 数据类型
setXXX() 方法
CHAR
VARCHAR
LONGVARCHAR
BINARY
setByte()
x1
x1


setShort()
x1
x1


setInt()
x1
x1


setLong()
x1
x1


setFloat()
x1
x1


setDouble()
x1
x1


setBigDecimal()
x
x


setBoolean()
x
x


setString()
X
X
x
x
setBytes()


x
X
setDate()
x
x


setTime()
x
x


setTimestamp()
x
x


setAsciiStream()


X
x

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


X
x
setBinaryStream()


x
x
setObject()
x
x
x2
x
注:
1. 列值必须精确符合 setXXX() 的类型,否则发出 SQLException 。如果列值不在允许
的范围内,则 setXXX() 方法发出异常并不会转换数据。例如,如果正在写入的值
是1000,则 setByte(1) 会引发 SQLException。
2.
写入一个字节数组。
表 4. 来自 java.sql.Types 的字符型和时间型 JDBC API 数据类型(续)
setXXX() 方法
VARBINARY
LONGVARBINARY
DATE TIME
TIMESTAMP
setString()
x
x
x
x
x
setBytes()
X
x



setDate()


X

x
setTime()



X
x
setTimestamp()


x

X
setAsciiStream()
x
x



setCharacterStream(
)
x
x



setBinaryStream()
x
X



setObject()
x
x1
x
x2
x
注:
1.
写入字节数组。
2.
写入 Timestamp 对象而不是 Time 对象。
setMaxRows() 方法写入 SQL 空值。
GBase 8s 扩展数据类型
下表列出了 GBase 8s JDBC Driver 支持的 GBase 8s 扩展数据类型
的 PreparedStatement.setXXX() 方法,
其之间的映射在表在扩展类型和 Java 和 JDBC 类型

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 278
-
之间映射数据类型中展示。该表列出了您可以用于写入的特定扩展数据类型的数据
的 setXXX() 方法。
大写并加粗的 X 表示推荐使用的 setXXX() 方法;
小写的 x 表示 GBase 8s JDBC Driver 支持
的其它 setXXX() 方法。
该表不包含您不能使用的GBase 8s 扩展数据类型的 setXXX() 方法。

表 1. GBase 8s 扩展数据类型
setXXX() 方法
BOOLEAN
LVARCHAR
Opaque
类型
BLOB
CLOB BYTE TEXT
setByte()
x
x





setShort()
x






setInt()
x






setBoolean()
X






setString()

X


x

x
setBytes()



x

x

setAsciiStream()

x


x

X
setCharacterStream(
)

x


x

X
setBinaryStream()
x


x

X

setObject()
x
x
X
x
x
x
x
setArray()







setBlob()



X



setClob()




X


表 2. GBase 8s 扩展数据类型(续)
setXXX() 方法
NAMED ROW
UNNAMED ROW
SET 或
MULTISET
LIST
setObject()
X
X
x
x
setArray()


x
x
setMaxRows() 方法写入一个 SQL 空值。

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

在GBase ADO.NET 中调用一个存储过程
...............
23

功能
枚举型变量,用于指定HDFS 认证方式。
参数取值含义说明
simple:使用基本认证;
kerberos:使用Kerberos 认证。
与其它枚举型变量相同,参数值支持大写、小写及大小混合形式。支持由首字母
开始的一个或多个连续字母的缩写形式,比如以下方式为合法的参数值:
simple, Simple, SIMPLE, kerberos, Kerberos, KERBEROS,
s, sim, simp, k, ker, Kerb
表6- 80 参数值范围说明表
默认值
最小值
最大值
simple