Posts tagged ‘XSQL’
Day 19: Interface XSQL Melalui Program Java
Learning In Home-Original Date: 31 Januari 2009
Untuk meng-akses sebuah halaman XSQL dan melakukan pemrosesan terhadap halaman XSQL tersebut di dalam program Java, aku dapat menggunakan class XSQLRequest seperti pada contoh kode berikut ini:
try {
XSQLRequest xsqlRequest =
new XSQLRequest(
"file://c:\\XSQL\\latihan.xsql");
Hashtable params = new Hashtable();
params.put("kolomUrut", "EMPNO");
xsqlRequest.process(params,
new PrintWriter(System.out),
new PrintWriter(System.err));
} catch (Exception e) {
e.printStackTrace();
}
Jika action yang disediakan oleh XSQL dirasakan belum cukup, maka aku diperbolehkan untuk menambah action handler baru. Caranya adalah dengan meng-implementasi-kan interface oracle.xml.xsql.XSQLActionHandler, atau yang lebih gampang, dengan menurunkan class baru dari class oracle.xml.xsql.XSQLActionHandlerImpl.
Sebagai contoh, aku memiliki XSQL seperti berikut:
<?xml version="1.0" ?>
<hasil connection="latihan" xmlns:xsql="urn:oracle-xsql">
<xsql:action handler="xml.TestXSQLHandler">
<nama>Solid Snake</nama>
</xsql:action>
<xsql:action handler="xml.TestXSQLHandler">
<nama>Unknown Man</nama>
</xsql:action>
</hasil>
XSQL di atas akan memakai handler yang berupa class xml.TestXSQLHandler. Pastikan class tersebut terdapat di CLASSPATH, dan juga class tersebut di-compile dengan JDK bawaan Oracle, yaitu Java versi 1.4. Aku sempat mengalami masalah saat memakai JDK 6 karena XSQL Processor menolak class dengan versi yang tidak seperti yang ia harapkan. Berikut ini adalah isi handler latihan yang akan menambah atribut untuk element nama berupa atribut namaDepan dan namaBelakang:
package xml;
import java.sql.SQLException;
import oracle.xml.xsql.XSQLActionHandlerImpl;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class TestXSQLHandler
extends XSQLActionHandlerImpl {
public void handleAction(Node result)
throws SQLException {
try {
DocumentFragment df =
result.getOwnerDocument().
createDocumentFragment();
Element e = getActionElement();
NodeList nl = e.
getElementsByTagName("nama");
for (int i=0; i<nl.getLength(); i++) {
Node n = nl.item(i);
Node nValue = n.getFirstChild();
String namaLengkap =
nValue.getNodeValue();
String nama[] =
namaLengkap.split(" ");
((Element)n).setAttribute(
"namaDepan", nama[0]);
((Element)n).setAttribute(
"namaBelakang", nama[1]);
df.appendChild(n);
}
result.appendChild(df);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Argument result untuk void handleAction akan menentukan seperti apa hasil akhir proses dari sebuah node xsql:action handler.Aku menggunakan getActionElement() dari XSQLActionHandlerImpl untuk mendapatkan element xsql:action handler yang sedang di-proses.
Day 18: XSQL
Learning In Home-Original Date: 30 Januari 2009
Dengan berbasiskan XSU, Oracle XDk menyediakan XSQL untuk memproses halaman yang berisi query SQL dan menghasilkan XML. Halaman XSQL ini umumnya di-proses sebagai halaman servlet, tetapi dapat juga dipergunakan dalam program Java dan tool command-line. XSQL Framework dapat ditemukan di file %ORACLE_HOME%\lib\oraclexsql.jar. Disini terdapat tiga jenis processor, yaitu oracle.xml.xsql.XSQLServlet untuk processor servlet, oracle.xml.xsql.XSQLCommandLine untuk processor command line, dan oracle.xml.xsql.XSQLRequest untuk processor dalam program Java.
Hari ini aku akan mencoba latihan menjalankan sebuah halaman XSQL sederhana melalui command-line. Sebelumnya, aku membuat terlebih dahulu file konfigurasi XSQL yang secara default bernama XSQLConfig.xml:
<?xml version="1.0" ?>
<XSQLConfig>
<connectiondefs>
<connection name="latihan">
<username>scott</username>
<password>tiger</password>
<dburl>jdbc:oracle:oci:@localhost:1521:latihan</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<autocommit>false</autocommit>
</connection>
</connectiondefs>
</XSQLConfig>
Pada contoh di atas, aku mendefinisikan sebuah koneksi bernama latihan yang merujuk ke schema SCOTT. File XSQLConfig.xml harus terletak pada salah satu lokasi yang tercantum di CLASSPATH. Berikutnya, aku akan membuat sebuah halaman XSQL sederhana yang men-query seluruh data dari tabel EMP:
<?xml version="1.0" ?> <xsql:query connection="latihan" xmlns:xsql="urn:oracle-xsql"> SELECT * FROM EMP </xsql:query>
Setelah itu, aku menjalankan perintah berikut di command prompt:
java oracle.xml.xsql.XSQLCommandLine latihan.xsql
Tentu saja kemampuan XSQL tidak hanya sekedar query sederhana saja. Ia juga bisa menerima parameter dalam bentuk bind variables dan lexical substitution. Jika XSQL dijalankan untuk diproses sebagai servlet, maka bind variables ini diambil dari session dan cookies. Sebagai contoh sederhana, aku mengubah XSQL di atas menjadi:
<?xml version="1.0" ?> <HASIL connection="latihan" xmlns:xsql="urn:oracle-xsql"> <xsql:query bind-params="employerNo"> SELECT * FROM EMP WHERE EMPNO = ? </xsql:query> </HASIL>
Dengan demikian, aku bisa menjalankan XSQL di atas, sebagai servlet dengan URL seperti http://oracle.myHost.com/latihan.xsql?employerNo=7782, atau jika dipakai pada command line, aku menggunakan java oracle.xml.xsql.XSQLCommandLine latihan.xsql employerNo=7782.
Lexical substition hampir mirip seperti bind variables, hanya saja ia digunakan untuk substitusi syntax, seperti pada contoh:
SELECT EMPNO, ENAME FROM EMP ORDER BY {@kolomUrut}
XSQL juga mendukung aksi yang mirip if seperti pada contoh berikut:
<xsql:if-param name="kolomUrut" not-in-list="EMPNO,ENAME" ignore-case="yes"> <xsql:set-page-param name="kolomUrut" value="ENAME" /> </xsql:if-param>
Pada contoh di atas, jika parameter kolomUrut bukan bernilai “EMPNO” dan “ENAME” (perbandingan case-insensitive), maka ia akan diatur agar bernilai “ENAME”.