ヘッダーをスキップ
Oracle Database Java開発者ガイド
10gリリース2(10.2)
B19189-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

11 スキーマ・オブジェクトおよびOracle JVMユーティリティ

この章では、Oracle Database Java環境で使用するスキーマ・オブジェクトおよびOracle JVMユーティリティについて説明します。 これらのユーティリティは、UNIXシェルまたはMicrosoft社のWindowsのDOSプロンプトから実行します。


注意:

ツールに指定されている名前は、すべて大/小文字の区別があります。このため、スキーマ、ユーザー名およびパスワードは大文字に変換されません。

この章の内容は、次のとおりです。

11.1 スキーマ・オブジェクトの概要

従来のJava仮想マシン(JVM)では、Javaファイルをコンパイルおよびロードしていましたが、Oracle JVMではスキーマ・オブジェクトをコンパイルおよびロードします。次の種類のJavaスキーマ・オブジェクトがロードされます。

クラス・ファイルをOracle JVMで実行可能にするには、loadjavaツールを使用して、クラス・ファイルまたはソース・ファイルからJavaクラス・スキーマ・オブジェクトを作成し、スキーマにロードする必要があります。リソース・ファイルをOracle JVMからアクセス可能にするには、loadjavaを使用して、リソース・ファイルからJavaリソース・スキーマ・オブジェクトを作成して、ロードします。

dropjavaツールは、Javaファイルに対応するスキーマ・オブジェクトを削除します。loadjavaで作成したJavaスキーマ・オブジェクトは、必ずdropjavaを使用して削除してください。SQLのデータ定義言語(DDL)コマンドを使用してスキーマ・オブジェクトを削除した場合、loadjavaおよびdropjavaで保持している補助データは更新されません。

11.2 ロード内容とロード時期

リソース・ファイルは、必ずloadjavaを使用してロードする必要があります。データベースの外で従来のコンパイラを使用して.classファイルを作成する場合、そのファイルは、loadjavaを使用してロードする必要があります。クラス・ファイルをロードする別の方法には、ソース・ファイルをロードし、Oracle Databaseで、結果のクラス・スキーマ・オブジェクトをコンパイルおよび管理する方法があります。Oracle Database 10gでは、ほとんどのコードをデータベースの外でコンパイルおよびデバッグしてから、.classファイルをロードするのが最も能率的な方法です。特定のJavaクラスに対して、.classファイルまたは対応する.javaファイルのいずれかをロードできますが、両方はロードできません。

loadjavaツールは、ソース・ファイルとリソース・ファイル、またはクラス・ファイルとリソース・ファイルのいずれかを含むJavaアーカイブ(JAR)ファイルを受け入れます。loadjavaにJARファイルまたはZIPファイルを渡すと、loadjavaはアーカイブをオープンし、そのメンバーを個別にロードします。JARまたはZIPのスキーマ・オブジェクトはありません。前回のロード時から変更されていないファイルは、再ロードされません。このため、JARファイルのロードによるパフォーマンスの低下はほとんどありません。JARファイルのロードは、loadjavaの簡単で安全な使用方法です。

同一スキーマ内の2つのスキーマ・オブジェクトに同じクラスを定義することはできません。たとえば、a.javaでクラスxを定義し、xの定義をb.javaに移動する場合を考えてみます。a.javaがすでにロードされている場合、loadjavab.javaのロードを拒否します。かわりに、次のいずれかの方法を実行する必要があります。

11.3 参照の解決

すべてのJavaクラスには、他のクラスへの参照が含まれています。従来のJVMは、CLASSPATHで指定されたディレクトリ、ZIPファイルおよびJARファイル内でクラスを検索します。一方、Oracle JVMはスキーマでクラス・スキーマ・オブジェクトを検索します。データベース内のクラスごとにリゾルバ仕様があります。これは、CLASSPATHに相当するOracle Databaseの仕様です。たとえば、alphaというクラスのリゾルバ仕様は、alphaで使用するクラスを検索するスキーマのリストです。リゾルバ仕様はクラスごとにあります。一方、従来のJVMのCLASSPATHはすべてのクラスを対象にしたグローバルな仕様であることに注意してください。

各クラス・スキーマ・オブジェクトには、リゾルバ仕様の他に、クラス間参照バインドのリストがあります。参照リストの各項目の内容は、別のクラスへの参照と次のいずれかです。

参照リストの保守は、Oracle Databaseの機能の1つであるリゾルバが行います。 クラス内のクラス間参照ごとに、リゾルバは、クラスのリゾルバ仕様で指定されたスキーマで、参照を満たす有効なクラス・スキーマ・オブジェクトを検索します。 すべての参照が解決されると、リゾルバによりこのクラスは「有効」とマークされます。解決処理が行われていないクラス、または正常に解決できなかったクラスは「無効」とマークされます。無効になったスキーマ・オブジェクトに依存しているクラスも、最初のクラスが無効とマークされるときに無効とマークされます。つまり、無効化は1つのクラスからそのクラスを使用しているクラス群、そのクラス群を使用しているクラス群というように、上方に連鎖します。無効なクラスに依存するクラスを解決するとき、リゾルバは最初に参照先クラスを解決しようとします。これは、単に解決処理が行われていないために、無効とマークされている場合があるためです。リゾルバは、有効とマークされているクラスを解決することはしません。

開発者は、loadjavaでクラスを解決するように指示でき、実行時まで解決を延期することもできます。無効とマークされているクラスを別のクラスでロードしようとすると、自動的にリゾルバが実行されます。実行時以前に解決すると、欠落しているクラスを早期に検出できます。実行時に解決できない場合は、ClassNotFound例外が生成されます。また、次の理由で実行時に解決できない場合があります。

loadjavaツールには、次の2つの解決モードがあります。

可能な場合は、すべてのクラスのロードが完了するまで、解決を延期してください。延期することによって、使用するクラスがロードされていないために、リゾルバによりそのクラスが無効とマークされるのを回避できます。

11.4 ダイジェスト表

スキーマ・オブジェクトのダイジェスト表による最適化は、通常、開発者には表示されません。loadjavaは、このダイジェスト表に基づいて、前回のロード時から変更されていないファイルをスキップします。ファイルのコレクションの一部を再ロードする必要がある場合は、この機能によって、loadjavaをコールするMakeファイルとスクリプトのパフォーマンスを改善できます。これは、再ロードするアーカイブ・ファイルには、前回のロード時から変更されているファイルと変更されていないファイルが混在している場合があるためです。

loadjavaツールは、各スキーマのダイジェスト表を保守することで、変更されていないファイルを検出します。ダイジェスト表によって、ファイル名がダイジェスト、つまり、ファイル内容の短縮表現(ハッシュ)に対応付けられます。同一ファイルに対して異なる時期に作成されたダイジェストを比較することによって、ファイル内容の変更を高速に検出できます。この方法は、ファイル内の各バイトを比較するよりはるかに高速です。loadjavaは、処理対象のファイルごとにファイル内容のダイジェストを作成してから、ダイジェスト表でファイル名を検索します。ダイジェスト表に同じダイジェストのファイル名のエントリがある場合は、対応するスキーマ・オブジェクトの最新版が存在するため、loadjavaはそのファイルをロードしません。-verboseオプションを指定してloadjavaをコールすると、ダイジェスト表の検索結果が表示されます。

通常、ダイジェスト表は開発者には表示されません。これは、loadjavadropjavaによって、ダイジェスト表がスキーマ・オブジェクトの追加、変更および削除と同期化されているためです。したがって、loadjavaで作成したスキーマ・オブジェクトは、必ずdropjavaを使用して削除し、DDLは使用しないでください。ダイジェスト表が破損した場合は、loadjava -forceオプションを使用してダイジェスト表の参照を回避するか、またはJAVA$CLASS$MD5$TABLEという名前の表からすべての行を削除します。

11.5 コンパイル

ソース・ファイルをロードすると、Javaソース・スキーマ・オブジェクトが作成または更新され、そのソースから以前に導出されたクラス・スキーマ・オブジェクトが無効になります。クラス・スキーマ・オブジェクトが存在しない場合は、loadjavaによって作成されます。古いクラス・スキーマ・オブジェクトは新しくロードしたソースからコンパイルされていないため、loadjavaは古いクラス・スキーマ・オブジェクトを無効にします。新しくロードしたソース(たとえば、クラスA)のコンパイルは、次のいずれかの条件で自動的に実行されます。

ソース・ファイルのロード時に強制的にコンパイルするには、loadjava -resolveオプションを使用します。

コンパイラはエラー・メッセージを事前定義のUSER_ERRORSビューに書き込みます。つまり、loadjavaツールは、コンパイラの起動によって作成されたメッセージを取得して表示します。

コンパイラはいくつかのオプションを認識します。コンパイラにオプションを指定するには、次の2つの方法があります。-resolveオプションを指定してloadjavaを実行した場合は、コマンドラインでコンパイラ・オプションを指定できます。さらに、スキーマごとのデータベース表JAVA$OPTIONSに永続的なコンパイラ・オプションを指定できます。JAVA$OPTIONS表は、デフォルトのコンパイラ・オプションに使用できます。このデフォルト・オプションを選択的にオーバーライドするには、loadjavaのコマンドライン・オプションを使用します。


注意:

コマンドライン・オプションによって、JAVA$OPTIONS表内の一致しているエントリがオーバーライドおよび消去されます。

JAVA$OPTIONSの行には、オプション設定を適用する先のソース・スキーマ・オブジェクトの名前が含まれています。複数行を使用すると、ソース・スキーマ・オブジェクトごとに異なるオプションを設定できます。クラス・ローダーによってコンパイラをコールするか、またはコマンドラインでオプションを指定せずにコンパイラをコールすると、コンパイラはJAVA$OPTIONSでオプションを検索します。コンパイル対象のソース・スキーマ・オブジェクトにJAVA$OPTIONS表のエントリもコマンドラインのオプション値もない場合、コンパイラは次のデフォルト値を使用します。

11.6 loadjavaツール

loadjavaツールは、ファイルからスキーマ・オブジェクトを生成してスキーマにロードします。スキーマ・オブジェクトはJavaソース、クラスおよびデータ・ファイルから作成できます。また、loadjavaでは、SQLJファイルからもスキーマ・オブジェクトを作成できます。

クラスをロードするには、次のSQLデータベース権限が必要です。

loadjavaツールは、コマンドラインから実行するか、またはDBMS_JAVAクラスに含まれるloadjavaメソッドを使用して実行できます。使用しているJavaアプリケーション内からこのツールを実行する方法は、次のとおりです。

call dbms_java.loadjava('... options...');

オプションは、loadjavaツールのコマンドラインで指定できるオプションと同じです。各オプションは空白で区切ります。オプションをカンマで区切らないでください。ただし、空白を含む-resolverオプションは例外です。-resolverの場合は、次に示すように、他のすべてのオプションを最初の入力パラメータで指定し、-resolverオプションは2番目のパラメータで指定します。

call dbms_java.loadjava('..options...', 'resolver_options');

-thin-oci-userおよび-passwordの各オプションは、loadjavaコマンドライン・ツールのデータベース接続に関連しているため、指定しないでください。出力はstderrに送信されます。serveroutputをオンに設定し、必要に応じてdbms_java.set_outputをコールします。


注意:

loadjavaツールは、$ORACLE_HOMEの下のbinディレクトリに格納されています。

loadjavaツールは、終了直前に、正常に処理されたかどうかをチェックします。発生したすべての障害は、次のヘッダーの後に要約が示されます。

The following operations failed

データベースへの接続が失われるなど、条件によっては、loadjavaが完了前に停止する場合があります。エラーは次の構文で出力されます。

exiting: error_reason

この項の内容は、次のとおりです。

11.6.1 構文

loadjavaコマンドの構文は次のとおりです。

loadjava {-user | -u} user/password[@database] [options]
file.java | file.class | file.jar | file.zip |
file.sqlj | resourcefile ...
  [-action]
  [-andresolve]
  [-casesensitivepub]
  [-cleargrants]
  [-debug]
  [-d | -definer]
  [-dirprefix prefix]
  [-e | -encoding encoding_scheme]
  [-fileout file]
  [-f | -force]
  [-genmissing]
  [-genmissingjar jar_file]
  [-g | -grant user [, user]...]
  [-help]
  [-jarasresource]
  [-noaction]
  [-nocasesensitivepub]
  [-nocleargrants]
  [-nodefiner]
  [-nogrant]
  [-norecursivejars]
  [-noschema]
  [-noserverside]
  [-nosynonym]
  [-nousage]
  [-noverify]
  [-o | -oci | oci8]
  [-optionfile file]
  [-optiontable table_name]
  [-publish package]
  [-pubmain number]
  [-recursivejars]
  [-r | -resolve]
  [-R | -resolver "resolver_spec"]
  [-resolveonly]
  [-S | -schema schema]
  [-stdout]
  [-stoponerror]
  [-s | -synonym]
  [-tableschema schema]
  [-t | -thin]
  [-time]
  [-unresolvedok]
  [-v | -verbose]

11.6.2 引数の概要

表11-1は、loadjavaの引数の一覧です。オプションを変えて同じファイルを指定して複数回loadjavaを実行すると、最後の起動時に指定したオプションが保持されます。ただし、次の2つの例外があります。

  • ダイジェスト表のエントリに一致しているためにloadjavaによってファイルがロードされない場合は、コマンドラインで指定した大半のオプションがスキーマ・オブジェクトに反映されません。例外は-grant-resolveで、これらのオプションは必ず反映されます。loadjavaでダイジェスト表の参照をスキップするように指示するには、-forceオプションを使用する必要があります。

  • -grantオプションは累積です。特定スキーマの特定クラスに対して起動されたすべてのloadjavaに指定されているユーザーには、EXECUTE権限が付与されます。

表11-1 loadjavaの引数の概要

引数 説明
filenames .java.class.sqlj.ser.jar.zipおよびリソース・ファイル名の引数を、必要な数だけ任意の順序で組み合せて指定できます。
-action すべてのアクションを実行します。これはデフォルトの動作です。このオプションを使用すると、オプション・ファイルに指定されている可能性がある-noactionオプションをオーバーライドできます。
-andresolve -resolveのかわりに使用します。このオプションを指定すると、ファイルのロード時にそのファイルがコンパイルまたは解決されるため、個別にパスを指定する必要はありません。クラスをロード時に解決する場合、依存しているクラスは無効になりません。

このオプションは、以前にロードしたクラスを置換する場合にのみ使用してください。クラス内の既存のメソッドのコードのみを変更した場合は、-resolveのかわりにこのオプションを使用してください。

-casesensitivepub 公開時に、大/小文字の区別がある名前が作成されます。名前がすべて大文字でないかぎり、通常、PL/SQLでは名前を引用符で囲む必要があります。
-cleargrants -grantオプションを指定すると、loadjavaはクラス、ソースおよびリソースにEXECUTE権限を付与します。ただし、権限の取消しは行いません。-cleargrantsを指定すると、loadjavaは、-grantオペランドで指定されたユーザーとロールに実行権限を付与する前に、すでに付与されているすべての実行権限を取り消します。たとえば、実行権限をSCOTTのみに付与する場合、適切なオプションは次のようになります。
-grant SCOTT -cleargrants

-debug SQLロギングをオンにします。
-definer デフォルトでは、クラス・スキーマ・オブジェクトはその実行者の権限で実行されます。このオプションは、定義者の権限をクラスに付与します。このオプションは、UNIXのsetuid機能に概念的に類似しています。
-dirprefix prefix prefixで始まるファイルまたはJARエントリの場合は、スキーマ・オブジェクトの名前が決定する前に、このprefixが名前から削除されます。クラスとソースの場合、スキーマ・オブジェクトの名前はその内容によって決定されます。したがって、リソースのみがこのオプションの影響を受けます。
-encoding コンパイラに対してソース・ファイルのエンコーディングを識別します。JAVA$OPTIONSに一致する値がある場合は、その値をオーバーライドします。値は、javac -encodingオプションの値と同じです。コマンドラインまたはJAVA$OPTIONSでエンコーディングを指定しないと、エンコーディングでは、次のコードから戻される値が使用されます。
System.getProperty("file.encoding");

このオプションはソース・ファイルのロード時のみ有効です。

-fileout file すべてのメッセージを指定のファイルに出力します。
-force ダイジェスト表のエントリに一致する場合でも、ファイルが強制的にロードされます。
-genmissing loadjavaの処理対象のクラスが参照するクラスとメソッドを判別します。データベースまたはファイル引数に存在しないクラスを欠落しているクラスと呼びます。このオプションは、欠落しているクラスに対して、参照対象のすべてのメソッドが含まれるダミーの定義を生成します。次に、生成されたクラスをデータベースにロードします。この処理は、クラスの解決の前に実行されます。

参照をソースから検出することは、参照をクラス・ファイルから検出するよりも困難であり、通常、ライブラリの配布にソースは使用しないため、loadjavaはこの処理をソース・ファイルに対して実行しません。

欠落しているクラスがロードされるスキーマは、参照元クラスが他のスキーマで作成された場合でも、-userオプションで指定されたスキーマになります。作成されたクラスにはフラグが設定されるため、複数のツールで認識できます。これは特に、検証機能が生成されたクラスを認識するために必要です。

-genmissingjar jar_file このオプションは、-genmissingと同じアクションを実行します。さらに、生成されたすべてのクラスの定義が含まれるjar_fileというJARファイルを作成します。
-grant 指定したユーザーに、ロードしたクラスのEXECUTE権限を付与します。ユーザー名は必要な数だけ任意の順序で組み合せて指定できます。ユーザー名はカンマで区切り、空白は挿入できません。

EXECUTE権限を別のスキーマのオブジェクトに付与するには、WITH GRANTオプションを使用して元のCREATE PROCEDURE権限が付与されている必要があります。

注意:

  • -grantは累積のオプションです。ユーザーはEXECUTE権限を持つユーザーのリストに追加されます。権限を削除するには、-cleargrantsオプションを使用します。

  • スキーマ名は必ず大文字で指定します。

-help loadjavaとそのオプションの使用方法に関するメッセージを出力します。
-jarasresource JARファイルを解凍してその中の各クラスをロードするかわりに、JARファイル全体をリソースとしてスキーマにロードします。
-noaction ファイルに対してアクションを実行しません。これには、スキーマ・オブジェクトの作成、実行パーミッションの付与などのアクションが含まれます。このオプションは、通常、特定のクラスがJARファイルに作成されるのを抑制するために、オプション・ファイル内で使用します。コマンドラインで使用すると、オプション・ファイルでオーバーライドされないかぎり、loadjavaはすべてのファイルを無視します。ただし、JARファイルは検査の対象で、ファイル内にMETA-INF/loadjava-optionsエントリがあるかどうかが判別されます。エントリがある場合は、オプション・ファイルが処理されます。オプション・ファイル内の-actionオプションは、コマンドラインで指定された-noactionオプションをオーバーライドします。
-nocasesensitivepub 小文字をすべて大文字に変換します。 小文字から大文字に変換すると、アンダースコア(_)が挿入されます。たとえば、メソッド名IsXCharViewIS_XCHAR_VIEWになります。このコマンドは、-publishオプションのみを変更します。
-nocleargrants loadjavaで実行権限の取消しを省略します。このオプションは、-cleargrantsオプションをオーバーライドするために使用できます。
-nodefiner ロードされたクラスに実行者権限を定義します。これはデフォルトの動作です。このオプションは、-definerオプションをオーバーライドするために使用します。
-nogrant ロードされたクラスにEXECUTE権限を付与しません。これはデフォルトの動作です。このオプションは、-grantオプションをオーバーライドするために使用します。
-norecursivejars 他のJARファイルに含まれているJARファイルをリソースとして処理します。これはデフォルトの動作です。このオプションは、-recursivejarsオプションをオーバーライドするために使用します。
-noschema ロードされたクラス、ソースおよびリソースを、-userオプションで指定されたユーザーに対応付けられたスキーマに配置します。これはデフォルトの動作です。このオプションは、-schemaオプションをオーバーライドするために使用します。
-nosynonym クラスのPUBLICシノニムを作成しません。これはデフォルトの動作です。このオプションは、-synonymオプションをオーバーライドします。
-noserverside dbms_java.loadjavaの動作を、Java Database Connectivity(JDBC)ドライバを使用してオブジェクトにアクセスするように変更します。通常、サーバー側のloadjavaは、パフォーマンスを向上させるために、JDBCドライバを使用せずにスキーマにアクセスして直接オブジェクトを変更します。ただし、loadjavaでJDBCドライバを使用する必要がある場合は、このオプションを使用します。
-nousage オプションが指定されていない場合、または-helpオプションが指定されている場合は、使用方法についての指定のメッセージを抑制します。
-noverify クラスがバイトコードの検証なしにロードされます。このオプションを使用するには、oracle.aurora.security.JServerPermission(Verifier)を付与されていることが必要です。このオプションを効果的に実行するには、-resolveと併用する必要があります。
-oci | -oci8 loadjavaに対して、JDBC Oracle Call Interface(OCI)ドライバを使用してデータベースと通信するように指示します。-oci-thinは相互に排他的です。いずれも指定しない場合は、デフォルトで-ociが使用されます。-ociを選択すると、-user値の構文が暗黙的に使用されます。URLの指定は必要ありません。
-optionfile file ファイルをloadjavaオプションに提供できます。
-optiontable tablename このオプションは-optionfileと同様に動作しますが、パターンとオプションのソースがファイルではなくSQL表になります。このオプションは、ユーザーがクラスのプロパティを永続的に指定する場合に使用します。表をロードするためのメカニズムは提供されていません。表名には、PATTERNOPTIONおよびVALUEという3つの文字列を含める必要があります。PATTERNの値は、オプション・ファイル内のパターンと同じ方法で解析されます。他の2つの列は、対応するコマンドライン・オプションと同じで、オペランドを取ります。オペランドを取らないオプションの場合、VALUE列はNULLにする必要があります。行は、オプション・ファイルの行と同様に処理されます。指定のスキーマ・オブジェクトのオプションを判別するために順に行が検査され、一致するとそのオプションがオプション・リストに追加されます。2つの行に、-synonym-nosynonymなど同じパターンで矛盾するオプションがある場合に、どちらが優先されるかは指定されていません。2つの行に同じパターンとオプション列がある場合に、どちらのVALUEが優先されるかは指定されていません。
-publish package packageは、loadjavaによって作成または置換されます。このパッケージには、適格なメソッドのラッパーが定義されます。オプション・ファイルを使用すると、loadjavaの1回の起動で複数のパッケージを作成できます。各パッケージでは、メソッドと同じ名前変換が実行されます。
-pubmain number java.lang.String型の単一の引数を取るメソッドに適用される特別なオプションです。SQLプロシージャまたはファンクションの複数の異体が作成され、それぞれが異なる数のVARCHAR型の引数を取ります。特に、最大でnumberの数まで引数を取る異体が作成されます。デフォルト値は3です。このオプションは、java.lang.String型の単一の引数を取るメソッドと同様に、mainに適用されます。
-recursivejars 通常、loadjavaはJARファイル内で.jar拡張子を持つエントリを検出すると、そのエントリをリソースとしてロードします。このオプションを指定すると、loadjavaは、該当するJARファイルをトップレベルのJARファイルと同様に処理します。つまり、エントリを読み込み、クラス、ソースおよびリソースをロードします。
-resolve コマンドラインのすべてのクラスがロードされた後に、必要に応じて、クラス内の外部参照をコンパイルおよび解決します。-resolveを指定しないと、loadjavaはファイルをロードしますが、コンパイルまたは解決を実行しません。
-resolver 明示的なリゾルバ仕様を指定します。この仕様は、新しくロードされたクラスにバインドされます。-resolverを指定しないと、カレント・ユーザーのスキーマとPUBLICを含んだデフォルトのリゾルバ仕様が使用されます。
-resolveonly loadjavaで最初の作成手順をスキップします。権限付与、解決、シノニムの作成などは実行されます。
-schema スキーマ・オブジェクトを作成するスキーマを指定します。このオプションを指定しないと、-userのスキーマが使用されます。他のユーザーのスキーマにスキーマ・オブジェクトを作成するには、CREATE PROCEDURE権限またはCREATE ANY PROCEDURE権限が必要です。CREATE TABLE権限またはCREATE ANY TABLE権限も必要です。さらに、クラスに対するJServerPermission loadLibraryInClassも必要です。
-stdout stderrではなく、stdoutに出力を送信します。
-stoponerror 通常、loadjavaでは、ファイルの処理中にエラーが発生した場合、メッセージを発行して他のクラスの処理を継続します。このオプションを指定すると、エラーの発生時に処理を停止します。さらに、Javaオブジェクトに適用され、クラスのロード先スキーマのUSER_ERROR表に格納されているすべてのエラーをレポートします。ただし、ORA-29524エラーはレポートしません。このエラーは、参照先のクラスが解決できないため、クラスを解決できない場合に生成されます。したがって、このエラーは、参照先のクラスが未解決であるために起こった、二次的な結果になります。
-synonym ロードされるクラスに対してPUBLICシノニムを作成し、ロード先スキーマの外側からもクラスにアクセスできるようにします。このオプションを指定するには、CREATE PUBLIC SYNONYM権限が必要です。ソース・ファイルに対して-synonymを指定すると、そのソース・ファイルからコンパイルされたクラスは、-synonymを指定してロードした場合と同様に処理されます。
-tableschema schema Javaファイルの接続先スキーマではなく、指定したスキーマ内にloadjavaの内部表を作成します。
-thin loadjavaに対して、JDBC Thinドライバを使用してデータベースと通信するように指示します。-thinを選択すると、-user値の構文が暗黙的に使用されます。-userオプションを使用して、適切なURLを指定する必要があります。
-time すべてのメッセージにタイムスタンプを出力します。
-unresolvedok -resolveと組み合せると、未解決のエラーが無視されます。
-user ユーザー名、パスワードおよびデータベース接続文字列を指定します。ファイルはこのデータベース・インスタンスにロードされます。
-verbose loadjavaに対して、実行中に詳細なステータス・メッセージを出力するように指示します。-verboseを使用して、ダイジェスト表のエントリに一致したためにloadjavaがファイルをロードしなかった場合を調べます。

11.6.3 引数の詳細

この項では、動作が複雑なloadjavaの一部の引数について、表11-1の概要よりさらに詳しく説明します。

ファイル名

.class.java.sqlj.jar.zipおよびリソース・ファイルは、必要な数だけ任意の順序で指定できます。JARファイルまたはZIPファイルを指定すると、loadjavaは、そのJARまたはZIPでファイルを処理します。JARまたはZIPのスキーマ・オブジェクトはありません。JARまたはZIPに別のJARまたはZIPが含まれていると、loadjavaはこれらのファイルを処理しません。

ファイルのロード方法としては、JARまたはZIPにファイルをまとめ、アーカイブとしてロードすることをお薦めします。アーカイブをロードすることで、リソース・スキーマ・オブジェクトのネーミングの手間を省くことができます。Java Development Kit(JDK)で使用するJARまたはZIPがある場合も、loadjavaでロードできます。この場合、リソース・スキーマ・オブジェクトのネーミングについては知る必要ありません。

スキーマ・オブジェクト名はファイル名と異なります。loadjavaは異なるタイプのスキーマ・オブジェクトを異なる方法でネーミングします。クラス・ファイルは自己識別できるため、loadjavaによるクラス・ファイル名のスキーマ・オブジェクト名へのマッピングは開発者には表示されません。同様に、ソース・ファイル名のマッピングも開発者には表示されません。loadjavaは、ソース・ファイル内に定義されている最初のクラスの完全修飾名をスキーマ・オブジェクト名とします。JARファイルとZIPファイルにも、それぞれのファイルの名前が含まれています。

ただし、リソース・ファイルは自己認識できません。loadjavaは、引数で指定したとおりのリテラルなファイル名からJavaリソース・スキーマ・オブジェクト名を生成します。リソース・スキーマ・オブジェクトがクラスで使用され、リソースの正しい指定方法がわかりにくい場合があるため、コマンドラインで正しくリソース・ファイル名を指定することが重要です。

各リソース・ファイルを正確にロードする最善の方法は、パッケージ・ツリーの最上部からloadjavaを実行し、そのディレクトリに相対するリソース・ファイル名を指定する方法です。


注意:

パッケージ・ツリーの最上部とは、CLASSPATHで指定するディレクトリです。

この規則に従わない場合は、次のリソース・ファイル・ネーミングに従ってください。リソース・ファイルをロードすると、loadjavaはコマンドラインで指定したとおりのリテラルなリソース・ファイル名からリソース・スキーマ・オブジェクト名を生成します。たとえば、次のように入力したとします。

% cd /home/scott/javastuff
% loadjava options alpha/beta/x.properties
% loadjava options /home/scott/javastuff/alpha/beta/x.properties

同じファイルを相対パス名と絶対パス名で指定していますが、loadjavaalpha/beta/x.propertiesROOT/home/scott/javastuff/alpha/beta/x.propertiesの2つのスキーマ・オブジェクトを作成します。リソース・スキーマ・オブジェクトの名前は、入力したとおりのファイル名から生成されます。

クラスは、リソース・ファイルを相対的に参照することも絶対的に参照することもできます。loadjavaとクラス・ローダーで同じスキーマ・オブジェクト名を使用するには、クラスからgetResource()またはgetResourceAsString()に渡す名前をコマンドラインに入力します。

リソース・ファイルは、次のようにJARでロードできます。この場合、名前をコマンドラインに正しく入力するために、クラスで使用するリソース名が相対名か絶対名かを記憶したり、ディレクトリを変更する必要はありません。

% cd /home/scott/javastuff
% jar -cf alpharesources.jar alpha/*.properties
% loadjava options alpharesources.jar

処理をさらに簡略化するには、クラス・ファイルとリソース・ファイルの両方をJARで格納します。これによって、次のコマンドを起動しても同じ処理を実行できます。

% loadjava options alpha.jar
% loadjava options /home/scott/javastuff/alpha.jar

前述したloadjavaコマンドは、JARファイルの内容をロードするには任意のパス名が使用できることを示しています。冗長なコマンドを実行した場合でも、loadjavaは、ファイルを2回ロードする必要がないことをダイジェスト表を通じて認識します。したがって、loadjavaの前回の起動後に変更されたファイルが少ない場合でも、JARファイルの再ロードには、考えられているほどの時間はかかりません。

definer

{-definer | -d}

このオプションはストアド・プロシージャにおける定義者権限に相当し、概念的にはUNIXのsetuid機能に類似しています。 ただし、setuidはプログラム全体に適用されますが、-definerオプションは各クラスに適用できます。さらに、定義者ごとに異なる権限を付与することもできます。アプリケーションは多数のクラスで構成される場合があるため、意図した結果を得るには、-definerを注意して適用する必要があります。つまり、クラスに必要以上の権限を付与しないように注意してください。

noverify

[-noverify]

このオプションを指定すると、クラスがバイトコードの検証なしにロードされます。このオプションを実行するには、oracle.aurora.security.JServerPermission(Verifier)を付与されていることが必要です。また、このオプションは、-resolveと併用する必要があります。

検証機能によって、形式が無効なJavaバイナリがサーバーにロードされて実行されるのを防止できます。ロードするJARまたはクラスが有効であることが判明している場合は、このオプションによってloadjavaプロセスを高速化できます。検証プロセス時には、解析のパフォーマンスを向上させるためのOracle Database固有の最適化が実行されます。したがって、このオプションを使用すると、アプリケーションの解析のパフォーマンスが低下する場合があります。

optionfile

[-optionfile <file>]

このオプションを使用すると、loadjavaオプションにファイルを指定できます。このファイルは、他のloadjavaオプションが処理される前に、loadjavaで読み込まれて処理されます。このファイルには1行以上が含まれ、各行にはパターンと一連のオプションが含まれます。各行は、改行文字(\n)で終了している必要があります。

loadjavaで処理されるファイルまたはJARエントリごとに、作成されるスキーマ・オブジェクトのロング名がパターンと照合してチェックされます。パターンは、任意の文字列を示すワイルドカード(*)で終了している場合があります。ワイルドカードを使用しない場合、パターンは名前と完全に一致する必要があります。

一致するJavaスキーマ・オブジェクトに適用されるオプションは、行の後半で指定します。オプションは、コマンドライン・オプションを置換するのではなく、コマンドライン・オプションに追加されます。複数の行が名前と一致する場合、一致する行はパターンの長さが短い順にソートされ、各行のオプションが追加されます。通常、loadjavaオプションは累積ではありません。後から追加されたオプションは以前のオプションをオーバーライドします。つまり、長いパターンで行に指定されたオプションは、短いパターンで行に指定されたオプションをオーバーライドします。

このファイルは、java.io.StreamTokenizerで解析されます。

このファイルでJavaのコメントを使用できます。行のコメントは#で開始します。空の行は無視されます。引用文字には二重引用符(")を使用してください。つまり、空白を含むオプションは、二重引用符で囲む必要があります。-user-verboseなどの特定のオプションは、loadjavaの処理全体に影響を与えますが、個別のJavaスキーマ・オブジェクトに対して実行されるアクションには影響を与えません。このようなオプションがオプション・ファイルに存在する場合は無視されます。

アプリケーションをパッケージ化するために、loadjavaは処理対象の各JARファイルでMETA-INF/loadjava-optionsエントリを検索します。このエントリが検出された場合、そのエントリは、オプション・ファイル内の他の全エントリに適用されるオプション・ファイルとして処理されます。ただし、loadjavaは、JARファイルで出現する順にエントリに対する処理を実行します。

loadjavaMETA-INF/loadjava-optionsを処理する前にエントリを部分的に処理した場合、loadjavaは適用可能なオプションに準拠するようにスキーマ・オブジェクトの変更を試みます。たとえば、loadjavaは、定義者権限で作成される必要があったクラスが実行者権限で作成された場合に、そのクラスを変更します。-noactionに対する修正は、作成済のスキーマ・オブジェクトを削除することです。これによって正しい結果が得られます。ただし、loadjavaの起動前にスキーマ・オブジェクトが存在していた場合を除きます。この場合、そのスキーマ・オブジェクトは削除されます。

publish

[-publish <package>]
[-pubmain <number>]

公開オプションを使用すると、loadjavaは処理済のクラスに含まれるメソッドのPL/SQLラッパーを作成します。通常、ユーザーは、JAR内にあるいくつかのクラスのラッパーのみを公開します。このオプションは、オプション・ファイルで指定されている場合に最も役立ちます。

公開可能にするには、メソッドが次の条件を満たす必要があります。

  • メソッドがpublicクラスのメンバーであることが必要です。

  • メソッドをpublicおよびstaticとして宣言する必要があります。

  • メソッドのシグネチャは、次の規則を満たしてマップ可能であることが必要です。

    • 引数および戻り値のJavaの算術型は、NUMBERにマップされます。

    • 引数および戻り型として使用されるcharは、VARCHARにマップされます。

    • 引数および戻り型として使用されるjava.lang.Stringは、VARCHARにマップされます。

    • メソッドの唯一の引数がjava.lang.String型である場合は、-pubmainオプションで説明したように、特別な規則が適用されます。

    • 戻り型がvoidになると、プロシージャが作成されます。

    • 戻り型が算術型、charまたはjava.lang.String型の場合は、ファンクションが作成されます。

前述の規則に該当しない引数または戻り型を取るメソッドは、適格ではありません。SQL引数のOUTIN OUTOBJECT型およびその他多数のSQL機能に対するプロビジョニングはありません。

resolve

{-resolve | -r}

以前ロードしたクラスをloadjavaで強制的にコンパイルおよび解決するには、-resolveを使用します。解決はロード後に個別に行われるため、-forceを指定する必要はありません。

リゾルバ

{-resolver | -R} resolver_specification

このオプションは、loadjavaが作成または置換したクラス・スキーマ・オブジェクトに明示的なリゾルバ仕様を対応付けます。

リゾルバ仕様は1つ以上の項目で構成されます。各項目の内容は、次の構文で表された名前仕様とスキーマ仕様です。

"((name_spec schema_spec) [(name_spec schema_spec)] ...)"

名前仕様は、import文における名前に類似しています。名前仕様として、Javaの完全修飾クラス名、最終要素がワイルドカード文字のアスタリスク(*)のパッケージ名、またはアスタリスク(*)のみを指定できます。名前仕様の要素間は、ピリオド(.)ではなくスラッシュ(/)で区切ります。たとえば、名前仕様a/b/*は、名前がa.bで始まるすべてのクラスに一致します。特殊な名前である「*」はすべてのクラス名に一致します。

スキーマ仕様として、スキーマ名またはワイルドカード文字のダッシュ(-)を指定できます。ワイルドカードは、スキーマを特定するものではなく、一致する名前への参照が解決できない場合でもクラスを無効とマークしないように解決処理に対して指示するために使用します。テスト対象のクラスで参照しているクラスをロードできない、またはロードしない場合は、ダッシュ(-)を使用します。たとえば、クラスでGUIクラスを参照していても、サーバーでの実行時はGUIがないため、このGUIクラスはコールされません。

解決処理では、名前が名前仕様に一致するスキーマ・オブジェクトが、パートナ・スキーマ仕様で指定されているスキーマで検索されます。

この解決処理では、リゾルバ仕様のリスト順にスキーマが検索されます。次に例を示します。

-resolver '((* SCOTT) (* PUBLIC))'

これは、最初にSCOTTで、次にPUBLICで参照を検索することを意味します。参照が解決されない場合は、参照元クラスを無効とマークし、エラー・メッセージを表示します。

次の例を考えてみます。

-resolver "((* SCOTT) (* PUBLIC) (my/gui/* -))"

これは、最初にSCOTTで、次にPUBLICで参照を検索することを意味します。参照先がパッケージmy.gui内のクラスで、その参照が見つからない場合は、参照元クラスを有効とマークし、エラー・メッセージは表示しません。参照先がmy.gui内のクラスでなく、その参照が見つからない場合は、参照元クラスを無効とマークし、エラー・メッセージを表示します。

user

{-user | -u} user/password[@database_url]

デフォルトでは、loadjavaは、-userオプションで指定されたログイン・スキーマにロードされます。別のロード先スキーマを指定するには、-schemaオプションを使用します。そのスキーマにログインする必要はありませんが、スキーマを変更するパーミッションが必要になります。

@database_urlの形式は、次に説明するように、-ociを指定するか、または-thinを指定するかによって異なります。

  • -oci:@database_urlはオプションです。指定しない場合、loadjavaはユーザーのデフォルト・データベースを使用します。指定した場合、database_urlはTNS名またはOracle Net Servicesの名前/値リストのいずれかになります。

  • -thin:@database_urlは必須です。形式はhost:lport:SIDです。

    各項目は次のとおりです。

    • hostは、データベースが動作しているコンピュータの名前です。

    • lportは、Oracle Net Services接続のリスニング用に構成されたリスナー・ポートです。デフォルト・インストールでは5521です。

    • SIDは、データベース・インスタンスの識別子です。デフォルト・インストールではORCLです。

次に、loadjavaコマンドの例を示します。

  • デフォルトのOCIドライバでデフォルト・データベースに接続し、JAR内のファイルをTESTスキーマにロードしてから、ファイルを解決する場合

    loadjava -u joe/shmoe -resolve -schema TEST ServerObjects.jar
    
    
  • JDBC Thinドライバで接続し、クラス・ファイルとリソース・ファイルをロードして、各クラスを解決する場合

    loadjava -thin -u SCOTT/TIGER@dbhost:5521:orcl \
      -resolve alpha.class beta.props
    
    
  • alpha.classを実行できるユーザー群にBettyとBobを追加する場合

    loadjava -thin -schema test -u SCOTT/TIGER@localhost:5521:orcl \
      -grant BETTY,BOB alpha.class
    
    

11.7 dropjavaツール

dropjavaツールは、loadjavaと逆の処理を実行します。コマンドラインでのファイル名およびJARファイルまたはZIPファイルの内容をスキーマ・オブジェクト名に変換してから、スキーマ・オブジェクトとそれに対応するダイジェスト表の行を削除します。.java.class.sqlj.ser.zip.jarおよびリソース・ファイル名をコマンドラインに任意の順序で入力できます。

また、スキーマ・オブジェクト名を、直接dropjavaに指定できます。.jar.zip.class.javaまたは.sqljで終わらないコマンドライン引数は、スキーマ・オブジェクト名とみなされます。複数のスキーマ・オブジェクトに該当するスキーマ・オブジェクト名を指定すると、該当するすべてのスキーマ・オブジェクトが削除されます。

クラスを削除すると、そのクラスに依存しているクラス群が無効になります。この無効化は、上方に再帰的に連鎖します。ソースを削除すると、このソースから導出されたクラスが削除されます。


注意:

Javaスキーマ・オブジェクトは、最初にロードしたときと同じ方法で削除する必要があります。.sqljソース・ファイルをロードしてサーバーで変換する場合は、同じソース・ファイルでdropjavaを実行する必要があります。クライアントで変換してからクラスおよびリソースを直接ロードする場合は、同じクラスおよびリソースでdropjavaを実行します。

dropjavaは、コマンドラインから実行するか、またはDBMS_JAVAクラスに含まれるdropjavaメソッドを使用して実行できます。 使用しているJavaアプリケーション内からdropjavaを実行するには、次のコマンドを使用します。

call dbms_java.dropjava('... options...');

オプションは、コマンドラインで指定する内容と同じです。各オプションは空白で区切ります。オプションをカンマで区切らないでください。ただし、-resolverオプションは例外です。接続は常にカレント・セッションに対して確立されます。したがって、-userオプションを使用して別のユーザー名を指定することはできません。

-resolverの場合は、他のすべてのオプションを最初に指定してカンマ(,)で区切り、次に-resolverオプションとその定義を指定してください。-thin-oci-userおよび-passwordの各オプションは、loadjavaのデータベース接続に関連しているため、指定しないでください。出力はstderrに送信されます。serveroutputをオンに設定し、必要に応じてdbms_java.set_outputをコールします。

この項の内容は、次のとおりです。

11.7.1 構文

dropjavaコマンドの構文は次のとおりです。

dropjava [options] {file.java | file.class | file.sqlj |
file.jar | file.zip | resourcefile} ...
  -u | -user user/password[@database]
  [-genmissingjar JARfile]
  [-jarasresource]
  [-noserverside]
  [-o | -oci | -oci8]
  [-optionfile file]
  [-optiontable table_name]
  [-S | -schema schema]
  [-stdout]
  [-s | -synonym]
  [-t | -thin]
  [-time]
  [-v | -verbose]

11.7.2 引数の概要

表11-2は、dropjavaの引数の一覧です。

表11-2 dropjavaの引数の概要

引数 説明
-user ユーザー名、パスワードおよびデータベース接続文字列(オプション)を指定します。ファイルはこのデータベース・インスタンスから削除されます。
filenames .java.class.sqlj.ser.jar.zipおよびリソース・ファイル名を、必要な数だけ組み合せて指定します。
-genmissingjar JARfile このオプションのオペランドを処理対象のファイルとして扱います。
-jarasresource 以前にリソースとしてロードされたJARファイル全体を削除します。
-noserverside サーバー側のdropjavaツールの動作を、JDBCドライバを使用してスキーマにアクセスするように変更します。通常、サーバー側のdropjavaは、パフォーマンスを向上させるために、JDBCドライバを使用せずにスキーマにアクセスして直接スキーマを変更します。ただし、loadjavaでJDBCドライバを使用する必要がある場合は、このオプションを使用します。
-oci | -oci8 dropjavaに対して、OCI JDBCドライバを使用してデータベースに接続するように指示します。-ociと-thinは相互に排他的です。いずれも指定しない場合は、デフォルトで-ociが使用されます。-ociを選択すると、-user値の形式が暗黙的に使用されます。
-optionfile file 使用方法はloadjavaと同じです。
-optiontable table_name 使用方法はloadjavaと同じです。
-schema schema スキーマ・オブジェクトを削除するスキーマを指定します。このオプションを指定しないと、ログイン・スキーマが使用されます。他のユーザーのスキーマからスキーマ・オブジェクトを削除するには、DROP ANY PROCEDURE権限およびUPDATE ANY TABLE権限が必要です。
-stdout stderrではなく、stdoutに出力を送信します。
-synonym loadjavaを使用して作成されたPUBLICシノニムを削除します。
-thin dropjavaに対して、JDBC Thinドライバを使用してデータベースと通信するように指示します。-thinを選択すると、-user値の形式が暗黙的に使用されます。
-time すべてのメッセージにタイムスタンプを出力します。
-verbose dropjavaに対して、実行中に詳細なステータス・メッセージを出力するように指示します。

11.7.3 引数の詳細

この項では、dropjavaの一部の複雑な引数について説明します。

ファイル名

dropjavaは、ほとんどのファイル名をloadjavaと同じ方法で解析します。

  • .classファイル

    ファイル内のクラス名を検索して、対応するスキーマ・オブジェクトを削除します。

  • .javaおよび.sqljファイル

    ファイル内の最初のクラス名を検索して、対応するスキーマ・オブジェクトを削除します。

  • .jarおよび.zipファイル

    アーカイブ・ファイル名を、コマンドラインに入力された場合と同様に処理します。

dropjavaは、これ以外の拡張子が付いているファイル名、または拡張子が付いていないファイル名をスキーマ・オブジェクト名として解析し、その名前に一致するすべてのソース・オブジェクト、クラス・オブジェクトおよびリソース・オブジェクトを削除します。

dropjavaは、スキーマ・オブジェクトに一致しないファイル名を検出すると、メッセージを表示し、残りのファイル名を処理します。

user

{-user | -u} user/password[@database]

@databaseの形式は、-ociを指定するか、または-thinを指定するかによって異なります。

  • -oci:@databaseはオプションです。指定しない場合、dropjavaはユーザーのデフォルト・データベースを使用します。指定した場合、databaseはTNS名またはOracle Net Servicesの名前/値リストのいずれかになります。

  • -thin:@databaseは必須です。形式はhost:lport:SIDです。

    各項目は次のとおりです。

    • hostは、データベースが動作しているコンピュータの名前です。

    • lportは、Oracle Net Services接続のリスニング用に構成されたリスナー・ポートです。デフォルト・インストールでは5521です。

    • SIDは、データベース・インスタンスの識別子です。デフォルト・インストールではORCLです。

次に、dropjavaの例を示します。

  • ServerObjects.jarからロードしたデフォルト・データベース内のTESTスキーマにある、すべてのスキーマ・オブジェクトを削除する場合

    dropjava -u SCOTT/TIGER -schema TEST ServerObjects.jar
    
    
  • JDBC Thinドライバで接続してから、クラス・ファイルとリソース・ファイルをユーザーのスキーマから削除する場合

    dropjava -thin -u SCOTT/TIGER@dbhost:5521:orcl alpha.class beta.props
    
    

11.7.4 リソースの削除

サーバーに直接ロードされたリソースを削除する場合は注意が必要です。-ser2classオプションを使用せずにクライアントで変換した場合、このリソースにはプロファイルが含まれています。ソースやクラス・スキーマ・オブジェクト、またはサーバー側SQLJトランスレータで生成されたリソース・スキーマ・オブジェクトを削除する場合は、該当する.sqljソース・ファイルのパッケージ仕様に従ってスキーマ・オブジェクトが検索されます。ただし、クライアントで生成されてサーバーに直接ロードされたリソースのスキーマ・オブジェクトの完全修飾名は、.jarファイルのパス情報またはロード時にコマンドラインに指定したパス情報によって異なります。.jarファイルを使用してリソースをロードし、同じ.jarファイルを使用してリソースを削除する場合は問題ありません。ただし、コマンドラインを使用してリソースをロードする場合は、dropjavaを実行してリソースを削除するときに同じパス情報を指定するように注意してください。

11.8 ojvmjavaツール

ojvmjavaツールは、データベース・インスタンスのセッション・ネームスペースとの対話型インタフェースです。ojvmjavaを起動するときは、データベース接続引数を指定します。これによって、プロンプトが表示され、コマンドを入力できる状態になります。

シェルは実行可能プログラム、つまり、static main()メソッドを持つクラスを起動できます。実行可能ファイルは、loadjavaを使用してロードしておく必要があります。

この項の内容は、次のとおりです。

11.8.1 構文

ojvmjavaコマンドの構文は次のとおりです。

ojvmjava {-user user[/password@database ] [options]
  [@filename]
  [-batch]
  [-c | -command command args]
  [-debug]
  [-d | -database conn_string]
  [-fileout filename]
  [-o | -oci | -oci8]
  [-oschema schema]
  [-t | -thin]
  [-version | -v]

11.8.2 引数の概要

表11-3は、ojvmjavaの引数の一覧です。

表11-3 ojvmjavaの引数の概要

引数 説明
-user | -u データベースに接続するためのユーザー名を指定します。この名前は大/小文字の区別がありません。名前は常に大文字に変換されます。データベース情報を指定した場合、デフォルトで使用される構文はOCIです。また、デフォルト・データベースを指定することもできます。
-password | -p データベースに接続するためのパスワードを指定します。この名前は大/小文字の区別がないため、常に大文字に変換されます。
@filename 実行するojvmjavaコマンドを含むスクリプト・ファイルを指定します。
-batch スクリーンに出力されたすべてのメッセージを無効にします。ヘルプ・メッセージまたはプロンプトは出力されません。入力したコマンドへの応答のみが出力されます。
-command 任意のコマンドを実行します。ojvmjavaをインタプリタ・モードで実行するのではなく、1つのコマンドのみ実行する場合は、このオプションの後にコマンドと引数を含む文字列を指定して実行します。指定したコマンドが実行されると、ojvmjavaは終了します。
-debug デバッグ情報を出力します。
-d | -database conn_string データベース接続文字列を指定します。
-fileout file 出力を指定のファイルにリダイレクトします。
-o | -oci | -oci8 JDBC OCIドライバを使用します。OCIドライバがデフォルトです。このフラグを使用して、@databaseまたは-databaseオプションのいずれかで使用する構文を指定します。
-o schema schema このスキーマを使用してクラスを参照します。
-t | -thin JDBC Thinドライバ用のデータベース構文を使用するように指定します。データベース接続文字列は、host:port:SIDの形式で指定するか、またはOracle Net Servicesの名前/値リストになります。
-verbose 接続情報を出力します。
-version バージョンを表示します。

11.8.3

次に示すように、データベースorclのセッション・ネームスペース上のシェルを、ホストdbserverのリスナー・ポート2481に対してオープンします。

ojvmjava -thin -user SCOTT/TIGER@dbserver:2481:orcl

11.8.4 機能

ojvmjavaコマンドには様々なタイプの機能があり、次のようにグループ化されます。

11.8.4.1 ojvmjavaオプション

この項では、ojvmjavaコマンドライン・ツールのオプションについて説明します。

ojvmjavaツールの出力リダイレクション

コマンド・オプションの最後に&>filenameを追加して、ojvmjavaツールで生成された出力をファイルに送信できます。次のコマンドでは、すべての出力がlistDirファイルに送信されます。

ls -lR &>/tmp/listDir

@filenameオプションでのojvmjavaコマンドのスクリプト

この@filenameオプションは、1つ以上のojvmjavaコマンドを含むスクリプト・ファイルを指定します。指定されたスクリプト・ファイルは、クライアント上に配置されます。ojvmjavaツールはファイルを読み込み、指定されたサーバー上ですべてのコマンドを実行します。さらに、スクリプト・ファイルはサーバー上で実行されるため、ファイルへの出力のリダイレクトや別のスクリプトの実行など、そのスクリプト・ファイルでのオペレーティング・システムとの対話はすべてサーバー上で行われます。別のスクリプト・ファイルを実行するようにojvmjavaに指示する場合、そのファイルはサーバー上の$ORACLE_HOMEに存在する必要があります。

ojvmjavaコマンドの後に任意のオプションと必要な入力引数を入力します。

スクリプト・ファイルには、ojvmjavaコマンドおよびそれに続くオプションと入力パラメータが含まれています。入力パラメータは、コマンドラインでojvmjavaに渡すことができます。ojvmjavaは、既知のオプションをすべて処理し、その他のオプションと引数をスクリプト・ファイルに渡します。

スクリプト・ファイルにあるコマンド内の引数にアクセスするには、&1...&nを使用して引数を示します。すべての入力パラメータが1つのコマンドに渡される場合は、&*を入力して、すべての入力パラメータがこのコマンドに渡されることを示すことができます。

次の例は、スクリプト・ファイルexecShellの内容を示します。

chmod +x SCOTT nancy /alpha/beta/gamma
chown SCOTT /alpha/beta/gamma
java testhello &*

必要な入力引数は2つであるため、次のように、javaコマンドの入力パラメータを実装できます。

java testhello &1 &2


注意:

同じ方法で、-commandオプションに引数を指定することもできます。次に例を示します。
ojvmjava ... -command "cd &1" contexts

ojvmjavaは、すべてのオプションを処理した後、contextsを引数としてcdコマンドに渡します。


このファイルを実行するには、次のように指定します。

ojvmjava -user SCOTT -password TIGER -thin -database dbserver:2481:orcl \
  @execShell alpha beta

ojvmjavaは既知のオプションをすべて処理し、スクリプト・ファイル内のコマンドが使用する他の入力パラメータを渡します。次の例では、パラメータのalphabetaは、スクリプト・ファイル内のjavaコマンドに渡されます。実際に実行されるコマンドは次のようになります。

java testhello alpha beta

スクリプト・ファイルには、ハッシュ(#)を使用してコメントを追加できます。コメントはojvmjavaでは無視されます。次に例を示します。

#this whole line is ignored by ojvmjava

アプリケーション内でのsess_shの実行

sess_shコマンドは、次のコマンドを使用してJavaまたはPL/SQLアプリケーション内から実行できます。

アプリケーション・タイプ コマンドおよび説明
PL/SQLアプリケーション
dbms_namespace.shell(in command VARCHAR2)

使用しているアプリケーションで、固有のセッション・インスタンスで個々のコマンドを実行できます。シェルの状態は、同じセッション内でsess_shがコールされるたびに保持されます。次の例では、PL/SQLアプリケーション内でsess_shツールのcdコマンドを実行します。
dbms_namespace.shell('cd /webdomains');

dbms_namespace.shell('ls &> /tmp/test');

シェル・インスタンスの状態をリセットするには、次のようにexitコマンドを実行します。

dbms_namespace.shell('exit');

Javaアプリケーション Javaサーバー・オブジェクト内でoracle.aurora.namespace.shell.Shellをインスタンス化します。作成した後は、initializeメソッドを使用してShellオブジェクトを初期化する必要があります。初期化した後は、次のようにsess_shコマンドを実行できます。
 String commands="cd /webdomains\nls -l";
 StringReader commandReader = new StringReader(commands);
 Shell sh = new oracle.aurora.namespace.shell.Shell();

 try
 {
   sh.initialize();
   sh.invoke(new BufferedReader(commandReader), false);
 }
 catch (ToolsException te)
 {
   //Error executing the commands
 }


11.8.4.2 シェル・コマンド

この項では、ネームスペース内のコンテキストとオブジェクトを操作したり表示するために使用するコマンドについて説明します。

次のシェル・コマンドは、UNIXシェル・コマンドと同様に機能します。

各シェル・コマンドにはいくつかの共通オプションがあります。表11-4は、それらの共通オプションの一覧です。

表11-4 ojvmjavaコマンドの共通オプション

オプション 説明
-describe | -d ツールの操作方法を要約表示します。
-help | -h ツールの構文を要約表示します。
-version バージョンを表示します。

echo

このコマンドは、指定された対象を正確にstdoutに出力します。これは、ほとんどの場合、スクリプト・ファイルで使用します。

構文は次のとおりです。

echo [echo_string] [args]

echo_stringは、シェル・スクリプトの起動時にスクリーンに書き込むテキストが含まれる文字列です。argsは、ユーザーが指定する入力引数です。たとえば、次のコマンドは通知を出力します。

echo "Adding an owner to the schema" &1

入力引数がSCOTTの場合、出力は次のようになります。

Adding an owner to the schema SCOTT

exit

このコマンドは、ojvmjavaを終了します。構文は次のとおりです。

exit

たとえば、シェルを終了するには次のコマンドを使用します。

$ exit
%

help

このコマンドは、シェル・コマンドの構文の要約を表示します。また、helpコマンドを使用すると、特定のコマンドについてオプションの要約も表示できます。構文は次のとおりです。

help [command]

java

このコマンドは、JDKのjavaコマンドに類似しています。このコマンドは、クラスのstatic main()メソッドをコールします。loadjavaを使用してクラスをロードする必要があります。このコマンドは、データベースで実行されるJavaコードのテストに便利です。特に、このコマンドは例外を捕捉し、クラスの標準出力と標準エラー出力をシェルにリダイレクトして、他のコマンド出力の場合と同様に表示します。データベース内で実行されるJavaクラスの標準出力と標準エラー出力の出力先は、データベース・サーバー・プロセスの1つ以上のトレース・ファイルです。これは読みにくく、また読むためにはDBA権限が必要な場合があります。

このコマンドの構文は次のとおりです。

java [-schema schema] class [arg1 ... argn]

表11-5は、このコマンドの引数の一覧です。

表11-5 javaの引数の概要

引数 説明
class 実行するJavaクラス・スキーマ・オブジェクトの名前を指定します。
-schema 実行するクラスを含むスキーマ名を指定します。デフォルトは実行者のスキーマです。 スキーマ名は、大/小文字の区別があります。
arg1 ... argn クラスのstatic main()メソッドに渡す引数。

次のJavaファイルWorld.javaについて考えます。

package hello;
public class World
{
  public World()
  {
    super();
  }

  public static void main(String[] argv)
  {
    System.out.println("Hello from the Oracle Database");
    if (argv.length != 0)
      System.out.println("You supplied " + argv.length + " arguments: ");
    for (int i = 0; i < argv.length; i++)
      System.out.println(" arg[" + i + "] : " + argv[i]);
  }
}

次のように、クラスをコンパイル、ロード、公開および実行します。

% javac hello/World.java
% loadjava -r -user SCOTT/TIGER@localhost:2481:orcl hello/World.class
% ojvmjava -user SCOTT -password TIGER -database localhost:2481:orcl
$ java testhello alpha beta
Hello from the Oracle Database
You supplied 2 arguments:
arg[0] : alpha
arg[1] : beta

version

このコマンドは、ojvmjavaツールのバージョンを表示します。また、指定したコマンドのバージョンも表示できます。このコマンドの構文は次のとおりです。

version [options] [command]

たとえば、次のように、シェルのバージョンを表示できます。

$ version
1.0

whoami

このコマンドは、カレント・セッションにログインしているユーザーのユーザー名を出力します。このコマンドの構文は次のとおりです。

whoami