distinct 类型可映射至底层的基础类型或映射至用户定义的 Java™ 对象。例如,distinct 类型 INT 可映射至 int 或映射至封装该数据表示的 Java 对象。此 Java 对象必须实现 java.sql.SQLData 接口。必须提供如 映射数据类型 中所描述的定制类型映射,来将此 Java 对象映射至对应的 SQL 类型名称。
1、插入数据示例
下列示例展示一个定义 distinct 类型的 SQL 语句:
CREATE DISTINCT TYPE mymoney AS NUMERIC(10, 2);
CREATE TABLE distinct_tab (mymoney_col mymoney);
下列为映射至基础类型的示例:
String s = “insert into distinct_tab (mymoney_col) values (?)”;
pstmt = conn.prepareStatement(s);
…
BigDecimal bigDecObj = new BigDecimal(123.45);
pstmt.setBigDecimal(1, bigDecObj);
System.out.println(“setBigDecimal…ok”);
pstmt.executeUpdate();
当映射至底层的类型时,GBase 8s JDBC Driver 在客户机侧执行映射,因为数据库服务器提供在底层的类型与 distinct 类型之间隐式的强制转型。
还可将 distinct 类型映射至实现 SQLData 接口的 Java™ 对象。
下列示例展示一个定义 distinct 类型的 SQL 语句:
CREATE DISTINCT TYPE mymoney AS NUMERIC(10,2)
下列代码将 distinct 类型映射至名为 MyMoney 的 Java 对象:
import java.sql.;
import com.gbasedbt.jdbc.;
public class myMoney implements SQLData
{
private String sql_type = “mymoney”;
public java.math.BigDecimal value;
public myMoney() { }
public myMoney(java.math.BigDecimal value){
this.value = value;
}
public String getSQLTypeName(){
return sql_type;
}
public void readSQL(SQLInput stream, String type) throws SQLException
{
sql_type = type;
value = stream.readBigDecimal();
}
public void writeSQL(SQLOutput stream) throws SQLException
{
stream.writeBigDecimal(value);
}
// overides Object.equals()
public boolean equals(Object b)
{
return value.equals(((myMoney)b).value);
}
public String toString()
{
return “value=” + value;
}
}
…
pstmt = conn.prepareStatement(“insert into distinct_tab (mymoney_col) values (?)”);
myMoney mymoney = new myMoney();
mymoney.value = new java.math.BigDecimal(123.45);
pstmt.setObject(1, mymoney);
System.out.println(“setObject(myMoney)…ok”);
pstmt.executeUpdate();
在此情况下,请使用 setObject() 方法,而不是 setBigDecimal() 方法,来插入数据。
2、检索数据示例
可访存 distinct 类型作为它的底层基础类型,或作为 Java™ 对象,如果以定义类型映射来定义该映射的话。使用前面的示例,可访存该数据作为 Java 对象,如下列示例所示:
java.util.Map customtypemap = conn.getTypeMap();
System.out.println(“getTypeMap…ok”);
if (customtypemap == null)
{
System.out.println("\n***ERROR: typemap is null!");
return;
}
customtypemap.put(“mymoney”, Class.forName(“myMoney”));
…
String s = “select mymoney_col from distinct_tab order by 1”;
try
{
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(s);
System.out.println(“Fetching data …”);
int curRow = 0;
while (rs.next())
{
curRow++;
myMoney mymoneyret = (myMoney)rs.getObject(“mymoney_col”);
}
System.out.println(“total rows expected: " + curRow);
stmt.close();
}catch (SQLException e)
{
System.out.println(”***ERROR: " + e.getErrorCode() + " " +
e.getMessage());
e.printStackTrace();
}
在此情况下,请使用 getObject() 方法来检索数据,而不使用 getBigDecimal() 方法。