この付録では、生成されるコードの例を次の各項で説明しています。
この項では、「変換対象のSQL文の宣言」の説明に関連して、指定したSQL文用に生成されるコードの例について説明します。
この例では、-sqlstatementオプションに次のサンプル設定を使用しています。
-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
where ename=:{myname VARCHAR}"
-sqlstatement.return=both
この例では、次の点に注意してください。
コードのコメントは、示されている変換済コードに対応する#sql文を示しています。
-sqlstatement.return=both設定により生成されたgetEmpBeans()メソッドは、JavaBeansの配列を戻します。各要素は結果セットの行を表します。そのためにGetEmpRowクラスが定義されています。
JPublisherではSQLJクラスが生成されます。結果セットはSQLJイテレータにマップされます。
(UPDATE、INSERTまたはDELETE文の場合は、配列バインド用のバッチを使用するコードと使用しないコードの両方が生成されます。)
JPublisherで生成される変換済SQLJコードを次に示します。
public class MySqlStatements_getEmpRow
{
/* connection management */
/* constructors */
public MySqlStatements_getEmpRow()
{ }
public String getEname() throws java.sql.SQLException
{ return ename; }
public void setEname(String ename) throws java.sql.SQLException
{ this.ename = ename; }
private String ename;
}
/*@lineinfo:filename=MySqlStatements*/
/*@lineinfo:user-code*/
/*@lineinfo:1^1*/
import java.sql.SQLException;
import sqlj.runtime.ref.DefaultContext;
import sqlj.runtime.ConnectionContext;
import java.sql.Connection;
import oracle.sql.*;
public class MySqlStatements
{
/* connection management */
protected DefaultContext __tx = null;
protected Connection __onn = null;
public void setConnectionContext(DefaultContext ctx) throws SQLException
{ release(); __tx = ctx; }
public DefaultContext getConnectionContext() throws SQLException
{ if (__tx==null)
{ __tx = (__onn==null) ? DefaultContext.getDefaultContext() :
new DefaultContext(__onn); }
return __tx;
};
public Connection getConnection() throws SQLException
{ return (__onn==null) ? ((__tx==null) ? null : __tx.getConnection()) : __onn; }
public void release() throws SQLException
{ if (__tx!=null && __onn!=null) __tx.close(ConnectionContext.KEEP_CONNECTION);
__onn = null; __tx = null;
}
/* constructors */
public MySqlStatements() throws SQLException
{ __tx = DefaultContext.getDefaultContext(); }
public MySqlStatements(DefaultContext c) throws SQLException
{ __tx = c; }
public MySqlStatements(Connection c) throws SQLException
{__onn = c; __tx = new DefaultContext(c); }
/*@lineinfo:generated-code*/
/*@lineinfo:36^1*/
// ************************************************************
// SQLJ iterator declaration:
// ************************************************************
public static class getEmpIterator
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
{
public getEmpIterator(sqlj.runtime.profile.RTResultSet resultSet)
throws java.sql.SQLException
{
super(resultSet);
enameNdx = findColumn("ename");
m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
}
private oracle.jdbc.OracleResultSet m_rs;
public String ename()
throws java.sql.SQLException
{
return m_rs.getString(enameNdx);
}
private int enameNdx;
}
// ************************************************************
/*@lineinfo:user-code*/
/*@lineinfo:36^56*/
public MySqlStatements_getEmpRow[] getEmpBeans (String myname)
throws SQLException
{
getEmpIterator iter;
/*@lineinfo:generated-code*/
/*@lineinfo:43^5*/
// ************************************************************
// #sql [getConnectionContext()]
// iter = { select ename from emp where ename=:myname };
// ************************************************************
{
// declare temps
oracle.jdbc.OraclePreparedStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext();
if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec =
((__sJT_cc.getExecutionContext()==null) ?
sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
__sJT_cc.getExecutionContext().getOracleContext());
try {
String theSqlTS = "select ename from emp where ename= :1";
__sJT_st = __sJT_ec.prepareOracleStatement
(__sJT_cc,"0MySqlStatements",theSqlTS);
// set IN parameters
__sJT_st.setString(1,myname);
// execute query
iter = new MySqlStatements.getEmpIterator
(new sqlj.runtime.ref.OraRTResultSet
(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MySqlStatements",null));
} finally { __sJT_ec.oracleCloseQuery(); }
}
// ************************************************************
/*@lineinfo:user-code*/
/*@lineinfo:43^84*/
java.util.Vector v = new java.util.Vector();
while (iter.next())
{
MySqlStatements_getEmpRow r = new MySqlStatements_getEmpRow();
r.setEname(iter.ename());
v.addElement(r);
}
MySqlStatements_getEmpRow[] __jPt_result =
new MySqlStatements_getEmpRow[v.size()];
for (int i = 0; i < v.size(); i++)
__jPt_result[i] = (MySqlStatements_getEmpRow) v.elementAt(i);
return __jPt_result;
}
public java.sql.ResultSet getEmp (String myname)
throws SQLException
{
sqlj.runtime.ResultSetIterator iter;
/*@lineinfo:generated-code*/
/*@lineinfo:62^5*/
// ************************************************************
// #sql [getConnectionContext()] iter =
// { select ename from emp where ename=:myname };
// ************************************************************
{
// declare temps
oracle.jdbc.OraclePreparedStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext();
if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec =
((__sJT_cc.getExecutionContext()==null) ?
sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
__sJT_cc.getExecutionContext().getOracleContext());
try {
String theSqlTS = "select ename from emp where ename= :1";
__sJT_st = __sJT_ec.prepareOracleStatement
(__sJT_cc,"1MySqlStatements",theSqlTS);
// set IN parameters
__sJT_st.setString(1,myname);
// execute query
iter = new sqlj.runtime.ref.ResultSetIterImpl
(new sqlj.runtime.ref.OraRTResultSet
(__sJT_ec.oracleExecuteQuery(),__sJT_st,"1MySqlStatements",null));
} finally { __sJT_ec.oracleCloseQuery(); }
}
// ************************************************************
/*@lineinfo:user-code*/
/*@lineinfo:62^84*/
java.sql.ResultSet __jPt_result = iter.getResultSet();
return __jPt_result;
}
}
/*@lineinfo:generated-code*/
JPublisherでは、データベース内のJavaメソッドに対するデータベース外のJavaクライアントからのコールがサポートされています。Oracle Database 12cリリース1では、JPublisherの-dbjavaオプションがサーバー側Javaのコールに使用されます。-javaオプションとは異なり、-dbjavaオプションはシリアライズ不可能なパラメータまたは戻り型をサポートします。
この項では、サーバー・サイドJavaのコールの例を説明します。この項の内容は次のとおりです。
|
注意: Oracle Databaseの12cリリース1 (12.1)バージョンが必要です。 |
この例では、作成するソース・ファイルが3つあります。これを次に示します。
サーバー・サイドJavaクラス
サーバー・サイドJavaクラスで使用されるJavaBean
公開済クラス内のメソッドをコールするエントリ・ポイントJavaクラス
これらのファイルのソース・コードを次に示します。
サーバー・サイドJavaクラス
サーバー・サイドJavaクラスCallin2.javaのソース・コードは、次のとおりです。
public class Callin2
{
public static int testInt(int i)
{ return i; }
public static int[] testInt(int[] i)
{ return i; }
public static int[][] testInt(int[][] i)
{ return i; }
public static Integer testInteger(Integer i)
{ return i; }
public static Integer[] testInteger(Integer[] i)
{ return i; }
public static Integer[][] testInteger(Integer[][] i)
{ return i; }
// Test ORAData
public static oracle.sql.NUMBER testNum(oracle.sql.NUMBER num)
{ return num; }
public oracle.sql.NUMBER testInstNum(oracle.sql.NUMBER num)
{ return num; }
public oracle.sql.NUMBER[] testInstNum(oracle.sql.NUMBER[] num)
{ return num; }
public oracle.sql.NUMBER[][] testInstNum(oracle.sql.NUMBER[][] num)
{ return num; }
// Test Beans
public static Callin2Bean testBean()
{ return new Callin2Bean("mybean", new int[]{1,2}); }
public static Callin2Bean testBean (Callin2Bean b)
{ return b; }
public static Callin2Bean[] testBean (Callin2Bean[] b)
{ return b; }
public static Callin2Bean[][] testBean (Callin2Bean[][] b)
{ return b; }
public Callin2Bean testInstBean (Callin2Bean b)
{ return b; }
public Callin2Bean[] testInstBean (Callin2Bean[] b)
{ return b; }
public Callin2Bean[][] testInstBean (Callin2Bean[][] b)
{ return b; }
// Test Serializable
public static java.io.Serializable testSer()
{ return new String("test Serializable"); }
public static java.io.Serializable testSer (java.io.Serializable b)
{ return b; }
public static java.io.Serializable[] testSer (java.io.Serializable[] b)
{ return b; }
public static java.io.Serializable[][] testSer (java.io.Serializable[][] b)
{ return b; }
public java.io.Serializable testInstSer (java.io.Serializable b)
{ return b; }
public java.io.Serializable[] testInstSer (java.io.Serializable[] b)
{ return b; }
public java.io.Serializable[][] testInstSer (java.io.Serializable[][] b)
{ return b; }
}
サーバー・サイドJavaクラスで使用されるJavaBean
サーバー・サイドJavaクラスCallin2.javaで使用されるJavaBeanのCallin2Bean.javaのソース・コードは、次のとおりです。
public class Callin2Bean
{
private String stringValue = "";
private int[] numberValue;
public Callin2Bean ()
{
}
public Callin2Bean(String string_val, int[] number_val)
{
stringValue = string_val;
numberValue = number_val;
}
public void setStringValue(String string_val)
{
stringValue = string_val;
}
public String getStringValue ()
{
return stringValue;
}
public void setNumberValue (int[] number_val)
{
numberValue = number_val;
}
public int[] getNumberValue ()
{
return numberValue;
}
public boolean equals(Object other)
{
if(other instanceof Callin2Bean)
{
Callin2Bean my_bean = (Callin2Bean)other;
if ( stringValue.equals(my_bean.getStringValue()) && compareIntArray(numberValue, my_bean.getNumberValue()) )
{
return true;
}
}
return false;
}
private boolean compareIntArray(int[] b1, int[] b2)
{
try
{
if ((b1 == null) && (b2 == null))
return true;
if ((b1.length == 0) && (b2.length == 0))
return true;
if (b1.length != b2.length)
return false;
int x;
for (x = 0; x < b1.length; x++)
{
if (b1[x] != b2[x])
return false;
}
return true;
}
catch (Exception e)
{
return false;
}
}
}
エントリ・ポイントJavaクラス
TestCallin2.javaが、この例のエントリ・ポイントJavaクラスです。このクラスが公開済クラス内のメソッドをコールします。TestCallin2.javaファイルのソース・コードは、次のとおりです。
public class TestCallin2
{
public static void main(String[] args) throws Exception
{
java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection)
//java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:lsqlj1", "hr", "hr");
java.sql.DriverManager.getConnection("jdbc:oracle:oci8:@", "hr", "hr");
Callin2Client tkpu = new Callin2Client (conn);
System.out.println("testInstNum() returned " + tkpu.testinstnum(new java.math.BigDecimal(1999)));
TblNumber na = new TblNumber(new java.math.BigDecimal[]{new java.math.BigDecimal(2999)});
System.out.println("testInstNum([]) returned " +
tkpu.testinstnum(na).getArray()[0]);
ObjCallin2bean mb = new ObjCallin2bean("mybean", na);
System.out.println("testCallin2Bean() returned " + tkpu.testbean(mb).getStringValue());
System.out.println("testCallin2Bean([]) returned " +
tkpu.testbean(new TblObjCallin2bean(new ObjCallin2bean[]{mb})).getArray()[0].getStringValue());
java.io.Serializable s = new java.util.Hashtable();
((java.util.Hashtable) s).put("bush", "cheny");
((java.util.Hashtable) s).put("kerry", "dean");
java.io.Serializable[] s1 = new java.io.Serializable[]{s};
java.io.Serializable[][] s2 = new java.io.Serializable[][]{s1};
System.out.println("testSer() returned " + ((java.util.Hashtable) tkpu.testser(s)).get("kerry"));
System.out.println("testSer([]) returned " + ((java.util.Hashtable) tkpu.testser0(s1)[0]).get("kerry"));
System.out.println("testSer([][]) returned " + ((java.util.Hashtable) tkpu.testser1(s2)[0][0]).get("kerry"));
}
}
|
注意: JDBC Thinドライバを使用してデータベースに接続している場合、前出のコード内のgetConnection()メソッドへの最初のコールをコメント解除し、getConnection()メソッドへの2回目のコールをコメント化する必要があります。このコールにはOracle Call Interface(OCI)ドライバ用の接続文が含まれています。 |
必要なソース・ファイルを作成した後、それらのファイルを公開する必要があります。サーバー・サイドJavaクラスを公開するには、最初にこれらのファイルをデータベースにロードする必要があります。Callin2.javaとCallin2Bean.javaの両方をロードしてください。ロード用のコマンドは、次のとおりです。
% loadjava -u hr -r -v -f Callin2.java Callin2Bean.java
Password: password
これらのファイルを公開するには、次のコマンドを発行します。
% jpub -u hr -sysuser=sys/sys_password -dbjava=Callin2:Callin2Client -dir=tmp Enter hr password: password
JPublisherの出力は次のとおりです。
tmp/Callin2JPub.java tmp/plsql_wrapper.sql tmp/plsql_dropper.sql HR.TBL_NUMBER HR.TBL_TBL_NUMBER HR.OBJ_CALLIN2BEAN HR.TBL_OBJ_CALLIN2BEAN HR.TBL_TBL_OBJ_CALLI HR.JPUB_PLSQL_WRAPPER Executing tmp/plsql_dropper.sql Executing tmp/plsql_wrapper.sql Loading Callin2JPub.java
サーバー・サイドJavaクラスを公開すると、JPublisherでいくつかのJavaクラスとPL/SQLスクリプトが生成されます。その一部を次に示します。
Callin2JPub.java
これはCallin2.java用のサーバー・サイドJavaラッパー・クラスです。
Callin2Client.java
これはクライアント・サイドJavaクラスです。
plsql_wrapper.sql
これはサーバー・サイドJavaクラス用のPL/SQLラッパーです。
plsql_dropper.sql
これは、PL/SQLラッパーを削除するためのPL/SQLスクリプトです。
JPublisherにより生成されるその他のファイルは、次のとおりです。
TblNumber.java
int[]用に生成されるクライアント・サイド・ラッパー。
TblTblNumber.java
int[]用に生成されるクライアント・サイド・ラッパー。
ObjCallin2bean.java
サーバー・サイド・クラスCallin2Bean用に生成されるクライアント・サイド・ラッパー。
ObjCallin2beanRef.java
サーバー・サイド・クラスCallin2Bean用に生成され、表内でREF列として使用されるクライアント・サイド・ラッパー。このファイルは生成されますが、コールインの使用例では使用されません。
TblObjCallin2bean.java
Callin2Bean[]用に生成されるクライアント・サイド・ラッパー。
TblTblObjCalli.java
Callin2Bean[][]用に生成されるクライアント・サイド・ラッパー。
ファイルの公開後、公開されたクラスを次のコマンドを発行してテストできます。
% javac -classpath tmp:${CLASSPATH} -d tmp TestCallin2.java
% java -classpath tmp:${CLASSPATH} TestCallin2