BYTE 数据类型是在不可分的字节流中存储任何数据的简单大对象数据类型。此二进制数 据的示例包括电子表格、数字化的语音模式以及视频片段。TEXT 数据类型是存储任何文 本数据的简单大对象数据类型。它可同时包含单个的和多字节的字符。 任一数据类型的列都有 231 字节的理论限制,实际限制取决于磁盘容量。
1、高速缓存大对象
每当从数据库服务器访存 BLOB、CLOB、text 或 byte 类型的对象时,都在客户机内存中 高速缓存该数据。如果大对象的大小大于 LOBCACHE 环境变量中的值,则在临时文件中 存储大对象数据。要获取关于 LOBCACHE 变量的更多信息,请参阅 大对象的内存管理。
2、示例:插入或更新数据
要插入至 BYTE 或 TEXT 列,或更新这些列,请从源读取诸如操作系统文件这样的数据 流,并将它作为 java.io.InputStream 对象传送至数据库。PreparedStatement 提供设置此 Java ™ 输入流的输入参数的方法。当执行该语句时,GBase 8s JDBC Driver 反复地调用该输入流, 读取它的内容,并将这些内容作为实际的参数数据传送至数据库。
对于 BYTE 数据类型,请使用 PreparedStatement.setBinaryStream() 方法来设 置 InputStream 对象的输入参数。对于 TEXT 数据类型,请使用 PreparedStatement.setAsciiStream() 方法。
来自 ByteType.java 程序的下列示例展示如何将操作系统文件 data.dat 的内容插入至 BYTE 数据类型的列内:
try
{
stmt = conn.createStatement();
stmt.executeUpdate("create table tab1(col1 byte)");
}
catch (SQLException e)
{
System.out.println("Failed to create table ..." + e.getMessage());
}
try
{
pstmt = conn.prepareStatement("insert into tab1 values (?)");
}
catch (SQLException e)
{
System.out.println("Failed to Insert into tab: " + e.toString());
}
File file = new File("data.dat");
int fileLength = (int) file.length();
InputStream value = null;
FileInputStream fileinp = null;
int row = 0;
String str = null;
int rc = 0;
ResultSet rs = null;
System.out.println("Inserting data ...\n");
try
{
fileinp = new FileInputStream(file);
value = (InputStream)fileinp;
}
catch (Exception e) {}
try
{
pstmt.setBinaryStream(1,value,10); //set 1st column
}
catch (SQLException e)
{
System.out.println("Unable to set parameter");
}
set_execute();
...
public static void set_execute()
{
try
{
pstmt.executeUpdate();
}
catch (SQLException e)
{
System.out.println("Failed to Insert into tab: " + e.toString());
e.printStackTrace();
}
}
该示例首先创建一个表示操作系统文件 data.dat 的 java.io.File 对象。然后,该示例创 建 FileInputStream 对象,来从 File 类型的对象读取。将FileInputStream 类型的对象强制 转型为它的超类 InputStream,其为 PreparedStatement.setBinaryStream() 方法的第二个参数 所需的数据类型。在已准备好的 INSERT 语句上执行 setBinaryStream() 方法,其设置输入 流参数。最后,PreparedStatement.executeUpdate() 方法执行,其将 data.dat 操作系统文件的 内容插入至 BYTE 类型的列内。
TextType.java 程序展示如何将数据插入至 TEXT 类型的列内。它类似于插入至 BYTE 类 型的列内,只使用 setAsciiStream() 方法来设置输入参数,而不是使用 setBinaryStream()。
3、示例:选择数据
在从表选择至 ResultSet 对象内之后,您可使用 ResultSet.getBinaryStream() 方法来从 BYTE 类型的列检索二进制或 ASCII 数据流。您还可使用ResultSet.getAsciiStream() 方法来从 TEXT 类型的列检索二进制或 ASCII 数据流。两个方法都返回 InputStream 对象,可使用 其来读取 chunk 中的数据。
在调用 next() 方法来检索下一行之前,必须读取当前行中返回的流中的所有数据。
来自 ByteType.java 程序的下列示例展示如何从 BYTE 类型的列选择数据,并将数据打印 至标准输出设备:
try
{
stmt = conn.createStatement();
rs = stmt.executeQuery("Select * from tab1");
while( rs.next() )
{
row++;
value = rs.getBinaryStream(1);
dispValue(value);
}
}
catch (Exception e) { }
...
public static void dispValue(InputStream in)
{
int size;
byte buf;
int count = 0;
try
{
size = in.available();
byte ary[] = new byte[size];
buf = (byte) in.read();
while(buf!=-1)
{
ary[count] = buf;
count++;
buf = (byte) in.read();
}
}
catch (Exception e)
{
System.out.println("Error occured while reading stream ... \n");
}
}
该示例首先将 SELECT 语句的结果放入 ResultSet 对象内。然后,它执行方 法 ResultSet.getBinaryStream(),来将 BYTE 数据检索至 Java™InputStream 对象内。
示例中也包括方法 dispValue() 的 Java 代码,使用其来将该列的内容打印至标准输出设备。 dispValue() 方法使用字节数组,且InputStream.read() 方法系统地读取 BYTE 类型列的内容。 TextType.java 程序展示如何从 TEXT 类型列选择数据。它类似于从 BYTE 类型列选择, 只使用 getAsciiStream() 方法,而不使用getBinaryStream()。