Oracle 支援集合型別 VARRAY、NESTED TABLE。本文示範透過 JDBC 讀取 VARRAY 欄位,並處理字元集轉換 (ZHS16GBK)。
CREATE TYPE num_varray AS VARRAY(10) OF VARCHAR2(12);
CREATE TABLE varray_table (col1 num_varray);
INSERT INTO varray_table VALUES (num_varray('你好', 'abc'));
import java.sql.*;
import java.math.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;
class Array1 {
public static void main(String args[]) throws Exception {
int oracleId = CharacterSet.ZHS16GBK_CHARSET;
CharacterSet dbCharset = CharacterSet.make(oracleId);
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@10.9.200.58:1521:db01", "mytest", "mytest");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM varray_table");
while (rs.next()) {
ARRAY myArray = ((OracleResultSet) rs).getARRAY(1);
System.out.println("Array type: " + myArray.getSQLTypeName());
System.out.println("Element typecode: " + myArray.getBaseType());
System.out.println("Array length: " + myArray.length());
String[] values = (String[]) myArray.getArray();
for (int i = 0; i < values.length; i++) {
oracle.sql.CHAR outVal = new oracle.sql.CHAR(values[i], dbCharset);
System.out.println(">> index " + i + " = " + outVal);
}
}
rs.close(); stmt.close(); conn.close();
}
}
OracleResultSet.getARRAY(int) 取得 oracle.sql.ARRAY 物件。getArray() 回傳 Java 陣列 (String[]、BigDecimal[] 等),元素型別對應 SQL 基礎型別。oracle.sql.CHAR 配合 CharacterSet 正確解碼,否則會出現亂碼。getBaseType() 回傳 OracleTypes 常數 (如 VARCHAR = 12)。此模式同樣適用於 NESTED TABLE,只需將資料表欄位型別改為巢狀表型別即可。