Posts tagged ‘object database’
Day 8: Object Java dan Object Oracle Database
Learning In Home-Original Date: 20 Januari 2009
Untuk memakai tipe data object di Oracle Database, selain menggunakan STRUCT, aku juga bisa membuat sebuah class Java yang bersesuaian. Sebagai latihan, hari ini aku akan membuat class yang merepresentasikan object Oracle dimana object Oracle tersebut merupakan turunan dari object lain, yaitu TYPE INDIVIDUAL_CIF UNDER CIF.
Pertama, aku akan membuat class Java yang merepresentasikan object parent CIF:
import java.sql.Connection;
import java.sql.SQLException;
import oracle.sql.*;
public class CIF implements ORAData,
ORADataFactory {
private final static CIF cif =
new CIF();
public CHAR idNo;
public CHAR accNo;
public CIF () {}
public CIF (CHAR idNo, CHAR accNo) {
this.idNo = idNo;
this.accNo = accNo;
}
public static CIF getInstance() {
return cif;
}
public Datum toDatum(Connection cn)
throws SQLException {
StructDescriptor sd = StructDescriptor.
createDescriptor("CIF", cn);
Object[] attr = {idNo,accNo};
return new STRUCT(sd, cn, attr);
}
public ORAData create(Datum datum,
int sqlType) throws SQLException {
if (datum==null) return null;
Object[] attr = ((STRUCT)datum).
getOracleAttributes();
return new CIF((CHAR) attr[0],
(CHAR) attr[1]);
}
public String toString() {
return "CIF: IDNO = " + this.idNo +
"; ACCNO = " + this.accNo;
}
}
Class di atas harus meng-implementasi-kan ORAData dan ORADataFactory, jika akan menggunakan fitur ekstensi JDBC dari Oracle. Jika portabilitas merupakan prioritas, class standar dari JDBC, SQLData.
Langkah berikutnya, aku membuat class turunan dari class sebelumnnya:
import java.sql.Connection;
import java.sql.SQLException;
import oracle.sql.*;
public class IndividualCIF
extends CIF {
public CHAR firstName;
public CHAR lastName;
public DATE birthDate;
public final static IndividualCIF
individualCIF = new IndividualCIF();
public IndividualCIF() {}
public IndividualCIF(CHAR idNo, CHAR accNo,
CHAR firstName, CHAR lastName,
DATE birthDate) {
super(idNo, accNo);
this.firstName = firstName;
this.lastName = lastName;
this.birthDate = birthDate;
}
public static IndividualCIF
getInstance() {
return individualCIF;
}
public Datum toDatum(Connection cn)
throws SQLException {
StructDescriptor sd =
StructDescriptor.createDescriptor(
"INDIVIDUAL_CIF", cn);
Object[] attr = { super.idNo, super.accNo,
firstName, lastName, birthDate };
return new STRUCT (sd, cn, attr);
}
public ORAData create(Datum d, int sqlType)
throws SQLException {
if (d==null) return null;
Object[] attr = ((STRUCT)d).
getOracleAttributes();
return new IndividualCIF((CHAR)attr[0],
(CHAR)attr[1],(CHAR)attr[2],
(CHAR)attr[3], (DATE)attr[4]);
}
public String toString() {
return "CIFIndividual: ACC NO = " +
super.accNo + "; " +
"ID NO = " + super.idNo + "; " +
"FirstName = " + this.firstName + "; " +
"LastName = " + this.lastName + "; " +
"BirthDate = " + this.birthDate.dateValue();
}
}
Selanjutnya, aku membuat sebuah class factory yang akan dipakai untuk menghasilkan salah satu dari kedua class di atas sesuai dengan tipe data ORACLE-nya:
import oracle.sql.*;
public class CIFFactory implements
ORADataFactory {
public static final CIFFactory
cifFactory = new CIFFactory();
public static CIFFactory
getInstance() {
return cifFactory;
}
public ORAData create(Datum d,
int sqlType) throws SQLException {
STRUCT s = (STRUCT) d;
if (s.getSQLTypeName().equals(
"SCOTT.CIF")) {
return CIF.getInstance().
create(d, sqlType);
} else if (s.getSQLTypeName().equals(
"SCOTT.INDIVIDUAL_CIF")) {
return IndividualCIF.getInstance().
create(d, sqlType);
} else {
return null;
}
}
}
Dan ini adalah potongan kode program utama yang mengambil data field dari tabel dalam bentuk salah satu dari class di atas:
Object cif = rs.getORAData(1, CIFFactory.getInstance()); System.out.println(cif);
Object Type: Menyimpan Object Ke Dalam Table
Object yang sudah kita buat juga dapat kita simpan ke dalam sebuah table. Sebelumnya, kita harus membuat table untuk menampung object tersebut, dengan perintah seperti berikut:
CREATE TABLE TBL_INDIVIDUAL_CIF OF
INDIVIDUAL_CIF;
Setelah itu, kita bisa memasukkan data seperti biasanya:
INSERT INTO TBL_INDIVIDUAL_CIF VALUES (
'ID-1', 'ACC-1', 'Solid', 'Snake',
CURRENT_DATE
);
Kode berikut akan mengambil nilai object tersebut melalui PL/SQL:
DECLARE
cif INDIVIDUAL_CIF;
BEGIN
SELECT VALUE(P) INTO cif FROM
tbl_individual_cif p;
cif.print_account_info();
END;
/