この付録では、生成されるコードの例を次の各項で説明しています。
この項では、「Java間の型変換用にJPublisherで生成されるサブクラス」の例で生成されるコードについて説明します。この例では、スタイル・ファイルとホルダー・クラスを使用して、PL/SQLの出力引数をサポートし、WebサービスでサポートされるJava型を使用するユーザー・サブクラスを生成しています。この例で示されているのは、ストアド・ファンクションfooで構成される次のPL/SQLパッケージfoo_packを、Webサービスに適したJava型を使用して公開するためにJPublisherで生成されるインタフェース、ベース・クラスおよびユーザー・サブクラスです。
CREATE OR REPLACE PACKAGE foo_pack AS FUNCTION foo(a IN OUT SYS.XMLTYPE, b INTEGER) RETURN CLOB; END; /
foo_packパッケージを次のように変換するとします。
% jpub -u scott -s foo_pack:FooPack -style=webservices10
Enter scott password: password
次の点に注意してください。
SQL型xmltypeは、最初にJPublisher型マップ内でJava型oracle.sql.SimpleXMLTypeにマップされます。
SimpleXMLTypeは、Webサービス用にwebservices10.propertiesスタイル・ファイル内でjavax.xml.transform.Sourceにマップされます。
Sourceデータのホルダー・クラスjavax.xml.rpc.holders.SourceHolderは、出力のSource引数に使用されます。
スタイル・ファイルでは、次のJPublisherコマンドに関連して生成されるコードのネーミング・パターン%2Base:%2User#%2が指定されています。
-s foo_pack:FooPack
この結果、インタフェース・コードはFooPack.javaに、ベース・クラス・コードはFooPackBase.javaに、ユーザー・サブクラス・コードはFooPackUser.javaに生成されます。
FooPackUserユーザー・サブクラス内のfoo()ラッパー・メソッドでは、次の型変換機能が使用され、生成されたベース・クラスの対応する_foo()メソッドがコールされます。このメソッドでは、ラップされたストアド・ファンクションfooをコールするためのJava Database Connectivity(JDBC)コールが発生します。
foo (SourceHolder, Integer)
{
SourceHolder -> Source
Source -> SimpleXMLType
_foo (SimpleXMLType[], Integer);
SimpleXMLType -> Source
Source -> SourceHolder
}
次のコードは、FooPack.javaに生成されるJavaインタフェース・コードです。
import java.sql.SQLException;
import sqlj.runtime.ref.DefaultContext;
import sqlj.runtime.ConnectionContext;
import java.sql.Connection;
// Ensure that the java.io.* package and other required packages are imported.
import java.io.*;
public interface FooPack extends java.rmi.Remote
{
public java.lang.String foo(SourceHolder _xa_inout_x, Integer b) throws java.rmi.RemoteException;
}
次のコードは、FooPackBase.javaに生成されるベース・クラス・コードです。_foo()メソッドはユーザー・サブクラスのfoo()メソッドによりコールされ、JDBCを使用してJPublisherで公開されるfoo_pack PL/SQLパッケージのfooストアド・ファンクションをコールします。
|
注意: コメントは、対応するSQLJコードを示します。このコードは、JPublisherによりクラス生成時に自動的に変換されます。 |
import java.sql.SQLException;
import sqlj.runtime.ref.DefaultContext;
import sqlj.runtime.ConnectionContext;
import java.sql.Connection;
// Ensure that the java.io.* package and other required packages are imported.
import java.io.*;
public class FooPackBase
{
/* connection management */
protected DefaultContext __tx = null;
protected Connection __onn = null;
public void _setConnectionContext(DefaultContext ctx) throws SQLException
{ release(); __tx = ctx;
ctx.setStmtCacheSize(0);
ctx.setDefaultStmtCacheSize(0);
if (ctx.getConnection() instanceof oracle.jdbc.OracleConnection)
{
try
{
java.lang.reflect.Method m =
ctx.getConnection().getClass().getMethod("setExplicitCachingEnabled",
new Class[]{Boolean.TYPE});
m.invoke(ctx.getConnection(), new Object[]{Boolean.FALSE});
}
catch(Exception e) { /* do nothing for pre-9.2 JDBC drivers*/ }
}}
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 FooPackBase() throws SQLException
{ __tx = DefaultContext.getDefaultContext();
}
public FooPackBase(DefaultContext c) throws SQLException
{ __tx = c; }
public FooPackBase(Connection c) throws SQLException
{__onn = c; __tx = new DefaultContext(c); }
/* *** _foo() USES JDBC TO INVOKE WRAPPED foo STORED PROCEDURE *** */
public oracle.sql.CLOB _foo (
oracle.sql.SimpleXMLType a[],
Integer b)
throws SQLException
{
oracle.sql.CLOB __jPt_result;
// ************************************************************
// #sql [_getConnectionContext()] __jPt_result = { VALUES(SCOTT.FOO_PACK.FOO(
// :a[0],
// :b)) };
// ************************************************************
{
// declare temps
oracle.jdbc.OracleCallableStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = _getConnectionContext();
if (__sJT_cc==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 = "BEGIN :1 := SCOTT.FOO_PACK.FOO
(\n :2 ,\n :3 ) \n; END;";
__sJT_st = __sJT_ec.prepareOracleCall(__sJT_cc,"0FooPackBase",theSqlTS);
if (__sJT_ec.isNew())
{
__sJT_st.registerOutParameter(1,oracle.jdbc.OracleTypes.CLOB);
__sJT_st.registerOutParameter(2,2007,"SYS.XMLTYPE");
}
// set IN parameters
if (a[0]==null) __sJT_st.setNull(2,2007,"SYS.XMLTYPE");
else __sJT_st.setORAData(2,a[0]);
if (b == null) __sJT_st.setNull(3,oracle.jdbc.OracleTypes.INTEGER);
else __sJT_st.setInt(3,b.intValue());
// execute statement
__sJT_ec.oracleExecuteUpdate();
// retrieve OUT parameters
__jPt_result = (oracle.sql.CLOB) __sJT_st.getCLOB(1);
a[0] = (oracle.sql.SimpleXMLType)__sJT_st.getORAData
(2,oracle.sql.SimpleXMLType.getORADataFactory());
} finally { __sJT_ec.oracleClose(); }
}
// ************************************************************
return __jPt_result;
}
}
次のコードは、FooPackUser.javaに生成されるユーザー・サブクラス・コードです。このクラスはFooPackBaseクラスを拡張し、FooPackインタフェースを実装します。foo()メソッドは、ベース・クラスの_foo()メソッドをコールします。Java間の変換は、コードのコメントが示すようにtryブロックで処理されます。
import java.sql.SQLException;
import sqlj.runtime.ref.DefaultContext;
import sqlj.runtime.ConnectionContext;
import java.sql.Connection;
// Ensure that the java.io.* package and other required packages are imported.
import java.io.*;
public class FooPackUser extends FooPackBase implements FooPack, java.rmi.Remote
{
/* constructors */
public FooPackUser() throws SQLException { super(); }
public FooPackUser(DefaultContext c) throws SQLException { super(c); }
public FooPackUser(Connection c) throws SQLException { super(c); }
/* superclass methods */
public java.lang.String foo(SourceHolder _xa_inout_x, Integer b)
throws java.rmi.RemoteException
{
oracle.sql.CLOB __jRt_0 = null;
java.lang.String __jRt_1 = null;
/* *** FOLLOWING try BLOCK CONVERTS SourceHolder TO Source *** */
try {
javax.xml.transform.Source[] a_inout;
// allocate an array for holding the OUT value
a_inout = new javax.xml.transform.Source[1];
if (_xa_inout_x!=null) a_inout[0] = _xa_inout_x.value;
oracle.sql.SimpleXMLType[] xa_inoutx;
xa_inoutx = new oracle.sql.SimpleXMLType[1];
/* *** FOLLOWING try BLOCK TRANSFORMS Source TO SimpleXMLType *** */
try
{
javax.xml.transform.Transformer trans =
javax.xml.transform.TransformerFactory.newInstance().newTransformer();
xa_inoutx[0] = null;
if (a_inout[0]!=null)
{
java.io.ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream();
javax.xml.transform.stream.StreamResult streamr =
new javax.xml.transform.stream.StreamResult(buf);
trans.transform(a_inout[0], streamr);
xa_inoutx[0] = new oracle.sql.SimpleXMLType(_getConnection());
xa_inoutx[0] = xa_inoutx[0].createxml(buf.toString());
}
}
catch (java.lang.Throwable t)
{
throw OC4JWsDebugPrint(t);
}
/* *** CALL _foo() FROM BASE CLASS (SUPER CLASS) *** */
__jRt_0 = super._foo(xa_inoutx, b);
/* *** FOLLOWING try BLOCK TRANSFORMS SimpleXMLType TO Source *** */
try
{
javax.xml.parsers.DocumentBuilder db =
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
a_inout[0] = null;
if (xa_inoutx[0]!=null)
{
org.w3c.dom.Document _tmpDocument_ = db.parse
(new java.io.ByteArrayInputStream(xa_inoutx[0].getstringval().getBytes()));
a_inout[0]= new javax.xml.transform.dom.DOMSource(_tmpDocument_);
}
}
catch (java.lang.Throwable t)
{
throw OC4JWsDebugPrint(t);
}
/* *** FOLLOWING CODE CONVERTS Source TO SourceHolder *** */
// convert OUT value to a holder
if (a_inout!=null) _xa_inout_x.value = a_inout[0];
if (__jRt_0==null)
{
__jRt_1=null;
}
else
{
__jRt_1=readerToString(__jRt_0.getCharacterStream());
}
}
catch (Exception except) {
try {
Class sutil = Class.forName("com.evermind.util.SystemUtils");
java.lang.reflect.Method getProp = sutil.getMethod("getSystemBoolean",
new Class[]{String.class, Boolean.TYPE});
if (((Boolean)getProp.invoke(null, new Object[]{"ws.debug",
Boolean.FALSE})).booleanValue()) except.printStackTrace();
} catch (Throwable except2) {}
throw new java.rmi.RemoteException(except.getMessage(), except);
}
return __jRt_1;
}
private java.lang.String readerToString(java.io.Reader r)
throws java.sql.SQLException
{
CharArrayWriter caw = new CharArrayWriter();
try
{
//Read from reader and write to writer
boolean done = false;
while (!done)
{
char[] buf = new char[4096];
int len = r.read(buf, 0, 4096);
if(len == -1)
{
done = true;
}
else
{
caw.write(buf,0,len);
}
}
}
catch(Throwable t)
{
throw OC4JWsDebugPrint(t);
}
return caw.toString();
}
private void populateClob(oracle.sql.CLOB clb, java.lang.String data)
throws Exception
{
java.io.Writer writer = clb.getCharacterOutputStream();
writer.write(data.toCharArray());
writer.flush();
writer.close();
}
private boolean OC4JWsDebug()
{
boolean debug = false;
try {
// Server-side Debug Info for "java -Dws.debug=true -jar oc4j.jar"
Class sutil = Class.forName("com.evermind.util.SystemUtils");
java.lang.reflect.Method getProp = sutil.getMethod("getSystemBoolean",
new Class[]{String.class, Boolean.TYPE});
if (((Boolean)getProp.invoke(null, new Object[]{"ws.debug",
Boolean.FALSE})).booleanValue())
{
debug = true;
}
} catch (Throwable except2) {}
return debug;
}
private java.sql.SQLException OC4JWsDebugPrint(Throwable t)
{
java.sql.SQLException t0 = new java.sql.SQLException(t.getMessage());
if (!OC4JWsDebug()) return t0;
t.printStackTrace();
try
{
java.lang.reflect.Method getST =
Exception.class.getMethod("getStackTrace", new Class[]{});
java.lang.reflect.Method setST =
Exception.class.getMethod("setStackTrace", new Class[]{});
setST.invoke(t0, new Object[]{getST.invoke(t, new Object[]{})});
}
catch (Throwable th){}
return t0;
}
}
この項では、「変換対象の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 10g リリース2(10.2)では、JPublisherの-dbjavaオプションがサーバー・サイドJavaのコールに使用されます。-javaオプションとは異なり、-dbjavaオプションはシリアライズ不可能なパラメータまたは戻り型をサポートします。
この項では、サーバー・サイドJavaのコールの例を説明します。この項の内容は次のとおりです。
|
注意: 11g リリース1(11.1)バージョンのOracle Databaseが必要です。 |
この例では、作成するソース・ファイルが3つあります。これを次に示します。
サーバー・サイドJavaクラス
サーバー・サイドJavaクラスで使用されるJavaBeans
公開済クラス内のメソッドをコールするエントリ・ポイント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クラスで使用されるJavaBeans
サーバー・サイドJavaクラスCallin2.javaで使用されるJavaBeansの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", "scott", "tiger");
java.sql.DriverManager.getConnection("jdbc:oracle:oci8:@", "scott", "tiger");
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 scott -r -v -f Callin2.java Callin2Bean.java
Password: password
これらのファイルを公開するには、次のコマンドを発行します。
% jpub -u scott -sysuser=sys/sys_password -dbjava=Callin2:Callin2Client -dir=tmp Enter scott password: password
JPublisherの出力は次のとおりです。
tmp/Callin2JPub.java tmp/plsql_wrapper.sql tmp/plsql_dropper.sql SCOTT.TBL_NUMBER SCOTT.TBL_TBL_NUMBER SCOTT.OBJ_CALLIN2BEAN SCOTT.TBL_OBJ_CALLIN2BEAN SCOTT.TBL_TBL_OBJ_CALLI SCOTT.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