hp nonstop sql/mx javaストアド・ プロシージャ … · 523727-002j -1 概要...

166
概要 HP NonStop SQL/MX データベース Java ストアド・プロ シージャ (SPJ) する について します。 製品バージョン NonStop SQL/MX リリース 2.0 対象となるリリース・バージョン・アップデート (RVU) り、 G06.23 およびそれ以 G シリーズ RVU を対 します。 マニュアル番号 523727-002J 発行 2004 11 日本ヒューレット・パッカード株式会社 HP NonStop SQL/MX Java ストアド・ プロシージャ・ガイド

Upload: duongdat

Post on 06-Oct-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

523727

HP NonStop SQL/MX Java ストアド・ プロシージャ・ガイド

概要 本書では、HP NonStop SQL/MX データベースで Java ストアド・プロシージャ (SPJ) を使用する方法について説明します。

製品バージョン NonStop SQL/MX リリース 2.0

対象となるリリース・バージョン・アップデート (RVU)本書は、新版で特に示さない限り、G06.23 およびそれ以降のすべての G シリーズの RVU を対象とします。

マニュアル番号 523727-002J

発行 2004 年 11 月

日本ヒューレット・パッカード株式会社

-002J -1

 

-2

原  典Document History

Ordering InformationFor manual ordering information: domestic U.S. customers, call 1-800-243-6886; international customers, contact your local sales representative.

Document DisclaimerInformation contained in a manual is subject to change without notice. Please check with your authorized representative to make sure you have the most recent information.

Export StatementExport of the information contained in this manual may require authorization from the U.S. Department of Commerce.

ExamplesExamples and sample programs are for illustration only and may not be suited for your particular purpose. The inclusion of examples and sample programs in the documentation does not warrant, guarantee, or make any representations regarding the use or the results of the use of any examples or sample programs in any documentation. You should verify the applicability of any example or sample program before placing the software into productive use.

U.S. Government CustomersFOR U.S. GOVERNMENT CUSTOMERS REGARDING THIS DOCUMENTATION AND THE ASSOCIATED SOFTWARE:These notices shall be marked on any reproduction of this data, in whole or in part.NOTICE: Notwithstanding any other lease or license that may pertain to, or accompany the delivery of, this computer software, the rights of the Government regarding its use, reproduction and disclosure are as set forth in Section 52.227-19 of the FARS Computer Software—Restricted Rights clause.RESTRICTED RIGHTS NOTICE: Use, duplication, or disclosure by the Government is subject to the restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 52.227-7013.RESTRICTED RIGHTS LEGEND: Use, duplication or disclosure by the Government is subject to restrictions as set forth in paragraph (b)(3)(B) of the rights in Technical Data and Computer Software clause in DAR 7-104.9(a). This computer software is submitted with “restricted rights.” Use, duplication or disclosure is subject to the restrictions as set forth in NASA FAR SUP 18-52 227-79 (April 1985) “Commercial Computer Software—Restricted Rights (April 1985).” If the contract contains the Clause at 18-52 227-74 “Rights in Data General” then the “Alternate III” clause applies.U.S. Government Users Restricted Rights — Use, duplication or disclosure restricted by GSA ADP Schedule Contract.Unpublished — All rights reserved under the Copyright Laws of the United States.

本書のプログラムを含むすべての内容は、著作権法上の保護を受けております。著者、発行者の許諾を得ず、無断で複写、複製をすることは禁じられております。

Part Number Product Version Published

520368-001 NonStop SQL/MX Release 1.8 December 2002

523727-001 NonStop SQL/MX Release 2.0 April 2004

523727-002 NonStop SQL/MX Release 2.0 August 2004

523727-002J

更新情報

更新情報

マニュアル情報

概要

本書では、HP NonStop SQL/MX データベースで Java ストアド・プロシージャ (SPJ) を使用する方法に ついて説明します。

製品バージョン

NonStop SQL/MX リリース 2.0

対象となるリリース・バージョン・アップデート (RVU)

本書は次の版が発行されるまで、G06.23 およびそれ以降すべての G シリーズ RVU を対象とします。

マニュアル番号 523727-002J

発行 2004 年 8 月

マニュアル履歴

マニュアル番号 製品バージョン 発行

520368-001 NonStop SQL/MX Release 1.8 December 2002

523727-001 NonStop SQL/MX Release 2.0 April 2004

523727-002 NonStop SQL/MX Release 2.0 August 2004

523727-002J iii

更新情報

iv

新規情報と変更内容

本マニュアルの新規情報と変更内容は次のとおりです。

章 タイトル 新規情報または変更内容

1 「はじめに」 SQL/MX での SPJ の登録と呼び出しの新しいプロセスを追加しまし た。

SPJ Java 環境の初期化と Java 仮想マシン (JVM) の起動オプション の効果についての説明を追加しました。

クラス・ローダの説明を改訂しました。

2 「始める前に」 使用する JDBC/MX と NonStop Server for Java のバージョンを更 新しました。

SQL/MX UDR サーバの再リンクの説明を改訂しました。

JVM 起動オプションを制御する情報を追加しました。 (UDR_JAVA_OPTIONS のデフォルト属性)

JREHOME の場所を設定する新しい方法を追加しました。 (UDR_JAVA_OPTIONS および Guardian アプリケーション用の TACL PARAM )

UDR_JAVA_OPTIONS の設定を使用して、JDBC/MX の代替位置 を設定する情報を追加しました。

ク ラ ス・パ ス を 設 定 す る 新 し い 方 法 を 追 加 し ま し た。(UDR_JAVA_OPTIONS および Guardian アプリケーション用の TACL PARAM)

Java セキュリティを設定する新しい方法を追加しました。(環境変 数 SQLMX_JAVA_SECURITY は廃止されました。)

3 「SPJ Java メソッドの 作成」

SPJ Java メソッドでのトランザクションを扱う情報を追加しまし た。

新たに追加された付録 A「SPJ のサンプル」に基づいて例を変更し ています。

4 「SQL/MX への SPJ の 登録」

SPJ の作成と削除についての説明を更新しました。構文を削除し、 例を追加しました。

新たに追加された付録 A「SPJ のサンプル」に基づいた例にしてい ます。

データ・タイプと文字セットの説明を更新しました。

SPJ とその Java バイトコードの変更についての説明を追加しまし た。

523727-002J

更新情報

5 「SQL/MX での SPJ の 呼び出し」

SPJ の呼び出しについての説明を更新しました。構文を削除し、例 を追加しました。

新たに追加された付録 A「SPJ のサンプル」に基づいた例にしてい ます。

トランザクションのセマンティクスについての情報を追加しました。

6 「SQL/MX での SPJ の 管理」

SPJ に関する特権の付与と取り消し方法について説明しています。

所有権、特権、構文といった SPJ の情報を表示する方法を説明し ています。

分散データベース環境での SPJ を使用方法について説明していま す。

SPJ を SQL/MX リリース 1.8 から SQL/MX リリース 2.0 に移行 する方法について説明しています。

7 「パフォーマンスとトラブルシューティング」

基本的なトラブルシューティングのガイドラインを説明しています。

パフォーマンスに関するヒントを説明しています。

EXPLAIN DESCRIPTION トークンは『NonStop SQL/MX クエリ・ ガイド』に移動しました。

実行プランとシェイプの表示についての説明を改訂しました。新たに追加された付録 A「SPJ のサンプル」に基づいた例にしています。

A 「SPJ のサンプル」 SQL/MX データベースでビジネス・ロジックをデモする SPJ Java メソッドの新しい付録を追加しました。

章 タイトル 新規情報または変更内容

523727-002J v

更新情報

vi

523727-002J

目次

目 次

本書について ......................................................................................................................................xi

対象読者 ....................................................................................................................................xi

本書の構成 ................................................................................................................................xi

本書で使用される例 ...............................................................................................................xiii

関連マニュアル....................................................................................................................... xiv

表記規約 ................................................................................................................................xviii

第 1 章 はじめに 1.1 SPJ とは何か .......................................................................................................................... 1-2

1.2 SPJ の利点 ............................................................................................................................. 1-3

1.2.1 SQL/MX から呼び出し可能な Java メソッド ...................................................... 1-3

1.2.2 移植性 ..................................................................................................................... 1-3

1.2.3 共通のパッケージング手法 .................................................................................. 1-3

1.2.4 生産性の向上 ......................................................................................................... 1-3

1.3 SQL/MX における SPJ ......................................................................................................... 1-4

1.3.1 SPJ 登録のプロセス .............................................................................................. 1-4

1.3.2 SPJ 呼び出しのプロセス ....................................................................................... 1-7

1.4 SPJ Java 環境 ...................................................................................................................... 1-11

1.4.1 SQL/MX UDR サーバ・プロセス ...................................................................... 1-11

1.4.2 マルチスレッド化 ................................................................................................ 1-14

1.4.3 SQL/MX UDR サーバでの Java クラスのロード .............................................. 1-14

1.5 SPJ の使用法 ....................................................................................................................... 1-19

第 2 章 始める前に 2.1 ソフトウェア要件 ................................................................................................................. 2-2

2.1.1 SPJ 製品ファイル .................................................................................................. 2-22.1.2 NonStop Server for Java ......................................................................................... 2-3

2.1.3 JDBC/MX ドライバ .............................................................................................. 2-3

2.2 ソフトウェア・バージョンの確認 ...................................................................................... 2-4

2.2.1 NonStop Server for Java の確認 ............................................................................ 2-4

2.2.2 JDBC/MX ドライバの確認 ................................................................................... 2-6

2.2.3 SQL/MX Language Manager の確認 ..................................................................... 2-6

2.2.4 SQL/MX UDR サーバの確認 ................................................................................ 2-7

2.3 SQL/MX UDR サーバの再リンク ....................................................................................... 2-8

523727-002J vii

目次

vi

2.3.1 mxudrlink スクリプトを使用した MXUDR の再リンク .................................... 2-9

2.3.2 make ファイルを使用した MXUDR の再リンク .............................................. 2-13

2.4 SPJ Java 環境の設定 .......................................................................................................... 2-14

2.4.1 JVM 起動オプションの制御 .............................................................................. 2-14

2.4.2 JREHOME の場所の設定 ................................................................................... 2-202.4.3 JDBC/MX の場所の設定 ................................................................................... 2-23

2.4.4 クラス・パスの設定 ........................................................................................... 2-25

2.4.5 SQL/MX への JAR ファイルのインストール ................................................... 2-28

2.4.6 Java セキュリティの設定 ................................................................................... 2-29

第 3 章 SPJ Java メソッドの作成 3.1 SPJ Java メソッドの作成ガイドライン .............................................................................. 3-2

3.1.1 Java メソッドのシグニチャ ................................................................................. 3-2

3.1.2 main() メソッド ..................................................................................................... 3-2

3.1.3 静的な Java 変数 ................................................................................................... 3-2

3.1.4 ヌルの入出力 ......................................................................................................... 3-3

3.1.5 ストアド・プロシージャの結果セット ............................................................... 3-3

3.1.6 java.sql.Connection オブジェクトの使用 ............................................................ 3-3

3.1.7 Java メソッド呼び出しのネスト .......................................................................... 3-4

3.2 SQL/MX データベースへのアクセス ................................................................................. 3-5

3.2.1 SQLJ ベースの Java メソッド .............................................................................. 3-5

3.2.2 JDBC/MX ベースの Java メソッド ...................................................................... 3-6

3.2.3 例外処理 ................................................................................................................ 3-6

3.3 Java の例外処理 ................................................................................................................... 3-7

3.3.1 ユーザ定義の例外 ................................................................................................. 3-7

3.4 ファイルまたは端末へのデータ書き込み .......................................................................... 3-8

3.5 Java クラスのコンパイル ................................................................................................. 3-10

第 4 章 SQL/MX への SPJ の登録 4.1 SPJ の作成 ............................................................................................................................ 4-2

4.1.1 必要な特権 ............................................................................................................ 4-2

4.1.2 SPJ の作成の結果 .................................................................................................. 4-2

4.1.3 CREATE PROCEDURE ステートメントの使用 ................................................ 4-3

4.2 SPJ の削除 12

4.2.1 必要な特権 .......................................................................................................... 4-12

4.2.2 SPJ の削除の結果 ................................................................................................ 4-12

4.2.3 DROP PROCEDURE ステートメントの使用 ................................................... 4-12

ii 523727-002J

目次

4.3 SPJ とその Java バイトコードの変更 .............................................................................. 4-13

4.3.1 外部パスの変更 ................................................................................................... 4-14

4.3.2 外部名の変更 ....................................................................................................... 4-15

4.3.3 Java のシグニチャの変更 .................................................................................... 4-16

第 5 章 SQL/MX での SPJ の呼び出し5.1 SPJ の呼び出し ..................................................................................................................... 5-2

5.1.1 必要な特権 ............................................................................................................. 5-2

5.1.2 SPJ 呼び出しの結果 .............................................................................................. 5-2

5.1.3 トランザクションのセマンティクス ................................................................... 5-2

5.1.4 CALL ステートメントの使用 ............................................................................... 5-3

5.2 MXCI での SPJ の呼び出し ................................................................................................. 5-6

5.2.1 MXCI の名前付きパラメータの使用 ................................................................... 5-6

5.2.2 MXCI の名前なしパラメータの使用 ................................................................... 5-6

5.3 C または COBOL による埋め込み SQL プログラムでの SPJ の呼び出し ....................... 5-8

5.3.1 静的 CALL ステートメント ................................................................................. 5-8

5.3.2 動的 CALL ステートメント ................................................................................. 5-9

5.4 SQLJ プログラムでの SPJ の呼び出し ............................................................................. 5-14

5.5 JDBC/MX プログラムでの SPJ の呼び出し ..................................................................... 5-15

5.6 NonStop ODBC/MX クライアントでの SPJ の呼び出し ................................................. 5-16

第 6 章 SQL/MX での SPJ の管理 6.1 SPJ を呼び出すのための 特権の付与 ...................................................................................6-2

6.1.1 SPJ に対する特権の付与 .......................................................................................6-2

6.1.2 参照するデータベース・オブジェクトへの特権の付与 ......................................6-4

6.1.3 SPJ の特権の取り消し ...........................................................................................6-4

6.2 SPJ に関する情報の表示 .......................................................................................................6-8

6.2.1 カタログ内の SPJ のリスト表示 ...........................................................................6-8

6.2.3 SPJ に対する特権の表示 ........................................................................................6-9

6.2.4 プロシージャ・ラベルの表示 ..............................................................................6-12

6.2.5 SPJ 構文の表示 .....................................................................................................6-13

6.3 OBEY コマンド・ファイルを使った SPJ ステートメントの保存 ..................................6-15

6.3.1 OBEY コマンド・ファイル .................................................................................6-15

6.3.2 CREATE PROCEDURE ステートメントの再生成 ............................................6-17

6.4 SPJ のバックアップ .............................................................................................................6-19

6.5 分散データベース環境での SPJ の使用法 .........................................................................6-20

6.5.1 Java バイトコードのリモート・ノードへのコピー ...........................................6-21

523727-002J ix

目次

x

6.5.2 外部パスでのノードの指定 ................................................................................. 6-23

6.5.3 非システム Java クラスの配布 ........................................................................... 6-24

6.6 SQL/MX リリース 1.8 から 2.0 への SPJ の移行 .............................................................. 6-25

6.6.1 SPJ の移行のための要件 ..................................................................................... 6-25

6.6.2 SQL/MX リリース 1.8 から 2.0 への SPJ の移行手順 ....................................... 6-25

第 7 章 パフォーマンスとトラブルシューティング7.1 SPJ 障害のトラブルシューティング ................................................................................... 7-2

7.2 パフォーマンスに関するヒント .......................................................................................... 7-3

7.3 CALL ステートメントの実行プランの表示 ....................................................................... 7-4

7.3.1 DISPLAY_EXPLAIN コマンドの使用 ................................................................. 7-4

7.3.2 EXPLAIN 関数の使用 ........................................................................................... 7-4

7.4 CALL ステートメントのシェイプの表示 ........................................................................... 7-5

7.4.1 シェイプのない CALL ステートメント ............................................................... 7-5

7.4.2 シェイプのある CALL ステートメント ............................................................... 7-5

付録 A SPJ のサンプル A.1 SQLJ ソース・ファイルの使用 ........................................................................................... A-2

A.1.1 sampleSQLJ.jar ファイルのインストール ........................................................... A-2

A.1.2 SQL/MX サンプル・データベースのインストール ........................................... A-2

A.2 SPJ Java メソッド ................................................................................................................ A-3

A.2.1 Sales クラス ........................................................................................................... A-3

A.2.2 Payroll クラス ....................................................................................................... A-5

A.3 CREATE PROCEDURE ステートメント ........................................................................... A-7

A.4 SPJ の呼び出し例 ................................................................................................................. A-8

523727-002J

本書について

本書について

本書では、Java ストアド・プロシージャ (SPJ) を開発し、HP NonStop SQL/MX にそのプロシージャを デプロイ、および管理する方法について説明します。SQL/MX は、HP NonStop サーバ向けのリレーショ ナル・データベース管理システムで、ANSI/ISO/IEC 9075:1999 SQL 標準 (一般名 SQL:1999) に準拠してい ます。

対象読者

本書は、SQL/MX データベースに Java ストアド・プロシージャを実装するアプリケーション・プログラ マおよびデータベース管理者を対象としています。読者に次の知識があることが前提です。

□ Java プログラミング言語

□ JDBC および JDBC Driver for SQL/MX (JDBC/MX)

□ SQL および SQL/MX の用語と概念

また、必須ではありませんが、SQL/JRT (Java Routines and Types) と呼ばれる ANSI SQL 標準の一部お よび SQLJ プログラム (Java による埋め込み SQL) についてよく理解しておくと役に立ちます。SQLJ プロ グラミングについての詳細は、『SQL/MX Programming Manual for Java』を参照してください。

本書の構成

第 1 章「はじめに」 SQL/MX における SPJ について紹介し、SPJ を使用す る利点、SQL/MX に SPJ を登録し呼び出す方法、SPJ Java 環境、SPJ の使用手順について説明しています。

第 2 章「始める前に」 SQL/MX で SPJ を登録し、呼び出すために必要なソフ トウェア要件とシステムの設定について説明しています。

第 3 章「SPJ Java メソッドの作成」 SPJ の本体として使用する Java メソッドを作成してコ ンパイルするためのガイドラインについて説明しています。

第 4 章「SQL/MX への SPJ の登録」 SQL/MX で SPJ を作成、削除、変更する方法について 説明しています。

第 5 章「SQL/MX での SPJ の呼び出し」 SQL/MX で CALL ステートメントを使用して、SPJ を 実行する方法について説明しています。

523727-002J xi

本書について

xi

第 6 章「SQL/MX での SPJ の管理」 SPJ を呼び出すための特権の付与、データベースに存 在する SPJ の表示、分散データベース環境での SPJ の 使用、および SQL/MX リリース 1.8 から 2.0 への SPJ の移行など、SPJ に関連する管理タスクについて説明 しています。

第 7 章「パフォーマンスとトラブルシューティ ング」

SPJ のパフォーマンスを向上させ、監視する方法と、一 般的な問題の解決方法について説明しています。

付録 A「SPJ のサンプル」 SQL/MX データベースでビジネス・ロジックをデモす る SPJ Java メソッドについて説明しています。

i 523727-002J

本書について

本書で使用される例

本書で使用される例とサンプルの SPJ は、SQL/MX サンプル・データベースを参照しています。サンプ ル・データベースをインストールするには、『NonStop SQL/MX SQLクイック・スタート』を参照してくだ さい。サンプル・データベースのスキーマとテーブルについての詳細は、『NonStop SQL/MX リファレンス・ マニュアル』を参照してください。

大部分の例とサンプルの SPJ は、SQL/MX サンプル・データベースの SQL/MP テーブルと SQL/MX テー ブルの両方でクエリの実行ができます。SQL/MP テーブルでクエリを実行するには SQL/MX リリース 1.8 のサンプル・データベースを使用してください。SQL/MX テーブルでクエリを実行するには、SQL/MX リ リース 2.0 のサンプル・データベースを使用してください。

注: SQL/MX リリース 2.0 は、SQL/MX 形式のテーブルを使用しています。サンプル・データベースをインス トールするには、SQL/MX DDL ステートメントを使用するライセンスが必要です。このライセンスを取得す るには、製品 T0394 を購入してください。この製品がないと、サンプル・データベースをインストールする ことができません。また、システムがライセンス付きではないことを示すエラー・メッセージが表示されます。

すべての SPJ については、付録 A「SPJ のサンプル」 を参照してください。

523727-002J xiii

本書について

xi

関連マニュアル

本書は、次のマニュアルから構成される SQL/MX マニュアル・ライブラリの一部です。

入門ガイド

『NonStop SQL/MP ユーザのための NonStop SQL/MX 比較ガイド』

SQL に関する SQL/MP と SQL/MX の違いについて説明してい ます。

『NonStop SQL/MX SQLクイック・ スタート』

SQL/MX 会話型インタフェース (MXCI) で SQL を使用するた めの基本的な技術について説明しています。また、サンプル・データベースのインストール方法についても説明しています。

リファレンス・マニュアル

『NonStop SQL/MX リファレンス・ マニュアル』

SQL/MX ステートメントの構文、MXCI コマンド、関数、およ びその他の SQL/MX の言語要素を説明しています。

『SQL/MX Connec t i v i t y Se rv ice Administrative Command Reference』

SQL/MX 会話型インタフェース (MXCI) で使用可能な SQL/ MX 管理コマンド・ライブラリ (MACL) を説明しています。

『DataLoader/MX Reference Manual』 SQL/MX データベースをロードするためのツールである DataLoader/MX 製品の特徴と機能を説明しています。

『NonStop SQL/MX Message Manual』 SQL/MX のメッセージを説明しています。

『SQL/MX Glossary』 SQL/MX の用語を定義しています。

プログラミング・マニュアル

『HP NonStop SQL/MXプログラミン グ・マニュアル C および COBOL言語 用』

SQL/MX ステートメントを ANSI C および COBOL プログラム に埋め込む方法について説明しています。

『HP NonStop SQL/MX Programming Manual for Java』

SQL/MX ステートメントを SQLJ 標準に準拠して Java プログ ラムに埋め込む方法について説明しています。

v 523727-002J

本書について

専門ガイド

『NonStop SQL/MX Installation and Management Guide』

SQL/MX データベースの計画、インストール、作成、および管 理の方法を説明しています。また、インストレーションおよび管理のコマンドとユーティリティについて説明しています。

『NonStop SQL/MX クエリ・ガイド』 クエリ実行プランを理解して SQL/MX データベースの最適な クエリを作成する方法を説明しています。

『SQL/MX Data Mining Guide』 知識発見プロセスを実行するための SQL/MX データ構造とオ ペレーションを説明しています。

『NonStop SQL/MX キューイングと パブリッシュ /サブスクライブ・ サービス』

SQL/MX がトランザクション・キューとパブリッシュ /サブス クライブ・サービスをデータベース・インフラストラクチャの中にどのように統合するかを説明しています。

『SQL/MX Report Writer Guide』 NonStop SQL/MX データベースのデータを使用してフォー マットしたレポートを作成する方法について説明しています。

『SQL/MX Connec t i v i t y Serv ice Manual』

SQL/MX Connectivity Service (MXCS) をインストールし、管 理する方法について説明しています。MXCS を使用することに より、Microsoft ODBC (Open Database Connectivity) アプリ ケーション・プログラミング・インタフェース (API) やその他 の接続性を提供する API 向けに開発されるアプリケーション が SQL/MX を使用できるようになります。

『NonStop SQL/MX Java ストアド・プ ロシージャ・ガイド』

Java 言語で記述されたストアド・プロシージャを SQL/MX で 使用する方法を説明しています。

オンライン・ヘルプ

NonStop SQL/MXオンライン・ヘルプは、次のもので構成されています。

Reference Help 『NonStop SQL/MX リファレンス・マニュアル』の概要と参照項 目で構成されています。

Messages Help 『SQL/MX Message Manual』のソース別にグループ分けされた 個々のメッセージで構成されています。

Glossary Help 『SQL/MX Glossary』の用語および定義です。

NSM/web Help コンテキスト依存のヘルプ・トピックで、NSM/web 管理ツー ルの使用法を説明しています。

Visual Query Planner Help コンテキスト依存のヘルプ・トピックで、Visual Query Planner グラフィカル・ユーザ・インタフェースの使用法を説明しています。

523727-002J xv

本書について

xv

NSM/web と Visual Query Planner のヘルプ・システムには、それぞれのアプリケーションからアクセス することができます。Reference、Messages、Glossary の各オンライン・ヘルプは、$SYSTEM.ZMXHELP サブボリュームから、あるいは HP NonStop Technical Library (NTL) からダウンロードできます。オンライ ン・ヘルプのダウンロードする方法については、『SQL/MX Installation and Management Guide』を参照して ください。

次のマニュアルは SQL/MP マニュアル・ライブラリの一部であり、SQL/MP データ定義言語 (DDL) の 情報および NonStop SQL/MP のインストールと管理に関する重要なリファレンス・マニュアルです。

次のマニュアルは、本書の概念と用語を理解するのに役立ちます。

関連する SQL/MP マニュアル

『NonStop SQL/MP Reference Manual』 SQL/MP の言語要素、式、述語、関数、およびステートメントを 説明しています。

『NonStop SQL/MP インストールと 管理ガイド』

SQL/MP データベースを設計、インストール、作成、管理する方 法、また SQL/MP のインストールと管理コマンド、また SQL/MP カタログとファイルについて説明しています。

その他の関連マニュアル

『NonStop Server f or Java Programmer’s Reference』

エンタープライズ・サーバ用のプログラムをサポートする Java 環 境である NonStop Server for Java について説明しています。

『JDBC Dr ive r fo r SQL/MX Programmer’s Reference』

JDBC アプリケーション・プログラミング・インタフェース (API) 用に開発されたアプリケーションによる SQL/MX の使用を可能 にする JDBC Driver for SQL/MX (JDBC/MX) のタイプ 2 ドライ バについて説明しています。

『International Standard Database Language SQL - Part 13: SQL Routines and Types Us ing the Java™ Programming Language (SQL/JRT) specification』

ANSI SQL 標準の拡張である SQL/JRT (Java Routines and Types) について説明しています。

『Sun Microsystems Glossary of Java™ Technology-Related Terms』

Java の用語を http://java.sun.com/docs/glossary.html で説明してい ます。

i 523727-002J

本書について

次の図は、SQL/MX ライブラリのマニュアルを示しています。

vst001.vsd

入門ガイド

NonStopSQL/MPユーザのための NonStopSQL/MX比較ガイド

NonStopSQL/MXクイック・スタート

SQL/MXGlossary

SQL/MXMessagesManual

NonStopSQL/MXリファレンス・マニュアル

リファレンス・マニュアル

HP NonStopSQL/MX プログラミング・マニュアル C および COBOL言語用

HP NonStopSQL/MXProgrammingManual forJava

HP NonStopSQL/MX Javaストアド・プロシージャ・ガイド

プログラミング・マニュアル

NonStopSQL/MXクエリ・ガイド

SQL/MXData MiningGuide

専門ガイド

Data-Loader/MXReferenceManual

SQL/MXInstallationandManagementGuide

NonStopSQL/MXキューイングとパブリッシュ /サブスクライブ・サービス

SQL/MXReportWriterGuide

SQL/MXConnectivityServiceAdminis-trativeCommandReference

NSM/webHelp

SQL/MX オンライン・ヘルプ

ReferenceHelp

MessagesHelp

GlossaryHelp

Visual QueryPlanner Help

SQL/MXConnectivityServiceManual

523727-002J xvii

本書について

xv

表記規約

構文の表記

以下のリストは、このマニュアルの構文上の表記規則をまとめたものです。

大文字

キーワードと予約語を示します。この項目は表記どおりに正確に入力する必要があります。大カッコで

囲まれていない項目は必須です。

MAXATTACH

斜体の小文字

ユーザ指定の変数項目を示します。大カッコで囲まれていない項目は必須です。

file-name

コンピュータ・タイプ

テキスト内のコンピュータ・タイプの文字は、C およびオープン・システム・サービス (OSS) のキーワー ドまたは予約語を示します。これらの項目は表記どおりに正確に入力する必要があります。大カッコで囲

まれていない項目は必須です。

myfile.c

斜体のコンピュータ・タイプ

テキスト内の斜体のコンピュータタイプの文字は、C およびオープン・システム・サービス (OSS) のユー ザ指定の変数項目を示します。大カッコで囲まれていない項目は必須です。

pathname

[ ] 大カッコ

オプションの構文項目を囲みます。

TERM [\system-name.]$terminal-name

INT[ERRUPTS]

大カッコで囲んだ項目のリストは、そのリストから 1 つの項目を選択するか、何も選択しなくてもよい ことを意味します。リスト内の項目については、各項目を大カッコで囲んで垂直に並べるか、リストを大

カッコで囲んで各項目を縦線で区切って水平に並べます。

FC [ num ] [ -num ] [ text ]

K [ X | D ] address

{ } 中カッコ

中カッコで囲んだ項目のリストは、選択できる項目のリストです。そのリストから 1 つの項目を選択す る必要があります。リスト内の項目については、各項目を中カッコで囲んで垂直に並べるか、リストを中

iii 523727-002J

本書について

カッコで囲んで各項目を縦線で区切って水平に並べています。

LISTOPENS PROCESS { $appl-mgr-name } { $process-name }

ALLOWSU { ON | OFF }

| 縦線

大カッコまたは中カッコで囲んだリスト内で水平に並べた項目を区切ります。

INSPECT { OFF | ON | SAVEABEND }

... 省略記号

大カッコまたは中カッコの直後の省略記号は、カッコ内の構文項目の並びを任意の回数繰り返すことが

できることを示します。

M address [ , new-value ]…[ - ] {0|1|2|3|4|5|6|7|8|9}…

1 つの構文項目の直後の省略記号は、その構文項目を任意の回数繰り返すことができることを示します。

"s-char…"

区切り記号

カッコ、コンマ、セミコロン、およびその他の区切り記号は表記どおりに入力する必要があります。

error := NEXTFILENAME ( file-name ) ;

LISTOPENS SU $process-name.#su-name

大カッコや中カッコのような記号を囲む引用符は、その記号を表記どおりに入力する必要があることを

示します。

"[" repetition-constant-list "]"

項目間のスペース

項目がカッコやコンマのような区切り記号以外の場合、項目間に示しているスペースは必須です。

CALL STEPMOM ( process-id ) ;

2 つの項目間にスペースがない場合、スペースは許可されません。次の例では、ピリオドとその他の項 目との間でスペースは許可されません。

$process-name.#su-name

複数行にまたがる場合

コマンドの構文が長すぎて 1 行に収まらない場合、後続の各行は 3 つのスペースでインデントされ、空 行で区切ります。この空行は、後続の行内の項目と、垂直に並んだ選択リスト内の項目とを区別します。

ALTER [ / OUT file-spec / ] LINE [ , attribute-spec ]…

!i と !o

プロシージャ・コールで、入力パラメータ (呼ばれる側のプロシージャにデータを渡すパラメータ) の後 に !i を表記し、出力パラメータ (呼び出し側のプログラムにデータを返すパラメータ) の後に !o を表記し

523727-002J xix

本書について

xx

ます。

CALL CHECKRESIZESEGMENT ( segment-id !i , error ) ; !o

!i,o

プロシージャ・コールで、入出力パラメータ (呼ばれる側のプロシージャにデータを渡し、呼び出し側の プログラムにデータを返すパラメータ) の後に !i,o を表記します。

error := COMPRESSEDIT ( filenum ) ; !i,o

!i:i

プロシージャ・コールで、対応するパラメータが文字列の長さをバイト単位で指定する場合、入力文字

列パラメータの後に !i:i を表記します。

error := FILENAME_COMPARE_ ( filename1:length !i:i , filename2:length ) ; !i:i

!o:i

プロシージャ・コールで、対応する入力パラメータが出力バッファの最大長をバイト単位で指定する場

合、出力バッファ・パラメータの後に !o:i を表記します。

error := FILE_GETINFO_ ( filenum !i , [ filename:maxlen ] ) ; !o:i

メッセージ表記

本書のメッセージの表記規則をまとめたものを次に示します。

太字のテキスト

例中の太字のテキストは、端末からのユーザ入力を示します。

ENTER RUN CODE

?123

CODE RECEIVED: 123.00

入力後に Return キーを押す必要があります。

非斜体のテキスト

非斜体の文字、数字、および区切り記号は、そのテキストが表記どおりに表示されるか、返されること

を示します。

Backup Up.

斜体の小文字

値が表示されるか返される変数項目を示します。

p-register

process-name

[ ] 大カッコ

523727-002J

本書について

状況によって表示されるが、常に表示されるとは限らない項目を囲みます。

Event number = number [ Subject = first-subject-value ]

大カッコで囲んだ項目のリストは、表示される可能性がある項目のリストです。リスト内の 1 つの項目 が実際に表示されるか、どの項目も表示されない場合があります。リスト内の項目については、各項目を

大カッコで囲んで垂直に並べるか、リストを大カッコで囲んで各項目を縦線で区切って水平に並べていま

す。

proc-name trapped [ in SQL | in SQL file system ]

{ } 中カッコ

中カッコで囲んだ項目のリストは、表示される可能性がある項目のリストです。リスト内の1 つの項目 が実際に表示されます。リスト内の項目については、各項目を中カッコで囲んで垂直に並べるか、リスト

を中カッコで囲んで各項目を縦線で区切って水平に並べています。

obj-type obj-name state changed to state, caused by { Object | Operator | Service }

process-name State changed from old-objstate to objstate { Operator Request. } { Unknown. }

| 縦線

大カッコまたは中カッコで囲んだリスト内で水平に並べた項目を区切ります。

Transfer status: { OK | Failed }

% パーセント記号

10 進数以外の数字の前に示されています。8 進数の前には %、2 進数の前には %B、16 進数の前には %H を表記しています。

%005400

%B101111

%H2F

P=%p-register E=%e-register

管理プログラミング・インタフェースの表記

本書のプログラム用コマンド、イベント・メッセージ、およびエラー・リストの表で使用されている表

記規則をまとめたものを次に示します。

大文字

定義ファイルの名前を示します。この項目は表記どおりに正確に入力します。

ZCOM-TKN-SUBJ-SERV

小文字

データ定義言語 (DDL) のキーワードなど、表記の一部である語を示します。

token-type

!r

トークンまたはフィールド名の後に表記し、そのトークンまたはフィールドが必須であることを示しま

523727-002J xxi

本書について

xx

す。

ZCOM-TKN-OBJNAME token-type ZSPI-TYP-STRING. !r

!o

トークンまたはフィールド名の後に表記し、そのトークンまたはフィールドがオプションであることを

示します。

ZSPI-TKN-MANAGER token-type ZSPI-TYP-FNAME32. !o

ii 523727-002J

第 1 章 はじめに

この章では、SQL/MX における Java ストアド・プロシージャ (SPJ) について、次の項目に沿って説明し ます。

□ 1-2 ページの「SPJ とは何か」

□ 1-3 ページの「SPJ の利点」

□ 1-4 ページの「SQL/MX における SPJ」

□ 1-11 ページの「SPJ Java 環境」

□ 1-19 ページの「SPJ の使用法」

523727-002J 1-1

第 1 章 はじめに

1

1.1 SPJ とは何かJava ストアド・プロシージャ (SPJ) は、データベース・サーバで動作するユーザ定義ルーチン (UDR) の

一種です。UDR は、呼び出し元に値を直接返さないストアド・プロシージャ、または呼び出し元に値を直 接返すユーザ定義関数のどちらかです。(ストアド・プロシージャは、そのパラメータ・リストのホスト変数または動的パラメータにのみ値を返します。)

現在SQL/MX は、ストアド・プロシージャだけをサポートし、ユーザ定義関数をサポートしていません。 SQL/MX における SPJ の実装は、特に指定のない限り ANSI SQL 標準を拡張する SQL/JRT (Java Routines and Types) に概ね準拠しています。

SPJ は Java クラスに含まれる Java メソッドであり、SQL/MX に登録され、アプリケーションが CALL ステートメントを発行すると SQL/MX によって呼び出されます。

ストアド・プロシージャの本体は、 public と static として定義され void を返す Java メソッドです。 これらは、SPJ Java メソッドと呼ばれ、クラス・ファイルに格納される、または、HP NonStop Kernel オー プン・システム・サービス (OSS) ファイル・システムの場合には Java アーカイブ (JAR) ファイルに格納さ れます。SQL ステートメント CREATE PROCEDURE は、これらの外部の Java メソッドの名前、パラメー タ・タイプ、場所、およびその他のメタデータを SQL/MX システム・メタデータ・テーブルに格納し、ス トアド・プロシージャとしてデータベースに登録します。SPJ Java メソッドは、SQL/MX アプリケーショ ンに呼び出される前に SQL/MX に登録されている必要があります。SQL/MX における SPJ の動作の詳細 は、1-4 ページの「SQL/MX における SPJ」を参照してください。

CREATE PROCEDURE samdbcat.sales.lowerprice() EXTERNAL NAME 'Sales.lowerPrice' ...;

public static void lowerPrice() throws SQLException{ ...}

CALL samdbcat.sales.lowerprice();

3. SQL/MX で SPJ を呼び出す

2. Java メソッドを SPJ として SQL/MX に登録

1. Java メソッドのコーディング

-2 523727-002J

第 1 章 はじめに

1.2 SPJ の利点SPJ を使用すると、効率的かつ安全にSQL/MX データベースにビジネス・ロジックを実装できます。SPJ

には次の利点があります。

1.2.1 SQL/MX から呼び出し可能な Java メソッドSPJ がサポートされていることにより、SQL/MX アプリケーションから Java メソッドを呼び出すことが

できます。SQL/MX を使用して Java メソッドを呼び出すことで、SQL/MX データベースの機能を拡張で きます。SQL/MX に Java アプリケーションをデプロイすれば、フォールト・トレラントな NonStop サー バにビジネス・ロジックを実装できるという利点が得られます。

どの SQL/MX アプリケーションでも、CALL ステートメントを使用して SPJ を呼び出すことができま す。たとえば、SQLJ プログラム (Java による埋め込み SQL)、C 、C++、COBOL による埋め込み SQL プ ログラム、JDBC/MX プログラム、または HP NonStop ODBC/MX クライアントから同じ SPJ Java メソッ ドを呼び出すことができます。詳細は、第 5 章「SQL/MX での SPJ の呼び出し」を参照してください。

1.2.2 移植性SPJ Java メソッドは Java で記述され、かつ SPJ は ANSI SQL 標準に準拠しているため、SPJ を異なる

データベース・サーバ間で移植することができます。SPJ Java メソッドをわずかに変更するだけで、既存 の Java クラスを別のデータベース・サーバから NonStop サーバに移植し、メソッドを SPJ として SQL/MX に登録できます。

また、CALL ステートメントをわずかに変更するだけで、SPJ を呼び出す既存のアプリケーションを他 のデータベースから SQL/MX に移植できます。

1.2.3 共通のパッケージング手法SPJ を呼び出すアプリケーションは、SPJ Java メソッドがアクセスするテーブルの構造について知る必

要はありません。テーブル構造が変更された場合には、SPJ Java メソッドを変更する必要はありますが、ア プリケーション内の CALL ステートメントの変更は不要です。

1.2.4 生産性の向上Java 言語は広く使用されているため、SPJ を実装することにより Java プログラマの現在のスキル・セッ

トを活用できます。また、Java の移植性は高く、Java アプリケーションを一度作成してコンパイルするだ けでどこでも実行が可能なため開発の生産性が向上します。

523727-002J 1-3

第 1 章 はじめに

1

1.3 SQL/MX における SPJここでは、SQL/MX で Java ストアド・プロシージャ (SPJ) を登録して呼び出すプロセスについて、次の

項目に沿って説明します。

□ 1-4 ページの「SPJ 登録のプロセス」

□ 1-7 ページの「SPJ 呼び出しのプロセス」

1.3.1 SPJ 登録のプロセス

SPJ を SQL/MX に登録すると、その SPJ の名前、場所、パラメータ・タイプなどの Java メソッドに関 する情報が SQL/MX システム・メタデータ・テーブルに格納されます。SPJ が SQL/MX に登録された後 で、適切なアクセス権をもった SQL/MX アプリケーションまたはインタフェースは、その SPJ を呼び出し て SPJ Java メソッドを実行できます。

Java メソッドを SPJ として SQL/MX に登録するには、CREATE PROCEDURE ステートメントを使用し ます。たとえば、次の CREATE PROCEDURE ステートメントは、adjustSalary() という名前の Java メソッドを ADJUSTSALARY という名前の SPJ として SQL/MX に登録します。

CREATE PROCEDURE samdbcat.persnl.adjustsalary (IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2)) EXTERNAL NAME 'Payroll.Adjust' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA;

CREATE PROCEDURE ステートメントの使用方法についての詳細は、第 4 章「SQL/MX への SPJ の登 録」を参照してください。

-4 523727-002J

第 1 章 はじめに

SPJ 登録の結果

SPJ の登録時には、SPJ Java メソッドが存在することと、そのシグニチャが SPJ の SQL パラメータに一 致していることが SQL/MX によって検証されます。SPJ の検証が終わると、SPJ に関する情報がシステム・ メタデータ・テーブル に格納されます。図 1-1 は、SQL/MX が CREATE PROCEDURE ステートメント をどのように処理するかを示したものです。

1. アプリケーションから発行された CREATE PROCEDURE ステートメントは、SQL/MX コンパイラ (MXCMP) プロセスによって処理されます。

2. MXCMP プロセス内のカタログ・マネージャは VALIDATEROUTINE という名前の 内部 SPJ を呼び出 し、CREATE PROCEDURE ステートメントの情報を内部 SPJ に渡します。

3. VALIDATEROUTINE は、CREATE PROCEDURE ステートメントで指定された Java クラスとメソッド を SQL/MX UDR サーバ (MXUDR) プロセス内で検証します。

MXUDR プロセス内で埋め込み Java 仮想マシン (JVM) を使用して、VALIDATEROUTINE は Java メ ソッドが指定されたクラス・ファイル内にあるか、そしてそのシグニチャが CREATE PROCEDURE ス テートメントで指定された SQL パラメータに一致しているか検証します。メソッドが存在してそのシ グニチャが SQL パラメータに一致している場合は、MXUDR は成功を示す条件を MXCMP プロセスに 返します。それ以外の場合は MXUDR はエラー条件を返し、次の手順 4 と 5 は実行されません。

4. カタログ・マネージャは、SPJ に関する情報をシステム・メタデータ・テーブルに追加します。

ALL_UIDS テーブルは、SPJ を固有 ID (UID) と関連付けます。

OBJECTS テーブルには、各 SPJ のオブジェクト名、固有 ID (UID)、作成時間、所有権といった情 報が含まれます

図 1-1 SPJ の登録プロセス

アプリケーション MXCMP

MXUDR

JVM

/usr/mydir/Payroll.class

プロシージャ・ラベル

SQL/MX メタデータ・テーブル

4 SQL/MX システム・メタデータの追加

2 内部 SPJ の呼び出し

プ ロ シ ー ジャ・ラベルの作成

5

3 Java メソッドは存在しているか ?

1 プロシージャの作成

523727-002J 1-5

第 1 章 はじめに

1

ROUTINES テーブルには、カタログに作成された各 SPJ の外部の名前やパスなどの属性が含まれ ます。

COLS テーブルには、SPJ の各パラメータの属性が 1 パラメータにつき 1 列で含まれます。

TEXT テーブルには、エンコードされたSPJ の Java シグニチャのテキストが含まれます。

TBL_PRIVILEGES テーブルには、カタログ内の各 SPJ の所有権と付与されたアクセス権が含まれ ます。

REPLICAS テーブルには、SPJ のプロシージャ・ラベルに関する情報が含まれます。

これらのシステム・メタデータ・テーブルについての詳細は、『NonStop SQL/MX リファレンス・マニュ アル』を参照してください。

5. カタログ・マネージャは、CREATE PROCEDURE ステートメントを発行したユーザが所有するプロ シージャ・ラベルも作成します。

プロシージャ・ラベルは、SPJ に関する特権を追跡するために SQL/MX が内部で使用します。詳細は、 6-12 ページの「プロシージャ・ラベルの表示」を参照してください。

-6 523727-002J

第 1 章 はじめに

1.3.2 SPJ 呼び出しのプロセスSQL/MX で SPJ を呼び出すと、SQL/MX UDR サーバ・プロセスの JVM は SPJ Java メソッドを実行し

ます。

SPJ を呼び出すには、CALL ステートメントを使用します。たとえば、次の CALL ステートメントは、 MXCI から ADJUSTSALARY という名前の SPJ を呼び出します。

CALL samdbcat.persnl.adjustsalary(202, 5.5, ?);

CALL ステートメントの使用方法についての詳細は、第 5 章「SQL/MX での SPJ の呼び出し」を参照し てください。

SPJ 呼び出しの結果

アプリケーションが CALL ステートメントを発行すると、呼び出された SPJ の SPJ Java メソッドは JVM 内で実行されます。図 1-2 は、SQL/MX が CALL ステートメントをどのように処理するかを示したもので す。

1. SQL/MX アプリケーションは、CALL ステートメントを発行して SPJ を呼び出します。SQL/MX エグ ゼキュータは、その CALL ステートメント用にコンパイル済みの SQL プランを読み取ります。

2. SQL/MX エグゼキュータはプロシージャ・ラベルをチェックし、呼び出し元が SPJ を呼び出すアクセ ス権を持っているかを検証します。

図 1-2 SPJ 呼び出しのプロセス

/usr/mydir/Payroll.class

プロシージャ・ラベル

アプリケーション

SQL/MX

MXUDR

JVM

SQL プラン

3

1 2

4

5

CALL...

523727-002J 1-7

第 1 章 はじめに

1

3. 呼び出し元が SPJ を呼び出すアクセス権を持っている場合は、SQL/MX エグゼキュータは SPJ を実行 するように SQL/MX UDR サーバ (MXUDR)にメッセージを送信します。このとき SQL/MX エグゼ キュータは、アプリケーションが SPJ に渡すすべての入力パラメータを MXUDR に送信します。

4. MXUDR 内では、 JVM が SPJ によって指定されたクラス・ファイルをロードし、そのクラス・ファイ ルに含まれている SPJ Java メソッドを実行します。

5. MXUDR は SPJ の出力パラメータを SQL/MX エグゼキュータに返し、SQL/MX エグゼキュータは出力 をアプリケーションに返します。Java メソッドの実行中に例外が発生した場合は、MXUDR はその例 外を SQL 診断情報として SQL/MX エグゼキュータに返します。

-8 523727-002J

第 1 章 はじめに

異なるタイプの SPJ の呼び出し

図 1-3 は SQL/MX UDR サーバ (MXUDR) プロセス内のコード層を示したものです。アプリケーション が異なるタイプの SPJ を呼び出す CALL ステートメントを発行したときに、ソフトウェアの異なる層がど のように相互に作用し合うかを示しています。

図 1-3 呼び出された各タイプの SPJ のSQL/MX での処理

VST004.vsd

アプリケーション

SQL/MX CALL...

NonStop Server for Java

SQL/MX Language Manager

SQL/MX

JDBC/MX (C++)

Payroll.class

JDBC/MX (Java)

SQLJ

SQL/MX UDR サーバ (MXUDR)

SQLJ ベースのJava メソッド

JDBC/MX ベースのJava メソッド

ピュア Java メソッド

JVM

523727-002J 1-9

第 1 章 はじめに

1

SPJ Java メソッドは次の 3 つのタイプのいずれかに属します。

SQLJ ベースの Java メソッド

SPJ Java メソッドは、SQLJ プログラム (Java による埋め込み SQL) のクラス・ファイルである場合があ ります。この場合、SQLJ ラン・タイムが SPJ Java メソッドから発行されたデータベース要求を処理しま す。SQLJ ラン・タイムはすべて Java で記述されており、JDBC/MX の上位で動作します。JDBC/MX が呼 び出されると、 JDBC/MX ベースのメソッドの記述に従って処理が進められます。詳細はJDBC/MX ベース の Java メソッドを参照してください。

JDBC/MX ベースの Java メソッド

SPJ Java メソッドは、SQL/MX (JDBC/MX) プログラム (標準 JDBC メソッドを使用する JAVA プログラ ム) の、JDBC ドライバのクラス・ファイルである場合があります。この場合、SPJ Java メソッドから発行 されたデータベース要求は、JDBC/MX のピュア Java とネイティブ層が連携して 処理します。

ピュア Java メソッド

SPJ は、ピュア Java プログラム (SQLJ ステートメントや JDBC/MX メソッドのコールを含まないプログ ラム) の Java メソッドをベースにしている場合があります。ピュア Java メソッドはデータベースへのアク セス操作を直接行いません。このようなタイプの SPJ Java メソッドは、自身のクラス、その他の非システ ム・クラス、および Java システム・クラスを参照し、アプリケーション・ロジックを実行します。

-10 523727-002J

第 1 章 はじめに

1.4 SPJ Java 環境SQL/MX は、SQL/MX UDR サーバ (MXUDR) プロセス内にホストされている SPJ Java 環境で CALL ス

テートメントを処理します 。SPJ Java 環境 は内部に埋め込み JVM を持ち、そこでCALL ステートメント によって呼び出された SPJ Java メソッドを実行します。(1-9 ページの図 1-3 を参照)。ここでは、SPJ Java 環境と一般的な Java 環境の相違について説明します。

1.4.1 SQL/MX UDR サーバ・プロセスSQL/MX UDR サーバは、$SYSTEM.SYSTEM にある MXUDR という名前の実行可能プログラムです。

SQL/MX はアプリケーションの最初の CALL ステートメントを処理する時に 、MXUDR を実行し SQL/MX UDR サーバ・プロセスを起動します。1 つの SQL/MX UDR サーバ・プロセスは 1 つの SPJ Java 環境をホ ストし、稼動している間は SQL/MX アプリケーションの 1 つ以上の CALL ステートメントを処理します。 アプリケーションが終了すると、SQL/MX UDR サーバ・プロセスも終了します。

単一の SQL/MX UDR サーバ・プロセスによるアプリケーションの処理

SQL/MX アプリケーションがユーザ ID を切り替えず、 1 つの UDR_JAVA_OPTIONS の設定のみ使用す る場合、そのアプリケーションは 1 つの SQL/MX UDR サーバ・プロセスによって処理されます。このよ うなアプリケーションの CALL ステートメントは、すべて単一 の SPJ Java 環境で処理されます。

UDR_JAVA_OPTIONS のデフォルト属性は、SPJ Java 環境での JVM の起動オプションを制御します。 詳細は、2-14 ページの「JVM 起動オプションの制御」を参照してください。

複数の SQL/MX UDR サーバ・プロセスによるアプリケーションの処理

SQL/MX アプリケーションがユーザ ID を切り替えたり、複数の UDR_JAVA_OPTIONS オプションを 使用していると、アプリケーションは複数の SQL/MX UDR サーバ・プロセスで処理されます。このよう なアプリケーションの CALL ステートメントは複数の SPJ Java 環境で処理され、1 つの CALL ステートメ ントにつき 1 つの SPJ Java 環境が使用されます。

複数の SQL/MX UDR サーバ・プロセスを起動するアプリケーションには、NonStop ODBC/MX アプリ ケーションや JDBC/MX アプリケーションといったものがあります。NonStop ODBC/MX クライアントは、 ユーザ ID を頻繁に切り替えます。マルチスレッド化された JDBC/MX アプリケーションは、スレッドごと に異なる UDR_JAVA_OPTIONS の設定を使用することができます。

このようなアプリケーションでは、SQL/MX UDR サーバ・プロセスは必要に応じて開始され、SQL/MX UDR サーバ・プロセスが処理するすべての SQL コンテキストが終了するか、アプリケーションのユーザ ID が変更されるとサーバは停止します。詳細は、1-11 ページの「新たな SPJ Java 環境を初期化する条件」 を参照してください。

新たな SPJ Java 環境を初期化する条件

アプリケーションが CALL ステートメントを発行し (SPJ を呼び出し)、次の条件が 1 つでも満たされる 場合は、SQL/MX エグゼキュータは新しい SQL/MX UDR サーバ・プロセスを起動して、新たな SPJ Java 環境を初期化します。

□ SPJ Java 環境が、現在そのアプリケーションを処理していない (発行された CALL ステートメントが そのアプリケーションからの最初の CALL ステートメントである)。

523727-002J 1-11

第 1 章 はじめに

1

□ 現在そのアプリケーションを処理する SPJ Java 環境が、現在のユーザ ID に対応していない。

□ CALL ステートメントの UDR_JAVA_OPTIONS の設定 (ANYTHING 以外) が、現在のユーザ ID のア プリケーションを処理している SPJ Java 環境の UDR_JAVA_OPTIONS の設定とは異なっている。

2 つ以上の UDR_JAVA_OPTIONS の設定が一致しているかどうかの判断については、2-19 ページの 「同一の UDR_JAVA_OPTIONS の設定」を参照してください。

新たな SPJ Java 環境を初期化しない条件

CALL ステートメントの実行において、次の条件のうち 1 つが満たされると、新しい SQL/MX UDR サー バ・プロセスは起動されず SPJ Java 環境は初期化されません。

□ CALL ステートメントの UDR_JAVA_OPTIONS の設定 (ANYTHING 以外) が、現在のユーザ ID でア プリケーションを処理している 1 つ以上の SPJ Java 環境の UDR_JAVA_OPTIONS の設定と同じであ る。

2 つ以上の UDR_JAVA_OPTIONS の設定が一致しているかどうかの判断については、2-19 ページの 「同一の UDR_JAVA_OPTIONS の設定」を参照してください。

□ CALL ステートメントの UDR_JAVA_OPTIONS に ANYTHING の設定があり、1 つ以上の SPJ Java 環 境で現在のユーザ ID のアプリケーションを処理している。

SQL/MX UDR サーバ・プロセスと SPJ Java 環境がアプリケーションに応じて初期化される例について は、1-13 ページの図 1-4 を参照してください。

-12 523727-002J

第 1 章 はじめに

SPJ Java 環境の再初期化

まれに内部のシステム・エラーやアプリケーション・コードが原因で、SQL/MX UDR サーバが突然ク ラッシュすることがあります。このような場合は、クラッシュ後に CALL ステートメントが発行されたと きに、SPJ Java 環境が再初期化されます。

図 1-4 SQL/MX UDR サーバ・プロセスと SPJ Java 環境の初期化

prog1 SQL/MX アプリケーション

control query default UDR_JAVA_OPTIONS '-Da=1';CALL proc_a();

control query default UDR_JAVA_OPTIONS '-Da=2';CALL proc_b();

control query default UDR_JAVA_OPTIONS '-Da=1';CALL proc_c();

control query default UDR_JAVA_OPTIONS '-Da=2';CALL proc_d();

SQL/MX UDRサーバ・プロセス 1

SPJ Java環境 1

SQL/MX UDRサーバ・プロセス 2

SPJ Java環境 2

prog2 SQL/MX アプリケーション

control query default UDR_JAVA_OPTIONS '-Da=1';CALL proc_a();

control query default UDR_JAVA_OPTIONS '-Da=2';CALL proc_b();

control query default UDR_JAVA_OPTIONS '-Da=1';CALL proc_c();

control query default UDR_JAVA_OPTIONS '-Da=2';CALL proc_d();

SQL/MX UDRサーバ・プロセス 3

SPJ Java 環境 3

SQL/MX UDRサーバ・プロセス 4

SPJ Java 環境 4

同一 JVM 起動オプションとユーザ ID

同一 JVM 起動オプションとユーザ ID

VST005.vsd

同一 JVM 起動オプションとユーザ ID

同一 JVM 起動オプションとユーザ ID

523727-002J 1-13

第 1 章 はじめに

1

1.4.2 マルチスレッド化SQL/MX は、CALL ステートメントを発行するアプリケーションがマルチスレッド化された Java アプリ

ケーションである場合も、SPJ Java 環境内で単一の実行スレッドを管理します。マルチスレッド化された アプリケーションによって発行される CALL ステートメントは非ブロック方式で実行されますが、それら の CALL ステートメントによって呼び出される SPJ Java メソッドは指定された SPJ Java 環境でシリアルに 実行されます。

マルチスレッド化されたアプリケーションが発行する CALL ステートメントの並列処理をサポートする には、CALL ステートメントごとに異なる UDR_JAVA_OPTIONS の設定を使用するようにします。異な る UDR_JAVA_OPTIONS の設定で CALL ステートメントを実行すると、専用の SPJ Java 環境を持つ個別 の SQL/MX UDR サーバ・プロセスが起動されます。このような SPJ Java 環境の場合、マルチスレッド化 されたアプリケーションからの要求を並行処理できます。UDR_JAVA_OPTIONS のデフォルト属性の設定 についての詳細は、2-14 ページの「JVM 起動オプションの制御」を参照してください。

注. SQL/MX は SPJ Java メソッドによる他のスレッドの作成を防止しません。これを防止しないでくだ さい。防止すると予測できない結果が生じる可能性があります。

JDBC/MX の非ブロック方式についての詳細は、『JDBC Driver for SQL/MX Programmer’s Reference』を 参照してください。

1.4.3 SQL/MX UDR サーバでの Java クラスのロード

ここでは、SPJ が他の Java クラスにアクセスする方法、そのクラスがクラス・ローダによって処理され る方法、および、アクティブな SPJ Java 環境の存続中に Java バイトコードを変更することによる影響につ いて説明します。

SPJ がアクセス可能な Java クラス

SPJ として登録した Java メソッドは、適切な動作のために直接または間接的に他の Java クラスにアクセ スする必要が生じる場合があります。詳細は、1-15 ページの図 1-5 を参照してください。

システム・クラス

SPJ Java メソッドは、デフォルトですべてのシステム・クラスにアクセスすることができます。システ ム・クラスには、NonStop Server for Java の Java コア API クラス、java-installation- directory/jre/lib/ext の拡張パッケージのクラス、HP NonStop SQLJ 製品 (sqlj.jar) のクラス、およ び NonStop JDBC Driver for SQL/MX (JDBC/MX) 製品 (jdbcMx.jar) のクラスがあります。詳細は、1-15 ペー ジの図 1-5 を参照してください。

外部パスの非システム・クラス

SPJ Java メソッドは、デフォルトでその外部パスで指定された場所にあるすべての非システム・クラス にもアクセスできます。外部パスの場所は、CREATE PROCEDURE ステートメントの EXTERNAL PATH 句で指定されます。外部パスは、OSS ディレクトリ、または SPJ Java メソッドを含む Java クラス・ファ イルが存在する JAR ファイル・パスです。詳細は、4-10 ページの「外部パスの指定」を参照してください。

外部パスが OSS ディレクトリの場合、指定されたディレクトリ内 (または指定されたディレクトリのパッ ケージ内) のクラス・ファイルのみが外部パスにあると見なされます。指定されたディレクトリ内に JAR

-14 523727-002J

第 1 章 はじめに

ファイルがあっても、外部パスの一部とは見なされません。

外部パスが JAR ファイル・パスの場合は、JAR ファイル内のクラス・ファイルのみが外部パスにあると 見なされます。たとえば、myMethod() という名前の SPJ Java メソッドが myJar.jar という名前の JAR ファイルに含まれている場合、外部パスは JAR ファイル・パス /usr/myapps/myJar.jar です。 myMethod() と同じ JAR ファイルに格納されているすべてのクラスは、デフォルトで myMethod() にア クセスすることができます。

外部パスの外の非システム・クラス

SPJ Java メソッドがその外部パスの外の非システム・クラスにアクセスするには、クラス・パスという 検索パスを SPJ Java 環境に設定する必要があります。クラス・パスは複数のディレクトリのパスを含むこ とができるため、クラス・ローダは複数の場所にあるクラスを検索することができます。詳細は、2-25 ペー ジの「クラス・パスの設定」を参照してください。

CALL ステートメントの実行中に SPJ Java メソッドが非システム・クラスを参照する場合、クラス・ロー ダは最初にそのクラスの外部パスを検索し、見つからない場合はクラス・パスを検索します。

図 1-5 SPJ がアクセス可能な Java クラス

Java クラス・ファイル

例:myClass.class

SPJ Java メソッドがアクセス可能な Java クラス

外部パスの非システム・クラス

外部パスの非システム・クラスはmyClass.classと同じ JAR ファイルにある。 例:

'/usr/myapps/myJar.jar'

クラス・パスの非システム・クラス

例:

/usr/myapps:/usr2/otherapps:/usr3/moreapps:...

システム・クラス

NonStop Server for Javaのコア API クラス

拡張パッケージのクラス

sqlj.jar と jdbcMx.jar のクラス

SPJ Java メソッド

例:

外部名:'pkg.subpkg.myClass.myMethod()'

外部パス:'/usr/myapps/myJar.jar'

523727-002J 1-15

第 1 章 はじめに

1

クラス・ローダ

SPJ Java 環境では、外部パスで指定された場所ごとに 1 つの Java クラス・ローダが SQL/MX によって 作成され、割り当てられます。CREATE PROCEDURE ステートメントの EXTERNAL PATH 句で指定さ れている外部パスで指定された場所は、SPJ Java メソッドを含んだ Java クラス・ファイルのファイル・パ スです。CREATE PROCEDURE ステートメントについての詳細は、4-3 ページの「CREATE PROCEDURE ステートメントの使用」を参照してください。

JVM がクラス・ローダを作成して外部パスに割り当てると、そのクラス・ローダは、外部パスに登録さ れたすべての SPJ Java メソッドと、その SPJ Java メソッドが使用するすべての非システム・クラスのロー ドに対応するようになります。

たとえば、外部パス /usr/myapps/myJar.jar の myMethod() という名前の SPJ Java メソッドは、ク ラス・パス /usr/myapps の other.class という名前の非システム・クラスにアクセスするとします。  この場合、外部パス /usr/myapps/myJar.jar のクラス・ローダは、SPJ Java メソッド myMethod() を含むクラス・ファイルのほかに、other.class のコピーをロードします。詳細は 1-16 ページの図 1-6 を参照してください。

図 1-6 SQL/MX UDR サーバ・プロセスのクラス・ローダ

VST007.vsd

1 つのJava クラス・ローダが作成され、それぞれの外部パスに割り当てられる。

SPJA

外部名:'pkg1.subpkg1.myClass1.myMethod1()'

外部パス:'/usr/myapps'

SPJB

外部名:'pkg2.subpkg2.myClass2.myMethod2()'

外部パス:'/usr/myapps/myJar.jar'

外部パス '/usr/myapps/myJar.jar' のクラス・ローダ Y

外部パス '/usr/myapps' のクラス・ローダ X

SPJC

外部名:'pkg.subpkg.myClass.myMethod()'

外部パス:'/usr/myapps/myJar.jar'

非システム Java クラス

/usr/myapps classpath/クラス・パスの other.class

SQL/MX UDR サーバ・プロセス

SPJ Java 環境

CALL...

-16 523727-002J

第 1 章 はじめに

Java バイトコード変更による影響

クラス・ローダが指定された外部パスに関連付けられたすべての Java クラスのコピーを格納することは、 バイトコードの保持に影響を与えます。SQL/MX UDR サーバのクラス・ローダについての詳細は、1-16 ページの「クラス・ローダ」を参照してください。ディスク上で Java バイトコードを変更した場合は、現 在アクティブな SPJ Java 環境または JVM には反映されない可能性があります。

SPJ Java メソッドの Java バイトコードの変更

SPJ Java 環境がアクティブな間に SPJ の Java バイトコードが変更されると、その後同じ SPJ Java 環境で SPJ が呼び出されても、SQL/MX は古い SPJ Java メソッドを実行しようする場合があります。ディスク上 の Java バイトコードが変更されても、SPJ Java メソッドの変更前のバイトコードは SPJ Java 環境の JVM のキャッシュに格納されたまま残ります。領域がすべて使用された場合にのみ、キャッシュに格納された

バイトコードのガーベッジ・コレクションが発生します。したがって、更新した SPJ のバイトコードを実 行する新しい SPJ Java 環境を作成するには、常に SQL/MX UDR サーバ・プロセスを停止してから再起動 させます。詳細は、4-13 ページの「SPJ とその Java バイトコードの変更」を参照してください。

参照される非システム・クラスの Java バイトコードの変更

それぞれが異なる外部パスの場所をもつ 3 つの SPJ があり、それらの SPJ はクラス・パスに指定された 外部パス外の同一の非システム・クラスに依存しているものとします。それぞれの外部パスのクラス・ロー

ダは独立して動作するので情報を共有しないため、各非システム・クラスのコピーは異なる時点で個々に

SPJ Java 環境にロードされます。クラス・ローダのうちの 1 つが非システム・クラスをロードするたびに、 それぞれのバイトコードと静的変数の新しいコピーが作成され管理されます。例については、1-18 ページ の図 1-7 を参照してください。

SPJ Java 環境がアクティブな間に、非システム・クラスのバイトコードがディスク上で変更される可能 性がない場合は、その非システム・クラスの同一コピーがメモリに存在しリソースを無駄にすることにな

ります。リソースを保護するには、Java クラスとディレクトリ構造を、異なる外部パスにある SPJ Java メ ソッドが同じ非システム・クラスに依存しないように設計してください。

注.ただし、SPJ Java 環境がアクティブな間に、非システム・クラスのバイトコードがディスク上で変更 されると、非システム・クラスの新旧両バージョンのコピーが同時にメモリに格納される可能性があり、CALL ステートメントで予測できないまたは望ましくない動作が生じる可能性があります。この 問題を回避するには、SPJ Java 環境がアクティブな間はディスク上のバイトコードを変更しないでく ださい。

523727-002J 1-17

第 1 章 はじめに

1

図 1-7 クラス・ローダによる Java バイトコードのコピー

VST008.vsd

各クラス・ローダは、非システム Javaクラスの Java バイトコードと静的変数のコピーをロードする。

SQL/MX UDR サーバ・プロセスSPJ Java 環境

other.class のコピー

SPJA

外部名:'pkg1.subpkg1.myClass1.myMethod1()'

外部パス:'/usr/myapps'

外部パスのクラス・ローダ X'/usr/myapps'

CALL...1

other.class のコピー

SPJB

外部名:'pkg2.subpkg2.myClass2.myMethod2()'

外部パス:'/usr/myapps/myJar.jar'

外部パスのクラス・ローダ Y'/usr/myapps/myJar.jar'

CALL...2

非システム Java クラス

/usr/myapps クラス・パスのother.class

非システム Java クラス

/usr/myapps クラス・パスのother.class

非システム・クラスのバイトコードをディスク上で変更

3

other.class のコピー

SPJC

外部名:'pkg3.subpkg3.myClass3.myMethod3()'

外部パス:'/usr2/otherapps'

外部パスのクラス・ローダ Z'/usr2/otherapps'

CALL...4

-18 523727-002J

第 1 章 はじめに

1.5 SPJ の使用法SQL/MX で SPJ を作成して呼び出すには、次の手順に従ってください。

1. SPJ 用にシステム環境を設定します (第 2 章「始める前に」を参照)。

2. SPJ として使用する Java メソッドを作成してコンパイルします (第 3 章「SPJ Java メソッドの作成」を 参照)。

3. CREATE PROCEDURE ステートメントを使用して SQL/MX に SPJ を登録します (第 4 章「SQL/MX へ の SPJ の登録」を参照)。

4. CALL ステートメントを使用して SPJ を呼び出します (第 5 章「SQL/MX での SPJ の呼び出し」を参照)。

5. 特権を保守し、使用するデータベース環境の SPJ のメタデータを管理します (第 6 章「SQL/MX での SPJ の管理」を参照)。

6. SPJ のパフォーマンスを監視し、SQL/MX の SPJ の一般的な問題を解決します (第 7 章「パフォーマン スとトラブルシューティング」を参照)。

523727-002J 1-19

第 1 章 はじめに

1

-20 523727-002J

第 2 章 始める前に

SQL/MX で SPJ を使用する前に、次の作業を実施する必要があります。

□ 使用するシステムがソフトウェア要件を満たしていることを確認する。

□ 必要なソフトウェア製品をインストールする。

□ SQL/MX UDR サーバを再リンクする。

□ SPJ Java 環境を設定する。

この章では、次の内容を説明します。

□ 2-2 ページの「ソフトウェア要件」

□ 2-4 ページの「ソフトウェア・バージョンの確認」

□ 2-8 ページの「SQL/MX UDR サーバの再リンク」

□ 2-14 ページの「SPJ Java 環境の設定」

523727-002J 2-1

第 2 章 始める前に

2

2.1 ソフトウェア要件

本マニュアルの説明に従って SPJ を使用するには、NonStop システムに SQL/MX リリース 2.0 をインス トールする必要があります。SQL/MX のソフトウェア要件とインストール手順についての詳細は、『SQL/MX Installation and Management Guide』を参照してください。

2.1.1 SPJ 製品ファイル

次の SPJ 製品ファイルは SQL/MX リリース 2.0 に含まれており、システム上に存在している必要があり ます。

□ MXUDR

□ mxlangman.jar

□ mxlangman.policy

□ mxudr.mak

□ mxudr.oby

□ mxudr.tlo

□ mxudrlink

□ TANDEM_SYSTEM_NSK.SYSTEM_SCHEMA.SQLJ

これらのファイルと場所については、『SQL/MX Installation and Management Guide』を参照してください。

注. mxlangman.jar ファイルをインストール・ディレクトリ /usr/tandem/sqlmx/udr 以外の場所 に移動しないでください。移動すると、Java ストアド・プロシージャを呼び出すときに問題が生じます。

-2 523727-002J

第 2 章 始める前に

2.1.2 NonStop Server for Java

SQL/MX で SPJ を作成して実行するには、システムに HP NonStop Server for Java をインストールする 必要があります。HP NonStop Server for Java は Java 2 Platform, Standard Edition, SDK 1.4.1 に準拠してい ます。この製品は、NonStop Server for Java 4 とも呼ばれ、SQL/MX リリース 2.0 をサポートする最初の製 品バージョンです。

NonStop Server for Java についての詳細は、『NonStop Server for Java Programmer’s Reference』を参照し てください。NonStop Server for Java のインストール手順については、製品 CD に含まれている README ファイルを参照してください。

NonStop Server for Java を標準の場所以外にインストールしている場合は、2-20 ページの「JREHOME の場所の設定」を参照してください。

2.1.3 JDBC/MX ドライバ

SQL/MX で SPJ を作成して実行するには、システムに JDBC Driver for SQL/MX (JDBC/MX) の製品バー ジョン 3.1 をインストールする必要があります。JDBC/MX 3.1 は、適用可能な範囲では JDBC 3.0 API に 準拠しており、SQL/MX リリース 2.0 をサポートする最初の製品バージョンです。

JDBC/MX についての詳細は、『JDBC Driver for SQL/MX Programmer’s Reference』を参照してください。 JDBC/MX のインストール手順については、NonStop Server for Java 製品 CD に含まれている README ファイルを参照してください。

JDBC/MX ドライバを標準の場所以外にインストールしている場合は、2-23 ページの「JDBC/MX の場 所の設定」を参照してください。

523727-002J 2-3

第 2 章 始める前に

2

2.2 ソフトウェア・バージョンの確認

次の必要なソフトウェア製品とファイルの正しい製品バージョンがシステムにインストールされている

ことを確認します。

□ 2-4 ページの「NonStop Server for Java の確認」

□ 2-6 ページの「JDBC/MX ドライバの確認」

□ 2-6 ページの「SQL/MX Language Manager の確認」

□ 2-7 ページの「SQL/MX UDR サーバの確認」

2.2.1 NonStop Server for Java の確認

NonStop Server for Java の製品バージョンを確認するには、vproc コマンド、または Java オプション - nsjversion を使用します。

vproc コマンドの使用

システムにインストールされている NonStop Server for Java の製品バージョンを表示するには、OSS プ ロンプトで次の vproc コマンドを発行します。

vproc /usr/tandem/java/bin/java

環境変数 JREHOME が設定されている場合は、次のコマンドを発行します。

vproc $JREHOME/../bin/java

JREHOME についての詳細は、2-20 ページの「JREHOME の場所の設定」を参照してください。

このコマンドの出力は次のように表示されます。

T2766 の情報は、NonStop Server for Java の製品バージョンを示しています。

VPROC - T9617G03 - (07 AUG 2003) SYSTEM \KINGPIN Date 06 APR 2004, 16:34:35 Copyright 2003 Hewlett-Packard Development Company, L.P. /usr/tandem/java/bin/java GMT Binder timestamp: 27MAR2004 00:38:27 Version procedure: T0179G08_30APR2003_05FEB2003_IPM_G08 Version procedure: T2766V10_31MAR2004_jdk141_AAC_10Feb2004 Version procedure: T8432G09_30APR20031CRTLMAIN Version procedure: T1225V31_08APR2004_JDBCMX_20040326 Version procedure: T1227V30_31OCT2003_JDBCMP_10102003 Version procedure: T1248G07_11FEB2004_AAK_10FEB2004 Native Mode: runnable file

-4 523727-002J

第 2 章 始める前に

Java オプション -nsjversion の使用

OSS プロンプトで次の java コマンドを発行して、システムにインストールされている NonStop Server for Java の製品バージョンを表示することもできます。

java -nsjversion

このコマンドの出力は次のように表示されます。

製品バージョンの比較

このコマンドの出力と README または T2766 SOFTDOC ファイルに記載されている製品バージョンを 比較してください。互換性のない製品バージョンの NonStop Server for Java がシステムにインストールさ れている場合は、正しい製品バージョンを入手し、製品 CD に含まれている README ファイルの手順に 従ってインストールしてください。

必要な製品バージョンについての詳細は、2-3 ページの「NonStop Server for Java」を参照してください。

java version "jdk141_AAC"

523727-002J 2-5

第 2 章 始める前に

2

2.2.2 JDBC/MX ドライバの確認

JDBC/MX の製品バージョンを確認するには、OSS プロンプトで次の java コマンドを発行します。

java -cp /usr/tandem/jdbcMx/current/lib/jdbcMx.jar JdbcMx -version

または、JDBC/MX ドライバのクラス・パスが設定されている場合は、次のコマンドを発行します。

java JdbcMx -version

このコマンドの出力は次のように表示されます。

このコマンドの出力と README または T1225 SOFTDOC ファイルに記載されている製品バージョンを 比較してください。互換性のない製品バージョンの JDBC/MX がシステムにインストールされている場合 は、正しい製品バージョンを入手し、製品 CD に含まれている README ファイルの手順に従ってインス トールしてください。

必要な製品バージョンについては、2-3 ページの「JDBC/MX ドライバ」を参照してください。

2.2.3 SQL/MX Language Manager の確認

SQL/MX Language Manager である mxlangman.jar の製品バージョンを確認するには、OSS プロンプ トで次の java コマンドを発行します。

java -cp /usr/tandem/sqlmx/udr/mxlangman.jar com.tandem.sqlmx.vproc

このコマンドの出力は次のように表示されます。

このコマンドの出力と SQL/MX リリース 2.0 の T1231 SOFTDOC ファイルに記載されている製品バー ジョンを比較してください。互換性のない製品バージョンの SQL/MX Language Manager がシステムにイ ンストールされている場合は、『SQL/MX Installation and Management Guide』の手順に従って SQL/MX リ リース 2.0 をインストールしてください。

HP JDBC driver for NonStop(TM) SQL/MX Version T1225V31_08APR2004_JDBCMX_20040326

VPROC for NonStop(TM) SQL/MX Language Manager : T1231G10_29JAN2004_FCS_20040325

-6 523727-002J

第 2 章 始める前に

2.2.4 SQL/MX UDR サーバの確認

SQL/MX UDR サーバ (MXUDR) の製品バージョンを確認するには、OSS プロンプトで次の vproc コマ ンドを発行します。

vproc /G/SYSTEM/SYSTEM/MXUDR

このコマンドの出力は次のように表示されます。

このコマンドの出力と SQL/MX リリース 2.0 の T1230 SOFTDOC ファイルに記載されている製品バー ジョン、および、SQL/MX Language Manager (T1231) の製品バージョンと 2-6 ページの「SQL/MX Language Manager の確認」のコマンドの出力を比較してください。互換性のない製品バージョンの SQL/MX UDR サーバがシステムにインストールされている場合は、『SQL/MX Installation and Management Guide』の手順 に従って SQL/MX リリース 2.0 をインストールしてください。

SQL/MX UDR サーバにバインドされている NonStop Server for Java (T2766) と JDBC/MX ドライバ (T1225) の製品バージョンを、Java 環境に実装されている製品バージョンと比較してください。詳細は 2-4 ページの「NonStop Server for Java の確認」および 2-6 ページの「JDBC/MX ドライバの確認」を参照して ください。比較した結果、これらのバージョンが異なる場合は SPJ が予測できない動作をする可能性があ ります。2-8 ページの「SQL/MX UDR サーバの再リンク」を参照して、正しいバージョンの NonStop Server for Java と JDBC/MX ドライバを SQL/MX UDR サーバにバインドしてください。

Copyright 2003 Hewlett-Packard Development Company, L.P. /G/SYSTEM/SYSTEM/MXUDR GMT Binder timestamp: 01APR2004 22:30:08 Version procedure: T8432G09_30APR20031CRTLMAIN Version procedure: T1230G10_29JAN2004_FCS_20040325 Version procedure: T1231G10_29JAN2004_FCS_20040325 Version procedure: T6523G05_08MAY2002_RTLABF Version procedure: S7035D40^17JUL97^03OCT97^AAB Version procedure: T2766V10_31MAR2004_jdk141_AAC_10Feb2004 Version procedure: T1248G07_11FEB2004_AAK_10FEB2004 Version procedure: T1225V31_08APR2004_JDBCMX_20040326 Native Mode: runnable file

523727-002J 2-7

第 2 章 始める前に

2

2.3 SQL/MX UDR サーバの再リンクSQL/MX UDR サーバは、NonStop Server for Java および JDBC/MX ドライバに静的にリンクします。異

なる製品バージョンの NonStop Server for Java または新しい JDBC/MX ドライバをインストールするたび に、mxudrlink スクリプトを使用して SQL/MX UDR サーバを再リンクする必要があります。詳細は 2-9 ページの「mxudrlink スクリプトを使用した MXUDR の再リンク」を参照してください。

注. SQL/MX UDR サーバを再リンクする前に、NonStop Server for Java と JDBC/MX ドライバがシステム に適切にインストールされ、Java 環境が再リンクされていなければなりません。詳細は、製品 CD に 含まれている README ファイルを参照してください。

mxudrlink スクリプトを使用して、SQL/MX UDR サーバをユーザ固有の Java Native Interface (JNI) オ ブジェクトにリンクすることもできます。これにより、ネイティブ・メソッドを SQL/MX UDR サーバで 呼び出すことができるようになります。詳細は 2-13 ページの「make ファイルを使用した MXUDR の再リ ンク」を参照してください。

mxudrlink スクリプトを実行すると、SQL/MX UDR サーバの新しい実行可能プログラム MXUDR を作 成する make ファイル mxudr.mak が呼び出されます。mxudr.mak ファイルは、mxudrlink スクリプト から渡されたパラメータを受け取り、Native Mode Liker (nld) を使用して MXUDR を再リンクします。この make ファイルは次のファイルをリンクします。

□ mxudr.oby ファイルで指定された共有ランタイム・ライブラリ (SRL)

□ mxudr.tlo ライブラリ

□ NonStop Server for Java のオブジェクト・ファイルとライブラリ・ファイル

java.o

libjdk.lib

libjvm.lib

libspt.lib

sptcpp.o

□ JDBC/MX ライブラリ libjdbcMx.lib

□ JNI オブジェクト (指定されている場合)

-8 523727-002J

第 2 章 始める前に

2.3.1 mxudrlink スクリプトを使用した MXUDR の再リンク

mxudrlink スクリプトを実行すると、いくつかの質問が表示されます。各質問には、必要なファイル (1 つ以上) の標準の場所を示すデフォルトの応答が用意されています。デフォルトの応答を選択する場合は Return キーを押します。NonStop Server for Java または JDBC/MX ドライバを標準の場所以外にインストー ルした場合はその場所を入力します。

mxudrlink スクリプトの呼び出し

1. NonStop サーバにログオンします。

2. TACL プロンプトで osh コマンドを入力し、OSS シェルを起動します。

3. コマンド・ラインで mxudrlink の場所を入力します。

/usr/tandem/sqlmx/udr/mxudrlink

4. Y を入力して MXUDR の再リンクを開始するか、または N を入力して終了します。

設定の指定

注.設定に誤った情報を入力してしまった場合は、残りの設定に対して Return キーを押し、これらの 設定でよいかどうか聞かれた時に N を入力します。その後、設定を再入力できます。詳細は、2-11 ページの「設定の確認」を参照してください。

mxudrlink スクリプトは、新しい MXUDR のターゲット・ディレクトリを入力するように要求します。

1. 新しい MXUDR のターゲット・ディレクトリを入力するか、または Return キーを押してデフォルトの ディレクトリ /G/SYSTEM/SYSTEM を選択します。

mxudrlink スクリプトがディレクトリを見つけられない場合は、ディレクトリを再入力するよう に要求されます。ディレクトリのスペルと大文字 / 小文字をチェックしてください。Guardian 環境 のディレクトリの場合は、次の形式で指定する必要があります。

/G/volume/subvolume

MXUDR がターゲット・ディレクトリで使用されている場合は、MXUDR を使用しているアプリケー ションを終了するか、または別のターゲット・ディレクトリを指定するように要求されます。

2. mxudrlink、mxudr.mak、mxudr.oby、mxudr.tlo が置かれているディレクトリを入力するか、ま たは Return キーを押してデフォルト・ディレクトリ /usr/tandem/sqlmx/udr を選択します。

mxudrlink スクリプトがディレクトリを見つけられない場合、またはディレクトリに mxudr.mak、 mxudr.oby、mxudr.tlo ファイルが含まれていない場合は、ディレクトリを再入力するように要求さ

Please enter the target directory:(/G/SYSTEM/SYSTEM)

Please enter the SQL/MX UDR Server setup directory:(/usr/tandem/sqlmx/udr)

523727-002J 2-9

第 2 章 始める前に

2

れます。

3. Return キーを押して java.o、libjdk.lib、libjvm.lib、libspt.lib、sptcpp.o ファイルが 含まれるサブディレクトリのあるデフォルトのインストール・ディレクトリ /usr/tandem/java を 選択します。

mxudrlink スクリプトがディレクトリを見つけられない場合、またはディレクトリに NonStop Server for Java のすべてのオブジェクト・ファイルとライブラリ・ファイルが含まれていない場合は、ディレ クトリを再入力するように要求されます。

4. Return キーを押して libjdbcMx.lib ファイルが含まれているサブディレクトリのあるデフォルト・ ディレクトリ /usr/tandem/jdbcMx/current を選択します。

mxudrlink スクリプトがディレクトリを見つけられない場合、またはディレクトリに

libjdbcMx.lib ファイルが含まれていない場合は、ディレクトリを再入力するように要求されます。

5. JNI オブジェクトをスペースで区切って入力するか、またはオブジェクトを指定しない場合は Return キーを押します。

JNI オブジェクトを指定する場合、そのオブジェクトは .o または .lib ファイルなどの再リンク可能 な形式でなければなりません。.a ファイルなどのアーカイブ・オブジェクトは、サポートされていま せん。

指定した JNI オブジェクトが存在しない場合は、オブジェクト名を再入力するように要求されます。

6. ログ・ファイル mxudrlink.log を格納するディレクトリを入力するか、または Return キーを押し て、デフォルトのディレクトリ (手順 2 で指定したディレクトリ) を選択します。

このログ・ファイルには、指定した設定と情報、または再リンク操作中に発生したエラー・メッセージ

が含まれます。

Please enter the NonStop Server for Java installation directory: (/usr/tandem/java)

Please enter the JDBC/MX installation directory: (/usr/tandem/jdbcMx/current)

Please enter the JNI objects to link with mxudr, separated with spaces:()

Please enter the location of output log file:(/usr/tandem/sqlmx/udr)

-10 523727-002J

第 2 章 始める前に

設定の確認

設定の指定が完了すると、mxudrlink スクリプトはユーザが確認できるように次のように設定を表示し ます。

1. 入力したとおりの設定であるか確認します。

2. その設定で良い場合は Y を入力して再リンク操作を開始します。設定を破棄して再入力する場合は N を 入力します。

SQL/MX UDR サーバの再リンク

設定が確定されると、mxudrlink スクリプトは再リンク操作を開始します。

1. MKUDR がすでにターゲット・ディレクトリに存在する場合は、mxudrlink スクリプトは既存の MKUDR ファイルをバックアップし、次のようにバックアップ・ファイルの名前を表示します。

Backing up the existing NonStop SQL/MX UDR Server... /G/SYSTEM/SYSTEM/mxudr -> /G/SYSTEM/SYSTEM/mxudrbak FILES DUPLICATED: 1

2. mxudrlink スクリプトは次のように MKUDR のリンクを開始します。

Linking NonStop SQL/MX UDR Server, This may take a few minutes. Please wait ... Linking target /G/SYSTEM/SYSTEM/mxudr NLD - NATIVE MODE LINKER - T6017D45 - 30APR03 ...

再リンク操作が失敗した場合、mxudrlink スクリプトは、オリジナルの MKUDR ファイルがすでに 存在してバックアップされていればそのファイルをリストアして終了します。

再リンク操作が成功した場合は、次のメッセージが表示されます。

SQL/MX UDR Server setup has completed, please check the output above Press the Enter key to continue ...

再リンクされた SQL/MX UDR サーバの検証

1. Return キーを押すと、mxudrlink スクリプトは再リンクされた SQL/MX UDR サーバの検証を開始し ます。

□ 検証が失敗した場合は、次のメッセージが表示されます。

SQL/MX UDR Server verification failed.

Summary of Settings: Link mxudr(release version) Target directory: /G/SYSTEM/SYSTEM SQL/MX UDR Server setup directory: /usr/tandem/sqlmx/udr NonStop Server for Java installation location: /usr/tandem/java JDBC/MX installation location: /usr/tandem/jdbcMx/current JNI objects: Output log file: /usr/tandem/sqlmx/udr Do you accept these settings?(Y/N)

523727-002J 2-11

第 2 章 始める前に

2

□ 検証が成功した場合は、次の質問が表示されます。

Are there any unresolved externals in this SQL/MX UDR Server?(Y/N)

2. SQL/MX UDR サーバに未解決の外部参照がある場合は Y を入力し、なければ N を入力します。

□ Y を入力したか、または検証が失敗した場合は、オリジナルの MXUDR をリストアするか聞かれます。

Do you want to restore original mxudr?(Y/N)

○ オリジナルの MXUDR がすでに存在してバックアップされている場合は、Y を入力してそのファイルをリストアします。オリジナルの MXUDR をリストアした後、mxudrlink スクリプトはリストアしたファイルの名 前を表示して終了します。

Restoring the NonStop SQL/MX UDR Server from backup... /G/SYSTEM/SYSTEM/mxudrbak -> /G/SYSTEM/SYSTEM/mxudr FILES DUPLICATED: 1

○ オリジナルの MXUDR をリストアしない場合、特にそのファイルが存在しないか、またはバックアップされていない場合には N を入力します。

mkudrlink スクリプトはオリジナルの MXUDR をリストアせずに終了します。

□ N を入力した場合は、SQL/MX UDR サーバの検証が続行されます。

○ 検証が失敗した場合、mxudrlink スクリプトはオリジナルの MKUDR ファイルがすでに存在してバックアップされていればそのファイルをリストアします。

オリジナルの MXUDR をリストアすると、mkudrlink スクリプトはリストアしたファイルの名前 を表示して終了します。

Restoring the NonStop SQL/MX UDR Server from backup... /G/SYSTEM/SYSTEM/mxudrbak -> /G/SYSTEM/SYSTEM/mxudr FILES DUPLICATED: 1

○ 検証が成功すると、次のメッセージが表示されます。

SQL/MX UDR Server link operation completed. The new SQL/MX UDR Server is /G/SYSTEM/SYSTEM/mxudr

-12 523727-002J

第 2 章 始める前に

2.3.2 make ファイルを使用した MXUDR の再リンク

make ファイル mxudr.mak を使用しても MXUDR を再リンクすることができます。

注. make ファイル mxudr.mak は、オリジナルの MXUDR ファイルがすでにターゲット・ディレクト リに存在する場合も、このファイルをバックアップしません。また、make ファイルは新しい MXUDR を検証しません。

make コマンドを使用して MXUDR を再リンクします。

/bin/make -f MxInstallDir/mxudr.mak TARGET_DIR=MxTargetDir INSTALL_DIR=MxInstallDir JAVA_DIR=MxJavaDir JDBCLIB_DIR=MxJdbcDir JNI_OBJS="JNIObj1 JNIObj2"

make コマンドには次の変数を指定します。

□ TARGET_DIR=MxTargetDir

新しい MXUDR を置くターゲット・ディレクトリ MxTargetDir を指定します。

デフォルト・ディレクトリは /G/SYSTEM/SYSTEM です。

□ INSTALL_DIR=MxInstallDir

mxudr.tlo と mxudr.oby が含まれているセットアップ・ディレクトリ MxInstallDir を指定しま す。

デフォルト・ディレクトリは /usr/tandem/sqlmx/udr です。

□ JAVA_DIR=MxJavaDir

java.o、libjdk.lib、libjvm.lib、libspt.lib、sptcpp.o が含まれているディレクトリ MxJavaDir を指定します。

デフォルト・ディレクトリは /usr/tandem/java です。

□ JDBCLIB_DIR=MxJdbcDir

libjdbcMx.lib が含まれているディレクトリ MxJdbcDir を指定します。

デフォルト・ディレクトリは /usr/tandem/jdbcMx/current です。

□ JNI_OBJS="JNIObj1 JNIObj2"

JNI オブジェクトがある場合はスペースで区切って入力します。JNI オブジェクトを指定する場合、そ のオブジェクトは .o または .lib ファイルなどの再リンク可能形式でなければなりません。.a ファイ ルなどのアーカイブ・オブジェクトは、現時点では JNI オブジェクトとして指定できません。

523727-002J 2-13

第 2 章 始める前に

2

2.4 SPJ Java 環境の設定SPJ を開発してデプロイするには、次の作業を実施して SPJ Java 環境を設定する必要があります。

□ 2-14 ページの「JVM 起動オプションの制御」

□ 2-20 ページの「JREHOME の場所の設定」

□ 2-23 ページの「JDBC/MX の場所の設定」

□ 2-25 ページの「クラス・パスの設定」

□ 2-28 ページの「SQL/MX への JAR ファイルのインストール」

□ 2-29 ページの「Java セキュリティの設定」

2.4.1 JVM 起動オプションの制御

SPJ Java環境の JVM 起動オプションを指定するには、UDR_JAVA_OPTIONS のデフォルト属性を指定 します。この属性を使用して、次のことができます。

□ SPJ を呼び出すアプリケーションのクラス・パスの設定

□ SPJ を呼び出すアプリケーションの Javaシステム・プロパティの設定

□ SPJ Java 環境の Java ヒープ・サイズの制御

□ SPJ Java 環境のトラブルシューティング

UDR_JAVA_OPTIONS のデフォルト属性についての詳細は、『NonStop SQL/MX リファレンス・マニュ アル』を参照してください。

ここでは、次の内容を説明します。

□ 2-14 ページの「UDR_JAVA_OPTIONS のデフォルト属性の設定」

□ 2-19 ページの「同一の UDR_JAVA_OPTIONS の設定」

□ 2-19 ページの「単一アプリケーションでの複数の UDR_JAVA_OPTIONS の設定」

UDR_JAVA_OPTIONS のデフォルト属性の設定

UDR_JAVA_OPTIONS のデフォルト属性を設定する方法は 2 つあります。

□ 2-15 ページの「SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS」

□ 2-16 ページの「CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS」

それぞれの方法によって、CALL ステートメントの有効範囲と影響が異なります。

-14 523727-002J

第 2 章 始める前に

SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS

UDR_JAVA_OPTIONS デフォルト属性を設定する方法の 1 つには、SYSTEM_DEFAULTS テーブルに ローを挿入する方法があります。

SET SCHEMA NONSTOP_SQLMX_node.SYSTEM_DEFAULTS_SCHEMA; INSERT INTO SYSTEM_DEFAULTS (ATTRIBUTE, ATTR_VALUE) VALUES ('UDR_JAVA_OPTIONS', '-Djava.class.path=/usr/myclasses -Xmx32M');

SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS オプションの設定は、オフになっているシ ステム設定のデフォルト値を上書きします。詳細は『NonStop SQL/MX リファレンス・マニュアル』を参 照してください。

SYSTEM_DEFAULTS テーブルの有効範囲

SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS の設定は、SYSTEM_DEFAULTS テーブルと 同じノード上で稼動しているすべてのプロセス (またはセッション) に有効です。UDR_JAVA_OPTIONS の 設定を SYSTEM_DEFAULTS テーブルに挿入しても、現行のプロセスには反映されません。設定を有効に するには、プロセスを終了し再起動する必要があります。また、この挿入された値は、以前にコンパイル

された SQL/MX アプリケーションのモジュールには再コンパイルするまで反映されません。

優先順位

CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS 設定は、 SYSTEM_DEFAULTS テーブルの設定に優先されます。詳細は、2-16 ページの「CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS」を参照してください。

有効な UDR_JAVA_OPTIONS の表示

システムに影響を与える UDR_JAVA_OPTIONS の設定を表示するには、MXCI セッションで SHOWCONTROL ALL コマンドを入力します。SHOWCONTROL についての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

523727-002J 2-15

第 2 章 始める前に

2

CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS

UDR_JAVA_OPTIONS デフォルト属性を設定するもう 1 つの方法は、CONTROL QUERY DEFAULT ス テートメントを使用する方法です。CONTROL QUERY DEFAULT ステートメントによる UDR_JAVA_OPTIONS の設定は、オフになっているシステム定義のデフォルト設定と SYSTEM_DEFAULTS テーブルの設定に優先されます。

CONTROL QUERY DEFAULT ステートメントの構文についての詳細は、『NonStop SQL/MX リファレン ス・マニュアル』を参照してください。

SPJ Java メソッドの有効範囲

SPJ Java メソッドの UDR_JAVA_OPTIONS の設定は、SPJ が実行している SPJ Java 環境には反映され ません。SPJ Java メソッドが実行する CALL ステートメントの SPJ Java 環境に対してのみ有効です。通常 は、1 つの SPJ で CALL ステートメントをネストしないでください。詳細は、3-4 ページの「Java メソッ ド呼び出しのネスト」を参照してください。

静的にコンパイルされたアプリケーションでの有効範囲

静的にコンパイルされたアプリケーションでは、CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS の設定は、アプリケーションの行順のスコープで見て、後続の CALL ステートメ ントに対して有効となります。

たとえば、次の例で示す静的にコンパイルされた SQLJ プログラムの CONTROL QUERY DEFAULT ス テートメントの場合、 SPJ Java 環境の最大 Java ヒープ・サイズは、最初の CALL ステートメントで有効に なります。2 番目の CALL ステートメントは異なる接続コンテキスト・クラスに関連付けられているため、 UDR_JAVA_OPTIONS の設定は 2 番目の CALL ステートメントの SPJ Java 環境には影響しません。

ctx1 = SQLMXCtx1.getDefaultContext(); #sql [ctx1] {CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Xmx32M'}; /* 最初の静的 CALL ステートメント */ #sql [ctx1] {CALL samdbcat.sales.lowerprice()}; ctx1.close(); ctx2 = SQLMXCtx2.getDefaultContext(); /* 2 番目の静的 CALL ステートメント */ #sql [ctx2] {CALL samdbcat.sales.monthlyorders(1,:OUT num)}; ctx2.close();

埋め込み SQL プログラムの静的 CONTROL ステートメントのセマンティクスについての詳細は、 『NonStop SQL/MXプログラミング・マニュアル C および COBOL言語用』および『SQL/MX Programming Manual for Java』を参照してください。

-16 523727-002J

第 2 章 始める前に

動的にコンパイルされたアプリケーションでの有効範囲

動的にコンパイルされたアプリケーションでは、CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS の設定は、アプリケーションの制御フロー・スコープで見て、後続の CALL ステー トメントに対して有効となります。

次の例で示すように、動的に埋め込まれた C 言語の SQL プログラムの CONTROL QUERY DEFAULT ステートメントは、後にプリペアされる sqlstmt1 という名前の CALL ステートメントが実行される SPJ Java 環境にアプリケーション固有のシステム・プロパティを設定します。

/* 文字列バッファに CALL ステートメントを格納する */ strcpy(hv_sql_stmt1, "CALL samdbcat.persnl.adjustsalary(?,?,?)"); /* IN, IN, OUT */ /* SPJ Java 環境にアプリケーション固有の /* システム・プロパティを設定する */ EXEC SQL CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Dsqlmx.udr.extensions=/usr/tandem/jdbcMx/T1225V311/lib/jdbcMx.jar'; /* ステートメントをプリペアする */ EXEC SQL PREPARE sqlstmt1 FROM :hv_sql_stmt1; ... /* SPJ Java 環境のアプリケーション固有の /* システム・プロパティをオフにする */ EXEC SQL CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS 'OFF'; /* ストアド・プロシージャを呼び出す */ EXEC SQL EXECUTE sqlstmt1 USING :hv_empnum_param1, :hv_percent_param2 /* IN, IN */ INTO :hv_newsalary_param3; /* OUT */ ... ... /* 別のステートメントをプリペアする */ EXEC SQL PREPARE sqlstmt2 FROM :hv_sql_stmt2; ... /* ストアド・プロシージャを呼び出す */ EXEC SQL EXECUTE sqlstmt2 USING :hv_empnum_param1, :hv_percent_param2 /* IN, IN */ INTO :hv_newsalary_param3; /* OUT */

CONTROL QUERY DEFAULT ステートメントが UDR_JAVA_OPTIONS の設定をオフにした後にプリ ペアされる動的な CALL ステートメントは、アプリケーション固有の起動オプションなしで SPJ Java 環境 で実行されます。

埋め込み SQL プログラムの動的 CONTROL ステートメントのセマンティクスについての詳細は、 『NonStop SQL/MXプログラミング・マニュアル C および COBOL言語用』および『SQL/MX Programming Manual for Java』を参照してください。

523727-002J 2-17

第 2 章 始める前に

2

MXCI セッションでの有効範囲

MXCI セッションの間は、UDR_JAVA_OPTIONS のデフォルト属性を設定する CONTROL QUERY DEFAULT ステートメントを発行することができます。この設定は、CONTROL QUERY DEFAULT ステー トメントを発行した後、MXCI で発行する CALL ステートメントにのみ適用されます。

たとえば、最初の CONTROL QUERY DEFAULT ステートメントは、後に MXCI で発行される CALL ステートメントが実行される SPJ Java 環境にクラス・パスを設定するものとします。CONTROL QUERY DEFAULT ステートメントを発行した後に LOWERPRICE プロシージャを呼び出すと、JVM は /usr/otherclasses クラス・パスを使用して、そのSPJ の外部パスにはないクラスを検索してロードし ます。2 番目の CONTROL QUERY DEFAULT ステートメントは、UDR_JAVA_OPTIONS の設定をリセッ トして、現在の MXCI セッションの起動時にクラス・パスがあればこれを有効にします。

>>CALL samdbcat.sales.monthlyorders(1,?); NUMBER ----------- 1 --- SQL operation complete. >>CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Djava.class.path=/usr/myclasses'; --- SQL operation complete. >>CALL samdbcat.sales.lowerprice(); --- SQL operation complete. >>CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS RESET; --- SQL operation complete.

MXCI についての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

有効な UDR_JAVA_OPTIONS の表示

MXCI で発行された CONTROL QUERY DEFAULT ステートメントの有効な UDR_JAVA_OPTIONS の 設定を表示するには、現在の MXCI セッションで SHOWCONTROL コマンドを入力します。 SHOWCONTROL についての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

-18 523727-002J

第 2 章 始める前に

同一の UDR_JAVA_OPTIONS の設定

それぞれが SPJ Java 環境の JVM 起動オプションを制御する 2 つ以上の UDR_JAVA_OPTIONS の設定 が同一であると判断されるのは、大文字 / 小文字を区別する文字列においてそれらの文字列が一致した場 合です。大文字 / 小文字、空白、各文字列リテラルでオプションが出力される順序は同じでなければなり ません。

たとえば、個別の CONTROL QUERY DEFAULT ステートメントにある次の UDR_JAVA_OPTIONS の 設定は同じであると見なされます。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Xmx32M -Djava.class.path=/usr/otherclasses'; CALL...

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Xmx32M -Djava.class.path=/usr/otherclasses'; CALL...

しかし、次の UDR_JAVA_OPTIONS の設定のそれぞれは、オプションの順序が異なるため同一ではな いと見なされます。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Xmx32M -Djava.class.path=/usr/otherclasses'; CALL...

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Djava.class.path=/usr/otherclasses -Xmx32M'; CALL...

次の UDR_JAVA_OPTIONS の設定は、空白が異なるため同一ではないと見なされます。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS ' -Xmx32M -Djava.class.path=/usr/otherclasses '; CALL...

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Xmx32M -Djava.class.path=/usr/otherclasses'; CALL...

単一アプリケーションでの複数の UDR_JAVA_OPTIONS の設定

SQL/MX アプリケーションが異なる UDR_JAVA_OPTIONS の設定で CALL ステートメントを実行する 場合、複数の SQL/MX UDR サーバ・プロセスがそのアプリケーションを処理します。SQL/MX では、ア プリケーションの UDR_JAVA_OPTIONS の異なるセットごとに SQL/MX UDR サーバ・プロセスを管理 します。各 SQL/MX UDR サーバ・プロセスには、自身の埋め込み JVM を含んでいます。

注.複数の SQL/MX UDR サーバ・プロセスがある場合は、システムのパフォーマンスに重大な影響を及 ぼす可能性があります。したがって、必要な場合にのみアプリケーションに UDR_JAVA_OPTIONS 設定を使用してください。

詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。

523727-002J 2-19

第 2 章 始める前に

2

2.4.2 JREHOME の場所の設定

SQL/MX は、デフォルトで NonStop Server for Java の標準の場所から SPJ Java 環境に Java コンポーネン トをロードします。NonStop Server for Java が標準の場所にインストールされていない場合は、JREHOME の場所を NonStop Server for Java が現在インストールされているディレクトリに設定する必要があります。

SQL/MX アプリケーションが JREHOME の設定で起動されると、SQL/MX は JREHOME の場所からそ のアプリケーション用に作成された SPJ Java 環境に Java コンポーネントをロードします。

JREHOME の場所を設定するには、次の 2 つの方法があります。

□ 2-20 ページの「UDR_JAVA_OPTIONS を使用した JREHOME の設定」

□ 2-21 ページの「環境変数 JREHOME の設定」

それぞれの方法によって、CALL または CREATE PROCEDURE ステートメントの有効範囲と影響が異 なります。

UDR_JAVA_OPTIONS を使用した JREHOME の設定

UDR_JAVA_OPTIONS のデフォルト属性を使用して、あるノード上で稼動している 1 つのアプリケー ションまたはすべてのプロセスの SPJ Java 環境に JREHOME の場所を設定します。UDR_JAVA_OPTIONS のデフォルト属性は、特に、OSS または Guardian 環境で環境変数のセットを使用できない NonStop ODBC/MX アプリケーションを使用する場合に有用です。

UDR_JAVA_OPTIONS のデフォルト属性を使用して JREHOME の場所を設定するには、次の属性値を 使用します。

java-installation-directory には、NonStop Server for Java のインストール・ディレクトリの パスを指定します。

注. SQL/MX では、アプリケーションの UDR_JAVA_OPTIONS の異なるセットごとに SQL/MX UDR サーバ・プロセスを維持します。複数の SQL/MX UDR サーバ・プロセスがある場合は、システムの パフォーマンスに重大な影響を及ぼす可能性があります。したがって、必要な場合にのみアプリケーションに UDR_JAVA_OPTIONS 設定を使用してください。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。

有効範囲

CONTROL QUERY DEFAULT ステートメントによって設定された JREHOME の場所は、後続の CALL または CREATE PROCEDURE ステートメントの SPJ Java 環境に対して有効となります。この JREHOME の場所の設定は、SPJ Java 環境をホストする SQL/MX UDR サーバ・プロセスが終了するまで保持されま す。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。アプリケーション の CALL ステートメントの前に CONTROL QUERY DEFAULT ステートメントを使用して JREHOME の 場所を設定する例を次に示します。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Dsqlmx.udr.jrehome=/usr/myjavadir/jre'; CALL...

'-Dsqlmx.udr.jrehome=java-installation-directory/jre'

-20 523727-002J

第 2 章 始める前に

SYSTEM_DEFAULTS テーブルに挿入された JREHOME の設定は、システムで稼動するすべての CALL または CREATE PROCEDURE ステートメントに対して有効になります。この JREHOME の設定は、 SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS 属性が更新されるまで保持されます。たとえば、 SYSTEM_DEFAULTS テーブルにローを挿入して、システムに登録されているすべての CREATE PROCEDURE ステートメントに JREHOME の場所を設定する例を次に示します。

SET SCHEMA NONSTOP_SQLMX_node.SYSTEM_DEFAULTS_SCHEMA; INSERT INTO SYSTEM_DEFAULTS (ATTRIBUTE, ATTR_VALUE) VALUES ('UDR_JAVA_OPTIONS', '-Dsqlmx.udr.jrehome=/usr/myjavadir/jre');

UDR_JAVA_OPTIONS の設定の有効範囲についての詳細は、2-14 ページの「JVM 起動オプションの制 御」を参照してください。

優先順位

CONTROL QUERY DEFAULT の設定は、SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS の 設定を上書きします。SYSTEM_DEFAULTS テーブルと CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS の設定は、環境変数 JREHOME よりも優先されます。詳細は、2-21 ページの「環 境変数 JREHOME の設定」を参照してください。

環境変数 JREHOME の設定

環境変数 JREHOME を使用して、SPJ を呼び出すまたは作成するアプリケーションが実行されるセッ ションの SPJ Java 環境に JREHOME の場所を設定します。CALL または CREATE PROCEDURE ステート メントを発行するアプリケーションの稼動場所に応じて、OSS または Guardian 環境に環境変数 JREHOME を設定してください。

注.NonStop ODBC/MX アプリケーションは、OSS または Guardian 環境で環境変数のセットを使用する ことができません。詳細は、2-20 ページの「UDR_JAVA_OPTIONS を使用した JREHOME の設定」 を参照してください。

有効範囲

環境変数 JREHOME の設定は、現在の OSS または Guardian セッションの間保持され、現在のセッショ ンで実行しているすべてのアプリケーションに適用されます。

優先順位

UDR_JAVA_OPTIONS の設定は、環境変数 JREHOME よりも優先されます。詳細は、2-20 ページの 「UDR_JAVA_OPTIONS を使用した JREHOME の設定」を参照してください。

OSS 環境

環境変数 JREHOME を OSS 環境に設定するには、OSS プロンプトで次のコマンドを入力します。

export JREHOME=java-installation-directory/jre

523727-002J 2-21

第 2 章 始める前に

2

java-installation-directory には、NonStop Server for Java のインストール・ディレクトリの パスを指定します。

たとえば、次のコマンドは現在の OSS 環境で呼び出される SPJ の JREHOME の場所を設定します。

export JREHOME=/usr/myjavadir/jre

export コマンドについての詳細は、『Open System Services Shell and Utilities Reference Manual』を参照 してください。

Guardian 環境

環境変数 JREHOME を Guardian 環境に設定するには、Guardian プロンプトで次の PARAM コマンドを 入力します。

java-installation-directory には、NonStop Server for Java のインストール・ディレクトリの パスを指定します。

たとえば、次のコマンドは現在の Guardian セッションで稼動する C または COBOL の埋め込み SQL プ ログラムから呼び出される SPJ の JREHOME の場所を設定します。

PARAM JREHOME /usr/myjavadir/jre

PARAM コマンドについての詳細は、『TACL リファレンス・マニュアル』を参照してください。

PARAM JREHOME java-installation-directory/jre

-22 523727-002J

第 2 章 始める前に

2.4.3 JDBC/MX の場所の設定

SQL/MX は、デフォルトで標準の場所 /usr/tandem/jdbcMx/current/lib から SPJ Java 環境に JDBC/MX の jdbcMx.jar ファイルをロードします。場合によっては、SQL/MX リリース 2.0 と互換性 はあっても標準の場所にインストールされていない別バージョンの JDBC/MX を使用することがあるかも しれません。標準の場所以外の jdbcMx.jar を使用するには、UDR 拡張クラス・パスを jdbcMx.jar の JAR ファイル・パスに設定する必要があります。

JDBC/MX に UDR 拡張クラス・パスが設定された SQL/MX アプリケーションが起動されると、 SQL/MX はその場所からアプリケーション用の SPJ Java 環境に jdbcMx.jarをロードします。

UDR 拡張に関する留意事項

JDBC/MX の場所を設定する前に、次のことに留意してください。

□ UDR 拡 張 は jdbcMx.jar を 含 み ま す が、JVM 拡 張 と は 異 な り ま す。JVM 拡 張 は 通 常 $JREHOME/lib/ext に配置されます。

□ SQL/MX UDR サーバは、UDR 拡張クラス・パスと呼ばれる SQL/MX UDR サーバ専用の UDR 拡 張の検索パスをもっています。このクラス・パスには jdbcMx.jar の標準の場所が含まれています。

□ UDR 拡張クラス・パスとクラス・パスは異なります。クラス・パスに JDBC/MX ドライバの場所を 指定しないでください。クラス・パスについての詳細は、2-25 ページの「クラス・パスの設定」を参 照してください。

□ -Dsqlmx.udr.extensions オプションは、クラス・パスを SQL/MX UDR サーバの検索パスの先 頭に追加します。-Dsqlmx.udr.extensions の設定は検索パスに優先しますが、上書きしません。

注. -Dsqlmx.udr.extensions オプションを使用して JDBC/MX の代替場所を指定する場合に、 jdbcMx.jar がその場所に存在しないときは、SQL/MX は jdbcMx.jar の標準の場所を使用しま す。

UDR_JAVA_OPTIONS を使用した JDBC/MX の場所の設定

UDR_JAVA_OPTIONS のデフォルト属性を使用して、アプリケーションまたはノード上で稼動してい るすべてのプロセスの SPJ Java 環境に JDBC/MX の場所を設定します。

UDR_JAVA_OPTIONS のデフォルト属性を使用して JDBC/MX の場所を設定するには、次の属性値を使 用します。

jdbcmx-jar-filepath には、jdbcMx.jar の JAR ファイル・パスを指定します。

注. SQL/MX では、アプリケーション内の UDR_JAVA_OPTIONS の異なるセットごとに SQL/MX UDR サーバ・プロセスを維持します。複数の SQL/MX UDR サーバ・プロセスがある場合は、システムの パフォーマンスに重大な影響を及ぼす可能性があります。したがって、必要な場合にのみアプリケーションに UDR_JAVA_OPTIONS 設定を使用してください。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。

'-Dsqlmx.udr.extensions=jdbcmx-jar-filepath'

523727-002J 2-23

第 2 章 始める前に

2

有効範囲

CONTROL QUERY DEFAULT ステートメントによって設定された JDBC/MX の場所は、後続の CALL あるいは CREATE PROCEDURE ステートメントが実行される SPJ Java 環境に対して有効となります。 この JDBC/MX の場所の設定は、SPJ Java 環境をホストする SQL/MX UDR サーバ・プロセスが終了す るまで保持されます。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。た とえば、アプリケーションの CALL ステートメントの前に CONTROL QUERY DEFAULT ステートメン トを使用して JDBC/MX の場所を設定した例を次に示します。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Dsqlmx.udr.extensions=/usr/tandem/jdbcMx/T1225V311/lib/jdbcMx.jar'; CALL...

SYSTEM_DEFAULTS テーブルに挿入された JDBC/MX の設定は、システムで稼動するすべての CALL または CREATE PROCEDURE ステートメントに対して有効となります。この JDBC/MX の設定 は、SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS 属性が更新されるまで保持されます。た とえば、SYSTEM_DEFAULTS テーブルにローを挿入して、システムに登録されているすべての CREATE PROCEDURE ステートメントの JDBC/MX の場所を設定した例を次に示します。

SET SCHEMA NONSTOP_SQLMX_node.SYSTEM_DEFAULTS_SCHEMA; INSERT INTO SYSTEM_DEFAULTS (ATTRIBUTE, ATTR_VALUE) VALUES ('UDR_JAVA_OPTIONS', '-Dsqlmx.udr.extensions=/usr/tandem/jdbcMx/T1225V311/lib/jdbcMx.jar');

UDR_JAVA_OPTIONS の設定の有効範囲についての詳細は、2-14 ページの「JVM 起動オプションの制 御」を参照してください。

優先順位

CONTROL QUERY DEFAULT の設定は、SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS の設定を上書きします。

-24 523727-002J

第 2 章 始める前に

2.4.4 クラス・パスの設定

クラス・パスには、Java クラス・ファイルを検索するディレクトリまたは JAR ファイルの順序リストが 含まれます。SPJ Java メソッドが自身が含まれていないクラスを参照する場合 (たとえば、クラスをロード したり、クラスのオブジェクトを作成したり、クラスの別のメソッドを呼び出したりする場合)、そのクラスは SPJ Java メソッドと同じ外部パスで指定された場所にあるか、システム・クラス (java.lang.*、 java.sql.* など) に含まれているか、クラス・パスにその場所が指定されている必要があります。詳細 は、1-14 ページの「SPJ がアクセス可能な Java クラス」を参照してください。

注.UDR 拡張クラス・パスはクラス・パスとは異なります。クラス・パスに JDBC/MX ドライバの場所 を指定しないでください。UDR 拡張クラス・パスを設定するには、UDR_JAVA_OPTIONS のデフォ ルト属性で -Dsqlmx.udr.extensions オプションを指定します。詳細は、2-23 ページの「JDBC/MX の場所の設定」を参照してください。

SQL/MX アプリケーションが CALL ステートメントを発行すると、その SPJ Java 環境のクラス・ローダ はクラス・パスを使用して、SPJ Java メソッドの外部パスの外の Java クラスを検索しロードします。詳細 は、1-16 ページの「クラス・ローダ」を参照してください。

SQL/MX アプリケーションが CREATE PROCEDURE ステートメントを発行すると、JVM は、SPJ Java メソッド本体内ではなく、SPJ Java メソッドのシグニチャにある他の Java クラスを参照することで解決し ます。たとえば、JVM は、次のようなシグニチャの throws 句で定義されたユーザ定義の例外を処理する 場合があります。

public static void lowerPrice() throws pkg.subpkg.myException

ユーザ定義の例外クラスが外部パスの外側にある場合、例外クラスの場所はクラス・パスで記述する必

要があります。

SPJ クラス・ファイル (SPJ Java メソッドを含むクラス・ファイル) の場所をクラス・パスに含める必要 はありません。SQL/MX は、CREATE PROCEDURE ステートメントの EXTERNAL PATH 句に指定され た場所から SPJ クラス・ファイルを自動的に検索しロードします。詳細は、4-10 ページの「外部パスの指 定」を参照してください。

クラス・パスを設定するには、次の 2 つの方法があります。

□ 2-26 ページの「UDR_JAVA_OPTIONS を使用したクラス・パスの設定」

□ 2-27 ページの「環境変数 CLASSPATH を使用したクラス・パスの設定」

これらの方法は、それぞれ CALL および CREATE PROCEDURE ステートメントの有効範囲と影響が異 なります。

523727-002J 2-25

第 2 章 始める前に

2

UDR_JAVA_OPTIONS を使用したクラス・パスの設定

UDR_JAVA_OPTIONS のデフォルト属性を使用して、アプリケーションまたはあるノード上で稼動して いるすべてのプロセスの SPJ Java 環境にクラス・パスを設定できます。UDR_JAVA_OPTIONS のデフォ ルト属性は、特に、OSS または Guardian 環境で環境変数のセットを使用できない NonStop ODBC/MX ア プリケーションにおいて有用です。

UDR_JAVA_OPTIONS のデフォルト属性を使用してクラス・パスを設定するには、次の属性値を使用 します。

path1 と path2 には、JAR ファイルのパス、または Java クラスやパッケージ・ディレクトリが含まれ るトップレベルのディレクトリを指定します。これらのパスにパッケージ名を指定することはできません。

注. SQL/MX では、アプリケーション内の UDR_JAVA_OPTIONS の異なるセットごとに SQL/MX UDR サーバ・プロセスを維持します。複数の SQL/MX UDR サーバ・プロセスがある場合は、システムの パフォーマンスに重大な影響を及ぼす可能性があります。したがって、必要な場合にのみアプリケーションに UDR_JAVA_OPTIONS 設定を使用してください。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。

有効範囲

CONTROL QUERY DEFAULT ステートメントによって設定されたクラス・パスは、後続の CALL また は CREATE PROCEDURE ステートメントの SPJ Java 環境に対して有効となります。このクラス・パスの 設定は、SPJ Java 環境をホストする SQL/MX UDR サーバ・プロセスが終了するまで保持されます。詳細 は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。たとえば、アプリケーショ ンの CALL ステートメントの前に CONTROL QUERY DEFAULT ステートメントを使用してクラス・パス を設定する例を次に示します。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Djava.class.path=/usr/otherclasses: /usr/otherapps/myJar.jar'; CALL...

SYSTEM_DEFAULTS テーブルに挿入されたクラス・パスは、システムで稼動するすべての CALL また は CREATE PROCEDURE ステートメントに対して有効となります。このクラス・パスの設定は、 SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS 属性が更新されるまで保持されます。たとえば、 SYSTEM_DEFAULTS テーブルにローを挿入して、システムに登録されているすべての CREATE PROCEDURE ステートメントにクラス・パスを設定する例を次に示します。

SET SCHEMA NONSTOP_SQLMX_node.SYSTEM_DEFAULTS_SCHEMA; INSERT INTO SYSTEM_DEFAULTS (ATTRIBUTE, ATTR_VALUE) VALUES ('UDR_JAVA_OPTIONS', '-Djava.class.path=/usr/otherclasses: /usr/otherapps/myJar.jar');

UDR_JAVA_OPTIONS の設定の有効範囲についての詳細は、2-14 ページの「JVM 起動オプションの制 御」を参照してください。

'-Djava.class.path=path1[{:path2}...]'

-26 523727-002J

第 2 章 始める前に

優先順位

CONTROL QUERY DEFAULT の設定は、SYSTEM_DEFAULTS テーブルの UDR_JAVA_OPTIONS の 設定を上書きします。SYSTEM_DEFAULTS テーブルと CONTROL QUERY DEFAULT ステートメントの UDR_JAVA_OPTIONS の設定は、環境変数 CLASSPATH よりも優先されます。詳細は、2-27 ページの 「環境変数 CLASSPATH を使用したクラス・パスの設定」を参照してください。

環境変数 CLASSPATH を使用したクラス・パスの設定

環境変数 CLASSPATH を使用して、SPJ を呼び出す、または作成するアプリケーションが実行される セッションのSPJ Java 環境にクラス・パスを設定します。CALL または CREATE PROCEDURE ステート メントを発行するアプリケーションの稼動場所に応じて、OSS または Guardian 環境に環境変数 CLASSPATH を設定してください。

注.NonStop ODBC/MX アプリケーションは、OSS または Guardian 環境で環境変数を使用することがで きません。詳細は、2-26 ページの「UDR_JAVA_OPTIONS を使用したクラス・パスの設定」を参照 してください。

有効範囲

環境変数 CLASSPATH の設定は、現在の OSS または Guardian セッションの間保持され、現在のセッ ションで実行しているすべてのアプリケーションに適用されます。

優先順位

UDR_JAVA_OPTIONS の設定は、環境変数 CLASSPATH よりも優先されます。詳細は、2-26 ページ の「UDR_JAVA_OPTIONS を使用したクラス・パスの設定」を参照してください。

OSS 環境

環境変数 CLASSPATH を OSS 環境に設定するには、OSS プロンプトで次のコマンドを入力します。

path1 と path2 には、JAR ファイルのパス、または Java クラスやパッケージ・ディレクトリが含まれ るトップレベルのディレクトリを指定します。これらのパスにパッケージ名を指定することはできません。

たとえば、次のコマンドは、現在の OSS セッションで呼び出される SPJ のクラス・パスを設定します。

export CLASSPATH="$CLASSPATH:/usr/otherapps/myJar.jar: /usr/otherclasses"

export コマンドについての詳細は、『Open System Services Shell and Utilities Reference Manual』を参照 してください。

Guardian 環境

環境変数 CLASSPATH を Guardian 環境に設定するには、Guardian プロンプトで次の PARAM コマンド

export CLASSPATH=["][$CLASSPATH:]path1[{:path2}...]["]

523727-002J 2-27

第 2 章 始める前に

2

を入力します。

path1 と path2 には、JAR ファイルのパス、または Java クラスやパッケージ・ディレクトリが含まれ るトップレベルのディレクトリを指定します。これらのパスにパッケージ名を指定することはできません。

たとえば、次のコマンドは、現在の Guardian セッションで実行する C または COBOL の埋め込み SQL プログラムから呼び出される SPJ のクラス・パスを設定します。

PARAM CLASSPATH /usr/otherapps/myJar.jar:/usr/otherclasses

PARAM コマンドについての詳細は、『TACL リファレンス・マニュアル』を参照してください。

2.4.5 SQL/MX への JAR ファイルのインストール

SQL/MX は、JAR ファイルにパッケージされた SPJ Java メソッドをサポートしていますが、ANSI SQL/Foundation 標準の SQL/JRT の INSTALL_JAR、REMOVE_JAR、REPLACE_JAR、および ALTER_JAR_PATH プロシージャはサポートしていません。

JAR ファイルの Java メソッドを SPJ の本体として使用するには、次の手順に従ってください。

1. SPJ を登録する OSS ディレクトリに JAR ファイルを配置します。

たとえば、次の OSS コマンドはプライベートの場所 /usr/myfiles からパブリックの場所 /usr/spjfiles に myJar.jar ファイルをコピーします。

cp /E/DEV/usr/mydir/myJar.jar \ /E/PROD/usr/spjfiles/myJar.jar

2. EXTERNAL PATH 句にJAR ファイルの完全な OSS パスを指定して CREATE PROCEDURE ステート メントを発行し、SPJ を登録します。

CREATE PROCEDURE samdbcat.sales.lowerprice() EXTERNAL NAME 'pkg.subpkg.Sales.lowerPrice' EXTERNAL PATH '/usr/spjfiles/myJar.jar' ...

詳細は、4-2 ページの「SPJ の作成」を参照してください。

PARAM CLASSPATH path1[{:path2}...]

-28 523727-002J

第 2 章 始める前に

2.4.6 Java セキュリティの設定

Java には、Java セキュリティ・マネージャなどのセキュリティ機能が組み込まれています。セキュリ ティ機能は、システムの不正使用またはシステムへの不正アクセスを防止します。Java セキュリティが有 効な場合、Java セキュリティ・マネージャはシステム・リソースへのアクセスを制限することによって SPJ Java 環境を保護します。

ポリシー・ファイルを使用すれば、Java セキュリティ・マネージャを設定して特定の Java クラスおよび メソッドのディレクトリへのアクセスやネットワーク・アドレスへのアクセスなどを制限することができ

ます。

注. SQL/MX リリース 1.8 では、環境変数 SQLMX_JAVA_SECURITY は SPJ Java 環境の Java セキュリ ティを有効にしましたが、SQL/MX リリース 2.0 以降では、この環境変数はサポートされておらず使 用できません。

UDR_JAVA_OPTIONS を使用した Java セキュリティの有効化

SQL/MX UDR サーバ・プロセスの SPJ Java 環境では、Java セキュリティはデフォルトでは無効になっ ています。SPJ Java 環境で Java セキュリティを有効にするには、次の UDR_JAVA_OPTIONS の属性値を 使用します。

CONTROL QUERY DEFAULT ステートメントに UDR_JAVA_OPTIONS のデフォルト属性を設定する 例を次に示します。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Djava.security.manager -Djava.security.policy= /usr/tandem/sqlmx/udr/mxlangman.policy';

UDR_JAVA_OPTIONS のデフォルト属性を設定する別の方法については、2-14 ページの「JVM 起動オ プションの制御」を参照してください。

UDR_JAVA_OPTIONS の設定は、SPJ Java 環境で Java セキュリティ・マネージャを有効にします。Java セキュリティ・マネージャは、最初にデフォルトでシステムワイドな Java ポリシー・ファイル java-installation-directory/jre/lib/security/java.policy をロードし、次に -Djava.security.policy で指定された SPJ ポリシー・ファイルをロードします。Java セキュリティ は、SPJ Java 環境の存続期間中、SPJ Java 環境をホストする SQL/MX UDR サーバ・プロセスが終了する まで有効です。

UDR_JAVA_OPTIONS の設定には 1 つの SPJ ポリシー・ファイルのみ指定するようにしてください。複 数指定された場合、最後に指定されたポリシー・ファイルが有効となります。次の例では、

mypolicy.policy ファイルは mxlangman.policy ファイルより優先されます。

CONTROL QUERY DEFAULT UDR_JAVA_OPTIONS '-Djava.security.manager -Djava.security.policy= /usr/tandem/sqlmx/udr/mxlangman.policy -Djava.security.policy=/usr/myfiles/mypolicy.policy';

'-Djava.security.manager -Djava.security.policy= /usr/tandem/sqlmx/udr/mxlangman.policy'

523727-002J 2-29

第 2 章 始める前に

2

SPJ ポリシー・ファイルと必要なアクセス権

/usr/tandem/sqlmx/udr ディレクトリのデフォルトの SPJ ポリシー・ファイル mxlangman.policy には、次のアクセス権が含まれています。

デフォルトの SPJ ポリシー・ファイル mxlangman.policy を、そのまま、または再設定して使用でき ます。あるいは、独自に作成したポリシー・ファイルを使用することもできます。その際、設定したポリ

シー・ファイルには、SPJ Java 環境で適切に SPJ が動作できるように、SPJ の特定のアクセス権を含んで いなければなりません。詳細は次で説明します。

SQL/MX Language Manager のアクセス権

SQL/MX Language Manager は、SQL/MX UDR サーバ・プロセスで SPJ のロード、呼び出し、 アンロー ドを行う重要なコンポーネントです。mxlangman.jar ファイルには、SQL/MX Language Manager を実装 する Java バイトコードが含まれています。

SQL/MX Language Manager が適切に動作するには、SPJ ポリシー・ファイルに次のアクセス権を与え る必要があります。

grant codeBase "file:/usr/tandem/sqlmx/udr/mxlangman.jar" { permission java.security.AllPermission; };

SPJ ポリシー・ファイルにこれらのアクセス権が含まれていない場合、すべての CALL ステートメント は失敗し、SQL/MX Language Manager でセキュリティに関連する問題が発生したことを説明するエラー が返されます。

NonStop SQLJ 製品のアクセス権

SQLJ ベースの SPJ を呼び出す場合、NonStop SQLJ 製品 sqlj.jar が適切に動作するために、SPJ ポ リシー・ファイルで次のアクセス権を与える必要があります。

grant codeBase "file:/usr/tandem/sqlmx/udr/sqlj.jar" { permission java.security.AllPermission; };

SQLJ ベースの SPJ を呼び出すには、JDBC/MX および SPJ Java メソッドにアクセス権を与える必要も あります。詳細は、 2-30 ページの「JDBC/MX ドライバのアクセス権」および2-31 ページの「SPJ Java メ ソッドのアクセス権」を参照してください。

JDBC/MX ドライバのアクセス権

データベースにアクセスする SPJ (SQLJ ベースまたは JDBC/MX ベースの SPJ) を呼び出す場合、 JDBC Driver for SQL/MX (JDBC/MX) 製品が適切に動作するために、SPJ ポリシー・ファイルで次のアク

grant codeBase "file:/usr/tandem/sqlmx/udr/mxlangman.jar" { permission java.security.AllPermission; };grant codeBase "file:/usr/tandem/sqlmx/lib/sqlj.jar" { permission java.security.AllPermission; };grant codeBase "file:/usr/tandem/jdbcMx/current/lib/jdbcMx.jar" { permission java.security.AllPermission; };

-30 523727-002J

第 2 章 始める前に

セス権を与える必要があります。

grant codeBase "file:/usr/tandem/jdbcMx/current/lib/jdbcMx.jar" { permission java.security.AllPermission; };

標準の場所 (/usr/tandem/jdbcMx/current/lib/jdbcMx.jar) または、UDR 拡張クラス・パス で指定した標準以外の場所を指定します。詳細は、2-23 ページの「JDBC/MX の場所の設定」を参照して ください。

JDBC/MX についての詳細は、『JDBC Driver for SQL/MX Programmer’s Reference』を参照してください。

Java システム・クラスのアクセス権

Java コア API クラスおよび拡張パッケージなどの Java システム・クラスには、SPJ ポリシー・ファイ ルではなく、デフォルトのシステムワイドな Java ポリシー・ファイル java.policy でアクセス権が与 えられています。NonStop Server for Java の Java コア API クラスには、常にすべてのアクセス権が与えら れています。java-installation-directory/jre/lib/ext の拡張パッケージには、通常はすべ

てのアクセス権が与えられています。

java.policy についての詳細は、Sun Microsystems 社の Java に関するドキュメントを参照してくだ さい。

SPJ Java メソッドのアクセス権

Java セキュリティが SPJ Java 環境で有効な場合に、SPJ Java メソッド、または SPJ Java メソッドが 依存する非システム・クラスの制限操作の実行を許可するには、Java メソッドのコードベースに適切なア クセス権を与える必要があります。コードベースは、Java メソッドを含むクラスまたは JAR ファイルの 場所を示します。SPJ ポリシー・ファイルで適切なアクセス権を与えていない場合、呼び出された SPJ は 要求どおりに動作しないか、または CALL ステートメントの実行が失敗します。

たとえば、OSS ファイルを読み取る SPJ Java メソッドで構成される SPJ を呼び出す場合があるとしま す。SPJ ポリシー・ファイル mxlangman.policy のデフォルトのアクセス権に依存していれば、Java セ キュリティが有効な時のファイルの読み取りは制限操作であるため、SPJ を呼び出す CALL ステートメン トは失敗し、エラーを返します。Java セキュリティが有効な時に SPJ Java メソッドがOSS ファイルを読み 取れるようにするには、次のように grant ステートメントを SPJ ポリシー・ファイルに追加します。

grant codeBase "file:/usr/mydir/myJar.jar" { permission java.io.FilePermission "/usr/ossfiles", "read,write"; };

この例では、OSS ファイルを読み取る SPJ Java メソッドは、/usr/mydir ディレクトリの JAR ファイ ル myJar.jar にパッケージされています。このアクセス権を JAR ファイルを含む /usr/mydir ディ レクトリのすべてのクラスに与えるには、次のように grant ステートメントを SPJ ポリシー・ファイルに 追加します。

grant codeBase "file:/usr/mydir/*" { permission java.io.FilePermission "/usr/ossfiles", "read,write"; };

523727-002J 2-31

第 2 章 始める前に

2

SQLJ クラス・ファイルの実行には、読み取り可能なシステム・プロパティが必要です。Java セキュリ ティが有効な時のシステム・プロパティの読み取りは制限操作であるため、SQLJ ベースの SPJ のコード ベースにすべてのアクセス権を与える必要があります。たとえば、次のように grant ステートメントを SPJ ポリシー・ファイルに追加して、/usr/sqljclasses ディレクトリの SQLJ クラス・ファイルにすべて のアクセス権を与えます。

grant codeBase "file:/usr/sqljclasses/*" { permission java.security.AllPermission; };

SPJ ポリシー・ファイルの SQLJ ベースの SPJ にすべてのアクセス権を与えない場合は、これらのタイ プの SPJ の呼び出しは失敗します。

ポリシー・ファイルの構文と Java セキュリティについての詳細は、Sun Microsystems 社の Java に関す るドキュメントを参照してください。

-32 523727-002J

第 3 章 SPJ Java メソッドの作成

SQL/MX で SPJ を作成する前に、SPJ の本体として使用する Java メソッドを作成してコンパイルする必 要があります。本書では、この Java メソッドのことを SPJ Java メソッドと呼びます。

この章では、読者が Java プログラムの作成とコンパイルについて熟知していることを前提とし、次の内 容を説明します。

□ 3-2 ページの「SPJ Java メソッドの作成ガイドライン」

□ 3-5 ページの「SQL/MX データベースへのアクセス」

□ 3-7 ページの「Java の例外処理」

□ 3-8 ページの「ファイルまたは端末へのデータ書き込み」

□ 3-10 ページの「Java クラスのコンパイル」

523727-002J 3-1

第 3 章 SPJ Java メソッドの作成

3

3.1 SPJ Java メソッドの作成ガイドラインSQL/MX において SPJ として使用される SPJ Java メソッドを作成する際は、次のガイドラインに従って

ください。

3.1.1 Java メソッドのシグニチャ

SPJ として使用する Java メソッドには、次の一般的なシグニチャを使用する必要があります。

public static void myMethodName (java-parameter-list)

アクセス修飾子 public と static 修飾子

Java メソッドは、public かつ static として定義する必要があります。メソッドが private または protected の場合、SQL/MX は CREATE PROCEDURE ステートメントで指定された Java メソッドを見 つけられないためエラーを返します。

戻り値のタイプ void

Java メソッドの戻り値のタイプは void でなければなりません。つまり、メソッドは値を返してはいけ ません。

3.1.2 main() メソッド

Java クラス・ファイルの main() メソッドを SPJ Java メソッドとして使用することができます。この main() メソッドは、java.lang.String オブジェクトの配列に入力値を受け取り、その配列パラメータ のどの値も返さないため、他の Java メソッドとは異なります。

たとえば、次の main() メソッドを SPJ として登録できます。

public static void main (java.lang.String [] args) { ... }

SPJ として main() メソッドを登録する場合、基本となる main() メソッドが 1 つのパラメータしか受 け取らなくても、CREATE PROCEDURE ステートメントには 0 個以上の SQL パラメータを含むことがで きます。SPJ のすべての SQL パラメータは文字列データ・タイプ (CHAR または VARCHAR) とし、IN モードとして宣言する必要があります。

CREATE PROCEDURE ステートメントの EXTERNAL NAME 句でオプションの Java シグニチャを指定 する場合は、シグニチャを (java.lang.String []) とする必要があります。SPJ の作成方法についての 詳細は、4-3 ページの「CREATE PROCEDURE ステートメントの使用」を参照してください。

3.1.3 静的な Java 変数

移植可能な SPJ Java メソッドを作成する場合は、メソッドで静的変数を宣言しないでください。SQL/MX では、Java の静的変数の有効範囲と永続性は保証されません。

SPJ Java メソッドで静的変数を使用する場合は、次の欠点に留意してください。

-2 523727-002J

第 3 章 SPJ Java メソッドの作成

□ SQL/MX UDR サーバがクラッシュした場合、呼び出し側のアプリケーションに新しい SQL/MX UDR サーバと新しい SPJ Java 環境 (そのサーバで初期化されたすべての静的変数の新しいコピーを含む) が 割り当てられます。詳細は、1-11 ページの「SQL/MX UDR サーバ・プロセス」を参照してください。

□ 非システムの Java クラスに静的変数が含まれている場合、SQL/MX UDR サーバ・プロセスまたは SPJ Java 環境にそれらの静的変数のコピーが複数存在する可能性があります。詳細は、1-14 ページの 「SQL/MX UDR サーバでの Java クラスのロード」を参照してください。

3.1.4 ヌルの入出力

パラメータの Java データ・タイプがヌルをサポートしていれば、SPJ Java メソッドへの入力または SPJ Java メソッドからの出力としてヌル値を渡すことができます。Java プリミティブ・データ・タイプはヌル をサポートしていません。ただし、プリミティブ・データ・タイプに対応する Java ラッパ・クラスはヌル をサポートしています。ヌルをサポートしていないパラメータに対してヌルが入力または出力されると、

SQL/MX はエラー条件を生成します。

SPJ でヌルの入出力を処理する場合は、プリミティブ・データ・タイプではなく Java ラッパ・クラスを メソッド・シグニチャで使用することを検討してください。

たとえば、次の Java メソッドは、ヌル値が要求されないシグニチャで Java プリミティブ・データ・タ イプを使用しています。

public static void numMonthlyOrders(int month, Integer[] numOrders)

次の Java メソッドも、ヌル値が返されることを予測して、シグニチャで Java ラッパ・クラスを使用し ています。

public static void numMonthlyOrders(int month, Integer[] numOrders)

3.1.5 ストアド・プロシージャの結果セット

現在、SQL/MX は、ストアド・プロシージャの結果セットを返す SPJ をサポートしていません。ストア ド・プロシージャの結果セットは、SPJ Java メソッドがデータベース・サーバに制御を返すときにオープ ンされたままになっているカーソルであり、呼び出し側のアプリケーションはこのカーソルからデータを

取得できます。

3.1.6 java.sql.Connection オブジェクトの使用

SQL/MX は、SPJ Java 環境のデフォルト接続をサポートしていません。一般的に、Java 実行環境のデ フォルト接続にはデータ・ソース URL "jdbc:default:connection" が使用されます。

SPJ 環境でデフォルト接続がサポートされていないということは、次のことを意味します。

□ java.sql.Connection オブジェクトを作成する SPJ Java メソッドは、そのデータ・ソース URL "jdbc:sqlmx:" が SQL/MX 固有であるため移植できません。

□ 各 JDBC 接続には固有の SQL コンテキストと MXCMP サーバがあります。SPJ Java メソッドを呼び 出すたびに新しい接続オブジェクトが作成されてその接続が明示的にクローズされなければ、SQL/MXリソースが浪費されるためパフォーマンスが低下する可能性があります。

523727-002J 3-3

第 3 章 SPJ Java メソッドの作成

3

SPJ Java 環境からの要求を多数の MXCMP サーバで処理されないようにするには、次の推奨事項に従っ てください。

□ 静的にコンパイルされた SQLJ ステートメントを SPJ Java メソッドで使用します。こうすることで MXCMP サーバを使用することなく SPJ Java メソッドを実行できるようになります。

□ java:sql:Connection オブジェクトが不要になったときは、ガーベッジ・コレクションに頼らず各 オブジェクトを明示的にクローズします。この操作を実行すると、その接続用の SQL/MX リソース (MXCMP サーバなど) がただちに解放されます。

□ 同じ接続を使用して多数の SPJ Java メソッドを呼び出せるように、java:sql:Connection オブジェ クトを静的変数として管理します。ただし、この方法には欠点があります。詳細は 3-2 ページの「静 的な Java 変数」を参照してください。

3.1.7 Java メソッド呼び出しのネスト

ある SPJ が CALL ステートメントを発行して別の SPJ を呼び出す場合、新たに SQL/MX UDR サーバ・ プロセスが生成されます。このように SQL/MX UDR サーバ・プロセスをネストすると、リソースが浪費 されパフォーマンスが低下します。したがって、SPJ Java メソッドから別の SPJ Java メソッドを呼び出す 場合には、CALL ステートメントを使用せずに Java で直接 Java メソッドを呼び出してください。

-4 523727-002J

第 3 章 SPJ Java メソッドの作成

3.2 SQL/MX データベースへのアクセスSQL/MX データベースにアクセスする SPJ Java メソッドは、SQLJ プログラム (Java による埋め込み

SQL) または JDBC/MX プログラムのどちらかに存在しなければなりません。

3.2.1 SQLJ ベースの Java メソッド

SQLJ プログラムは、SQLJ 句に埋め込み SQL ステートメントを含む Java プログラムです。SQLJ クラ ス・ファイルのメソッドを使用して、SQL/MX データベース上で SQL 操作を実行する SPJ を作成できます。

次の例では、Payroll クラスの adjustSalary() メソッドは EMPLOYEE テーブル内の従業員の給与 を調整します。

public class Payroll { public static void adjustSalary( BigDecimal empNum, double percent, BigDecimal[] newSalary ) throws SQLException { #sql { MODULE samdbcat.persnl.payrollmod };

#sql { UPDATE samdbcat.persnl.employee SET salary = salary * (1 + (:percent / 100 )) WHERE empNum = :empNum }; #sql { SELECT salary INTO :(newSalary[0]) FROM samdbcat.persnl.employee WHERE empNum = :empNum }; } }

CREATE PROCEDURE ステートメントを使用して、SQLJ プログラムに含まれるこのメソッドを SPJ と して SQL/MX に登録できます。詳細は、第 4 章「SQL/MX への SPJ の登録」を参照してください。

SQLJ ベースの SPJ の他の例については、付録 A「SPJ のサンプル」を参照してください。

SQLJ プログラムの作成法についての詳細は、『SQL/MX Programming Manual for Java』を参照してくだ さい。

523727-002J 3-5

第 3 章 SPJ Java メソッドの作成

3

3.2.2 JDBC/MX ベースの Java メソッド

JDBC/MX プログラムは、JDBC/MX メソッドの呼び出しに SQL ステートメントを含む Java プログラム です。JDBC/MX クラス・ファイルのメソッドを使用して、SQL/MX データベース上で SQL 操作を実行す る SPJ を作成できます。

次の例では、Payroll クラスの adjustSalary() メソッドは EMPLOYEE テーブル内の従業員の給与 を調整します。

public static void adjustSalary( BigDecimal empNum, double percent, BigDecimal[] newSalary ) throws SQLException { Connection con = DriverManager.getConnection ( "jdbc:sqlmx:" );

con.createStatement().executeUpdate ( "UPDATE samdbcat.persnl.employee " + "SET salary = salary * (1 + (" + percent + " / 100)) " + "WHERE empnum = " + empNum ); PreparedStatement stmt = con.prepareStatement ( "SELECT salary FROM samdbcat.persnl.employee " + "WHERE empnum = " + empNum); ResultSet rs = stmt.executeQuery(); rs.next(); newSalary[0] = rs.getBigDecimal(1); rs.close(); }

CREATE PROCEDURE ステートメントを使用して、JDBC/MX プログラムに含まれるこのメソッドを SPJ として SQL/MX に登録できます。詳細は、第 4 章「SQL/MX への SPJ の登録」を参照してください。

JDBC/MX についての詳細は、『JDBC Driver for SQL/MX Programmer’s Reference』を参照してください。

3.2.3 例外処理

SQL/MX データベースにアクセスする SPJ Java メソッドには、例外を処理するための特別なコードは必 要ありません。SPJ 内で SQL 操作が失敗すると、その失敗に関するエラー・メッセージが CALL ステート メントを発行したアプリケーションに返されます。

-6 523727-002J

第 3 章 SPJ Java メソッドの作成

3.3 Java の例外処理SPJ Java メソッドがキャッチされない Java 例外、または java.sql.SQLException オブジェクトの

キャッチされないチェインを返すと、SQL/MX は Java の例外オブジェクトを SQL/MX のエラー条件に変 換し、CALL ステートメントは失敗します。各 SQL/MX のエラー条件には、Java の 1 つの例外オブジェク トに関連するメッセージ・テキストが含まれます。

SPJ Java メソッド自身が例外をキャッチして処理する場合、その例外は SQL/MX の処理に影響を及ぼし ません。

3.3.1 ユーザ定義の例外

38001 から 38999 までの SQLSTATE 値は、SPJ Java メソッドが返すエラー条件をユーザが独自に定義 できるように予約されています。java.sql.SQLException オブジェクトをスローするように SPJ Java メソッドをコーディングすると、CALL ステートメントはユーザ定義の SQLSTATE 値で失敗して、ユー ザ独自のエラー・メッセージ・テキストを出力します。

SQLSTATE に 38001 ~ 38999 の範囲外の値を定義すると、SQL/MX は外部ルーチンの呼び出し例外を 示す SQLSTATE 39001 を発生させます。

次の例では、numMonthlyOrders() という名前の SPJ Java メソッドで throw ステートメントを使用 して、月に無効な引数値が入力された場合、ユーザ定義のエラー条件を発生させる方法を示しています。

public static void numMonthlyOrders(int month, Integer[] numOrders) throws java.sql.SQLException { if ( month < 1 || month > 12 ) { throw new java.sql.SQLException ( "Invalid value for month. " + "Retry the CALL statement using a number " + "from 1 to 12 to represent the month.", "38001" ); } .... }

numMonthlyOrders() についての詳細は、A-3 ページの「Sales クラス」を参照してください。

SQL/MX 固有のエラーについては、『NonStop SQL/MX Message Manual』を参照してください。このマ ニュアルには、SQL/MX のすべてのエラーについて SQLCODE、SQLSTATE、メッセージ・テキスト、原 因・結果・回復処置の情報が記載されています。

523727-002J 3-7

第 3 章 SPJ Java メソッドの作成

3

3.4 ファイルまたは端末へのデータ書き込み

SQL/MX UDR サーバは端末がなくても動作します。そのため、SPJ Java 環境では、出力ストリーム System.out および System.err に送られたデータはデフォルトではどこにも送られません。この状況 を回避するため、OSS ファイルにデータまたはデバッグ情報を書き込むコードを、SPJ Java メソッドに追 加することができます。また、ストリーム System.out および System.err の一方または両方をファイ ルに対応付けることもできます。

端末装置には OSS パス名が付けられているので、端末装置の OSS 名がわかれば SPJ Java メソッドの出 力をその装置に送ることができます。OSS で tty コマンドを実行すると、端末装置のフル・パス名が標準 出力に書き込まれます。

次の例は、SPJ Java メソッドによるファイルへのメッセージ書き込みを可能にする方法を示しています。

public static void adjustSalary(BigDecimal empNum, double percent, BigDecimal[] newSalary) throws SQLException { ... String outputFileName = "/usr/mydir/spj.output"; FileOutputStream fileStream = new FileOutputStream(outputFileName); PrintStream printStream = new PrintStream(fileStream, true); ... printStream.println("The salary was updated for employee " + empnum); ... }

この SPJ Java メソッドを CALL ステートメントで呼び出すと (従業員番号 202 が SPJ に渡されると)、 "The salary was updated for employee 202" というテキストが /usr/mydir/spj.output ファイルに出力されます。

System ストリームの一方または両方を、選択した出力ストリームにリダイレクトすることもできます。 次の例は、前の例のコードを、ストリームをリダイレクトするように拡張したものです。

public static void adjustSalary(BigDecimal empNum, double percent, BigDecimal[] newSalary) throws SQLException { ... String outputFileName = "/usr/mydir/spj.output"; FileOutputStream fileStream = new FileOutputStream(outputFileName); PrintStream printStream = new PrintStream(fileStream, true); System.setOut(printStream); System.setErr(printStream);

-8 523727-002J

第 3 章 SPJ Java メソッドの作成

... // This message goes to the output stream. System.out.println("The salary was updated for employee " + empnum); // This message goes to the error stream. System.err.println("The salary was not updated for employee " + empnum); ... }

この S P J J a v a メソッドを C A L L ステートメントで呼び出すと、メッセージが

/usr/mydir/spj.output ファイルに出力されます。この例では、この呼び出しが成功すると次のメッ セージがファイルに出力されます。

The salary was updated for employee 202

呼び出しが失敗した場合は、次のメッセージがファイルに出力されます。

The salary was not updated for employee 202

523727-002J 3-9

第 3 章 SPJ Java メソッドの作成

3

3.5 Java クラスのコンパイルJava メソッドを SPJ として登録する前に、Java ソース・ファイルをコンパイルして Java バイトコード

を生成する必要があります。

□ SQLJ プログラムを変換してコンパイルする方法については、『SQL/MX Programming Manual for Java』 を参照してください。

□ Java コンパイラ (javac) を使用してJDBC/MX またはその他の Java プログラムのクラス・ファイルを コンパイルする方法については、『NonStop Server for Java Programmer’s Reference』または『NonStop Server for Java Tools Reference Pages』を参照してください。

-10 523727-002J

第 4 章 SQL/MX への SPJ の登録

この章では次の内容について説明します。

□ 4-2 ページの「SPJ の作成」

□ 4-12 ページの「SPJ の削除」

□ 4-13 ページの「SPJ とその Java バイトコードの変更」

この章では、すでに SPJ Java メソッドが作成されコンパイル済みであることを前提とします。SPJ Java メソッドの作成方法についての詳細は、第 3 章「SPJ Java メソッドの作成」を参照してください。

523727-002J 4-1

第 4 章 SQL/MX への SPJ の登録

4

4.1 SPJ の作成既存の Java メソッドを SPJ として SQL/MX データベースに登録するには、CREATE PROCEDURE ス

テートメントを使用します。SPJ を登録することで、CALL ステートメントを使用して SPJ Java メソッド を実行できるようになります。

次に示すようなSQL/MX を呼び出すアプリケーションまたはインタフェースから、CREATE PROCEDURE を発行できます。

□ SQL/MX 会話型インタフェース (MXCI)

□ C または COBOL による埋め込み SQL プログラム

□ SQLJ プログラム (Java による埋め込み SQL)

□ JDBC/MX プログラム

□ NonStop ODBC/MX クライアント

□ HP NSM/web

CREATE PROCEDURE ステートメントの実行時には、SPJ のカタログとスキーマが存在している必要が あります。

4.1.1 必要な特権

CREATE PROCEDURE ステートメントを発行するには、スキーマの所有者、または Super ID (super.super) である必要があります。また、SPJ Java メソッドが含まれている Java クラス・ファイルまた は JAR ファイルへの読み取りアクセス権が必要です。

4.1.2 SPJ の作成の結果

CREATE PROCEDURE ステートメントを実行すると、指定された Java メソッドが Java クラス・ファイ ルに存在するか、また、そのメソッドの属性が CREATE PROCEDURE ステートメントで指定された属性 と矛盾していないかが検証されます。詳細は 1-4 ページの「SPJ 登録のプロセス」を参照してください。

CREATE PROCEDURE ステートメントの実行が成功すると、システム・メタデータ・テーブルのロー が更新され、SPJ のプロシージャ・ラベルが作成されます。CREATE PROCEDURE ステートメントの実行 が失敗した場合は、システム・メタデータ・テーブルは更新されず、プロシージャ・ラベルも作成されま

せん。詳細は、1-5 ページの「SPJ 登録の結果」を参照してください。

システム・メタデータ・テーブルについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を 参照してください。プロシージャ・ラベルについての詳細は、6-12 ページの「プロシージャ・ラベルの表 示」を参照してください。

-2 523727-002J

第 4 章 SQL/MX への SPJ の登録

4.1.3 CREATE PROCEDURE ステートメントの使用

ここでは、CREATE PROCEDURE ステートメントの作成方法について、次に示す例で説明します。

CREATE PROCEDURE ステートメントの作成は、次の手順で行います。

□ 4-3 ページの「ストアド・プロシージャのネーミング」

□ 4-5 ページの「SQL パラメータの指定」

□ 4-8 ページの「SPJ Java メソッドの指定」

□ 4-10 ページの「外部パスの指定」

□ 4-11 ページの「プロシージャ・ラベルのネーミング」

□ 4-11 ページの「SQL アクセス・モードの指定」

ここで使用する例は、付録 A「SPJ のサンプル」の SPJ Java メソッドに基づいています。

CREATE PROCEDURE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュア ル』を参照してください。

ストアド・プロシージャのネーミング

プロシージャ名を選択し、その名前を ANSI 論理名の形式で次のように指定します。

CREATE PROCEDURE samdbcat.persnl.adjustsalary ...

選択したプロシージャ名は、SPJ を呼び出す CALL ステートメントで使用され、基となる SPJ Java メ ソッドを示します。

CREATE PROCEDURE samdbcat.persnl.adjustsalary(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2)) EXTERNAL NAME 'Payroll.adjustSalary' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA LOCATION $TX0115.ZSDPK4GV.Q85DXB00 MODIFIES SQL DATA;

メソッドの属性

SPJ JAVAメソッドの外部パス

SQL アクセス・モード (オプション)

プロシージャ・ラベル(オプション)

SPJ JAVA メソッド

プロシージャ名 SQL パラメータ

523727-002J 4-3

第 4 章 SQL/MX への SPJ の登録

4

プロシージャ名を選択する場合は、次のことに留意してください。

□ 同じスキーマのプロシージャ、テーブル、ビュー、SQL/MP のエイリアスで、まだ使用されていない 意味を持つユニークな名前を選択してください。

たとえば、EMPLOYEE テーブルの従業員の給与を調整する adjustSalary() という名前の Java メ ソッドには、ADJUSTSALARY というプロシージャ名 を使用します。

□ 区切り識別子は慎重に使用してください。インタプリタが解釈できるように、プロシージャ名は区切

り識別子として指定された部分を除いて英小文字が大文字に変換されます。

たとえば、CREATE PROCEDURE ステートメントに AdjustSalary というプロシージャ名を指定し た場合、解釈後の名前は ADJUSTSALARY となります。この SPJ を呼び出すには、次のように、プロ シージャ名に小文字または大文字を使用することができます。

CALL samdbcat.persnl.adjustsalary(202, 5.5, ?);

CREATE PROCEDURE ステートメントに "AdjustSalary" というプロシージャ名を指定した場合、 解釈後の名前は "AdjustSalary" となります。この SPJ を呼び出すには、次のように、プロシージャ 名の大文字 / 小文字を区別する部分を二重引用符で区切る必要があります。

CALL samdbcat.persnl."AdjustSalary"(202, 5.5, ?);

区切り識別子についての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

□ 既存のカタログおよびスキーマで、プロシージャ名を修飾してください。プロシージャ名を完全修飾

名で指定しない場合は、SQL/MX は現在の CATALOG および SCHEMA 設定に従って修飾します。 NAMETYPE 属性が ANSI ではなく NSK と設定されている場合にプロシージャ名に完全修飾名を指定 しないと、エラーが返されます。詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照して ください。

□ SQL/MX はプロシージャ名のオーバロードをサポートしていないため、シグニチャの異なる SPJ に同 じプロシージャ名を付けることはできません。つまり、異なる SPJ Java メソッドに対して同一プロシー ジャ名を複数登録することはできません。

-4 523727-002J

第 4 章 SQL/MX への SPJ の登録

SQL パラメータの指定

SPJ Java メソッドが引数を受け取らない場合 (たとえば lowerPrice() メソッド) 、 空のカッコ付きのプ ロシージャ名を指定します。

samdbcat.sales.lowerprice()

SPJ Java メソッドが引数を受け取る場合は、対応する SQL パラメータを指定します。各 SQL パラメー タは、次のように、パラメータ・モード、オプションの SQL 識別子、および SQL データ・タイプで構成 されます。

パラメータ・モード

パラメータ・モードは、SQL パラメータの入出力モードを指定します。

□ IN は、SPJ にデータを渡すパラメータであることを示します。

□ INOUT は、SPJ にデータを渡したり SPJ からデータを受け取ったりするパラメータであることを示し ます。

□ OUT は、SPJ からデータを受け取るパラメータであることを示します。

パラメータ・モードを指定しない場合、デフォルトのモードは IN です。パラメータ・モードが OUT ま たは INOUT の場合は、SQL パラメータのパラメータ・モードを明示的に指定する必要があります。

次の例では、3 つのすべてのパラメータが SPJ にデータを渡し、最後のパラメータは SPJ からデータを 受け取ります。

samdbcat.sales.totalprice(IN NUMERIC(18), IN VARCHAR(10), INOUT price NUMERIC(18,2))

SQL 識別子

SQL 識別子は、各 SQL パラメータを説明するために使用できるオプションの名前で、CREATE PROCEDURE ステートメントの可読性を高めます。次の例では、識別子によって ADJUSTSALARY プロ シージャの SQL パラメータが説明されています。

samdbcat.persnl.adjustsalary(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2))

VST017.vsd

(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2))

パラメータ・モード(オプション)

SQL パラメータ SQL パラメータSQL パラメータ

SQL 識別子(オプション)

SQL データ・タイプ

523727-002J 4-5

第 4 章 SQL/MX への SPJ の登録

4

この識別子は、他の SQL 識別子の構文に準拠しています。識別子についての詳細は、『NonStop SQL/MXリファレンス・マニュアル』を参照してください。

SQL データ・タイプ

次に示すように、SQL データ・タイプは SPJ Java メソッドの基となる Java データ・タイプに対応している必要があります。

この例の SPJ Java メソッドの Java シグニチャは (BigDecimal, double, BigDecimal[]) であり、プロシージャには上記の SQL データ・タイプまたは同様のデータ・タイプを指定する必要があります。詳細は、表 1-1を参照してください。

表 1-1 SQL/MX データ・タイプと Java データ・タイプのマッピング (1 / 2)

SQL/MX データ・タイプ マップされる Java データ・タイプ

CHAR[ACTER]*CHAR[ACTER] VARYING *VARCHAR* PIC[TURE] X *NCHARNCHAR VARYINGNATIONAL CHAR[ACTER]NATIONAL CHAR[ACTER] VARYING

java.lang.String

DATE java.sql.Date

TIME java.sql.Time

TIMESTAMP java.sql.Timestamp

NUMERIC **DEC[IMAL]**PIC[TURE] S9

java.math.BigDecimal

* 文字列データ・タイプの文字セットは、ISO88591 または UCS2 が使用できます。** NUMERIC データ・タイプ は符号付き (SQL/MX でのデフォルト ) です。*** SQL/MX データ・タイプは、デフォルトで Java プリミティブ・データ・タイプにマップされます。EXTERNAL

NAME 句の Java シグニチャにラッパ・クラスを指定した場合は、Java ラッパ・クラスにマップされます。詳細は、4-8 ページの「Java メソッドのシグニチャ」を参照してください。

VST018.vsd

adjustsalary(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalaryNUMERIC(8,2))

ストアド・プロシージャ

adjustSalary(BigDecimal empNum, double percent, BigDecimal[] newSalary)

SPJ Java メソッド

Ext

Ext

-6 523727-002J

第 4 章 SQL/MX への SPJ の登録

SQL/MX データ・タイプについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照して ください。

文字列パラメータと文字セット

文字列データ・タイプの SQL パラメータでは、文字セットに ISO88591 または UCS2 を指定することが できます。次の例では、lastname という名の SQL パラメータの文字セットに UCS2 (ユニコード) を指定 しています。

(IN empnum INT, OUT lastname CHAR(25) CHARACTER SET UCS2)

文字セットを指定しない場合、デフォルトは ISO88591 です。

(IN empnum INT, OUT lastname CHAR(25))

SPJ Java メソッドが、KANJI (日本語) または KSC5601 (韓国語) を含む SQL/MP テーブルに文字列の値 を渡したり、またはそのテーブルから文字列の値を受け取る場合、SQL パラメータには ISO88591 文字セッ トを指定してください。

文字セットについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

SMALLINT** short

INT[EGER]** int (または、指定された場合 java.lang.Integer)***

LARGEINT long (または、指定された場合 java.lang.Long)***

FLOAT double (または、指定された場合 java.lang.Double)***

REAL float (または、指定された場合 java.lang.Float)***

DOUBLE PRECISION double (または、指定された場合 java.lang.Double)***

このアイコンは、SQL データ・タイプが ANSI 標準の SQL/MX 拡張であることを示してい ます。この表の他のすべての SQL データ・タイプは、ANSI 標準に準拠しています。

表 1-1 SQL/MX データ・タイプと Java データ・タイプのマッピング (2 / 2)

SQL/MX データ・タイプ マップされる Java データ・タイプ

* 文字列データ・タイプの文字セットは、ISO88591 または UCS2 が使用できます。** NUMERIC データ・タイプ は符号付き (SQL/MX でのデフォルト ) です。*** SQL/MX データ・タイプは、デフォルトで Java プリミティブ・データ・タイプにマップされます。EXTERNAL

NAME 句の Java シグニチャにラッパ・クラスを指定した場合は、Java ラッパ・クラスにマップされます。詳 細は、4-8 ページの「Java メソッドのシグニチャ」を参照してください。

Ext

523727-002J 4-7

第 4 章 SQL/MX への SPJ の登録

4

SPJ Java メソッドの指定

次に示すように、EXTERNAL NAME 句で外部の Java メソッドを SPJ Java メソッドとして使用するよ うに指定します。

EXTERNAL NAME 句で指定する Java メソッドは、public かつ static として定義され、戻り値のタ イプは void でなければなりません。詳細は、3-2 ページの「SPJ Java メソッドの作成ガイドライン」を参 照してください。

SQL/MX では、EXTERNAL NAME 句に JAR ファイル名を指定することができません。その代わりに、 EXTERNAL PATH 句を使用して Java クラスが含まれている JAR ファイルの場所を指定します。詳細は、 4-10 ページの「外部パスの指定」を参照してください。

注. SQL/MX は、SPJ Java メソッドが含まれている Java クラス・ファイル内に Java バイトコードを保持 しません。SQL/MX は、システム・メタデータに Java クラス・ファイルの場所の参照だけを記録し ます。SPJ の登録後に Java クラス・ファイルを変更すると、SPJ の実行時にランタイム・エラーが生 じる可能性があります。SPJ の変更方法のガイドラインについては、4-13 ページの「SPJ とその Java バイトコードの変更」を参照してください。

Java メソッド名

Java メソッド名は、大文字 / 小文字を区別するメソッドの名前とそのメソッドが含まれる Java クラスで 構成されます。次の例では、adjustSalary() という名前の Java メソッドの前にそのクラスの名 Payroll が付加されています。

'Payroll.adjustSalary'

クラスがパッケージに格納されている場合、パッケージ名も指定する必要があります。次の例では、こ

のクラス・ファイルのパッケージ名とサブパッケージ名は pkg.subpkg です。

'pkg.subpkg.Payroll.adjustSalary'

クラス名とパッケージが存在するのに EXTERNAL NAME 句にこれらを指定しない場合は、CREATE PROCEDURE ステートメントは SPJ の登録に失敗します。

Java メソッドのシグニチャ

Java のシグニチャを指定する必要があるのは、SPJ の SQL パラメータがデフォルトで Java ラッパ・ク ラスにマップされない場合だけで、SPJ Java メソッドは、Java プリミティブ・データ・タイプの代わりに Java ラッパ・クラスをその Java のシグニチャに使用します。詳細は、4-6 ページの「1-1 SQL/MX データ・ タイプと Java データ・タイプのマッピング」を参照してください。

VST019.vsd

EXTERNAL NAME 'Payroll.adjustSalary'

クラス名 メソッド名

-8 523727-002J

第 4 章 SQL/MX への SPJ の登録

Java のシグニチャを指定しない場合、SQL データ・タイプはデフォルトの Java データ・タイプに正確 にマップされている必要があります。次の例では、SQL パラメータ (たとえば、NUMERIC と FLOAT) がデ フォルトの Java パラメータ (たとえば、java.math.BigDecimal と double) に正確にマップされている ため、EXTERNAL NAME 句では Java のシグニチャが省略されています。

EXTERNAL NAME 'Payroll.adjustSalary'

ただし、SQL パラメータに INT を指定し、基となる SPJ Java メソッドが java.lang.Integer を使用 する場合、次のように EXTERNAL NAME 句に Java のシグニチャを指定する必要があります。

Java のシグニチャは大文字/小文字が区別され、カッコで囲む必要があります。シグニチャには、パラ メータの各データ・タイプをクラス・ファイル内の Java メソッドの定義と同じ順番で指定する必要があり ます。OUT または INOUT パラメータに対応する各データ・タイプの後ろには空の大カッコ ([ ]) を記述し、 配列であることを示す必要があります。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT INT ) EXTERNAL NAME 'Sales.numMonthlyOrders(int, java.lang.Integer[])'

Java のシグニチャ文字列を指定した場合、SQL/MX はそのシグニチャが指定されたメソッドのパラメー タを Java データ・タイプに有効にマップしたものであるか検証します。シグニチャが無効な場合はエラー が返されます。

Java のシグニチャ文字列を指定しなかった場合でも、SQL/MX は Java メソッドのシグニチャの圧縮表 現を生成し、それを TEXT メタデータ・テーブルに格納します。圧縮されたシグニチャは、Javap ツール と -s オプション (たとえば、javap -s classfile) よって出力される内部タイプのシグニチャと一致 します。圧縮されたシグニチャが 8192 文字を超えた場合はエラーが返されます。javap についての詳細 は、『NonStop Server for Java Tools Reference Pages』を参照してください。

たとえば、adjustSalary() という SPJ Java メソッドがあるとします。

public static void adjustSalary(BigDecimal empNum, double percent, BigDecimal[] newSalary) ...

CREATE PROCEDURE ステートメントにこのメソッドの Java のシグニチャを指定する場合は、次のよ うになります。

(java.math.BigDecimal, double, java.math.BigDecimal[])

VST020.vsd

EXTERNAL NAME 'Sales.numMonthlyOrders(int, java.lang.Integer[])'

Java メソッドのシグニチャ

Java プリミティブデータ・タイプ

Java ラッパクラス

523727-002J 4-9

第 4 章 SQL/MX への SPJ の登録

4

SPJ の登録後 (CREATE PROCEDUR ステートメントを発行した後)、次のクエリを発行して、TEXT メ タデータ・テーブルの圧縮された Java のシグニチャを表示することができます。

SELECT SUBSTRING(TEXT,1,100) AS "Compressed Signature" FROM samdbcat.definition_schema_version_vernum.text t, nonstop_sqlmx_node.system_schema.all_uids u, nonstop_sqlmx_node.system_schema.schemata s WHERE t.object_uid = u.object_uid AND u.object_name = 'ADJUSTSALARY' AND u.schema_uid = s.schema_uid AND s.schema_name = 'PERSNL';

SQL/MX リリース 2.0 のバージョン番号 vernum は 1200 です。

このクエリは、ADJUSTSALARY プロシージャの圧縮された Java のシグニチャを表示しています。

TEXT メタデータ・テーブルについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照 してください。

外部パスの指定

外部パスには、SPJ Java メソッドが含まれる Java クラス・ファイルの場所を指定します。外部パスは、 Java クラス・ファイル (たとえば、Payroll.class) が存在する OSS ディレクトリまたは JAR ファイル・ パスを示す、大文字 / 小文字を区別する文字列です。

パッケージに関する留意事項

EXTERNAL PATH 句にはパッケージ名を指定しないでください。その代わりに、EXTERNAL NAME 句にパッケージ名を指定してください。詳細は、4-8 ページの「Java メソッド名」を参照してください。

クラス・ファイル・パスの例

たとえば、ソース・ファイル /usr/mydir/myclasses/Payroll.sqlj があるとします。

package pkg.subpkg; public class Payroll { public static void adjustSalary( BigDecimal empNum, double percent, BigDecimal[] newSalary ) ...

Java コンパイラは、この SQLJ ソース・ファイルから次のクラス・ファイルを生成します。

/usr/mydir/myclasses/pkg/subpkg/Payroll.class

このクラス・ファイルにある adjustSalary() メソッドを参照する正しい CREATE PROCEDURE の

Compressed Signature -------------------------------------------------------------------------- (Ljava/math/BigDecimal;D[Ljava/math/BigDecimal;)V

-10 523727-002J

第 4 章 SQL/MX への SPJ の登録

句は次のようになります。

EXTERNAL NAME 'pkg.subpkg.Payroll.adjustSalary' EXTERNAL PATH '/usr/mydir/myclasses'

JAR ファイル・パスの例

ソース・ファイル Payroll.sqlj がコンパイルされ、クラス・ファイルは /usr/mydir ディレクトリ にある JAR ファイル myJar.jar にパッケージされているとします。

/usr/mydir/myJar.jar

この JAR ファイルにある adjustSalary() メソッドを参照する正しい CREATE PROCEDURE 句は次 のようになります。

EXTERNAL NAME 'pkg.subpkg.Payroll.adjustSalary' EXTERNAL PATH '/usr/mydir/myJar.jar'

プロシージャ・ラベルのネーミング

プロシージャ・ラベルは、SPJ に関する特権を追跡するために SQL/MX が内部的に使用します。そのた め、Guardian 名とその場所を指定する必要はありません。LOCATION 句を指定しない場合は、SQL/MX が SPJ のスキーマと同じサブボリュームにシステム定義のファイルを生成します。詳細は、6-12 ページの「プ ロシージャ・ラベルの表示」を参照してください。

プロシージャ・ラベルの場所を、特に分散データベース環境で制御する場合は、次のように LOCATION 句を指定します。

LOCATION \KINGPIN.$TX0115.ZSDPK4GV.Q85DXB00

プロシージャ・ラベルは、SPJ の カタログが参照できるノード上にのみ作成できます。リモート・ノー ド上でのカタログの登録方法についての詳細は、『SQL/MX Installation and Management Guide』を参照して ください。LOCATION 句のネーミング規則については、『NonStop SQL/MX リファレンス・マニュアル』を 参照してください。

SQL アクセス・モードの指定

SQL アクセス・モードは、SPJ が SQL 操作を実行するかどうかを指定します。SPJ に SQL アクセス・ モードを指定することは、全くのオプションです。CREATE PROCEDURE ステートメントにアクセス・ モードを指定しない場合は、デフォルトは CONTAINS SQL、SPJ の機能は MODIFIES SQL DATA です。

SPJ が SQL 操作を実行しない場合は、オプションの NO SQL 句を指定します。SPJ Java メソッドが SQL 操作を実行せずアクセス・モードが CONTAINS SQL と指定されても、SPJ は正常に実行されます。ただ し、SQL 操作を実行する SPJ Java メソッドに NO SQL を指定した場合、SPJ を呼び出そうとしたときにエ ラーが返されます。

SPJ が実行する SQL 操作のタイプを指定するには、CONTAINS SQL、MODIFIES SQL DATA、READS SQL DATA のいずれかのオプション句を指定します。これらのすべてのオプションは MODIFIES SQL と 同じ機能を持ちます。SQL ステートメントを含み、SQLJ プログラムまたは JDBC/MX プログラムのクラ ス・ファイルに含まれるメソッドを登録する場合、これらのオプションのいずれかを指定します。SQLJ に ついての詳細は『SQL/MX Programming Manual for Java』を、JDBC/MX についての詳細は『JDBC Driver for SQL/MX Programmer’s Reference』を参照してください。

523727-002J 4-11

第 4 章 SQL/MX への SPJ の登録

4

4.2 SPJ の削除DROP PROCEDURE ステートメントは、SPJ を SQL/MX から削除します。次に示すようなSQL/MX を

呼び出すアプリケーションまたはインタフェースから、DROP PROCEDURE ステートメントを発行できま す。

□ SQL/MX 会話型インタフェース (MXCI)

□ C または COBOL による埋め込み SQL プログラム

□ SQLJ プログラム (Java による埋め込み SQL)

□ JDBC/MX プログラム

□ NonStop ODBC/MX クライアント

□ NSM/web

4.2.1 必要な特権

DROP PROCEDURE ステートメントを発行するには、SPJ の所有者か、または Super ID である必要が あります。SPJ の所有権を確認するには、6-9 ページの「SPJ に対する特権の表示」を参照してください。

4.2.2 SPJ の削除の結果

DROP PROCEDURE ステートメントの実行が成功すると、システム・メタデータ・テーブルから SPJ の 属性が削除され、SPJ のプロシージャ・ラベルが削除されます。基となる Java メソッドとこの SPJ を参照 するあらゆる SPJ は、DROP PROCEDURE ステートメントの影響を受けません。DROP PROCEDURE ス テートメントの実行が失敗した場合は、システム・メタデータ・テーブルは変更されず、プロシージャ・

ラベルも削除されません。

4.2.3 DROP PROCEDURE ステートメントの使用

SPJ を削除するには、次のように DROP PROCEDURE ステートメントに SPJ の名前を指定します。

DROP PROCEDURE samdbcat.persnl.adjustsalary;

プロシージャ名と共に SQL パラメータを指定しないでください。SQL/MX はプロシージャ名のオーバ ロードをサポートしていないため、各プロシージャ名はデータベース内でユニークな SPJ に対応します。

DROP PROCEDURE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』 を参照してください。

-12 523727-002J

第 4 章 SQL/MX への SPJ の登録

4.3 SPJ とその Java バイトコードの変更SPJ を変更するには、最初にシステム・メタデータから SPJ を削除する必要があります。DROP

PROCEDURE ステートメントを使用して SPJ を削除した後、CREATE PROCEDURE ステートメントを使 用して SPJ を再作成します。

注. SQL/MX は、ANSI SQL/Foundation 標準の SQL/JRT の ALTER_JAVA_PATH プロシージャをサポー トしていません。

SPJ または SPJ Java メソッドの Java バイトコードを変更するには、次の手順に従ってください。

1. 変更する SPJ Java メソッドをロードしている可能性のある現在のすべての SQL/MX UDR サーバ・プ ロセスを終了します。

たとえば、MXCI セッションで SPJ を呼び出していた場合は、その MXCI セッションを終了します。 SQL/MX アプリケーションから SPJ を呼び出していた場合は、そのアプリケーションを終了します。

2. DROP PROCEDURE ステートメントを使用して、システム・メタデータから SPJ を削除します。詳細 は、4-12 ページの「SPJ の削除」を参照してください。

注.この手順は、SPJ Java メソッドの Java バイトコードを移動する場合、またはその外部名や Java のシ グニチャを変更する場合にのみ必要です。

3. 目的の Java バイトコードを変更して再コンパイルします。

4. CREATE PROCEDURE ステートメントを使用して、SPJ を再作成します。詳細は、4-2 ページの「SPJ の作成」を参照してください。

注.この手順は、SPJ Java メソッドの Java バイトコードを移動する場合、またはその外部名や Java のシ グニチャを変更する場合にのみ必要です。

5. 新しい SQL/MX UDR サーバ・プロセスで SPJ を呼び出します。

注.CALL ステートメントの予測できないまたは望ましくない動作を回避するには、SPJ Java 環境がアク ティブな間は、ディスク上で Java バイトコードを変更しないでください。詳細は、1-17 ページの「Java バイトコード変更による影響」を参照してください。

SPJ の変更が必要な一般的なシナリオは、次で説明します。

523727-002J 4-13

第 4 章 SQL/MX への SPJ の登録

4

4.3.1 外部パスの変更

外部パスは、 SPJ Java メソッドを含む Java クラス・ファイルが存在する OSS ディレクトリまたは JAR ファイル・パスです。基となる SPJ Java メソッドの外部パスを変更する場合は、関連する SPJ を削除して、 再作成する必要があります。

たとえば、SPJ Java メソッド numMonthlyOrders() を含むクラス Sales.class を /usr/mydir/myclasses ディレクトリから、JAR ファイル myJar.jar に移動するとします。

この SPJ は、当初、次に示すようにシステム・メタデータに登録されていたものとします。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders(int, java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

この SPJ を削除するには、次の DROP PROCEDURE ステートメントを発行します。

DROP PROCEDURE samdbcat.sales.monthlyorders;

SPJ を再作成するには、次の CREATE PROCEDURE ステートメントを発行します。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders(int, java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myJar.jar' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

静的にコンパイルされたプログラムがこの SPJ を呼び出す場合、そのアプリケーションのモジュールを 明示的に再コンパイルする必要があります。再コンパイルしない場合、CALL ステートメントの SQL プラ ンを SQL/MX が ランタイム時に自動的に再コンパイルしようとします。

ここでは、既存の CALL ステートメントを発行することによって、再配置された SPJ Java メソッドを正 常に実行できます。

-14 523727-002J

第 4 章 SQL/MX への SPJ の登録

4.3.2 外部名の変更

外部名は、SPJ として登録されている SPJ Java メソッドを示します。SPJ の外部名の変更とは、SPJ Java メソッドの再割り当て、または既存の SPJ Java メソッドの基となる Java バイトコードの基本的な変更のい ずれかを指します。

たとえば、MONTHLYORDERS という名前の SPJ を、SPJ Java メソッド numMonthlyOrders() から、 Java シグニチャが同じ numMonthlyOrders2() という名前の別の SPJ Java メソッドに再割り当てすると します。

MONTHLYORDERS という名前の SPJ は、当初、次のようにシステム・メタデータに登録されていた ものとします。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders(int, java.lang.Integer[])' EXTERNAL PATH '/usr/myapps/myJar.jar' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

このSPJ を削除するには、次の DROP PROCEDURE ステートメントを発行します。

DROP PROCEDURE samdbcat.sales.monthlyorders;

SPJ を再作成するには、次の CREATE PROCEDURE ステートメントを発行します。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders2(int, java.lang.Integer[])' EXTERNAL PATH '/usr/myapps/myJar.jar' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

静的にコンパイルされたプログラムがこの SPJ を呼び出す場合、そのアプリケーションのモジュールを 明示的に再コンパイルする必要があります。再コンパイルしない場合、CALL ステートメントの SQL プラ ンをSQL/MX がランタイム時に自動的に再コンパイルしようとします。

ここでは、既存の CALL ステートメントを発行することによって、新しい SPJ Java メソッドを正常に実 行できます。

523727-002J 4-15

第 4 章 SQL/MX への SPJ の登録

4

4.3.3 Java のシグニチャの変更

Java のシグニチャは、Java メソッドの定義に各パラメータのデータ・タイプを指定します。SPJ のJava のシグニチャを変更することは、既存の SPJ メソッドの基となっている Java バイトコードの基本的な変更 を指します。

たとえば、MONTHLYORDERS という名前の SPJ を numMonthlyOrders() という名前の SPJ Java メ ソッドから、異なる Java シグニチャの numMonthlyOrders2() という名前の別の SPJ Java メソッドに再 割り当てするとします。

MONTHLYORDERS という名前の SPJ は、当初、次のようにシステム・メタデータに登録されていた ものとします。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders(int, java.lang.Integer[])' EXTERNAL PATH '/usr/myapps/myJar.jar' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

このSPJ を削除するには、次の DROP PROCEDURE ステートメントを発行します。

DROP PROCEDURE samdbcat.sales.monthlyorders;

SPJ を再作成するには、次の CREATE PROCEDURE ステートメントを発行します。

CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, IN partnum NUMERIC(4), OUT number INT) EXTERNAL NAME 'pkg.subpkg.Sales.numMonthlyOrders2(int, java.math.BigDecimal, java.lang.Integer[])' EXTERNAL PATH '/usr/myapps/myJar.jar' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA;

引数が この SPJ の新しいパラメータと一致するように、呼び出し側のアプリケーションのソース・コー ド内の CALL ステートメントを更新する必要があります。アプリケーションが静的にコンパイルされてい る場合は、アプリケーション全体を再コンパイルしなければなりません。ここでは、更新された CALL ス テートメントを発行することによって、新しい SPJ Java メソッドを正常に実行できます。

-16 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

この章では、Java ストアド・プロシージャ (SPJ) を実行する方法について説明します。ここでは SPJ が すでに SQL/MX に登録されていることを前提とします。SPJ の登録方法についての詳細は、第 4 章 「SQL/MX への SPJ の登録」を参照してください。

この章では次の内容を説明します。

□ 5-2 ページの「SPJ の呼び出し」

□ 5-6 ページの「MXCI での SPJ の呼び出し」

□ 5-8 ページの「C または COBOL による埋め込み SQL プログラムでの SPJ の呼び出し」

□ 5-14 ページの「SQLJ プログラムでの SPJ の呼び出し」

□ 5-15 ページの「JDBC/MX プログラムでの SPJ の呼び出し」

□ 5-16 ページの「NonStop ODBC/MX クライアントでの SPJ の呼び出し」

523727-002J 5-1

第 5 章 SQL/MX での SPJ の呼び出し

5

5.1 SPJ の呼び出しCALL ステートメントは、SQL/MX 内の SPJ を呼び出します。SQL/MX を呼び出す次のアプリケーショ

ンまたはインタフェースで、CALL ステートメントを発行できます。

□ SQL/MX 会話型インタフェース (MXCI)

□ SQLJ プログラム (Java による埋め込み SQL)

□ JDBC/MX プログラム

□ C または COBOL による埋め込み SQL プログラム

□ NonStop ODBC/MX クライアント

CALL ステートメントは、スタンドアロンの SQL ステートメントとしてのみ使用できます。CALL ス テートメントをコンパウンド・ステートメント内やトリガ内で、またはローセットと共に使用することは

できません。

5.1.1 必要な特権

CALL ステートメントを実行するには、プロシージャのEXECUTE 権限が必要です。詳細は、6-2 ページ の「SPJ を呼び出すのための 特権の付与」を参照してください。

5.1.2 SPJ 呼び出しの結果

CALL ステートメントを発行すると、呼び出された SPJ の SPJ Java メソッドは SPJ Java 環境の JVM 内 で実行されます。詳細は、1-7 ページの「SPJ 呼び出しのプロセス」および1-11 ページの「SPJ Java 環境」 を参照してください。

注. SQL/MX は、SPJ Java メソッドを含まれている Java クラス・ファイル内に Java バイトコードを保持 しません。SQL/MX は、システム・メタデータに Java クラス・ファイルの場所の参照だけを記録し ます。SPJ の登録後に Java クラス・ファイルを変更すると、SPJ の実行時にランタイム・エラーが生 じる可能性があります。SPJ の変更方法のガイドラインについては、4-13 ページの「SPJ とその Java バイトコードの変更」を参照してください。

5.1.3 トランザクションのセマンティクス

アクティブなトランザクションがない場合は、CALL ステートメントは自動的にトランザクションを開 始します。CALL ステートメントによって呼び出された SPJ Java メソッドは、呼び出し元からのトランザ クションを継承します。

アプリケーションで CALL ステートメントが失敗しても、常にトランザクションが自動的にアボートさ れるものとは限りません。

□ AUTOCOMMIT が ON に設定されていたシステム開始のトランザクションにおいて、CALL ステート メントの実行中にエラーが発生すると、ステートメント実行の終了時に SQL/MX は SPJ Java メソッド が実行したデータベース操作を含むトランザクションを自動的にロールバックします。

-2 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

□ システム開始の、あるいはユーザ定義の AUTOCOMMIT が OFF に設定されているトランザクション において、CALL ステートメントの実行中にエラーが発生しても、SQL/MX はトランザクションを自 動的にロールバックすることはありません。

ユーザ定義のトランザクションでアトミック単位の処理を確実に行う場合や、システム定義のトランザ

クションで AUTOCOMMIT が OFF に設定されている場合は、トランザクションの成功時にトランザ クションを明示的にコミットし、エラー発生時にトランザクションを明示的にロールバックする必要が

あります。

SQL/MX では、SPJ Java メソッドにおいて COMMIT WORK や ROLLBACK WORK といった SQL ト ランザクション・ステートメントや、Connection.commit() や Connection.rollback() といっ た JDBC トランザクション・メソッドをサポートしていません。

トランザクション管理についての詳細は、『SNonStop SQL/MX リファレンス・マニュアル』を参照して ください。

5.1.4 CALL ステートメントの使用

ストアド・プロシージャを呼び出すには、次のように、CALL ステートメントにストアド・プロシージャ の名前とその引数を指定します。

CALL ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照してく ださい。

SPJ 名の指定

CALL ステートメントには、SQL/MX にすでに登録されている SPJ の名前を指定します。プロシージャ 名は、CREATE PROCEDURE ステートメントに指定したものと同じカタログとスキーマで修飾します。例 を次に示します。

SET SCHEMA samdbcat.persnl; CALL adjustsalary(202, 5.5, ?);

プロシージャ名に完全修飾名を指定しない場合は、SQL/MX が CATALOG および SCHEMA の現在の設 定に従って修飾します。詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

VST021.vsd

CALL samdbcat.persnl.adjustsalary(202, 5.5, ?)

パラメータ引数リストプロシージャ名

入力パラメータの引数

出力パラメータの引数

523727-002J 5-3

第 5 章 SQL/MX での SPJ の呼び出し

5

SPJ の引数リスト

CALL ステートメントに指定した引数は、CREATE PROCEDURE ステートメントに指定した SQL パラ メータと対応している必要があります。

たとえば、ストアド・プロシージャに 3 つの SQL パラメータ (2 つの IN パラメータと 1 つの OUT パラ メータ) を登録した場合、CALL ステートメントにはコンマで区切られた仮パラメータを指定しなければな りません。

CALL samdbcat.persnl.adjustsalary(202, 5, ?);

SPJ が引数を受け取らない場合は、次のように空のカッコを指定する必要があります。

CALL samdbcat.sales.lowerprice();

パラメータ引数のデータ変換

パラメータ引数のデータ・タイプがストアド・プロシージャの仮パラメータのデータ・タイプと一致は

していないが互換性があるという場合、SQL/MX は暗黙的にデータ変換を実行します。ストアド・プロシー ジャの入力値は、実際の引数値から仮パラメータのデータ・タイプに変換されます。ストアド・プロシー

ジャの出力値は、仮パラメータのデータ・タイプを持つ実際の出力値からホスト変数または動的パラメー

タの宣言されたデータ・タイプに変換されます。

入力パラメータの引数

SPJ の IN または INOUT パラメータにデータを渡すには、結果が文字、日付時刻、または数値になる SQL 式を指定します。基本となる Java パラメータがヌル値をサポートしている場合は、SQL 式の結果が NULL になることもあります。詳細は、3-3 ページの「ヌルの入出力」を参照してください。

IN パラメータの引数では、次の SQL 式のいずれかを使用します。

引数のタイプ 例

リテラル CALL adjustsalary(202, 5.5, ?); CALL dailyorders(DATE '2003-03-19', ?); CALL totalprice(23, 'nextday', ?param);

SQL 関数 (CASE 式と CAST 式を 含む)

CALL dailyorders(CURRENT_DATE, ?);

算術式 CALL adjustsalary(202, :percent * 0.25, :OUT newsalary);

連結演算 CALL totalprice(23, 'next' || 'day', ?param);

-4 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

INOUT パラメータでは SPJ にデータを渡し SPJ からデータを受け取るため、CALL ステートメントの INOUT パラメータの引数には、ホスト変数または動的パラメータのみが指定できます。

出力パラメータの引数

SPJ は、OUT および INOUT パラメータで値を返します。OUT および INOUT パラメータの引数は、静 的 CALL ステートメントの場合はホスト変数 (たとえば :hostvar)、動的 CALL ステートメントの場合は 動的パラメータ (たとえば ? または ?param) として指定します。

CALL ステートメントに指定するパラメータ引数は、SPJ を呼び出すアプリケーションまたはインタ フェースによって異なります。様々なアプリケーションでの SPJ の呼び出し方法についての詳細は、次の 各項目を参照してください。

□ 5-6 ページの「MXCI での SPJ の呼び出し」

□ 5-8 ページの「C または COBOL による埋め込み SQL プログラムでの SPJ の呼び出し」

□ 5-14 ページの「SQLJ プログラムでの SPJ の呼び出し」

□ 5-15 ページの「JDBC/MX プログラムでの SPJ の呼び出し」

□ 5-16 ページの「NonStop ODBC/MX クライアントでの SPJ の呼び出し」

スカラ・サブクエリ CALL totalprice((SELECT qty_ordered FROM odetail WHERE ordernum = 100210 AND partnum = 5100), 'nextday', ?param);

ホスト変数 CALL adjustsalary(:empnum, :percent, :OUT newsalary);

動的パラメータ CALL adjustsalary(?, ?, ?); CALL adjustsalary(?param1, ?param2, ?param3);

引数のタイプ 例

523727-002J 5-5

第 5 章 SQL/MX での SPJ の呼び出し

5

5.2 MXCI での SPJ の呼び出しMXCI では、CALL ステートメントを直接発行するか、または CALL ステートメントをプリペアして実

行することにより SPJ を呼び出すことができます。

MXCI の名前付きパラメータと名前なしパラメータは、MXCI で呼び出される SPJ の引数リストのどこ にでも使用できます。MXCI の名前付きパラメータは SET PARAM コマンドで設定され、MXCI の名前な しパラメータは EXECUTE ステートメントの USING 句で設定されます。

OUT または INOUT パラメータの引数には、MXCI パラメータを使用する必要があります。MXCI で CALL ステートメントを発行すると、すべての出力パラメータ値が表示されます。プロシージャ・コール では、OUT または INOUT パラメータとして使用される MXCI の名前付きパラメータの値は変更されませ ん。

MXCI パラメータについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

5.2.1 MXCI の名前付きパラメータの使用

MXCI セッションで、2 つの IN パラメータと 1 つの INOUT パラメータが指定された TOTALPRICE と いう名前の SPJ を呼び出すものとします。この SPJ は、商品の数量、出荷速度、価格を受け取り、税金と 送料を含む総額を計算して返します。詳細は、A-3 ページの「Sales クラス」を参照してください。

SPJ を呼び出す前に SET PARAM コマンドを入力して、INOUT パラメータの入力値を設定します。

SET PARAM ?p 10; CALL samdbcat.sales.totalprice(23, 'standard', ?p);

この CALL ステートメントは、この商品の総額を返します。

MXCI の名前付きパラメータ ?p の値は、10 のままです。

5.2.2 MXCI の名前なしパラメータの使用

MXCI セッションで、CALL ステートメントをプリペアして実行することにより、TOTALPRICE という 名前の SPJ を呼び出すものとします。INOUT パラメータは、EXECUTE ステートメントの USING 句で設 定された値を受け取り、総額を返します。

SET SCHEMA samdbcat.sales; PREPARE stmt1 FROM CALL totalprice(50,'nextday',?); EXECUTE stmt1 USING 2.25;

PRICE --------------------- 253.96 --- SQL operation complete.

-6 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

プリペアされた CALL ステートメントの出力は、次のようになります。

MXCI セッションで、3 つのすべてのパラメータが EXECUTE ステートメントの USING 句で設定され た値を受け取る CALL ステートメントをプリペアして実行することにより、TOTALPRICE という名前の SPJ を再度呼び出します。INOUT パラメータは総額を返します。

PREPARE stmt2 FROM CALL totalprice(?,?,?); EXECUTE stmt2 USING 3, 'economy', 16.99;

プリペアされた CALL ステートメントの出力は次のようになります。

PRICE --------------------- 136.77 --- SQL operation complete.

PRICE --------------------- 57.12 --- SQL operation complete.

523727-002J 5-7

第 5 章 SQL/MX での SPJ の呼び出し

5

C

CO

5.3 C または COBOL による埋め込み SQL プログラムでの SPJ の呼び出 し

C または COBOL による埋め込み SQL プログラムでは、静的または動的 CALL ステートメントで SPJ を呼び出すことができます。静的 CALL ステートメントは、EXEC SQL 指示語内に配置します。

詳細は、次の各項目を参照してください。

□ 5-8 ページの「静的 CALL ステートメント」

□ 5-9 ページの「動的 CALL ステートメント」

C、C++、または COBOL による埋め込み SQL プログラムの作成方法についての詳細は、『HP NonStop SQL/MXプログラミング・マニュアル C および COBOL言語用 』を参照してください。

5.3.1 静的 CALL ステートメント

静的 CALL ステートメントは、静的にコンパイルされた SQL プログラムに直接埋め込まれ、静的な実 パラメータを持ちます。静的 CALL ステートメントの場合、埋め込みプログラムは入力または出力デスク リプタを明示的に参照しません。

次の C による埋め込み SQL プログラムの例では、静的 CALL ステートメントには IN パラメータの引数 が指定されています。この IN パラメータの引数は、ホスト変数、IN パラメータの引数である 5.5、別のホ スト変数からなる OUT パラメータの引数で構成されています。

EXEC SQL BEGIN DECLARE SECTION; NUMERIC(4) hv_empnum_param1; NUMERIC(8,2) hv_newsalary_param3; EXEC SQL END DECLARE SECTION;

/* IN 引数を設定する */ hv_empnum_param1 = 202;

/* ストアド・プロシージャを呼び出す * パラメータ・モードは IN、IN、OUT */ EXEC SQL CALL samdbcat.persnl.adjustsalary(:hv_empnum_param1, 5.5, :hv_newsalary_param3);

/* OUT パラメータの値を出力する */ printf("\nThe new salary is %ld.\n", hv_newsalary_param3);

EXEC SQL CALL procedure-name ([parameter [{, parameter}...]]);

EXEC SQL CALL procedure-name ([parameter [{, parameter}...]]) END-EXEC

/C++

BOL

-8 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

5.3.2 動的 CALL ステートメント

C または COBOL による埋め込み SQL プログラムでは、SQL デスクリプタ領域またはホスト変数を使 用して動的な入力データを指定できます。同様に、動的な出力データをSQL デスクリプタ領域に格納した り、ホスト変数に直接格納したりできます。詳細は、次の各項目を参照してください。

□ 5-9 ページの「入力デスクリプタと出力デスクリプタ」

□ 5-13 ページの「引数リスト」

入力デスクリプタと出力デスクリプタ

SQL デスクリプタ領域を使用して、動的 CALL ステートメントの入出力パラメータに関する情報を格納 したり取得したりできます。

仮パラメータと実パラメータ

仮パラメータは仮プロシージャ・シグニチャのパラメータの 1 つで、実パラメータはプロシージャ・コー ルのパラメータ引数のうちの 1 つです。1 つ以上の実パラメータを 1 つの仮パラメータにマップすること が可能なため、実パラメータ数は仮パラメータ数よりも多いことがあります。

□ PARAMETER_MODE が IN、OUT、および IN の 3 つのパラメータを次の順序で受け取るように定義 された SPJ があるとします。

CALL myproc(?w /*IN*/, ?x /*OUT*/, ?y + ?z /*IN*/);

この CALL ステートメントには、3 つの仮パラメータと 4 つの実パラメータ (w, x, y, z) が指定されて います。このパラメータの PARAMETER_ORDINAL_POSITION は、(1, 2, 3, 3) です。

□ 重複した実パラメータを使用する次の CALL ステートメントがあるとします。

CALL myproc(?w /*IN*/, ?x /*OUT*/, ?w + ?y /*IN*/);

こ の 場 合、3 つ の 実 パ ラ メ ー タ (w , x , y ) が あ り ま す。こ の パ ラ メ ー タ の

PARAMETER_ORDINAL_POSITION は、(1, 2, 3) です。

入力デスクリプタと出力デスクリプタ内のエントリ数

動的 SQL の場合、入力デスクリプタには n 個のエントリがあります。n は IN および INOUT の 仮パラ メータにマップされる実パラメータの数であり、IN および INOUT の仮パラメータ数と必ずしも同じであ るとは限りません。

一方、出力デスクリプタには m 個のエントリがあります。m は OUT および INOUT の仮パラメータに マップされる実パラメータの数であり、OUT および INOUT の仮パラメータの数と同じです。これは、 CALL ステートメントでは各出力パラメータを 1 つの動的なパラメータで表現する必要があるからです。

523727-002J 5-9

第 5 章 SQL/MX での SPJ の呼び出し

5

入力デスクリプタと出力デスクリプタの使用例

SQL デスクリプタ領域と動的 CALL ステートメントを使用する埋め込み SQL プログラムをコーディン グするには、次の手順に従ってください。

1. 入力および出力 SQL デスクリプタ領域を割り当てます。

動的な入力パラメータ (IN または INOUT モードに関連付けられる) には入力 SQL デスクリプタ領域 を、動的な出力パラメータ (OUT または INOUT モードに関連付けられる) には出力 SQL デスクリプタ 領域を割り当てます。

EXEC SQL ALLOCATE DESCRIPTOR 'in_sda'; EXEC SQL ALLOCATE DESCRIPTOR 'out_sda';

ALLOCATE DESCRIPTOR ステートメントの構文については、『NonStop SQL/MX リファレンス・マ ニュアル』を参照してください。

2. CALL ステートメントをプリペアします。

ホスト変数に格納する CALL ステートメントをプリペアします。PREPARE ステートメントはステート メントの構文をチェックし、パラメータのデータ・タイプを確認して CALL ステートメントをコンパ イルします。そして CALL ステートメントを後続の EXECUTE ステートメントで使用できるステート メント名に関連付けます。

/* 文字列バッファに CALL ステートメントを格納する */ strcpy(hv_sql_stmt, "CALL samdbcat.persnl.adjustsalary(?,?,?)"); /* IN, IN, OUT */

/* ステートメントをプリペアする */ EXEC SQL PREPARE sqlstmt FROM :hv_sql_stmt;

PREPARE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照 してください。

3. 入出力パラメータを記述します。

DESCRIBE ステートメントは、プリペアされた CALL ステートメントの動的な入力または出力パラメー タに関する情報を SQL デスクリプタ領域に格納します。入力および出力 SQL デスクリプタ領域にデー タを格納するには、次の DESCRIBE ステートメントを使用します。

DESCRIBE INPUT は、プリペアされた CALL ステートメントの動的な入力パラメータ (IN または INOUT モードに関連付けられる) に基づいて入力 SQL デスクリプタ領域を初期化します。

EXEC SQL DESCRIBE INPUT sqlstmt USING SQL DESCRIPTOR 'in_sda';

DESCRIBE OUTPUT は、プリペアされた CALL ステートメントの動的な出力パラメータ (OUT ま たは INOUT モードに関連付けられる) の出力 SQL デスクリプタ領域に情報を格納します。

EXEC SQL DESCRIBE OUTPUT sqlstmt USING SQL DESCRIPTOR 'out_sda';

DESCRIBE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照

-10 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

してください。

4. SET DESCRIPTOR を使用して入力パラメータ値を設定します。

SET DESCRIPTOR ステートメントを使用して、各入力パラメータの入力 SQL デスクリプタ領域に明 示的に情報を設定します。

/* 入力デスクリプタにおいて唯一のエントリである * 順序位置 1 と 2 に 2 つの IN パラメータの * 入力値を設定する */ printf("\nEnter the employee number: "; scanf("%ld", &hv_empnum_param1); hv_i = 1; EXEC SQL SET DESCRIPTOR 'in_sda' VALUE :hv_i VARIABLE_DATA = :hv_empnum_param1; printf("\nEnter the percentage adjustment: "; scanf("%f", &hv_percent_param2); hv_i = 2; EXEC SQL SET DESCRIPTOR 'in_sda' VALUE :hv_i VARIABLE_DATA = :hv_percent_param2;

SET DESCRIPTOR ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』 を参照してください。

注.デスクリプタ項目 PARAMETER_ORDINAL_POSITION と PARAMETER_MODE を変更することは できません。

5. プリペアされた CALL ステートメントを実行します。

入力 SQL デスクリプタ領域には入力 USING 句を、出力 SQL デスクリプタ領域には出力 INTO 句を指 定して EXECUTE ステートメントを発行することにより、プリペアされた CALL ステートメントを実 行します。

EXEC SQL EXECUTE sqlstmt USING SQL DESCRIPTOR 'in_sda' INTO SQL DESCRIPTOR 'out_sda';

EXECUTE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照 してください。

523727-002J 5-11

第 5 章 SQL/MX での SPJ の呼び出し

5

6. GET DESCRIPTOR を使用して出力パラメータ値を取得します。

GET DESCRIPTOR ステートメントを使用して、出力 SQL デスクリプタ領域から出力パラメータの情 報を取得します。

hv_i = 1; EXEC SQL GET DESCRIPTOR 'out_sda' VALUE :hv_i VARIABLE_DATA = :hv_newsalary_param3; printf("\nThe new salary is %ld.\n", hv_newsalary_param3);

GET DESCRIPTOR ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』 を参照してください。

7. GET DESCRIPTOR を使用してパラメータ・デスクリプタ情報を取得します。

GET DESCRIPTOR ステートメントを使用することで、動的な出力パラメータに関するデータを取得す る 以 外 に、動 的 パ ラ メ ー タ の デ ス ク リ プ タ 項 目 PARAMETER_MODE と PARAMETER_ORDINAL_POSITION を取得することもできます。

次の例では、GET DESCRIPTOR ステートメントは、指定されたホスト変数に OUT パラメータとして PARAMETER_MODE と PARAMETER_ORDINAL_POSITION の情報を格納します。

hv_i = 1; EXEC SQL GET DESCRIPTOR 'out_sda' VALUE :hv_i VARIABLE_DATA = :hv_newsalary_param3 PARAMETER_MODE = :pm_newsalary_param3 PARAMETER_ORDINAL_POSITION = :pop_newsalary_param3;

デスクリプタ項目についての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してくだ さい。

C、C++、COBOL による埋め込み SQL プログラムの作成方法についての詳細は、『HP NonStop SQL/MX プログラミング・マニュアル C および COBOL 言語用 』を参照してください。

-12 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

引数リスト

入力または出力デスクリプタを使用しなくても、埋め込み動的 CALL ステートメントを実行できます。 デスクリプタの代わりに 2 つの引数リストを EXECUTE ステートメントの入力 USING 句と出力 INTO 句 に直接渡します。

次の例は、引数リストを使用した埋め込み動的 CALL ステートメントを示しています。

EXEC SQL BEGIN DECLARE SECTION; NUMERIC(4) hv_empnum_param1; double hv_percent_param2; NUMERIC(8,2) hv_newsalary_param3; CHAR hv_sql_stmt[64]; EXEC SQL END DECLARE SECTION;

/* 文字列バッファに CALL ステートメントを格納する */ strcpy(hv_sql_stmt, "CALL samdbcat.persnl.adjustsalary(?,?,?)"); /* IN, IN, OUT */

/* ステートメントをプリペアする */ EXEC SQL PREPARE sqlstmt FROM :hv_sql_stmt;

/* 順序位置 1 と 2 に 2 つの * IN パラメータの入力値を設定する printf("\nEnter the employee number: "; scanf("%ld", &hv_empnum_param1); printf("\nEnter the percentage adjustment: "; scanf("%f", &hv_percent_param2);

/* ストアド・プロシージャを呼び出す */ EXEC SQL EXECUTE sqlstmt USING :hv_empnum_param1, :hv_percent_param2 /* IN, IN */ INTO :hv_newsalary_param3; /* OUT */ printf("\nThe new salary is %ld.\n", hv_newsalary_param3);

C、C++、COBOL による埋め込み SQL プログラムの作成方法についての詳細は、『NonStop SQL/MX プ ログラミング・マニュアル C および COBOL 言語用』を参照してください。

523727-002J 5-13

第 5 章 SQL/MX での SPJ の呼び出し

5

5.4 SQLJ プログラムでの SPJ の呼び出しSQLJ プログラムは、SQLJ 句に埋め込み SQL ステートメントを含む Java プログラムです。SQLJ プロ

グラムでは、CALL ステートメントで SPJ を呼び出すことができます。

次のように、SQLJ の実行可能句の中に CALL ステートメントを記述します。

SQLJ プログラムでは、CALL ステートメントのホスト変数と式はデフォルトで IN パラメータ・モード になります。したがって、次の例に示すように CALL ステートメントの INOUT および OUT 引数を明示的 に記述する必要があります。

#sql { CALL adjustsalary (:IN empnum, :IN percent, :OUT newsalary) };

SQLJ プログラムの作成方法についての詳細は、『SQL/MX Programming Manual for Java』を参照してく ださい。

#sql {CALL procedure-name ([parameter[{, parameter}...]])};

-14 523727-002J

第 5 章 SQL/MX での SPJ の呼び出し

5.5 JDBC/MX プログラムでの SPJ の呼び出しJDBC の CallableStatement インタフェースを使用すれば、JDBC/MX プログラムで CALL ステート

メントを実行できます。JDBC/MX プログラムでは、次のように CALLステートメントをエスケープ句に 含める必要があります。

CallableStatement インタフェースの settype() メソッドを使用して、IN および INOUT パラメー タの入力値を設定します。

CallableStatement インタフェースの gettype() メソッドを使用して、OUT および INOUT パラ メータの出力値を取得します。

パラメータ・モードが OUT または INOUT の場合は、CALL ステートメントを実行する前に CallableStatement インタフェースの registerOutParameter() メソッドを使用してそのパラメー タを出力パラメータとして登録する必要があります。

次の例では、CALL ステートメントが JDBC/MX プログラムから実行されます。

CallableStatement stmt = con.prepareCall("{call adjustsalary(?,?,?)}"); stmt.setBigDecimal(1,202); // x = 202 stmt.setDouble(2,5.5); // y = 5.5 stmt.registerOutParameter(3, java.sql.Types.NUMERIC); stmt.execute(); int z = stmt.getBigDecimal(3); // Retrieve the value of the // OUT parameter

JDBC/MX についての詳細は、『JDBC Driver for SQL/MX Programmer’s Reference』を参照してください。

{call procedure-name ([parameter[{, parameter}...]])}

523727-002J 5-15

第 5 章 SQL/MX での SPJ の呼び出し

5

5.6 NonStop ODBC/MX クライアントでの SPJ の呼び出しNonStop ODBC/MX クライアントで CALL ステートメントを実行することができます。Microsoft

ODBC/MX クライアントでは、次のように CALLステートメントをエスケープ句に含める必要があります。

IN または INOUT パラメータには、リテラルまたはパラメータ・マーカ (?) を使用します。

注.引数リストには IN または INOUT パラメータとして空の文字列を使用することはできません。

INOUT パラメータにリテラルを指定した場合は、ドライバは出力値を破棄します。

OUT パラメータには、パラメータ・マーカ (?) のみを使用できます。この場合は、CALL ステートメン トを実行する前に SQLBindParameter 関数を使用してすべてのパラメータ・マーカをバインドする必要 があります。

次の例では、CALL ステートメントは NonStop ODBC/MX クライアントから実行されます。

/* 変数を宣言する */ SQLHSTMT hstmt; SQL_NUMERIC_STRUCT salary; SDWORD cbParam = SQL_NTS; /* パラメータ・マーカをバインドする */ SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC, SQL_NUMERIC, 4, 0,

202, 0, &cbParam); SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_FLOAT, 0, 0,

5.5, 0, &cbParam); SQLBindParameter(hstmt, 3, SQL_PARAM_OUTPUT, SQL_C_NUMERIC, SQL_NUMERIC, 8,

2, &salary, 0, &cbParam); /* CALL ステートメントを実行する */ SQLExecDirect(hstmt, "{call adjustsalary(?,?,?)}", SQL_NTS);

NonStop ODBC/MX クライアントについての詳細は、『ODBC/MX Driver for Windows Manual』を参照し てください。

{call procedure-name ([parameter][,[parameter]]...)}

-16 523727-002J

第 6 章 SQL/MX での SPJ の管理

この章では、SQL/MX での SPJ に関連する管理タスクについて、次の項目に沿って説明します。

□ 6-2 ページの「SPJ を呼び出すのための 特権の付与」

□ 6-8 ページの「SPJ に関する情報の表示」

□ 6-15 ページの「OBEY コマンド・ファイルを使った SPJ ステートメントの保存」

□ 6-19 ページの「SPJ のバックアップ」

□ 6-20 ページの「分散データベース環境での SPJ の使用法」

□ 6-25 ページの「SQL/MX リリース 1.8 から 2.0 への SPJ の移行」

523727-002J 6-1

第 6 章 SQL/MX での SPJ の管理

6

6.1 SPJ を呼び出すのための 特権の付与SPJ のセキュリティは、スキーマの所有権ルールおよび特定のユーザへの特権付与によって実装されま

す。

SPJ が登録されたスキーマが所有権の単位です。つまり、スキーマの作成者がそのスキーマとそれに関 連付けされたすべてのオブジェクトの所有者となります。SQL/MX では、スキーマの所有者および super ID は自動的に次の特権を持ちます。

□ スキーマ内の SPJ を作成・削除することができる特権

□ スキーマ内のの SPJ に対する EXECUTE および WITH GRANT OPTION 特権

SPJ を作成または削除するには、SPJ のスキーマの所有者または Super ID である必要があります。SPJ を 呼び出すには、その SPJ について EXECUTE 特権を持っている必要があります。 EXECUTE 特権を持つと、 ユーザは CALL ステートメントを発行し SPJ を呼び出すことができます。 また、 WITH GRANT OPTION 特権を持つユーザは、EXECUTE および WITH GRANT OPTION 特権を他のユーザへ付与することができ ます。

現在の所有権および特権を表示するには、 6-9 ページの「SPJ に対する特権の表示」 を参照してください。

6.1.1  SPJ に対する特権の付与

GRANT EXECUTE または GRANT ステートメントを使って、特定のユーザに SPJ の EXECUTE 特権お よび WITH GRANT OPTION 特権を付与することができます。GRANT ステートメントでは、 ALL PRIVILEGES を指定することで SPJ の EXECUTE 特権を付与することができます。GRANT EXECUTE お よび GRANT ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照し てください。

SPJ の所有者、またはこのオブジェクト所有者に代わって作業できる Super ID は、SPJ の EXECUTE お よび WITH GRANT OPTION 特権を任意のユーザに付与することができます。SPJ の所有者または Super ID でない場合、特権を他のユーザへ付与するには、事前に WITH GRANT OPTION 特権が付与されている 必要があります。

WITH GRANT OPTION 特権を持つ SPJ の所有者、またはユーザに代わって作業できる Super ID は、 EXECUTE および WITH GRANT OPTION 特権を特定のユーザへ選択的に付与することができます。SPJ の中には、機密情報やデータ変更を扱うものがあります。このような SPJ の場合、EXECUTE および WITH GRANT OPTION 特権を限定したユーザへ付与することが求められます。たとえば、ADJUSTSALARY と いう名前の SPJ は、データベース内の従業員の給与データを変更します。この SPJ を呼び出せるのは特定 のユーザに限定する必要があります。この例では、データベース管理者 (super ID) がこの SPJ の所有者に 代わって ADJUSTSALARY の EXECUTE および WITH GRANT OPTION 特権を各支店の人事部長へ付与 し、各支店の人事部長が EXECUTE 特権を各部門のマネージャへ付与しています。

-2 523727-002J

第 6 章 SQL/MX での SPJ の管理

また、場合によっては、データベース・システムのすべてのユーザが SPJ を呼び出すことが必要なこと もあります。たとえば、MONTHLYORDERS という名前の SPJ は特定の月の製品受注数を集計します。こ の SPJ は社員すべてにとって有用であり、機密情報や変更データを扱いません。したがってデータベース 管理者 (super ID) は、この SPJ の所有者の代わりに、MONTHLYORDERS のEXECUTE 特権をPUBLIC へ付与しています。これにより、現在および今後のユーザ ID すべてに EXECUTE 特権が付与されます。

GRANT EXECUTE ON samdbcat.sales.monthlyorders TO PUBLIC;

EXECUTE 特権をいったん PUBLIC へ付与すると、ユーザの一部から EXECUTE 特権を取り消すことは できません。その場合は、PUBLIC からEXECUTE 特権を取り消し、その後 EXECUTE 特権を与えない ユーザを除いた特定のユーザへEXECUTE 特権を付与します。

データベース管理者

Super ID

GRANT EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary TO "HR.MGRNA", "HR.MGREU" WITH GRANT OPTION;

人事部長北アメリカ

HR.MGRNA

人事部長ヨーロッパ

HR.MGREU

GRANT EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary TO "MKG.RAYMOND", "RD.MCKAY", "CORP.GREEN";

マネージャマーケティング部門

MKG.RAYMOND

マネージャ調査部門

RD.MCKAY

マネージャ企業部門

CORP.GREEN

523727-002J 6-3

第 6 章 SQL/MX での SPJ の管理

6

6.1.2 参照するデータベース・オブジェクトへの特権の付与

SPJ がデータベース・オブジェクトを操作する場合は、SPJ を呼び出すユーザ ID は対象のデータベース・ オブジェクトに対して適切な特権を持っている必要があります。

たとえば、テーブルからデータを選択して更新する ADJUSTSALARY という名前の SPJ の EXECUTE 特権を持つユーザは、EMPLOYEE という名前の SQL/MX テーブルに対して SELECT および UPDATE 特 権を持つ必要があります。次の例では、データベース管理者 (Super ID) は、オブジェクト所有者に代わっ て各支店の人事部長にSELECT および UPDATE のアクセス権を付与しています。

GRANT SELECT, UPDATE (salary) ON TABLE samdbcat.persnl.employee TO "HR.MGRNA", "HR.MGREU" WITH GRANT OPTION;

その後で、北米担当の人事部長は、次のように、これらのアクセス権を各部門のマネージャへ付与して

います。

GRANT SELECT, UPDATE (salary) ON TABLE samdbcat.persnl.employee TO "MKG.RAYMOND", "RD.MCKAY", "CORP.GREEN";

MONTHLYORDERS という名前の SPJ の EXECUTE 特権を持つすべてのユーザは、ORDERS テーブル に対して SELECT 特権を持つ必要があります。

GRANT SELECT ON TABLE samdbcat.sales.orders TO PUBLIC;

基本となる SPJ Java メソッドの SQL ステートメントの、SELECT、UPDATE、DELETE、INSERT と いったタイプは、参照されるデータベース・オブジェクトに対して、SELECT、UPDATE、DELETE、INSERT といったどの特権が必要であるかを記述することが求められます。前述の例については、さらに 付録 A「SPJ のサンプル」 を参照してください。

GRANT ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照して ください。SQL/MX データベース・オブジェクトに対する特権の付与についての詳細は、『SQL/MX Installation and Management Guide』を参照してください。SQL/MP データベース・オブジェクトのセキュ リティについては、『SQL/MP Installation and Management Guide』を参照してください。

6.1.3  SPJ の特権の取り消し

REVOKE EXECUTE または REVOKE ステートメントを使って、特定のユーザから SPJ の EXECUTE ま たは WITH GRANT OPTION 特権を削除することができます。REVOKE ステートメントでは、ALL PRIVILEGES を指定して、SPJ の EXECUTE 特権を取り消すことができます。REVOKE EXECUTE およ び REVOKE ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照し てください。

SPJ の所有者の場合、この SPJ に対する EXECUTE および WITH GRANT OPTION 特権を付与したすべ てのユーザから、EXECUTE および WITH GRANT OPTION 特権を取り消すことができます。特権付与者 を代行する Super ID の場合は、その特権付与者が付与した特権に関して、すべてのユーザから EXECUTE および WITH GRANT OPTION 特権を取り消すことができます。 SPJ の所有者または Super ID のいずれで もない者が他ユーザの特権を取り消すには、事前に WITH GRANT OPTION 特権を付与される必要があり、

-4 523727-002J

第 6 章 SQL/MX での SPJ の管理

特権を付与したユーザからのみ特権を取り消すことができます。

たとえば、北米担当の人事部長は、本人が特権を付与した部門マネージャのみから ADJUSTSALARY に 対する EXECUTE 特権を取り消すことができます。この例では、北米担当の人事部長は、マーケティング 部門のマネージャの EXECUTE 特権を取り消しています。

北米担当の人事部長は、ヨーロッパ担当の人事部長の EXECUTE または WITH GRANT OPTION 特権を 取り消すことはできません。この特権はSPJ の所有者に代わってデータベース管理者が付与したものであ るためです。

データベース管理者 (Super ID) は特権を付与した者に代わって、 ADJUSTSALARY の WITH GRANT OPTION 特権を持ついずれのユーザからも、その特権を取り消すことができます。この例では、データベー ス管理者は SPJ の所有者に代わって、北米担当の人事部長の WITH GRANT OPTION 特権を取り消してい

データベース管理者

Super ID

VST013.vsd

人事部長北アメリカ

HR.MGRNA

人事部長ヨーロッパ

HR.MGREU

REVOKE EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary FROM "MKG.RAYMOND";

マネージャマーケティング部門

MKG.RAYMOND

マネージャ調査部門

RD.MCKAY

マネージャ企業部門

CORP.GREEN

EXECUTE EXECUTE

WITH GRANT OPTION

EXECUTE

WITH GRANT OPTION

EXECUTE

WITH GRANT OPTION

EXECUTE

EXECUTE

523727-002J 6-5

第 6 章 SQL/MX での SPJ の管理

6

ます。

データベース管理者

Super ID

VST014.vsd

人事部長北アメリカ

HR.MGRNA

人事部長ヨーロッパ

HR.MGREU

REVOKE GRANT OPTION FOR EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary FROM "HR.MGRNA";

マネージャマーケティング部門

MKG.RAYMOND

マネージャ調査部門

RD.MCKAY

マネージャ企業部門

CORP.GREEN

EXECUTE

WITH GRANT OPTION

EXECUTE

WITH GRANT OPTION

EXECUTE

WITH GRANT OPTION

EXECUTE

EXECUTE

-6 523727-002J

第 6 章 SQL/MX での SPJ の管理

また、データベース管理者は特権を付与した者に代わって、 EXECUTE 特権を持ついずれのユーザから、 その特権を取り消すことができます。また、CASCADE オプションを使って、この EXECUTE 特権と依存 関係にあるすべての特権を持ついずれのユーザからも取り消すことができます。この例では、データベー

ス管理者は、SPJ の所有者に代わって北米担当の人事部長の EXECUTE 特権と、その人事部長が特権を与 えた配下の部門マネージャのEXECUTE 特権を取り消しています。

すべてのユーザが特権を持つ (つまり、 PUBLIC) SPJ では、 PUBLIC (すべてのユーザ) の特権を取り消 すことは可能ですが、特定のユーザの特権のみを取り消すことはできません。たとえば、次のステートメントは MONTHLYORDERS という名前の SPJ の EXECUTE 特権をすべてのユーザ (PUBLIC) から取り消 しています。

REVOKE EXECUTE ON PROCEDURE samdbcat.sales.monthlyorders FROM PUBLIC;

データベース管理者

Super ID

VST015.vsd

人事部長北アメリカ

HR.MGRNA

人事部長ヨーロッパ

HR.MGREU

REVOKE EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary FROM "HR.MGRNA" CASCADE;

マネージャマーケティング部門

MKG.RAYMOND

マネージャ調査部門

RD.MCKAY

マネージャ企業部門

CORP.GREEN

EXECUTE

WITH GRANT OPTION

EXECUTE

WITH GRANT OPTION

EXECUTEEXECUTE

EXECUTE

523727-002J 6-7

第 6 章 SQL/MX での SPJ の管理

6

6.2 SPJ に関する情報の表示SQL/MX で SPJ を管理するには、データベースにすでに登録されている SPJ に関する情報を収集する必

要があります。ここでは、次の項目に沿って、SPJ に関する情報の表示について説明していきます。

□ 6-8 ページの「カタログ内の SPJ のリスト表示」

□ 6-9 ページの「SPJ に対する特権の表示」

□ 6-12 ページの「プロシージャ・ラベルの表示」

□ 6-13 ページの「SPJ 構文の表示」

最初の 3 つの項目は、SQL/MX システム・メタデータのクエリを必要とします。SQL/MX システム・メ タデータ・テーブルについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

6.2.1 カタログ内の SPJ のリスト表示

データベースのユーザ・カタログ内のすべての SPJ の名前を表示するには、OBJECTS、SCHEMATA お よび CATSYS システム・メタデータ・テーブルへクエリを発行します。必要に応じて、クエリ結果をロ グ・ファイルに保存します。例を次に示します。

1. MXCI セッションで LOG コマンドを発行し、MXCI がクエリ結果をログ・ファイルへ出力するように します。

LOG spj_list.txt;

2. 同一の MXCI セッションで次のクエリを発行し、データベースのカタログ内のすべての SPJ をリスト します。

SELECT SUBSTRING(cat_name,1,25) AS "CATALOG", SUBSTRING(schema_name,1,25) AS "SCHEMA", SUBSTRING(object_name,1,25) AS "PROCEDURE" FROM catalog.definition_schema_version_vernum.objects ot, nonstop_sqlmx_node.system_schema.schemata st, nonstop_sqlmx_node.system_schema.catsys ct WHERE ot.object_type = 'UR' AND ot.schema_uid = st.schema_uid AND st.cat_uid = ct.cat_uid;

SQL/MX リリース 2.0 のバージョン番号 vernum は 1200 です。

3. ログ出力を停止するには、ログ・ファイルの名前を指定せずに LOG コマンドを入力します。

LOG;

-8 523727-002J

第 6 章 SQL/MX での SPJ の管理

クエリは、次に示すように、カタログ内のすべての SPJ のカタログ、スキーマ、プロシージャ名を返します。

6.2.2 SPJ に対する特権の表示

データベースのユーザ・カタログ内のすべての SPJ の所有者と特権を表示するには、 TBL_PRIVILEGES、 OBJECTS および SCHEMATA システム・メタデータ・テーブルにクエリを発行します。必要に応じて、ク エリ結果をログ・ファイルに保存します。例を次に示します。

1. MXCI セッションで LOG コマンドを発行し、MXCI がクエリ結果をログ・ファイルへ出力するように します。

LOG spj_prvlgs.txt;

2. 上と同じ MXCI セッションで次のクエリを発行して、データベースのカタログ内のすべての SPJ に関 する所有者および特権付与者の情報をリストします。

SELECT SUBSTRING(schema_name,1,8) AS "SCHEMA", SUBSTRING(object_name,1,15) AS "PROCEDURE", object_owner, grantor, grantor_type, grantee FROM catalog.definition_schema_version_vernum.objects ot, nonstop_sqlmx_node.system_schema.schemata st, catalog.definition_schema_version_vernum.tbl_privileges pr WHERE ot.object_type = 'UR' AND ot.schema_uid = st.schema_uid AND ot.object_uid = pr.table_uid;

SQL/MX リリース 2.0 のバージョン番号 vernum は 1200 です。

実際の出力については、6-10 ページの「所有者および特権付与者情報の解釈」 を参照してください。

3. 次のクエリを発行して、データベースのカタログ内のすべての SPJ に付与された特権を表示します。

SELECT SUBSTRING(schema_name,1,8) AS "SCHEMA", SUBSTRING(object_name,1,15) AS "PROCEDURE", grantee, grantee_type, privilege_type, is_grantable FROM catalog.definition_schema_version_vernum.objects ot, nonstop_sqlmx_node.system_schema.schemata st, catalog.definition_schema_version_vernum.tbl_privileges pr WHERE ot.object_type = 'UR' AND ot.schema_uid = st.schema_uid AND ot.object_uid = pr.table_uid;

SQL/MX リリース 2.0 のバージョン番号 vernum は 1200 です。

CATALOG SCHEMA PROCEDURE ------------------------- ------------------------- -------------------- SAMDBCAT PERSNL ADJUSTSALARY SAMDBCAT SALES DAILYORDERS SAMDBCAT SALES LOWERPRICE SAMDBCAT SALES MONTHLYORDERS SAMDBCAT SALES TOTALPRICE --- 5 row(s) selected.

523727-002J 6-9

第 6 章 SQL/MX での SPJ の管理

6

実際の出力については、6-10 ページの「特権情報の解釈」 を参照してください。

4. ログ出力を停止するには、ログ・ファイルの名前を指定せずに LOG コマンドを入力します。

LOG;

所有者および特権付与者情報の解釈

次の例に示すように、ステップ 10 での最初のクエリは、カタログ内のすべての SPJ に関する所有者、特 権の付与者および付与された者の情報を返します。

所有者 (OBJECT_OWNER)、付与者 (GRANTOR) および付与された者 (GRANTEE) は、ユーザ ID 番号 によって表示されます。 USER_GETINFO_ プロシージャを使って、このユーザ ID 番号に対応するユーザ 名を返すことができます。詳細は、『Guardian プロシージャ・コール・リファレンス・マニュアル』 を参照 してください。

デフォルトとして、システム (GRANTOR カラム内で -2 によって示される) は、各スキーマおよびその SPJ の作成者へ所有者特権を付与します。この例では、OBJECT_OWNER カラムに示されたユーザ ID 2053 がこれに該当します。GRANTOR_TYPE カラムは、システム (S) または ユーザ (U) のいずれが他ユーザへ の特権付与の権限を持つかを示します。

この例では、オブジェクト所有者(2053) に代わって、Super ID (65535) が MONTHLYORDERS プロシー ジャの特権を PUBLIC (GRANTEE カラム内で -1 によって示される) に付与しています。 また、オブジェ クト所有者 (2053) に代わって、Super ID が ADJUSTSALARYプロシージャの特権を HR.MGRNA (2054) および HR.MGREU (2051) へ付与しています。ハイライト表示されたローで示すように、HR.MGRNA (2054) という名前のユーザは、MKG.RAYMOND (2069)、RD.MCKAY (2068) および CORP.GREEN (2055) へ特権を付与しています。

特権情報の解釈

次の例に示すように、ステップ 3 での 2 番目のクエリは、カタログ内の各 SPJ の特権とその特権を付与

SCHEMA PROCEDURE OBJECT_OWNER GRANTOR GRANTOR_TYPE GRANTEE -------- --------------- ------------ ----------- ------------ ------ PERSNL ADJUSTSALARY 2053 -2 S 2053 PERSNL ADJUSTSALARY 2053 2054 U 2069 PERSNL ADJUSTSALARY 2053 2054 U 2068 PERSNL ADJUSTSALARY 2053 2054 U 2055 PERSNL ADJUSTSALARY 2053 2053 U 2054 PERSNL ADJUSTSALARY 2053 2053 U 2051 SALES DAILYORDERS 2053 -2 S 2053 SALES LOWERPRICE 2053 -2 S 2053 SALES MONTHLYORDERS 2053 -2 S 2053 SALES MONTHLYORDERS 2053 2053 U -1 SALES TOTALPRICE 2053 -2 S 2053 --- 11 row(s) selected.

-10 523727-002J

第 6 章 SQL/MX での SPJ の管理

された者に関する情報を返します。

特権を付与された者がユーザ ID 番号によって表示されます。USER_GETINFO_ プロシージャを使って、 このユーザ ID 番号に対応するユーザ名を返すことができます。詳細は、『Guardian プロシージャ・コー ル・リファレンス・マニュアル』を参照してください。

デフォルトとして、各 SPJ の所有者 (この例では、2053) は次の特権をもっています。

□ EXECUTE 特権 (PRIVILEGE_TYPE カラムに E の表示)

□ WITH GRANT OPTION 特権 ( IS_GRANTABLE カラムに Y の表示)

この例では、次のユーザは、 ADJUSTSALARY プロシージャに対して EXECUTE (E) および WITH GRANT OPTION (Y) 特権を持ちます。

□ SPJ 所有者 (2053)

□ Super ID (65535)

□ HR.MGRNA (2054)

□ HR.MGREU (2051)

次のユーザは、 ADJUSTSALARY プロシージャに対して EXECUTE (E) 特権を持ちますが、 WITH GRANT OPTION (N) 特権は持っていません。

□ MKG.RAYMOND (2069)

□ RD.MCKAY (2068)

□ CORP.GREEN (2055)

ハイライト表示されたローで示すように、このシステムの全ユーザ (つまり、PUBLIC ユーザ) は、 MONTHLYORDERS プロシージャの EXECUTE (E) 特権を持ちます。GRANTEE_TYPE カラムは、特権 が付与された者が、Public (P) または User (U) のいずれであるかを示します。

SCHEMA PROCEDURE GRANTEE GRANTEE_TYPE PRIVILEGE_TYPE IS_GRANTABLE -------- -------------- -------- ------------ -------------- ------------ PERSNL ADJUSTSALARY 2053 U E Y PERSNL ADJUSTSALARY 2069 U E N PERSNL ADJUSTSALARY 2068 U E N PERSNL ADJUSTSALARY 2055 U E N PERSNL ADJUSTSALARY 2054 U E Y PERSNL ADJUSTSALARY 2051 U E Y SALES DAILYORDERS 2053 U E Y SALES LOWERPRICE 2053 U E Y SALES MONTHLYORDERS 2053 U E Y SALES MONTHLYORDERS -1 P E N SALES TOTALPRICE 2053 U E Y --- 11 row(s) selected.

523727-002J 6-11

第 6 章 SQL/MX での SPJ の管理

6

6.2.3 プロシージャ・ラベルの表示

プロシージャ・ラベルは、SPJ 上の特権を追跡するために SQL/MX が内部的に使用します。SQL/MX は、各 SPJ につき 1 つのプロシージャ・ラベルを生成します。SPJ を正常に呼び出すには、プロシージャ・ ラベルは必ず存在し、利用可能になっている必要があります。プロシージャ・ラベルの場所を把握するこ

とは、分散データベース環境で SPJ を使用する場合には特に重要になります。詳細は、6-20 ページの「分 散データベース環境での SPJ の使用法」 を参照してください。

特定の SPJ のプロシージャ・ラベルの表示

特定の SPJ のプロシージャ・ラベルの場所を表示するには、SHOWDDL コマンドを使用します。 たとえ ば、MXCI セッションで次の SHOWDDL コマンドを発行したとします。

SHOWDDL PROCECURE samdbcat.sales.lowerprice;

次の例に示すように、SHOWDDL コマンドは LOCATION 句内にプロシージャ・ラベルの場所に関する 情報を返します。

SHOWDDL コマンドについての詳細は、6-13 ページの「SPJ 構文の表示」 を参照してください。

カタログ内の全 SPJ のプロシージャ・ラベルの表示

データベースのユーザ・カタログ内のすべての SPJ のプロシージャ・ラベルの場所を表示するには、次 のように、OBJECTS、SCHEMATA および REPLICAS メタデータ・テーブルへクエリを発行します。

SELECT SUBSTRING(schema_name,1,8) AS "SCHEMA", SUBSTRING(object_name,1,15) AS "PROCEDURE", system_name, data_source, file_suffix FROM catalog.definition_schema_version_vernum.objects ot, nonstop_sqlmx_node.system_schema.schemata st, catalog.definition_schema_version_vernum.replicas rt WHERE ot.object_type = 'UR' AND ot.schema_uid = st.schema_uid AND ot.object_uid = rt.object_uid;

SQL/MX リリース 2.0 のバージョン番号 vernum は、1200 です。

次に示すように、クエリは、スキーマ名 (SCHEMA)、プロシージャ名 (PROCEDURE)、ノード名 (SYSTEM_NAME)、ボリューム名 (DATA_SOURCE) 、サブボリュームとファイル名 (FILE_SUFFIX) を

CREATE PROCEDURE SAMDBCAT.SALES.LOWERPRICE ( ) EXTERNAL NAME 'Sales.lowerPrice ()' EXTERNAL PATH '/usr/mydir/myclasses' LOCATION \KINGPIN.$TX0115.ZSDX7KT4.SL9FSB00 LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA NOT DETERMINISTIC ISOLATE ; --- SQL operation complete.

-12 523727-002J

第 6 章 SQL/MX での SPJ の管理

返します。

6.2.4 SPJ 構文の表示

SPJ の CREATE PROCEDURE 構文をシステム・メタデータ内の内容と同様に表示するには、SHOWDDL コマンドを使用します。SHOWDDL コマンドは SPJ に関するメタデータの記述を生成し、MXCI セッショ ンで表示します。

SHOWDDL コマンドを使用することで、SQL/MX の以前の製品バージョンから現在のシステムへと移行 した SPJ についての情報を表示することができます。詳細は、6-25 ページの「SQL/MX リリース 1.8 から 2.0 への SPJ の移行」 を参照してください。

また、SHOWDDL コマンドを使用して SPJ の複製を作成することができます。詳細は、6-17 ページの 「CREATE PROCEDURE ステートメントの再生成」 を参照してください。

SHOWDDL コマンドの使用法

ADJUSTSALARY という名前の SPJ についての情報を表示するには、次のように MXCI セッションで SHOWDDL コマンドを発行します。

SHOWDDL PROCEDURE samdbcat.persnl.adjustsalary;

SHOWDDL コマンドの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照してく ださい。

SHOWDDL コマンドの出力

SHOWDDL コマンドは、次の形式で、SPJ についての情報を表示します。

SCHEMA PROCEDURE SYSTEM_NAME DATA_SOURCE FILE_SUFFIX -------- --------------- ----------- ----------- ------------------ PERSNL ADJUSTSALARY \KINGPIN $TX0115 ZSDPK4GV.Q85DXB00 SALES DAILYORDERS \KINGPIN $TX0115 ZSDX7KT4.N71HTB00 SALES LOWERPRICE \KINGPIN $TX0115 ZSDX7KT4.SL9FSB00 SALES MONTHLYORDERS \KINGPIN $TX0115 ZSDX7KT4.G13HVB00 SALES TOTALPRICE \KINGPIN $TX0115 ZSDX7KT4.T4BGWB00 --- 5 row(s) selected.

CREATE PROCEDURE catalog-name.schema-name.procedure-name ( [sql-parameter [{, sql-parameter}...]] ) EXTERNAL NAME 'java-method-name (java-signature)' EXTERNAL PATH 'class-or-JAR-file-path' LOCATION procedure-label LANGUAGE JAVA PARAMETER STYLE JAVA {NO SQL | MODIFIES SQL DATA | READS SQL DATA | CONTAINS SQL} {DETERMINISTIC | NOT DETERMINISTIC} {NO ISOLATE | ISOLATE} ;

523727-002J 6-13

第 6 章 SQL/MX での SPJ の管理

6

SHOWDDL の出力と CREATE PROCEDURE ステートメントの相違

SHOWDDL コマンドの出力は、次の点でオリジナルの CREATE PROCEDURE ステートメントと異なり ます。

□ SHOWDDL コマンドは、LOCATION、CONTAINS SQL、NOT DETERMINISTIC、ISOLATE などの オプション句を省略しない。

□ SHOWDDL コマンドは、つねに SPJ の Java シグニチャを生成する。

□ SHOWDDL コマンドは、PIC S9 の代わりに DECIMAL または NUMERIC データ・タイプを表示しま す。PIC S9 が SQL パラメータとして指定された場合は、SQL/MX は PIC S9 をこのいずれかのデー タ・タイプとして保存します。

□ SHOWDDL コマンドは、PIC X の代わりに CHARACTER データ・タイプを表示します。PIC X が SQL パラメータとして指定された場合は、SQL/MX は PIC X を CHAR データ・タイプとして保存し ます。

□ SHOWDDL コマンドは、NCHAR データ・タイプを CHARACTER SET 修飾子として UCS2 (または ISO88591、KANJI または KSC5601) の CHAR タイプとして表示する。

□ すべての ANSI 名は、完全修飾される。

□ すべての物理的なロケーション名は、完全に拡張される。

6-14 ページの「SHOWDDL 出力の例」 を参照してください。

SHOWDDL 出力の例

ADJUSTSALARY という名前の SPJ に対する SHOWDDL コマンドは、次の出力を返します。

ADJUSTSALARY およびその基本となる SPJ Java メソッド adjustSalary() についての詳細は、付録 A「SPJ のサンプル」 を参照してください。

CREATE PROCEDURE SAMDBCAT.PERSNL.ADJUSTSALARY ( IN EMPNUM NUMERIC(4) , IN PERCENT DOUBLE PRECISION , OUT NEWSALARY NUMERIC(8,2) ) EXTERNAL NAME 'Payroll.adjustSalary (java.math.BigDecimal,double,java.math.BigDecimal[])' EXTERNAL PATH '/usr/mydir/myclasses' LOCATION \KINGPIN.$TX0115.ZSDPK4GV.Q85DXB00 LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA NOT DETERMINISTIC ISOLATE ; --- SQL operation complete.

-14 523727-002J

第 6 章 SQL/MX での SPJ の管理

6.3 OBEY コマンド・ファイルを使った SPJ ステートメントの保存OBEY コマンド・ファイル内に SPJ ステートメントを保存することができます。この方法によって、SPJ

を迅速かつ容易に作成、削除、再登録し、必要に応じて SPJ の特権を付与したり取り消したりすることが できます。

6.3.1 OBEY コマンド・ファイル

OBEY コマンド・ファイルは、OSS テキスト・ファイル (奇数非構造化ファイル、タイプ 180) または Guardian EDIT ファイル (タイプ 101) のいずれかを選ぶことができます。OBEY コマンドについての詳細 は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

OBEY コマンド・ファイル内の CREATE PROCEDURE ステートメント

この例では次に示すように、OBEY コマンド・ファイル createprocs.sql は、一連の CREATE PROCEDURE ステートメントを含んでいます。

OBEY コマンド・ファイルを使用して SPJ を作成するには、次のように、MXCI で OBEY コマンドを発 行します。

OBEY createprocs.sql;

注.CREATE PROCEDURE ステートメントを正常に稼動するには、SPJ の Java バイトコードがディスク 上に存在する必要があります。

?SECTION "CREATE SALES SPJs" CREATE PROCEDURE samdbcat.sales.lowerprice() EXTERNAL NAME 'Sales.lowerPrice' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA; ... ?SECTION "CREATE PERSNL SPJs" CREATE PROCEDURE samdbcat.persnl.adjustsalary(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2)) EXTERNAL NAME 'Payroll.adjustSalary' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA; ...

523727-002J 6-15

第 6 章 SQL/MX での SPJ の管理

6

OBEY コマンド・ファイル内の DROP PROCEDURE ステートメント

同一または別の OBEY コマンド・ファイルを使って、一連の SPJ を削除することができます。この例で は次に示すように、OBEY コマンド・ファイル dropprocs.sql は一連の DROP PROCEDURE ステート メントを含んでいます。

SPJ を削除するには、 次のように、MXCI で OBEY コマンドを発行します。

OBEY dropprocs.sql "DROP SALES SPJs";

OBEY コマンド・ファイル内の GRANT EXECUTE ステートメント

同一または別の OBEY コマンド・ファイルを使って、一連の SPJ に特権を付与することができます。こ の例では次に示すように、OBEY コマンド・ファイル grantprocs.sql は、一連の GRANT EXECUTE ステートメントを含んでいます。

SPJ に特権を付与するには、次のように、MXCI で OBEY コマンドを発行します。

OBEY grantprocs.sql "GRANT SALES SPJs";

?SECTION "DROP SALES SPJs" DROP PROCEDURE samdbcat.sales.lowerprice; DROP PROCEDURE samdbcat.sales.dailyorders; DROP PROCEDURE samdbcat.sales.monthlyorders; DROP PROCEDURE samdbcat.sales.totalprice; ?SECTION "DROP PERSNL SPJs" DROP PROCEDURE samdbcat.persnl.adjustsalary;

?SECTION "GRANT SALES SPJs" GRANT EXECUTE ON samdbcat.sales.monthlyorders TO PUBLIC; GRANT SELECT ON TABLE samdbcat.sales.orders TO PUBLIC; ?SECTION "GRANT PERSNL SPJs" GRANT EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary TO "HR.MGRNA", "HR.MGREU" WITH GRANT OPTION; GRANT SELECT, UPDATE(salary) ON TABLE samdbcat.persnl.employee TO "HR.MGRNA", "HR.MGREU" WITH GRANT OPTION;

-16 523727-002J

第 6 章 SQL/MX での SPJ の管理

OBEY コマンド・ファイル内の REVOKE EXECUTE ステートメント

同一または別の OBEY コマンド・ファイルを使って、一連の SPJ の特権を取り消すことができます。例 えば、OBEY コマンド・ファイル revokeprocs.sql は一連の REVOKE EXECUTE ステートメントを含 んでいます。

SPJ の特権を取り消すには、次のように、MXCI で OBEY コマンドを発行します。

OBEY revokeprocs.sql "REVOKE SALES SPJs";

6.3.2 CREATE PROCEDURE ステートメントの再生成

新規または既存の OBEY コマンド・ファイル内で、SHOWDDL コマンドを使って登録された SPJ の CREATE PROCEDURE ステートメントを再生成することができます。

1. MXCI セッションで、LOG コマンドを発行し MXCI が SHOWDDL コマンドの結果をログ・ファイル へ出力するようにします。

LOG createprocs.sql;

2. 同じ MXCI セッションで、 データベース内の特定の SPJ に対して SHOWDDL コマンドを発行します。

SHOWDDL PROCEDURE samdbcat.sales.dailyorders; SHOWDDL PROCEDURE samdbcat.sales.monthlyorders; ...

SHOWDDL コマンドの構文については、『NonStop SQL/MX リファレンス・マニュアル』を参照してく ださい。

3. ログ出力を停止するには、ログ・ファイルの名前を指定せずに LOG コマンドを入力します。

LOG;

?SECTION "REVOKE SALES SPJs" REVOKE EXECUTE ON PROCEDURE samdbcat.sales.monthlyorders FROM PUBLIC; REVOKE SELECT ON TABLE samdbcat.sales.orders FROM PUBLIC; ?SECTION "REVOKE PERSNL SPJs" REVOKE GRANT OPTION FOR EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary FROM "HR.MGRNA", "HR.MGREU" CASCADE; REVOKE EXECUTE ON PROCEDURE samdbcat.persnl.adjustsalary FROM "HR.MGRNA", "HR.MGREU" CASCADE; REVOKE SELECT, UPDATE(salary) ON TABLE samdbcat.persnl.employee FROM "HR.MGRNA", "HR.MGREU" CASCADE;

523727-002J 6-17

第 6 章 SQL/MX での SPJ の管理

6

4. 必要に応じて SHOWDDL コマンドを削除したり CREATE PROCEDURE ステートメントを変更して、 ログ・ファイルを編集します。

この例では、太文字部分のテキストをログ・ファイルから削除する必要があります。 SHOWDDL コマ ンドの出力は、必ずしも、オリジナルの CREATE PROCEDURE ステートメントと完全に一致するもの ではありません。詳細は、6-14 ページの「SHOWDDL の出力と CREATE PROCEDURE ステートメン トの相違」 を参照してください。

他の OBEY コマンド・ファイルと同様に、編集したログ・ファイルを使って、必要に応じて、SPJ を再 作成することができます。詳細は、6-15 ページの「OBEY コマンド・ファイル内の CREATE PROCEDURE ステートメント」 を参照してください。

>>showddl procedure samdbcat.sales.dailyorders; CREATE PROCEDURE SAMDBCAT.SALES.DAILYORDERS ( IN DATE , OUT NUMBER INTEGER ) EXTERNAL NAME 'Sales.numDailyOrders (java.sql.Date,java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myclasses' LOCATION \KINGPIN.$TX0115.ZSDX7KT4.N71HTB00 LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA NOT DETERMINISTIC ISOLATE ; --- SQL operation complete. >>showddl procedure samdbcat.sales.monthlyorders; CREATE PROCEDURE SAMDBCAT.SALES.MONTHLYORDERS ( IN INTEGER , OUT NUMBER INTEGER ) EXTERNAL NAME 'Sales.numMonthlyOrders (int,java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myclasses' LOCATION \KINGPIN.$TX0115.ZSDX7KT4.G13HVB00 LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA NOT DETERMINISTIC ISOLATE ; --- SQL operation complete. >>log;

-18 523727-002J

第 6 章 SQL/MX での SPJ の管理

6.4 SPJ のバックアップSPJ のバックアップは、データベース全体のバックアップとリカバリ作業の一部として行う必要があり

ます。このリカバリ作業には、次のファイルを他のディスク、磁気テープ、または他のシステムなどの安

全な場所に定期的に保存することが含まれます。

□ CREATE PROCEDURE ステートメント (またはこれに相当する SQL/MX メタデータ)

□ SPJ の Java バイトコードを含む Java クラスまたは JAR ファイル

データベース・ファイルのバックアップおよびリカバリに関しての包括的な方法については、『SQL/MXInstallation and Management Guide』を参照してください。

523727-002J 6-19

第 6 章 SQL/MX での SPJ の管理

6

6.5 分散データベース環境での SPJ の使用法SPJ を分散データベース環境で実行するには、SPJ が作成されたカタログが、このカタログにアクセスが

必要なすべてのリモート・ノードから見えていなければなりません。つまり、各ノードのユーザが SPJ を 呼び出すには、それぞれのノードからSPJ のカタログが見えるようにしておく必要があります。

カタログをリモート・ノードから見えるようにするには、カタログが見えているノードでローカル・ノー

ドと同様に REGISTER CATALOG ステートメントを発行してカタログをリモート・ノードに登録する必要が

あります。REGISTER CATALOG ステートメントの構文については、『NonStop SQL/MX リファレンス・マニュ アル』を参照してください。分散データベース環境の管理方法については、『SQL/MX Installation and Management Guide』 を参照してください。

分散データベース環境において、SQL/MX は SPJ の基となる Java バイトコードの複製または配布を行い ません。ローカル・ノードでSPJ を作成し、リモート・ノードでこの SPJ を呼び出すには、次の方法のい ずれかを用いる必要があります。

□ 6-21 ページの「Java バイトコードのリモート・ノードへのコピー」

□ 6-23 ページの「外部パスでのノードの指定」

分散データベース環境では、SPJ が依存する非システム Java クラスも利用できるようにする必要があり ます。詳しくは、 6-24 ページの「非システム Java クラスの配布」 を参照してください。

-20 523727-002J

第 6 章 SQL/MX での SPJ の管理

6.5.1 Java バイトコードのリモート・ノードへのコピー

SPJ に必要なすべての Java バイトコードをローカル・ノード (たとえば、\NODEA) からリモート・ノー ドの同一の OSS ディレクトリへコピーする方法があります。デフォルトでは、Java バイトコードの相対パ スのみが SQL/MX システム・メタデータに保存されます。このため、リモート・ノード \NODEB のアプリ ケーションが SPJ を呼び出すと、JVM は \NODEB 上のOSS ディレクトリ内の Java バイトコードを探し ます。次の 図 6-8 を参照してください。

図 6-8 Java バイトコードのリモート•ノードへのコピー

OSS ディレクトリ:/usr/mydir/myclasses

クラス・ファイル:Sales.lowerPrice

NONSTOP_SQLMX_NODEB.SYSTEM_SCHEMA テーブル

SAMDBCAT は見えている。

VST009.vsd

\NODEB

SAMDBCAT 内のSQL/MXメタデータ・テーブル

\NODEA

CREATE PROCEDURE samdbcat.sales.lowerprice()EXTERNAL NAME 'Sales.lowerPrice'EXTERNAL PATH '/usr/mydir/myclasses'LANGUAGE JAVAPARAMETER STYLE JAVAMODIFIES SQL DATA;

SPJ の Java バイトコードをリモート・ノード \NODEB へコピーする。

2

\NODEA から、SAMDBCATをリモート・ノード \NODEB に登録する。

1

NODEA 上に SAMDBCAT を作成する。

3

NONSTOP_SQLMX_NODEA.SYSTEM_SCHEMA テーブル

SAMDBCAT ユーザ・カタログ

OSS ディレクトリ:/usr/mydir/myclasses

クラス・ファイル:Sales.lowerPrice

SQL/MX は、外部パスのロケーションを含む SPJについての情報を SQL/MX メタデータ・テーブルに保存する。

523727-002J 6-21

第 6 章 SQL/MX での SPJ の管理

6

Java バイトコードをコピーすることの利点

この方法の利点は、ノード間での依存関係がより少なくなることです。ネットワークが切断された場合、 または 1 つのノード (たとえば、\NODEA) がダウンした場合でも、静的にコンパイルされたアプリケーショ ンは、SPJ のプロシージャ・ラベルがアクセスできる限り、残りのノード (たとえば、\NODEB) で 、SPJ を 実行することができます。

SPJ のプロシージャ・ラベルは、呼び出し元のアプリケーションと同じノード (この場合は、\NODEB) に存 在するか、またはダウンしていない接続中のリモート・ノード (たとえば、\NODEC) に存在する場合は使用可 能です。SPJ のプロシージャ・ラベルが使用できない場合 (たとえば、\NODEA 上に存在する場合) 、SPJ を呼 び出す CALL ステートメントは失敗します。SPJ のプロシージャ・ラベルについては、4-3 ページの「ストア ド・プロシージャのネーミング」 および 6-12 ページの「プロシージャ・ラベルの表示」 を参照してください。

現在は、SQL/MX は他ノードへのメタデータの複製を認めていません。そのため、SQL/MX はローカ ル・ノードの自律性に限定されています。詳しくは、『SQL/MX Installation and Management Guide』を参照 してください。

Java バイトコードをコピーすることの欠点

この方法の欠点は、Java バイトコードを複数のノードでメンテナンスする必要があることです。つまり、 1 つのノードで Java バイトコードを変更し、再コンパイルすると、他のノードでも同じ操作を行う必要が あります。この作業を行わない場合、SPJ は分散データベース環境で一貫性のない動作をすることになり ます。

-22 523727-002J

第 6 章 SQL/MX での SPJ の管理

6.5.2 外部パスでのノードの指定

ノード名で始まる外部パスを使用して SPJ を登録する方法があります。それには、CREATE PROCEDURE ステートメントの EXTERNAL PATH 句にフル・パス (たとえば、 /E/NODEA/usr/mydir/myclasses) を指定します。Java バイトコードのフル・パスがSQL/MX システ ム・メタデータに保存されます。詳しくは次の 図 6-9 を参照してください。

リモート・ノード \NODEB 上のアプリケーションが SPJ を呼び出すと、JVM は \NODEA の /E/NODEA/usr/mydir/myclasses ディレクトリ内の Java バイトコードを探します。SPJ Java 環境内の JVM は、CALL ステートメントを発行したノードにかかわらず、EXTERNAL PATH 句で指定されたノー ドの OSS ディレクトリから Java バイトコードのロードを試みます。

図 6-9 外部パスでのノード指定

NONSTOP_SQLMX_NODEB.SYSTEM_SCHEMA テーブル

SAMDBCAT は見えている。

VST010.vsd

\NODEB

SAMDBCAT 内のSQL/MXメタデータ・テーブル

\NODEA

CREATE PROCEDURE samdbcat.sales.lowerprice()EXTERNAL NAME 'Sales.lowerPrice'EXTERNAL PATH ' /E/NODEA/usr/mydir/myclasses 'LANGUAGE JAVAPARAMETER STYLE JAVAMODIFIES SQL DATA;

\NODEA から、SAMDBCATをリモート・ノード \NODEB に登録する。

1

\NODEA の SAMDBCAT 内に SPJ を作成し、EXTERNAL PATH 句内にこのノード名 \NODEA を指定する。

2

NONSTOP_SQLMX_NODEA.SYSTEM_SCHEMA テーブル

SAMDBCAT ユーザ・カタログ

OSS ディレクトリ:/usr/mydir/myclasses

クラス・ファイル:Sales.lowerPrice

SQL/MX は、外部パスのロケーションを含む SPJについての情報を SQL/MX メタデータ・テーブルに保存する。

523727-002J 6-23

第 6 章 SQL/MX での SPJ の管理

6

ノード指定における利点

Java バイトコードが 1 つの場所にしか存在しないため、複数ノードでのメンテナンスの必要がありませ ん。

ノード指定における欠点

この方法を使用すると、ローカル・ノードの自律性を犠牲にすることになります。たとえば、 \NODEB で 稼動するアプリケーションが正常に機能するには、 \NODEA 上に保存された Java バイトコードに依存しま す。したがって、 \NODEB が \NODEA から切断されると、\NODEA 上の SPJ を呼び出す \NODEB のアプリ ケーションは動かなくなります。

また、この方法は、ローカル・ノードではなく、リモート・ノードから Java バイトコードをロードする ため、ロードにかかるオーバーヘッドが発生することになります。

6.5.3 非システム Java クラスの配布

分散データベース環境の SPJ Java メソッドが外部パスの外の非システム Java クラスに依存している場 合、これらのクラスをリモート・ノード上の同一の OSS ディレクトリにコピーするか、またはクラス・パ ス内にこれらのクラスのフル・パスを含めることが必要になります。クラス・パスの設定の仕方について

は、2-25 ページの「クラス・パスの設定」 を参照してください。

-24 523727-002J

第 6 章 SQL/MX での SPJ の管理

6.6 SQL/MX リリース 1.8 から 2.0 への SPJ の移行SQL/MX リリース 1.8 データベースの SPJ を SQL/MX リリース 2.0 データベースで使用するには、SPJ

のメタデータを移行する必要があります。migrate ユーティリティを使って、SQL/MP 環境の PROCS テー ブルから SQL/MX 環境の ROUTINES および TEXT テーブルへ、SQL/MP 環境の PARAMS テーブルから SQL/MX 環境の COLS テーブルへ、それぞれメタデータをコピーします。

SQL/MX リリース 2.0 をインストールし、SQL/MX リリース 2.0 データベース内にカタログおよびスキー マを作成したのち、ただちに migrate ユーティリティを使用する必要があります。

システム・デフォルト、SQL/MP エイリアス、ODBC/MX (MXCS) メタデータ、エイリアスおよびホー ルバック時の考慮などを含む完全なメタデータの移行については、『SQL/MX Installation and Management Guide』を参照してください。

6.6.1 SPJ の移行のための要件

SPJ の移行を行うには、以下の要件が求められます。

□ SQL/MX リリース 1.8 から SQL/MX リリース 2.0 へアップグレードされていること

□ HP NonStop Transaction Management Facility (TMF) がシステム上にインストールされ、起動されてい ること

□ PROCS および PARAMS テーブルが、 SQL/MX リリース 2.0 と同一ノードの SQL/MP 環境に存在して いること

□ 対応するカタログおよびスキーマが、SQL/MX リリース 2.0 データベースのシステム・メタデータ内 に存在していること

□ Super ID を使用し、SPJ Java メソッドを含んでいる Java クラス・ファイルまたは JAR ファイルへの読 み取りアクセス権をもっていること

6.6.2 SQL/MX リリース 1.8 から 2.0 への SPJ の移行手順

migrate ユーティリティは OSS コマンド・ラインでのみ実行可能で、また、大文字・小文字を区別します。

1. SQLCI セッションで、GET CATALOG OF SYSTEM コマンドを発行して、 PROCS および PARAMS テーブルが存在する SQL/MP システム・カタログのボリュームとサブボリュームを表示します。

GET CATALOG OF SYSTEM;

2. OSS 環境で、次のように SQL/MP システム・カタログのボリュームとサブボリュームに関する環境変 数を設定します。

export SQLMX_NAMETYPE=NSK

export NSK_VOL=\$vol

export NSK_SUBVOL=subvol

vol と subvol は PROCS および PARAMS テーブルが存在するボリュームおよびサブボリュームの 名前です。

523727-002J 6-25

第 6 章 SQL/MX での SPJ の管理

6

3. 移行する SPJ を特定するために、 migrate ユーティリティの SHOW PROCS コマンドを使って PROCS テーブル内に存在する SPJ エントリを表示し、この情報をファイルへ出力します。

/usr/tandem/sqlmx/bin: migrate SHOW PROCS > spj_info.out

このコマンドにより、次の結果が表示されます。

4. migrate ユーティリティの PRELIMINARY_REPORT コマンドを使って、移行する SPJ の相違点を チェックして、レポートとしてこの情報をファイルへ出力します。

/usr/tandem/sqlmx/bin: migrate PRELIMINARY_REPORT > reprt.out

上記のコマンドは、次の結果を表示します。

PRELIMINARY REPORT コマンドは、移行する SPJ に対して次の 2 つのタイプの相違点を表示します。

SHOW: The following PROCS exist in the MP catalog... ... Procedure PUBS.SUSAN.PRNTMETH Procedure PUBS.SUSAN.STARS1 Procedure PUBS.SUSAN.STARS2 Procedure PUBS.SUSAN.STARS3 Procedure PUBS.SUSAN.STARS4 -------------------------------------------------------------------------- SHOW: Summary of Show Scan. PROCS entries: 443 entries available for migration. --------------------------------------------------------------------------

PRELIMINARY_REPORT: Checking for missing catalogs and schemas for MPALIAS Migration... ... PRELIMINARY_REPORT: Checking for missing Guardian files for MPALIAS Migration... \POOH.$MXQA01.SQL.OPTABLE does not exist and is referenced. ... PRELIMINARY_REPORT: Checking for missing SQL/MP tables for ODBC Migration... All necessary ODBC tables exist. PRELIMINARY_REPORT: Checking for missing catalogs and schemas for PROCS Migration... PUBS.SUSAN: CATALOG AND SCHEMA DO NOT EXIST IN THE MX ENVIRONMENT PRELIMINARY_REPORT: Checking for missing OSS files for PROCS Migration... /PUB/susan/PrintTest.class does not exist and is referenced. Check jar files for class. /PUB/susan/ErrorTesting.class does not exist and is referenced. Check jar files for class. /PUB/susan/ErrorTesting.class does not exist and is referenced. Check jar files for class. /PUB/susan/ErrorTesting.class does not exist and is referenced. Check jar files for class. /PUB/susan/ErrorTesting.class does not exist and is referenced. Check jar files for class. -------------------------------------------------------------------------- PRELIMINARY_REPORT: Summary of Preliminary Scan Unique Catalogs and Schemas: 112 out of 142 need to be resolved. SQLMP ALIAS Migration-Guardian Name Space Files: 472 out of 5839 files missing. ODBC Catalog Tables are available: 0 out of 5 tables missing. PROCS Migration-OSS Name Space Files: 7 out of 443 files missing. --------------------------------------------------------------------------

-26 523727-002J

第 6 章 SQL/MX での SPJ の管理

□ SQL/MX に存在しないカタログまたはスキーマへの PROCS テーブル内での参照

□ ディスク上に物理的に存在しないクラスまたは JAR ファイルへの PROCS テーブル内での参照

5. 相違点を見つけた場合、または SPJ を選択的に移行したい場合は、次のように migrate ユーティリ ティの SHOW SCRIPT コマンドを使ってスクリプト・ファイルを生成します。

/usr/tandem/sqlmx/bin: migrate SHOW PROCS SCRIPT spj_script.out CLEAR

上記のコマンドは、PROCS テーブル内のすべての SPJ のCREATE PROCEDURE ステートメントを含 むスクリプト・ファイル (この例では spj_script.out) を生成します。PROCS テーブル内のメタ データは、このコマンドの実行中および実行後もそのままの状態で維持されます。

スクリプト・ファイルの名前および OSS の場所を指定していない場合は、スクリプト・ファイルはデ フォルトで現在のディレクトリの script.out になります。既存のスクリプト・ファイルを指定する 場合は、migrate ユーティリティにメタデータを追加する前に、CLEAR オプションを使って この既存 のスクリプト・ファイルの内容をクリアするように指示します。スクリプト・ファイルがすでに存在していて CLEAR オプションを指定しなかった場合は、 migrate ユーティリティは script.out を使 用します。

6. スクリプト・ファイルを編集して相違点を修正するか、または SPJ を削除します。

必要に応じて CREATE PROCEDURE ステートメントを修正するか、または削除します。たとえば、次 のようにカタログ、スキーマ、Java クラスまたは JAR ファイル・パス名を変更して、CREATE PROCEDURE ステートメントを修正します。

7. Java クラスまたは JAR ファイルが指定の OSS ディレクトリに存在するかをチェックします。

注.スクリプト・ファイル内の CREATE PROCEDURE ステートメントを正常に実行するには、 SPJ のJava バイトコードがディスク上に存在している必要があります。

8. migrate ユーティリティの EXECUTE コマンドを使って、SPJ エントリを SQL/MP メタデータから SQL/MX メタデータへ移行します。

□ 直接すべての SPJ を PROCS テーブルから移行するには、次のように、migrate ユーティリティ の EXECUTE コマンドを入力します。

/usr/tandem/sqlmx/bin: migrate EXECUTE PROCS ERROR_LOG spj_errors.out

CLEAR

□ スクリプト・ファイル内の SPJ のみを移行するには、次のように、migrate ユーティリティの

CREATE PROCEDURE SAMDBCAT.PERSNL.PRNTMETH( IN INT SIGNED ) external name 'PrintTest.starsWithException(int)' external path '/PUB/susan/spj_errors' language JAVA parameter style JAVA contains SQL not deterministic isolate; CREATE PROCEDURE SAMDBCAT.SALES.STARS1( IN INT SIGNED ) external name 'ErrorTesting.starsWithException1(int)' external path '/PUB/susan/spj_errors' language JAVA parameter style JAVA contains SQL not deterministic isolate; CREATE PROCEDURE PUBS.SUSAN.STARS2( IN INT SIGNED ) external name 'ErrorTesting.starsWithException2(int)' external path '/PUB/susan' language JAVA parameter style JAVA contains SQL not deterministic isolate;

523727-002J 6-27

第 6 章 SQL/MX での SPJ の管理

6

EXECUTE コマンドを入力します。

/usr/tandem/sqlmx/bin: migrate EXECUTE SCRIPT spj_script.out ERROR_LOG

spj_errors.out CLEAR

注.OBEY コマンド・ファイルとしてスクリプト・ファイルを実行することもできます。OBEY コマンド については、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

エラー・ログ・ファイルの名前および OSS の場所を指定していない場合は、エラー・ログ・ファイル のデフォルトは、現在のディレクトリの error_log.out になります。既存のエラー・ログ・ファイ ルを指定する場合は、移行エラー情報が追加される前に、CLEAR オプションを使って migrate ユー ティリティが既存のエラー・ログ・ファイルの内容をクリアするように指示します。エラー・ログ・ファイルがすでに存在していて CLEAR オプションを指定しなかった場合は、 migrate ユーティリ ティは error_log.out を使用します。

9. エラー・ログ・ファイル内のエラーを確認して、修正します。

migrate EXECUTE コマンドは、次のように SQL/MX リリース 2.0 への移行を失敗したメタデータ・ エントリについての情報を収集し、エラー・ログ・ファイルにこの情報を記録します。

スクリプト・ファイル内のエラーを修正し、EXECUTE SCRIPT コマンドを実行して、以前エラーになっ たメタデータを移行します。詳しくはステップ 5、6、8 を参照してください。

10. GRANT EXECUTE または GRANT ステートメントを発行して、移行した SPJ のセキュリティおよび特 権を設定します。詳細は、6-2 ページの「SPJ を呼び出すのための 特権の付与」 を参照してください。

注. SQL/MX リリース 1.8 でサロゲート・ファイルを使用して設定した SPJ のセキュリティ設定または特 権は SQL/MX リリース 2.0 に移行されません。

システム・デフォルト、SQL/MP エイリアス、ODBC/MX (MXCS) メタデータ、およびホールバック時 の考慮などを含む完全なメタデータの移行については、『SQL/MX Installation and Management Guide』を参 照してください。また、migrate ユーティリティの構文については、『NonStop SQL/MX リファレンス・マ ニュアル』を参照してください。

== Error occurred: 2 CREATE PROCEDURE PUBS.SUSAN.STARS2( IN INT SIGNED ) external name 'ErrorTesting.starsWithException2(int)' external path '/PUB/susan' language JAVA parameter style JAVA contains SQL not deterministic isolate == **************************************************************************

-28 523727-002J

第 7 章 パフォーマンスとトラブルシューティング

この章では、次の項目に沿って SQL/MX の SPJ のパフォーマンスの向上と監視方法について説明しま す。また、共通する問題のためのトラブルシューティングのガイドラインを示します。

□ 7-2 ページの「SPJ 障害のトラブルシューティング」

□ 7-3 ページの「パフォーマンスに関するヒント」

□ 7-4 ページの「CALL ステートメントの実行プランの表示」

□ 7-5 ページの「CALL ステートメントのシェイプの表示」

523727-002J 7-1

第 7 章 パフォーマンスとトラブルシューティング

7

7.1 SPJ 障害のトラブルシューティングSPJ の登録または呼び出し時に発生した問題を解決するには、次のガイドラインに従ってください。

□ エラー・メッセージの SQLCODE または SQLSTATE の値をメモして、 『NonStop SQL/MX Message Manual』 にあるエラー情報を確認します。『NonStop SQL/MX Message Manual』には、すべての SQL/MX のエラーに関する原因、影響、対策が記載されています。

□ ユーザが SPJ を作成または呼び出すための適切な権限をもっていることを確認します。詳しくは、 4-12 ページの「必要な特権」、5-2 ページの「必要な特権」 および 6-9 ページの「SPJ に対する特権の表示」 を参照してください。

□ SPJ Java メソッドのコードをチェックします。詳しくは、第 3 章「SPJ Java メソッドの作成」 を参照し てください。問題がある場合は修正します。

□ SHOWDDL コマンドを使って、CREATE PROCEDURE ステートメントの構文をチェックします。詳 しくは、6-13 ページの「SPJ 構文の表示」 を参照してください。CREATE PROCEDURE 構文を SPJ Java メソッドと比較します。詳しくは、4-3 ページの「CREATE PROCEDURE ステートメントの使用」 を参照してください。問題がある場合は修正します。

□ アプリケーションの CALL ステートメントの構文をチェックします。詳しくは、第 5 章「SQL/MX で の SPJ の呼び出し」 を参照してください。問題がある場合は修正します。

□ SQL/MX 構文と SPJ コードが正しい場合は、SPJ Java 環境のコンフィグレーションをチェックします。 JREHOME、JDBC/MX の場所およびクラス・パスの設定を確認します。JVM スタートアップ・オプ ション (UDR_JAVA_OPTIONS の設定) を構成し直して、問題が SPJ Java 環境に関連するものかを チェックします。 詳しくは、2-14 ページの「SPJ Java 環境の設定」 を参照してください。

□ Java セキュリティに関連する問題を記述するエラーを受け取った場合は、UDR_JAVA_OPTIONS の設 定および指定されているポリシー・ファイル内のアクセス権をチェックします。すべての Java クラス が必要なアクセス権を持っていることを確認します。詳しくは、2-29 ページの「Java セキュリティの 設定」 を参照してください。

□ Java 関連のエラーを特定するには、データベース外で、コマンド・ラインで実行する Java アプリケー ションから直接 Java メソッドを呼び出して SPJ Java メソッドを実行します。詳しくは『NonStop Server for Java Programmer’s Reference』を参照してください。

-2 523727-002J

第 7 章 パフォーマンスとトラブルシューティング

7.2 パフォーマンスに関するヒント

SQL/MX 内の SPJ のパフォーマンスを最適化するには、次のことを行います。

□ 同じ非システム・クラスに依存するSPJ Java メソッドがなるべく異なる外部パスに存在しないように、 Java クラスおよびディレクトリ構造を設計します。この方法はシステム・リソースおよびメモリを節約 します。詳しくは、 1-17 ページの「Java バイトコード変更による影響」 を参照してください。

□ UDR_JAVA_OPTIONS の設定を、マルチスレッドのアプリケーションからの CALL ステートメント の並列性をサポートし、複数のSPJ Java 環境を管理するように指定します。詳しくは、1-14 ページの 「マルチスレッド化」 を参照してください。

□ SPJ を呼び出す 1 つのアプリケーション内で、あまり多くの UDR_JAVA_OPTIONS 設定を使用しな いようにします。詳しくは、 2-19 ページの「単一アプリケーションでの複数の UDR_JAVA_OPTIONS の設定」 を参照してください。

□ 1 つの SPJ Java メソッド内で CALL ステートメントをネスティングしないようにします。CALL ステー トメントのネスティングは、リソースを消費しパフォーマンスを低下させます。詳しくは、3-4 ページ の「Java メソッド呼び出しのネスト」 を参照してください。

□ SPJ Java メソッドでは静的にコンパイルされた SQLJ ステートメントを使うようにします。こうする ことで、MXCMP サーバを使わずに SPJ Java メソッドを実行できます。詳しくは、3-3 ページの 「java.sql.Connection オブジェクトの使用」 を参照してください。

□ java.sql.Connection オブジェクトが必要なくなった場合は、ガーベッジ・コレクションに頼らず に各オブジェクトを明示的にクローズしてください。詳しくは、 3-3 ページの「java.sql.Connection オ ブジェクトの使用」 を参照してください。

523727-002J 7-3

第 7 章 パフォーマンスとトラブルシューティング

7

7.3 CALL ステートメントの実行プランの表示実行プランは、CALL ステートメントがどのように最適化されたかを示します。DISPLAY_EXPLAIN コ

マンドまたは EXPLAIN 関数を使用して、CALL ステートメントの実行プランのすべてまたは一部を表示 することができます。

7.3.1 DISPLAY_EXPLAIN コマンドの使用

次の CALL ステートメントの実行プランを表示するものとします。

CALL samdbcat.persnl.adjustsalary(202, 5.5, ?);

MXCI セッションで、次のように DISPLAY_EXPLAIN コマンドを発行します。

DISPLAY_EXPLAIN CALL samdbcat.persnl.adjustsalary(202, 5.5, ?);

DISPLAY_EXPLAIN コマンドは、EXPLAIN 関数の結果テーブルのすべてのカラムを生成して表示しま す。詳細は、『NonStop SQL/MX クエリ・ガイド』を参照してください。

7.3.2 EXPLAIN 関数の使用

次のように、CALL ステートメントをプリペアして、EXPLAIN 関数の結果テーブルから特定のカラム を選択することができます。

PREPARE call_spj FROM CALL samdbcat.persnl.adjustsalary(202, 5.5, ?); SELECT SUBSTRING(OPERATOR,1,8) AS "OPERATOR", OPERATOR_COST, SUBSTRING(DESCRIPTION,1,500) AS "DESCRIPTION" FROM TABLE (EXPLAIN(NULL, 'CALL_SPJ'));

SELECT ステートメントは、次の出力を表示します。

CALL ステートメントに関して、結果テーブルの OPERATOR カラムに CALL という名前のローが含ま れます。DESCRIPTION カラムは、 CALL オペレータに対する特別なトークン・ペアを含みます。詳細は、 『NonStop SQL/MX クエリ・ガイド』を参照してください。

OPERATOR OPERATOR_COST DESCRIPTION -------- --------------- ----------------------------------------------- CALL 1.3930000E-005 input_values: cast(202), cast(cast((cast(5.5) / cast(10)))) parameter_modes: I I O routine_name: SAMDBCAT.PERSNL.ADJUSTSALARY routine_label: \KINGPIN.$TX0115.ZSDPK4GV.Q85DXB00 sql_access_mode: MODIFIES SQL DATA external_name: adjustSalary external_path: /usr/mydir/myclasses external_file: Payroll signature: (Ljava/math/BigDecimal;D[Ljava/math/BigDecimal;)V language: Java runtime_options: OFF runtime_option_delimiters: ' ' ROOT 5.8506000E-008 select_list: NUMERIC(8,2) SIGNED input_variables: ? statement_index: 0 statement: CALL samdbcat.persnl.adjustsalary(202, 5.5, ?); return

-4 523727-002J

第 7 章 パフォーマンスとトラブルシューティング

7.4 CALL ステートメントのシェイプの表示SHOWSHAPE は、MXCI セッションでの CALL ステートメントのような 指定の DML ステートメント

に対するシェイプを表示するコマンドです。この結果は、後で SQL/MX コンパイラに特定の実行プラン を強制的に選択させる (または、指定ステートメントに対して同一の実行プランを強制させる) ために使用 することができます。

7.4.1 シェイプのない CALL ステートメント

CALL ステートメントが SQL パラメータ引数の 1 つとしてサブクエリを含まない場合は、シェイプを 持ちません。たとえば、次の SHOWSHAPE コマンドはサブクエリ・パラメータをもたない CALL ステー トメントに対して発行されています。

SHOWSHAPE CALL samdbcat.persnl.adjustsalary(202,5.5,?);

この CALL ステートメントはシェイプをもたないため、SHOWSHAPE コマンドは次の結果を返します。

7.4.2 シェイプのある CALL ステートメント

CALL ステートメントが SQL パラメータ引数として 1 つ以上のサブクエリを含む場合、SHOWSHAPE コマンドは SQL ステートメント全体を記述するシェイプを生成します。たとえば、次の SHOWSHAPE コ マンドは、1 つのサブクエリ・パラメータをもつ CALL ステートメントに対して発行されています。

SHOWSHAPE CALL samdbcat.sales.totalprice((SELECT qty_ordered FROM samdbcat.sales.odetail WHERE ordernum = 100210 AND partnum = 5100), 'standard', ?param);

生成されたシェイプは、次のようにすべてのサブクエリ・ツリーを記述し、CALL ステートメントを表 わすために 1 つの ANYTHING トークンを含んでいます。

SHOWSHAPE コマンドの結果が希望どおりでない場合、CONTROL QUERY SHAPE ステートメントを 使って実行プランを強制することができます。最初に、プリペアした CALL ステートメントについて EXPLAIN 関数の結果を生成し、次に CONTROL QUERY SHAPE を使って実行プランのオペレータ・ツ リーを変更します。

SHOWSHAPE コマンドおよび CONTROL QUERY SHAPE ステートメントについての詳細は、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。実行プランの強制については、『NonStop SQL/MX クエリ・ガイド』を参照してください。

control query shape anything; --- SQL operation complete.

control query shape nested_join(nested_join(sort_groupby(partition_access( scan(path 'SAMDBCAT.SALES.ODETAIL', forward, blocks_per_access 1 , mdam off))),tuple),anything); --- SQL operation complete.

523727-002J 7-5

第 7 章 パフォーマンスとトラブルシューティング

7

-6 523727-002J

付録 A SPJ のサンプル

本付録では、本書に例として記載されている SPJ について説明します。SPJ Java メソッドについて、お よび SPJ Java メソッドを SQL/MX データベースに登録するための CREATE PROCEDURE ステートメン トについては、次の項目を参照してください。

□ A-3 ページの「SPJ Java メソッド」

□ A-7 ページの「CREATE PROCEDURE ステートメント」

□ A-8 ページの「SPJ の呼び出し例」

523727-002J A-1

付録 A SPJ のサンプル

A

A.1 SQLJ ソース・ファイルの使用SPJ Java メソッドは、SQLJ ソース・ファイルにコーディングされています。 この SQLJ ソース・ファイ

ルは、HP NonStop Technical Library (NTL) の中の sampleSQLJ.jar という名前の JAR ファイルに格納さ れています。

A.1.1 sampleSQLJ.jar ファイルのインストール

NTL から sampleSQLJ.jar ファイルをインストールするには、次の手順を行います。

1. NTL の G06.23 以降の RVU のページに進みます。

2. [Categories] リストから [Sample Programs] をクリックします。

3. [Publications] から [SQL/MX SQLJ Source Files] をクリックします。

4. NTL の指示に従って、 PC または ワークステーションに sampleSQLJ.jar ファイルをダウンロードし ます。

ソース・ファイルを使用するには、まずダウンロードしてきた JAR ファイルを目的の OSS ディレクト リにコピーします。次にソース・ファイルを抽出し、SQLJ 変換プログラムを使用して抽出したソース・ ファイルを処理します。詳細については、 sampleSQLJ.jar ファイル中の README ファイルを参照して ください。コンピュータ上で、WinZip を使用して sampleSQLJ.jar ファイルを解凍し、README.txt

ファイルを開きます。README_OSS ファイルは README.txt ファイルと同一内容ですが、OSS で表示で きます。

A.1.2 SQL/MX サンプル・データベースのインストール

SPJ が正しく実行されるかどうかは SQL/MX サンプル・データベース (製品番号 T0517) に依存します。 サンプル・データベースのインストール方法については『NonStop SQL/MX クイックスタート』を参照し てください。また、サンプル・データベースのスキーマおよびテーブルの詳細については、『NonStop SQL/MX リファレンス・マニュアル』を参照してください。

すべての SPJ の例において、SQL/MX サンプル・データベースの SQL/MP テーブルと SQL/MX テーブ ルのクエリが可能です。 SQL/MP のクエリには、SQL/MX バージョン 1.8 のサンプル・データベースを使 用してください。SQL/MX テーブルのクエリには、SQL/MX バージョン 2.0 のサンプル・データベースを 使用してください。

注. SQL/MX バージョン 2.0 のサンプル・データベースには SQL/MX フォーマット・テーブルを使用し ています。 サンプル・データベースをインストールするには、SQL/MX DDLステートメントを使用す るライセンスが必要です。 ライセンス取得には、製品 T0394 をご購入いただく必要があります。この 製品がない場合、サンプル・データベースをインストールすることができず、また、エラーメッセージにてシステムにライセンスが付与されていないことが通知されます。

-2 523727-002J

付録 A SPJ のサンプル

A.2 SPJ Java メソッドSPJ Java メソッドは、次の 2 つのクラス・ファイルに格納されています。

□ A-3 ページの「Sales クラス」

□ A-5 ページの「Payroll クラス」

上記のクラス・ファイルは SQLJ ソース・ファイルとしてコーディングされています。SQLJ の詳細につ いては『NonStop SQL/MX Programming Manual for Java』を参照してください。

A.2.1 Sales クラス

Sales クラスには、注文の追跡および売り上げの管理に役立つ次の SPJ Java メソッドが含まれています。

□ lowerPrice() メソッドは、売り上げが伸びていない (注文数が 50 未満の) 商品を割り出し、データ ベースでそれらの商品価格を 10 % 引き下げます。

□ numDailyOrders() メソッドは、日付を受け取り、その日付の注文数を出力パラメータに返します。

□ numMonthlyOrders() メソッドは、月を表わす整数を受け取り、その月の注文数を出力パラメータ に返します。

□ totalPrice() メソッドは、商品の数量、出荷速度、価格を受け取り、税金および送料を含めた合計 金額を計算します。そして合計金額を入力/出力パラメータに返します。

sampleSQLJ.jar の中の Sales.sqlj ソース・ファイルには、次のコードが含まれています。

例 A-1 Sales.sqlj—Sales クラス (1 / 3)

import java.sql.*; import java.math.*; import sqlj.runtime.*; public class Sales { #sql static iterator LowerPriceIter (BigDecimal partnum, BigDecimal qtyOrdered);

523727-002J A-3

付録 A SPJ のサンプル

A

public static void lowerPrice() throws SQLException { #sql { MODULE samdbcat.sales.salesmod }; LowerPriceIter iter; #sql iter = { SELECT p.partnum, SUM(qty_ordered) AS qtyOrdered FROM samdbcat.sales.parts p LEFT OUTER JOIN samdbcat.sales.odetail o ON p.partnum = o.partnum GROUP BY p.partnum }; while (iter.next()) { BigDecimal qty = iter.qtyOrdered(); if ((qty == null) || (qty.intValue() < 50)) { #sql { UPDATE samdbcat.sales.parts SET price = price * 0.9 WHERE partnum = :(iter.partnum()) }; } } iter.close(); } public static void numDailyOrders(Date date, Integer[] numOrders) throws SQLException { #sql { SELECT COUNT(order_date) INTO :(numOrders[0]) FROM samdbcat.sales.orders WHERE order_date = :date }; } public static void numMonthlyOrders(int month, Integer[] numOrders) throws SQLException { if ( month < 1 || month > 12 ) { throw new SQLException ( "Invalid value for month. " + "Retry the CALL statement using a number from 1 to 12 " + "to represent the month.", "38001" ); } #sql { SELECT COUNT(month(order_date)) INTO :(numOrders[0]) FROM samdbcat.sales.orders WHERE month(order_date) = :month }; }

例 A-1 Sales.sqlj—Sales クラス (2 / 3)

-4 523727-002J

付録 A SPJ のサンプル

A.2.2 Payroll クラス

Payroll クラスには、adjustSalary() という名前の SPJ Java メソッドが 1 つ含まれています。 adjustSalary() メソッドは、社員番号および社員のパーセンテージを受け取り、その値に基づいてデー タベースでその社員の給与を更新します。また、このメソッドは更新した給与の額を出力パラメータに返

します。

public static void totalPrice(BigDecimal qtyOrdered, String shippingSpeed, BigDecimal[] price) throws SQLException { BigDecimal shipcharge = new BigDecimal(0); if (shippingSpeed.equals("economy")) { shipcharge = new BigDecimal(1.95); } else if (shippingSpeed.equals("standard")) { shipcharge = new BigDecimal(4.99); } else if (shippingSpeed.equals("nextday")) { shipcharge = new BigDecimal(14.99); } else { throw new SQLException ( "Invalid value for shipping speed. " + "Retry the CALL statement using \'economy\' " + "for 7 to 9 days, \'standard\' for 3 to 5 days, " + "for \'nextday\' for one day.", "38002" ); } BigDecimal subtotal = price[0].multiply(qtyOrdered); BigDecimal tax = new BigDecimal(0.0825); BigDecimal taxcharge = subtotal.multiply(tax); BigDecimal charges = taxcharge.add(shipcharge); price[0] = subtotal.add(charges); } }

例 A-1 Sales.sqlj—Sales クラス (3 / 3)

523727-002J A-5

付録 A SPJ のサンプル

A

sampleSQLJ.jar の中の Payroll.sqlj ソース・ファイルには、次のコードが含まれています。

例 A-2 Payroll.sqlj—Payroll クラス

import java.sql.*; import java.math.*; import sqlj.runtime.*; public class Payroll { public static void adjustSalary(BigDecimal empNum, double percent, BigDecimal[] newSalary) throws SQLException { #sql { MODULE samdbcat.persnl.payrollmod }; #sql { UPDATE samdbcat.persnl.employee SET salary = salary * (1 + (:percent / 100)) WHERE empnum = :empNum }; #sql { SELECT salary INTO :(newSalary[0]) FROM samdbcat.persnl.employee WHERE empnum = :empNum }; } }

-6 523727-002J

付録 A SPJ のサンプル

A.3 CREATE PROCEDURE ステートメントCREATE PROCEDURE ステートメントは、SPJ Java メソッドを SQL/MX データベースに登録します。

A-3 ページの「SPJ Java メソッド」 に記載されているメソッドを登録する前に、SQLJ ソース・ファイルを クラス・ファイルにコンパイルする必要があります。SQLJ ソース・ファイルの処理については、『NonStop SQL/MX Programming Manual for Java』を参照してください。

sampleSQLJ.jar 内の createprocs.sql という名前の OBEY コマンド・ファイルには、次の CREATE PROCEDURE ステートメントが含まれています。

OBEY コマンド・ファイルを実行する前に、OSS ディレクトリへの外部パスを任意のパスに変更してく ださい。

カタログおよびスキーマは、CREATE PROCEDURE ステートメントを発行する時点で存在している必 要があります。SAMDBCAT カタログ、および SALES スキーマと PERSNL スキーマは、SQL/MX サンプ ル・データベースの一部です。サンプル・データベースをインストールする方法については、『NonStopSQL/MX クイックスタート』を参照してください。

例 A-3 createprocs.sql—OBEY コマンド・ファイル

CREATE PROCEDURE samdbcat.sales.lowerprice() EXTERNAL NAME 'Sales.lowerPrice' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA; CREATE PROCEDURE samdbcat.sales.dailyorders(IN DATE, OUT number INT) EXTERNAL NAME 'Sales.numDailyOrders (java.sql.Date, java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA; CREATE PROCEDURE samdbcat.sales.monthlyorders(IN INT, OUT number INT) EXTERNAL NAME 'Sales.numMonthlyOrders (int, java.lang.Integer[])' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA; CREATE PROCEDURE samdbcat.sales.totalprice(IN NUMERIC(18), IN VARCHAR(10), INOUT price NUMERIC(18,2)) EXTERNAL NAME 'Sales.totalPrice' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA READS SQL DATA; CREATE PROCEDURE samdbcat.persnl.adjustsalary(IN empnum NUMERIC(4), IN percent FLOAT, OUT newsalary NUMERIC(8,2)) EXTERNAL NAME 'Payroll.adjustSalary' EXTERNAL PATH '/usr/mydir/myclasses' LANGUAGE JAVA PARAMETER STYLE JAVA MODIFIES SQL DATA;

523727-002J A-7

付録 A SPJ のサンプル

A

A.4 SPJ の呼び出し例次の CALL ステートメントは、A-7 ページの「CREATE PROCEDURE ステートメント」 によって登録

されたサンプル SPJ を呼び出し、出力結果を MXCI に表示します。

□ MXCI で LOWERPRICE プロシージャを呼び出します。

CALL samdbcat.sales.lowerprice();

LOWERPRICE プロシージャは、注文数が 50 以下の商品の価格を 10 % 引き下げます。たとえば、商 品番号 3103 のレーザープリンタ X1 の注文が 40 の場合、LOWERPRICE が呼び出され、この商品の価 格が 4200.00 から 3780.00 に下げられます。

データベースの各商品について注文数を確認するには、次のクエリを発行します。

SELECT p.partnum, SUM(qty_ordered) AS qtyOrdered FROM samdbcat.sales.parts p LEFT OUTER JOIN samdbcat.sales.odetail o ON p.partnum = o.partnum GROUP BY p.partnum;

データベースの各商品について価格を確認するには、次のクエリを発行します。

SELECT * FROM samdbcat.sales.parts;

□ MXCI で DAILYORDERS プロシージャを呼び出します。

CALL samdbcat.sales.dailyorders(DATE '2003-03-19', ?);

DAILYORDERS プロシージャは、指定した日付の注文数の合計を計算し、その結果を MXCI に返しま す。

NUMBER ----------- 2 --- SQL operation complete.

2003 年 3 月 19 日には 2 つの注文がありました。

□ MXCI で MONTHLYORDERS プロシージャを呼び出します。

CALL samdbcat.sales.monthlyorders(3,?);

MONTHLYORDERS プロシージャは、指定した月の注文数の合計を計算し、その結果を MXCI に返し ます。

NUMBER ----------- 4 --- SQL operation complete.

3 月には 4 つの注文がありました。

-8 523727-002J

付録 A SPJ のサンプル

□ MXCI で TOTALPRICE プロシージャを呼び出します。

SET PARAM ?p 10; CALL samdbcat.sales.totalprice(23, 'standard', ?p);

TOTALPRICE プロシージャは、1 件の注文の合計金額を計算し、その結果を MXCI に返します。

PRICE --------------------- 253.96 --- SQL operation complete.

1 個 10 ドルで、標準料金で配送される 23 個の商品の合計金額は、消費税込みで 253.96 ドルです。

□ MXCI で ADJUSTSALARY プロシージャを呼び出します。

CALL samdbcat.persnl.adjustsalary(29, 2.5, ?);

ADJUSTSALARY プロシージャは、社員番号 29 の従業員の給与を 2.5 % アップし、その結果を MXCI に返します。

NEWSALARY ------------ 139400.00 --- SQL operation complete.

社員番号 29 の従業員の給与はこれまで 136000.00 ドルでしたが、ADJUSTSALARY の呼び出し後は 139400.00 に変更されています。

523727-002J A-9

付録 A SPJ のサンプル

A

-10 523727-002J

5

索引

索 引

AadjustSalary() メソッド A-6

ADJUSTSALARY プロシージャ

生成 A-7呼び出し A-9

ALL_UIDS システム・メタデータ・テーブル 1-5

AUTOCOMMIT 設定 5-2

CCALL オペレータ 7-4

CALL ステートメント

シェイプ 7-5実行プラン 7-4制限事項 5-2静的なオペレーション 5-8説明 5-3動的なオペレーション 5-9トランザクションセマンティクス 5-2

CALLステートメント

実行プラン 7-4CLASSPATH 環境変数 2-27

COLS システム・メタデータ・テーブル 1-6

Connection オブジェクト 3-3

CONTAINS SQL 句 4-11

CONTROL QUERY SHAPE ステーメント 7-5

CREATE PROCEDURE ステートメント

再生成 6-17説明 4-3例 A-7

CREATE PROCEDURE ステートメントの再生成 6-17

DDAILYORDERS プロシージャ

生成 A-7呼び出し A-8

DISPLAY_EXPLAIN コマンド 7-4-Djava.class.path 2-26

-Djava.security.manager 2-29

DROP PROCEDURE ステートメント 4-12-Dsqlmx.udr.extensions 2-23

-Dsqlmx.udr.jrehomeオプション 2-20

EEXECUTE 特権 6-2

EXPLAIN 関数 7-4

External name

説明 4-8

GGRANT EXECUTE ステートメント 6-2

GRANT ステートメント 6-2

IINOUT パラメータ 5-5

INOUT パラメータ・モード 4-5

IN パラメータ 5-4

IN パラメータ・モード 4-5

JJAR ファイル・パス 4-11

JAR ファイル、インストール 2-28

Java 仮想マシン (JVM)

SPJの登録 1-5SPJの呼び出し 1-7, 1-8

Java 環境

SPJ Java 環境を参照Java クラス

SPJにアクセス可能 1-14, 1-15コンパイル 3-10ロード 1-14

Java シグニチャ

制限事項 3-2説明 4-8変更 4-16

Javaシグニチャ

圧縮された 4-10Java セキュリティ 2-29

Java データ・タイプ 4-6

Java バイトコード

変更 4-13変更による影響 1-17リモート・ノードへのコピー 6-21

Java 変数、静的 3-2

Java メソッド

SPJ Java メソッドを参照Java 例外、処理 3-7

JDBC/MX ドライバ

バージョンの確認 2-6必要なアクセス権 2-30必要な製品バージョン 2-3

23727-002J 索引 -1

索引

JDBC/MXの場所、設定 2-23

JDBC/MXベースの Java メソッド

プロセス 1-10JDBC/MXベースの Java メソッド

SPJ Java メソッドも参照例 3-6

JREHOME 環境変数 2-20, 2-21

JVM 起動オプション、設定 2-14

LLOCATION 句 4-11

lowerPrice() メソッド

コード A-4説明 A-3

LOWERPRICE プロシージャ

生成 A-7呼び出し A-8

Mmain() メソッド 3-2

migrate ユーティリティ 6-25

MODIFIES SQL DATA 句 4-11

MONTHLYORDERS プロシージャ

生成 A-7呼び出し A-8

MXCMP プロセス、SPJの登録 1-5

mxlangman ポリシー・ファイル 2-30MXUDR

SPJの登録 1-5SPJの呼び出し 1-8SQL/MX UDR サーバも参照

mxudr.mak makeファイル 2-13

mxudrlink スクリプト 2-9

NNO SQL 句 4-11NonStop Server for Java

バージョンの確認 2-4必要な製品バージョン 2-3

Nowait SQL/MX 1-14

numDailyOrders() メソッド

コード A-4説明 A-3

numMonthlyOrders() メソッド

コード A-4説明 A-3

OOBEY コマンド・ファイル 6-15

OBJECTS システム・メタデータ・テーブル 1-5

ODBC/MX クライアント

JREHOMEの設定 2-20SPJの呼び出し 5-16クラス・パスの設定 2-26

OUT パラメータ 5-5

OUT パラメータ・モード 4-5

PPARAMS メタデータテーブル 6-25

Payroll クラス A-5

PROCS メタデータテーブル 6-25

RREADS SQL DATA 句 4-11

REPLICAS システム・メタデータ・テーブル 1-6

REVOKE EXECUTE ステートメント 6-4

REVOKE ステートメント 6-4

ROUTINES システム・メタデータ・テーブル 1-6

SSales クラス A-3sampleSQLJ.jar A-2

SHOWDDL コマンド 6-13

SHOWSHAPE コマンド 7-5SPJ

Stored procedure in Java (SPJ)を参照SPJ Java 環境

再初期化 1-13初期化 1-11設定 2-14説明 1-11ダイアグラム 1-9, 1-13

SPJ Java メソッド

CREATE PROCEDURE ステートメント中のシグニチャ 4-8JDBC/MXベースの Java メソッドも参照Pure JavaSQL/MX データベースへのアクセス 3-5SQLJベースの Java色々なタイプ 3-5外部パス 4-10異なるタイプの処理 1-9作成ガイドライン 3-2シグニチャの制限事項 3-2ネーミング 4-8必要なアクセス権 2-31プリント出力 3-8例 A-3

引 -2 523727-002J

5

索引

SPJ 製品ファイル 2-2

SPJに関する情報の表示 6-8

SPJに対する特権の付与 6-2

SPJの call

SPJの呼び出しを参照SPJの移行 6-25

SPJの削除 4-12

SPJの作成 1-4, 4-2

SPJの登録も参照SPJのサンプル、インストール A-2

SPJの登録

SPJの作成も参照内部プロセス 1-5

SPJの特権の取り消し 6-4

SPJのネスティング 3-4

SPJのバックアップ 6-19

SPJの変更 4-13

SPJの呼び出し

CまたはCOBOLによる埋め込み SQL プログラム 5-8JDBC/MX プログラム 5-15MXCI 5-6ODBC/MX クライアント 5-16SQLJ プログラム 5-14制限事項 5-2説明 5-2特権 6-2トランザクションのセマンティクス 5-2内部プロセス 1-7例 A-8

SPJ ポリシー・ファイル 2-30SQL/MX language manager

バージョンの確認 2-6必要なアクセス権 2-30

SQL/MX UDR サーバ

SPJの呼び出し 1-8MXUDRも参照SPJの登録 1-5クラスのアクセスとロード 1-14サーバ・プロセス 1-11再リンク 2-8ダイアグラム 1-9

SQL/MX UDRサーバ

バージョンの確認 2-7SQL/MX UDR サーバ・プロセス 1-13

SQL/MX リリース 1.8、SQL/MXリリース 2.0への SPJの移行 6-25

SQL/MX データ・タイプ 4-6Stored procedure in Java (SPJ)

SQL/MX リリース 1.8から 2.0への移行 6-25SQL/MX リリース 1.8、SPJの SQL/MX リリース 2.0への移行 6-25SQLException 3-7

sqlj.jar、必要なアクセス権 2-30

SQLJ 製品、必要なアクセス権 2-30

SQLJ ソース・ファイル、インストール A-2

SQLJベースの Java メソッド

プロセス 1-10SPJ Java メソッドも参照

SQLJベースの Javaメソッド

例 3-5SQL アクセス・モード 4-11

SQL 構文、SPJ 6-13

SQL データ・タイプ 4-6

SQL パラメータ

CALL ステートメント 5-4CREATE PROCEDURE ステートメント 4-5文字セット 4-7

Stored procedure in Java (SPJ)

SQL/MX プロセス 1-4‐ ??, 1-4‐ 1-10SQL/MXリリース 1.8から 2.0への移行 6-25構文の表示 6-13使用法 1-19情報の表示 6-8説明 1-2登録 1-4, 4-2特権の取り消し 6-4特権の付与 6-2ネーミング 4-3バックアップ 6-19引数リスト 5-4変更 4-13呼び出し 1-7, 5-2利点 1-3

System.err.println() メソッド 3-8

System.out.println() メソッド 3-8

TTBL_PRIVILEGES システム・メタデータ・テーブル 1-6

TEXT システム・メタデータ・テーブル 1-6

throw ステートメント 3-7

totalPrice() メソッド

コード A-5

23727-002J 索引 -3

索引

説明 A-3TOTALPRICE プロシージャ

生成 A-7呼び出し A-9

UUDR_JAVA_OPTIONS デフォルト属性

CONTROL QUERY DEFAULT ステートメントによる設定 2-16SYSTEM_DEFAULTSテーブルの設定 2-15説明 2-14同一の設定 2-19複数の設定 2-19

VVALIDATEROUTINE 1-5

WWITH GRANT OPTION 特権 6-2

あ圧縮された Javaシグニチャ 4-10

えエラー・メッセージ、発見 7-2

か外部パス

説明 4-10変更 4-14リモート・ノードの指定 6-23

外部名

変更 4-15環境変数

CLASSPATH 2-27JREHOME 2-20, 2-21

くクラス・パス、設定 2-25

クラス・ファイル・パス 4-10

クラス・ローダ

Java バイトコードのコピー 1-18SQL/MX UDR サーバ・プロセス中 1-16説明 1-16

け結果セット 3-3

こ構文、SPJ 6-13

コンパイル、Java 3-10

さ再初期化、SPJ Java 環境 1-13

しシェイプ、CALL ステートメントの 7-5

シグニチャ、Java

制限事項 3-2説明 4-8

システム・クラス

説明 1-14必要なアクセス権 2-31

実行プラン、CALL ステートメントの 7-4

実行プラン、CALLステートメントの 7-4

出力デスクリプタ 5-9

初期化、SPJ Java 環境 1-11

所有者、情報の表示 6-10

すストアド・プロシージャの結果セット 3-3

せ静的な CALL ステートメント 5-8

静的な Java 変数 3-2

製品ファイル、SPJ 2-2

セキュリティ、SPJ Java 環境 2-29

そソフトウェア・バージョン、確認 2-4

ソフトウェア要件 2-2

た代替ファイル

プロシージャ・ラベルを参照

てデータ・ソース URL 3-3

データ・タイプ

Java 4-6SQL 4-6パラメータ引数の変換 5-4

デフォルト接続 3-3

と動的 CALL ステートメント

入力および出力デスクリプタ 5-9引数リスト 5-13

特権

SPJの削除 4-12SPJの作成 4-2SPJを呼び出すための 6-2参照するデータベース・オブジェクトへの 6-4情報の表示 6-9取り消し 6-4

引 -4 523727-002J

5

索引

付与 6-2特権付与者、情報の表示 6-10

特権を付与された者、情報の表示 6-10

トラブルシューティングガイドライン 7-2

トランザクションセマンティクス 5-2

な内部 SPJ、SPJの登録 1-5

内部タイプのシグニチャ

圧縮された Java シグニチャを参照

に入力デスクリプタ 5-9

ぬヌル、入出力 3-3

はバージョン、ソフトウェア製品 2-2

パフォーマンスに関するヒント 7-3

パラメータ・デスクリプタ、情報の取得 5-12

パラメータ・モード、IN、OUT、または INOUT 4-5

パラメータ、SQL 4-5, 5-4

ひ引数リスト、SPJ 5-4

非システム・クラス

説明 1-14, 1-15分散データベース環境での 6-24

非ブロック方式 JDBC/MX 1-14

ピュア Java メソッド 1-10

SPJ Java メソッドも参照

ふプロシージャ名 4-3

プロシージャ名のオーバロード 4-4

プロシージャ・ラベル

SPJの削除の結果 4-12作成 1-6ネーミング 4-11場所の表示 6-12SPJの作成の結果 4-2

分散データベース環境の留意事項 6-20

ほポリシー・ファイル 2-30

まマルチスレッド化 1-14

めメソッド属性 4-3

も文字セット、SQL パラメータとしてサポートされる 4-7

ゆユーザ定義の例外 3-7

よ要件、ソフトウェア 2-2

りリモート・ノード

Java バイトコードのコピー 6-21外部パスでの指定 6-23

れ例外、処理 3-7

23727-002J 索引 -5

索引

引 -6 523727-002J