>サイトトップへ >このカテゴリの一覧へ

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

(1) 

目  次

ページ

序文

1

1

  適用範囲

1

2

  引用規格

1

2.1

  JIS 及び ISO 規格

1

2.2

  その他の国際規格

2

3

  定義,表記法及び規約

2

3.1

  定義

3

3.1.1

  [Java]からの定義

3

3.1.2

  [JVM]からの定義

3

3.1.3

  第 13 部での定義

3

3.2

  規約

5

3.2.1

  組込み手続の規定

5

3.2.2

  配置記述子ファイルの規定

5

4

  概念

6

4.1

  Java プログラム言語

6

4.2

  SQL 呼出しルーチン

7

4.2.1

  SQL 呼出しルーチンの概要

7

4.2.2

  SQL 呼出しルーチンの特性

7

4.3

  Java クラス名解決

9

4.4

  SQL 結果集合

9

4.5

  パラメタ対応付け

10

4.6

  処理されない Java 例外

11

4.7

  データ型

12

4.7.1

  既定義でなく,SQL 以外のデータ型

12

4.8

  利用者定義型

12

4.8.1

  利用者定義型の導入

12

4.8.2

  利用者定義型記述子

13

4.8.3

  利用者定義型の比較及び代入

14

4.8.4

  静的フィールドのアクセス

15

4.8.5

  SQL と Java との間のオブジェクトの変換

15

4.8.5.1

  SERIALIZABLE 

15

4.8.5.2

  SQLDATA 

16

4.8.5.3

  可搬性の向上

16

4.9

  組込み手続

16

4.10

  権限

17


X 3005-13

:2007 (ISO/IEC 9075-13:2003)  目次

(2)

ページ

4.11

  JAR 

17

4.11.1

  配置記述子ファイル

18

5

  語い(彙)要素

18

5.1

  <トークン>及び<分離符号

18

5.2

  名前及び識別子

19

6

  スカラ式

20

6.1

  <メソッド呼出し

20

6.2

  <NEW 指定>

20

7

  述語

21

7.1

  <比較述語

21

8

  その他の共通要素

22

8.1

  <Java パラメタ宣言リスト>

22

8.2

  <SQL Java パス>

22

8.3

  <ルーチン呼出し

23

8.4

  <LANGUAGE 

31

8.5

  配列戻し関数の実行

31

8.6

  Java ルーチン署名決定

37

9

  スキーマ定義及びスキーマ操作

44

9.1

  <スキーマ削除文

44

9.2

  表定義

44

9.3

  <ビュー定義

45

9.4

  <利用者定義型定義

45

9.5

  <属性定義

48

9.6

  <型変更文

51

9.7

  <データ型削除文

51

9.8

  <SQL 呼出しルーチン>

52

9.9

  <ルーチン変更文

55

9.10

  <ルーチン削除文

55

9.11

  <利用者定義順序付け定義>

56

9.12

  <利用者定義順序付け削除文>

56

10

  アクセス制御

57

10.1

  <GRANT 権限文

57

10.2

  <権限

57

10.3

  <REVOKE 

58

11

  組込み手続

59

11.1

  SQLJ.INSTALL_JAR 手続

59

11.2

  SQLJ.REPLACE_JAR 手続

60

11.3

  SQLJ.REMOVE_JAR 手続

61

11.4

  SQLJ.ALTER_JAVA_PATH 手続

63


X 3005-13

:2007 (ISO/IEC 9075-13:2003)  目次

(3)

ページ

12

  Java について

64

12.1

  この規格で提供する Java の機能

64

12.1.1

  パッケージ java.sql

64

12.1.2

  システム特性

64

12.2

  配置記述子ファイル

64

13

  情報スキーマ

67

13.1

  JAR_JAR_USAGE ビュー

67

13.2

  JARS ビュー

67

13.3

  METHOD_SPECIFICATIONS ビュー

68

13.4

  ROUTINE_JAR_USAGE ビュー

68

13.5

  TYPE_JAR_USAGE ビュー

69

13.6

  USER_DEFINED_TYPES ビュー

70

13.7

  短い名前のビュー

70

14

  定義スキーマ

72

14.1

  JAR_JAR_USAGE 実表

72

14.2

  JARS 実表

73

14.3

  METHOD_SPECIFICATIONS 実表

74

14.4

  ROUTINE_JAR_USAGE 実表

75

14.5

  ROUTINES 実表

76

14.6

  TYPE_JAR_USAGE 実表

76

14.7

  USAGE_PRIVILEGES 実表

77

14.8

  USER_DEFINED_TYPES 実表

77

15

  状態コード

78

15.1

  受け取られていない Java 例外に対するクラス及びサブクラスの値

78

15.2

  SQLSTATE 

79

16

  適合性

79

16.1

  SQL/JRT に対する適合性の主張

79

16.2

  SQL/JRT に対するその他の適合性要件

79

16.3

  SQL/JRT の前提機能の関係

79

附属書 A(参考)SQL 適合性の要約

81

附属書 B(参考)処理系定義要素

86

附属書 C(参考)処理系依存要素

89

附属書 D(参考)SQL の機能の分類

90

附属書 E(参考)ルーチン入門

91

附属書 F(参考)型入門

121


X 3005-13

:2007 (ISO/IEC 9075-13:2003)  目次

(4)

まえがき

この規格は,工業標準化法第 12 条第 1 項の規定に基づき,財団法人日本規格協会(JSA)から,工業標準

原案を具して日本工業規格を制定すべきとの申し出があり,日本工業標準調査会の審議を経て,経済産業

大臣が制定した日本工業規格である。

この規格は,著作権法で保護対象となっている著作物である。

この規格の一部が,特許権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に

抵触する可能性があることに注意を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許

権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に係る確認について,責任は

もたない。

JIS X 3005

の規格群には,次に示す部編成がある。

JIS

X

3005-1

第 1 部:枠組 (SQL/Framework)

JIS

X

3005-2

第 2 部:基本機能 (SQL/Foundation)

JIS

X

3005-3

第 3 部:呼出しレベルインタフェース (SQL/CLI)

JIS

X

3005-4

第 4 部:永続格納モジュール (SQL/PSM)

JIS

X

3005-9

第 9 部:外部データ管理 (SQL/MED)

JIS

X

3005-10

第 10 部:オブジェクト言語結合 (SQL/OLB)

JIS

X

3005-13

第 13 部:Java プログラム言語を用いる SQL ルーチン及び型 (SQL/JRT)

JIS

X

3005-14

第 14 部:XML 関連仕様 (SQL/XML)


日本工業規格

JIS

 X

3005-13

:2007

(ISO/IEC 9075-13

:2003

)

データベース言語 SQL

第 13 部:Java プログラム言語を用いる

SQL

ルーチン及び型 (SQL/JRT)

Information technology

−Database languages−SQL−

Part 13: SQL Routines and Types

Using the Java

TM

 Programming Language (SQL/JRT)

序文

この規格は,2003 年に第 2 版として発行された ISO/IEC 9075-13 を基に,技術的内容及び対応国際規格

の構成を変更することなく作成した日本工業規格である。

なお,この規格で点線の下線を施してある注記事項は,対応国際規格にはない事項である。

1

適用範囲

この規格は,Java プログラム言語で書かれた静的メソッドを SQL 呼出しルーチンとして呼び出す機能,

及び Java プログラム言語で定義されたクラスを SQL 利用者定義構造型として用いる機能を規定する(Java

は,Sun Microsystems, Inc の登録商標である。

注記  この規格の対応国際規格及びその対応の程度を表す記号を,次に示す。

ISO/IEC 9075-13:2003

,Information technology−Database languages−SQL−Part 13: SQL Routines

and Types Using the Java

TM

 Programming Language (SQL/JRT) (IDT)

なお,対応の程度を表す記号(IDT)は,ISO/IEC Guide 21 に基づき,一致していることを示す。

2

引用規格

次に掲げる規格は,この規格に引用されることによって,この規格の規定の一部を構成する。

これらの引用規格のうちで,西暦年を付記してあるものは,記載の年の版を適用し,その後の改正版(追

補を含む。

)には適用しない。西暦年の付記がない引用規格は,その最新版(追補を含む。

)を適用する。

2.1

JIS

及び ISO 規格

[Framework]

ISO/IEC 9075-1:2003

, Information technology − Database languages − SQL − Part 1: Framework

(SQL/Framework)

注記  JIS X 3005-1:2002  データベース言語 SQL  第 1 部:枠組 (SQL/Framework) が,この国際規

格の前の版 ISO/IEC 9075-1:1999 と一致している。

[Foundation]

ISO/IEC 9075-2:2003

, Information technology − Database languages − SQL − Part 2: Foundation


2

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

(SQL/Foundation)

注記  JIS X 3005-2:2002  データベース言語 SQL 第 2 部:基本機能(SQL/Foundation)が,この国際

規格の前の版 ISO/IEC 9075-2:1999 と一致している。

[OLB]

ISO/IEC 9075-10:2003

,Information technology−Database languages−SQL−Part 10: Object Language

Bindings (SQL/OLB)

注記  JIS X 3005-10:2003  データベース言語 SQL  第 10 部:オブジェクト言語結合(SQL/OLB)が,

この国際規格の前の版 ISO/IEC 9075-10:2000 と一致している。

[Schemata]

ISO/IEC 9075-11:2003

,Information technology−Database languages−SQL−Part 11: Information and

Definition Schemas (SQL/Schemata)

2.2

その他の国際規格

[Java]

The Java™ Language Specification, Second Edition, Bill Joy (Editor), Guy Steele, James Gosling, and Gilad

Bracha, Addison-Wesley, 2000, ISBN 0-201-31008-2.

[JVM]

The Java™ Virtual Machine Specification, Second Edition, Tim Lindholm and Frank Yellin, Addison-Wesley,

1999, ISBN 0-201-43294-3.

[J2SE]

Java™ 2 Platform, Standard Edition, v1.3.1, API Specification,

http://java.sun.com/j2se/1.3/docs/api/index.html.

[Serialization]

Java™ Object Serialization Specification,

http://java.sun.com/j2se/1.3/docs/guide/serialization/spec/serialTOC.doc.html.

[JavaBeans]

The JavaBeans™ 1.01 Specification, http://java.sun.com/products/javabeans/docs/spec.html.

[JDBC]

JDBC™ 3.0 Specification, Final Release, John Ellis & Linda Ho with Maydene Fisher, Sun Microsystems, Inc.,

October, 2001.

[RFC2368]

RFC 2368, The mailto URL schema, P. Hoffman, L. Masinter, J.Zawinski, July, 1998.

http://www.ietf.org/rfc/rfc2368.txt

[RFC2396]

RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax, T. Berners-Lee, R. Fielding, L. Maxinter,

August, 1998. http://www.ietf.org/rfc/rfc2396.txt

3

定義,表記法及び規約

この箇条は,

ISO/IEC 9075-2

の“

3 

定義,表記法及び規約”を修正する。

 


3

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

3.1

定義

この細分箇条は,

ISO/IEC 9075-2

の“

3.1 

定義”を修正する。

 

3.1.1

[Java]

からの定義

この規格に[Java]からの次の用語の定義を適用する。

3.1.1.1

ブロック  (block)

3.1.1.2

クラス宣言  (class declaration)

3.1.1.3

クラスインスタンス  (class instance)

3.1.1.4

クラス変数  (class variable)

3.1.1.5

フィールド  (field)

3.1.1.6

インスタンス初期化子  (instance initializer)

3.1.1.7

インスタンス変数  (instance variable)

3.1.1.8

インタフェース  (interface)

3.1.1.9

局所変数  (local variable)

3.1.1.10

入れ子になったクラス  (nested class)

3.1.1.11

パッケージ  (package)

3.1.1.12

静的初期化子  (static initializer)

3.1.1.13

サブパッケージ  (subpackage)

3.1.2

[JVM]

からの定義

この規格に[JVM]からの次の用語の定義を適用する。

3.1.2.1

クラスファイル  (class file)

3.1.2.2

Java

仮想機械  (Java Virtual Machine)

3.1.3

第 13 部での定義

この規格では,加えて次の用語の定義を適用する。

3.1.3.1

クラスファイル  (class file)


4

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

Java クラスのコンパイルされたバイトコードを含むファイル。

3.1.3.2

既定コネクション  (default connection)

データソースとして URL“jdbc:default:connection”

(URL の詳細については,[RFC2368]及び

[RFC2396]

参照)で確立された現行 SQL 処理系,SQL セション,及び SQL トランザクションへの JDBC

コネクション。

3.1.3.3

配置記述子  (deployment descriptor)

SQLJ.INSTALL_JAR 手続及び SQLJ.REMOVE_JAR 手続にそれぞれ対応する<組込み動作>及び<除去動作

>を指定し,

配置記述子ファイル

  (deployment descriptor file)

中に含まれる一つ以上の SQL 文。

3.1.3.4

配置記述子ファイル  (deployment descriptor file)

[J2SE]

の java.util.jar 部 で 記 述 さ れ る よ う に , JAR の マ ニ フ ェ ス ト 項 目 で

SQLJDeploymentDescriptor: TRUE

を指定した JAR 中に含まれる配置記述子を含むテキストファイ

ル。

3.1.3.5

外部 Java データ型  (external Java data type)

<外部 Java 型句>を指定する<利用者定義型定義>で定義された SQL 利用者定義型。

3.1.3.6

外部 Java ルーチン  (external Java routine)

LANGUAGE JAVA を指定し,かつ,PROCEDURE 若しくは FUNCTION のいずれかを指定する<SQL 呼

出しルーチン>で定義される外部ルーチン,又は<外部 Java 型句>を指定する<利用者定義型定義>で定義さ

れる外部ルーチン。

3.1.3.7

組み込まれた JAR (installed JAR)

SQL 環境にその存在が既に登録され,SQLJ.INSTALL_JAR 手続又は SQLJ.REPLACE_JAR 手続のうち

の一つの実行によって SQL 環境にその内容が複写された JAR。

3.1.3.8

Java

アーカイブ  (Java Archive),JAR

[J2SE]

の java.util.jar 部で記述されるように,

0 個以上の Java の class 及び ser ファイルを含み,

0 個以上の配置記述子ファイルを含む zip 形式のファイル。JAR は,Java プログラムを配布する通常の方

法であり,ある SQL 環境に対する外部 Java ルーチン及び外部 Java データ型の処理系を提供するこの規格

によって規定される仕組みである。

3.1.3.9

JVM

[JVM]

で規定される Java 仮想機械。

3.1.3.10

ser

ファイル  (ser file)

[Serialization]

で規定される形式での Java オブジェクトの表現を含むファイル。


5

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

3.1.3.11

当該 Java クラス  (subject Java class)

そのクラスの

当該

Java

クラス名

  (subject Java class name)

及びそれを含む JAR の組合せによって一意に

識別される Java クラス。

3.1.3.12

当該 Java クラス名  (subject Java class name)

Java クラスの完全に修飾されたパッケージ及びクラス名。

3.1.3.13

システムクラス  (system class)

この規格に適合する処理系によって提供される Java クラスで,組み込まれた JAR 中に含まれていなく

ても外部 Java ルーチン又は外部 Java データ型から参照することができる Java クラス。

3.2

規約

この細分箇条は,

ISO/IEC 9075-2

の“

3.3 

規約”を修正する。

 

3.2.1

組込み手続の規定

組込み手続は,次によって規定する。

機能:  手続の目的の短い説明。

署名:  SQL での手続の署名の規定。署名の目的は,手続名,パラメタ名,及びパラメタ型を指定

することとする。これらの組込み手続を定義する方法は,処理系依存とする。

アクセス規則:  一般規則を成功裏に適用する以前に満たさなければならないスキーマオブジェク

トへのアクセスを支配する規則の自然言語での規定。

一般規則:  手続呼出しの実行時の効果についての自然言語での規定。ある要素の効果の規定で一

つ以上の一般規則が用いられる場合,要求される効果は,最初の一般規則から始めて,ある規則が

規則の適用の順番の変更又は終了を指定するか暗に想定する場合を除き,規則の番号順に適用した

結果とする。適用される特定の規則によって指定されるか又は暗に想定される場合を除き,一般規

則の適用は,番号順で最後の規則が適用されたときに終了する。

適合性規則:  その要素が,SQL に適合するために,どのように提供されなければならないかの規

定。

記法記号の適用範囲は,それらの記号が定義される細分箇条とする。細分箇条内で,署名,アクセス規

則又は一般規則中で定義された記号は,参照される前に定義されているとき,その他の規則中で参照する

ことができる。

3.2.2

配置記述子ファイルの規定

配置記述子ファイルは,次によって規定する。

機能:  配置記述子ファイルの短い説明。

モデル:  配置記述子ファイルがそれを含む JAR 内で識別される方法についての短い説明。

特性:  配置記述子ファイルの内容の構文についての BNF での規定。

記述:  配置記述子ファイルの内容についての要求及び制限の規定。

適合性規則:  その要素が,SQL に適合するために,どのように提供されなければならないかの規

定。


6

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

4

概念

この箇条は,

ISO/IEC 9075-2

の“

4 

概念”を修正する。

 

4.1

Java

プログラム言語

Java プログラム言語は,クラスベースのオブジェクト指向言語である。この規格では,次の Java の概念

及び用語を用いる。

クラス

  (class)  は,Java プログラムの基本構成要素であり,すべての実行可能な Java コードは,Java ク

ラス定義に含まれる。クラスは,0 個以上のフィールド,0 個以上のメソッド,0 個以上の入れ子になった

クラス,0 個以上のインタフェース,0 個以上のインスタンス初期化子,0 個以上の静的初期化子及び 0 個

以上の構成子からなる,空であってもよい集合を指定する

クラス宣言

  (class declaration)  で宣言する。

変数の有効範囲は,クラス,クラスのインスタンス,又はそのクラスのメソッドである。

静的

  (static)  と

宣言された変数の有効範囲は,クラスであり,その変数を

クラス変数

  (class variable)  と呼ぶ。そのクラス

中で宣言されたその他の各変数の有効範囲は,そのクラスのインスタンスであり,そのような変数を

イン

スタンス変数

  (instance variable)  と呼ぶ。クラスのクラス変数及びインスタンス変数をそのクラスの

フィ

ールド

  (field)  と呼ぶ。メソッド中で宣言された変数の有効範囲は,

ブロック

  (block),又はそのメソッド

中で宣言されている Java の for 文であり,その変数を

局所変数

  (local variable)  と呼ぶ。

クラスインスタンス

  (class instance)  は,そのクラス中で宣言された各インスタンス変数及びそのクラス

のスーパクラス中で宣言された各インスタンス変数のインスタンスからなる。クラスインスタンスは,ク

ラス名によって,強く型付けされている。クラスインスタンスで利用可能な操作は,そのクラスに定義さ

れているものである。

java.lang.Object

クラスを除いて,各クラスは,(高々)一つの他のクラスを

拡張する

  (extend)  と

宣言される。クラスで他のクラスを明示的に拡張すると宣言しないものは,暗に java.lang.Object を

拡張する。宣言されたクラスは,それが拡張するクラスの

直接サブクラス

  (direct subclass)  である。それ

が拡張するクラスは,宣言されたクラスの

直接スーパクラス

  (direct superclass)  である。

クラス がクラス の直接サブクラスか,又は が直接サブクラスであるクラス が存在し,かつ,C

が のサブクラスならば,は,

サブクラス

  (subclass)  である。同様に,クラス がクラス の直接

スーパクラスか,又は が直接スーパクラスであるクラス が存在し,かつ,が のスーパクラスなら

ば,は,

スーパクラス

  (superclass)  である。サブクラスは,そのスーパクラスのすべてのフィール

ド及びメソッドをもち,のスーパクラスのインスタンスが許されるところはどこでも,クラス のイン

スタンスを用いてもよい。

メソッド

  (method)  は,実行可能ルーチンである。メソッドは,

静的

  (static)  であると宣言することがで

きる。その場合,

クラスメソッド

  (class method)  と呼ぶ。そうでなければ,

インスタンスメソッド

  (instance 

method)

と呼ぶ。クラスメソッドは,クラス名又はそのクラスのインスタンス名のいずれかでメソッド名

を修飾することによって参照することができる。インスタンスメソッドは,そのクラスのインスタンスを

結果とする Java 式で,又は,構成子の場合,

“new”で,メソッド名を修飾することによって参照するこ

とができる。インスタンスメソッドのメソッド本体では,そのクラス変数,インスタンス変数及び局所変

数を参照することができる。

メソッドの Java

メソッド署名

  (Java method signature)

は,メソッド名並びにパラメタの数及びそれらの

データ型からなる。

パッケージ

  (package)  は,0 個以上のクラス,0 個以上のインタフェース,及び 0 個以上の

サブパッケー

  (subpackage)  からなる(サブパッケージは,パッケージ内のパッケージである。)。各パッケージは,そ


7

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

れ自身の名前空間をもち,パッケージ中のクラスは,そのパッケージ外から参照できないクラスを含み,

同じパッケージ中の他のクラスを参照することができる。すべてのクラスは,明示的に指定した名前付き

のパッケージ又は名前なしの既定パッケージのいずれかであるただ一つのパッケージに属する。

クラスは,

他の名前付きパッケージを参照し,そのパッケージのクラスをパッケージ修飾なしでクラス内で参照する

ために,Java の import 文を指定することができる。

クラス,フィールド又はメソッドは,

公開

  (public),

非公開

  (private),又は

限定公開

  (protected)  として

宣言することができる。公開変数又は公開メソッドは,どのメソッドからでもアクセスできる。非公開変

数又は非公開メソッドは,同じクラス中のメソッドによってだけ参照することができる。限定公開変数又

は限定公開メソッドは,

同じクラス又はサブクラスのメソッドによってだけ参照することができる。

公開,

非公開又は限定公開として宣言されないメソッドは,同じパッケージ中のクラスによって宣言されたメソ

ッドからだけ呼び出すことができる。

インタフェース

  (interface)  は,メソッド署名の集合からなる Java の構成要素である。インタフェースは,

0 個以上のクラスによって実装される。クラスは,0 個以上のインタフェースを実装すると宣言することが

でき,クラスは,その宣言されたすべてのインタフェースによって指定される署名付きのメソッドをもつ

必要がある。

[J2SE]

で規定される Java

直列可能

  (Serializable)  インタフェース java.io.Serializable は,Java イ

ンスタンスと,[J2SE]の java.io.OutputStream 部及び java.io.InputStream 部でそれぞれ規定さ

れる java.io.OutputStream 又は java.io.InputStream との間の変換を定義し,Java オブジェクト

のインスタンスの永続表現を書き出し,Java オブジェクトのインスタンスの永続表現を読み出す。この変

換は,そのインスタンスの最特定クラスを識別し,そのインスタンスを再構成するために必要な情報を保

持する。

[JDBC]及び[J2SE]で規定される Java  SQLData インタフェース java.sql.SQLData は,Java インスタ

ンスと SQL 利用者定義型との間の変換を定義する。

Java クラスのソースは,通常,ファイル拡張子“java”の Java

ファイル

  (Java file),例えば,myclass.java

中に格納される。Java は,通常,Java を提供するどのプラットフォームでも可搬なバイトコード命令セッ

トに翻訳される。そのようなバイトコードを含むファイルは,通常,ファイル拡張子“class”の

クラスフ

ァイル

  (class file),例えば,myclass.class 中に格納される。

クラスファイルの集合は,Java

アーカイブ

  (Java archive)  ファイル又は(通常,ファイル拡張子“.jar”

をもつ)JAR に集めることができる。JAR は,zip 形式のファイルで,Java クラスファイルの集合を含む。

JAR は,Java プログラムを配布する通常の方法である。

4.2

SQL

呼出しルーチン

この細分箇条は,

ISO/IEC 9075-2

の“

4.27 SQL

呼出しルーチン”を修正する。

 

4.2.1

SQL

呼出しルーチンの概要

この細分箇条は,

ISO/IEC 9075-2

の“

4.27.1 SQL

呼出しルーチンの概要”を修正する。

 

【9 番目の段落の最初のテキストを置き換える。

】外部 Java ルーチンであってもなくても,静的 SQL 呼

出しルーチンは,次の条件を満たす。

4.2.2

SQL

呼出しルーチンの特性

この細分箇条は,

ISO/IEC 9075-2

の“

4.27.2 SQL

呼出しルーチンの特性”を修正する。

 

【第 2 段落の後に挿入する。

】外部ルーチンには,見たところ同じで根本的に異なる二つの形式のものが

ある。主要な違いは,SQL 呼出しルーチンの本体が Java で書かれていることを,外部ルーチンのルーチン


8

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

記述子が指定するかどうかとする。SQL 呼出しルーチンの本体が Java で書かれているとき,外部ルーチン

は,

外部

Java

ルーチン

  (external Java routine)  とする。他の外部ルーチンとは,次の点が異なる。

−  他の外部ルーチンでは,そのルーチンの

実行可能形式

  (executable form)(例えば,動的リンクライ

ブラリ又は何らかの実行時解釈形式)は,SQL 環境のカタログの外部に存在する。外部 Java ルーチ

ンの実行形式は,SQL 環境のカタログ中にインストールされた JAR として存在する指定された当該

Java ルーチンによって提供される。

−  インストールされた JAR は,完全に自己完結的(すなわち,それ自身の外部にある Java クラスへ

の参照がないもの)である必要はないので,当該 Java クラスがそのインストールされた JAR 又は

他のインストールされた JAR 中に含まれるクラスファイル中で定義されるクラスを参照すること

を許す機構が提供される。

注記 1  一度,外部 Java ルーチンが作成されると,それを含む SQL 環境によって実行される SQL 文

中でのその利用は,他の外部ルーチンのそれと同様である。

【第 4 段落を置き換える。

】SQL 呼出しルーチンは,それらの形式によって呼出し方法が異なる。SQL

呼出し手続は,<CALL 文>によって呼び出される。SQL 呼出し通常関数は,<ルーチン呼出し>によって呼

び出される。インスタンス SQL 呼出しメソッドは,<メソッド呼出し>によって呼び出される。一方,SQL

呼出し構成メソッドは,<NEW 呼出し>によって呼び出され,静的 SQL 呼出しメソッドは,<静的メソッ

ド呼出し>によって呼び出される。SQL 呼出しルーチンの呼出しは,SQL 呼出しルーチンの<ルーチン名>

を指定し,その SQL 呼出しルーチンの<SQL パラメタ宣言>に対応する引数値の並びを与える。呼出しの

当該ルーチン

  (subject routine)  は,<ルーチン呼出し>によって呼び出されてもよい SQL 呼出しルーチンと

する。<ルーチン呼出し>の当該ルーチンの選択後,SQL 引数は評価され,実行されるであろう SQL 呼出

しルーチンが選択される。当該ルーチンが外部 Java ルーチンでないインスタンス SQL 呼出しメソッドな

らば,実行される SQL 呼出しルーチンが当該ルーチンの置換メソッドの集合から選択される。

(置換メソ

ッドの集合は,ISO/IEC 9075-2 の“10.4  <ルーチン呼出し>”の一般規則で規定される。

)選択される置換

メソッドは,当該パラメタの宣言型の型指示子が,当該パラメタに対応する SQL 引数の値の最特定型の型

優先順序リスト中で,他のどの置換メソッドの当該パラメタの宣言型の形指示子よりも優先される当該パ

ラメタをもつ置換メソッドとする(ISO/IEC 9075-2 の“10.4 <ルーチン呼出し>”の一般規則参照。

。イン

スタンス SQL 呼出しメソッドが外部 Java ルーチンならば,

“置換メソッドの集合”という語は,そのよう

なメソッドには,適用しない。置換メソッドによって提供される機能は,Java 自身の機能と重複し,実行

される当該ルーチンは,他の置換メソッドが指定されない場合に呼び出されるものとなる。当該ルーチン

が SQL 呼出しメソッドでなければ,実行される SQL 呼出しルーチンは,その当該ルーチンとする。実行

のための SQL 呼出しルーチンの選択後,SQL 引数の値が SQL 呼出しルーチンの対応する SQL パラメタに

代入され,その<ルーチン本体>が実行される。SQL 呼出しルーチンが SQL ルーチンならば,<ルーチン本

体>は,ISO/IEC 9075-2 の“13.5 <SQL 手続文>”の一般規則に従って実行される<SQL 手続文>とする。SQL

呼出しルーチンが外部ルーチンならば,<ルーチン本体>は,SQL 以外の標準プログラムで書かれた,その

プログラム言語の規則に従って実行されるプログラムを識別する。

【第 6 段落を置き換える。

】SQL 呼出しルーチンが外部ルーチンならば,実効的な SQL パラメタリスト

が<ルーチン本体>の実行の前に作られる。実効的 SQL パラメタリストは,SQL 呼出しルーチンのパラメ

タ受渡し様式によって異なるエントリをもつ。実効的 SQL パラメタリストの各エントリの値は,

8.3 <ル

ーチン呼出し>”の一般規則に従って設定される。SQL 呼出しルーチンが外部 Java ルーチンでないとき,

実効的な SQL パラメタリスト中の値は,ISO/IEC 9075-2 の“13.6  データ型対応”の規則に従って<ルーチ


9

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

ン本体>によって識別されるプログラムに受け渡される。SQL 呼出しルーチンが外部 Java ルーチンならば,

実効的 SQL パラメタリスト中の値は,

4.5  パラメタ対応付け”の規則に従って<ルーチン本体>によって

識別されるプログラムに渡される。そのプログラムの実行後,SQL 呼出しルーチンのパラメタ受渡し様式

が SQL ならば,SQL 処理系は,出力パラメタ(があるならば,出力パラメタ)の値,そのプログラムか

ら戻される値(があるならば,その値)

,例外データ項目の値,及びメッセージテキスト(があるならば,

そのメッセージテキスト)の値を,プログラムによって実効的な SQL パラメタリストに代入される値から

得る。SQL 呼出しルーチンのパラメタ受渡し様式が JAVA ならば,そのような値は,プログラムによって

実効的な SQL パラメタリストに代入される値,及び受け取られていない Java 例外(があるならば,その

Java 例外)から得られる。SQL 呼出しルーチンのパラメタ受渡し様式が GENERAL ならば,そのような値

は,処理系定義の方法で得られる。

4.3

Java

クラス名解決

典型的な JVM は,

クラス名解決

  (class name resolution),すなわち,CLASSPATH と呼ばれる環境変数に

基づく探索パス機構を提供する。見たことのないクラスへの参照に JVM が出会ったとき,そのクラスが見

つかるか又はリストの最後に到達するまで,クラスパス中に現れるディレクトリのリストのメンバ,及び

JAR が順に調べられる。被参照クラスへの位置付けに失敗すると,実行時誤りとなり,それを検知する適

用業務プログラムをしばしば終了させることになる。

JVM が SQL 環境内に実効的に移るとき,JVM のクラス名解決を管理するという問題は,存在し続ける

が,大きな変更を伴う。Java 適用業務作成者にクラス名解決のより大きな制御を与え,その制御に関連し

て 追 加 さ れ た 安 全 保 護 を 与 え る た め に , 現 行 セ シ ョ ン の 環 境 変 数 ( 例 え ば , 動 的 文 に 対 す る

CURRENT_PATH など)ではなく,Java 適用業務プログラムを含んでいる JAR の特性としてクラスパスの

ような機構を規定する。したがって,外部 Java ルーチンが実行されている間に,見たことのないクラス参

照に出会ったならば,そのクラスは,現在実行中のクラスの定義を含んでいる JAR 中で最初に探索され,

見つからないならば,その JAR に関連付けられた SQL-Java パス(があるならば,それ)によって指定さ

れた方法で,そのクラスが探し出される。

SQL-Java パスは,JAR 内のクラスが,システムクラスではないクラス又は同じ JAR 中にないクラスを

参照するとき,JVM がクラス名をどのようにして解決するかを指定する。SQLJ.ALTER_JAVA_PATH は,

SQL-Java パスを JAR に関連付けるために用いる。SQL-Java パスは,(被参照項目,被参照 JAR)対のリス

トとする。被参照項目は,クラス,パッケージ,又は JAR 全体を指定するための“*”のいずれであって

もよい。SQL-Java パスリストは,対が指定された順序で探索される。各(被参照項目,被参照 JAR)対  (RI

RJ)

に対して,次による。

−  RI がクラス名ならば,そのクラスは,RJ 中で定義されていなければならない。RJ 中で定義されて

いなければ,例外条件が引き起こされる。

−  RI が解決されているクラスのパッケージならば,そのクラスは,RJ 中で定義されていなければな

らない。RJ 中で定義されていなければ,例外条件が引き起こされる。

−  RI が“*”で,かつ,そのクラスが RJ 中で定義されているならば,その解決が用いられる。そうで

なければ,次に続く対が試される。

4.4

SQL

結果集合

Java 適用業務プログラムには,カーソル又は結果集合が次の二つの形式で現れる。一つ目の形式は,JDBC 

ResultSet

と し て 参 照 さ れ , [JDBC] 及 び [J2SE] 中 で 定 義 さ れ る と お り の イ ン タ フ ェ ー ス

java.sql.ResultSet

を実装するクラスのオブジェクトとする。二つ目の形式は,SQLJ の Iterator とし


10

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

て 参 照 さ れ , ISO/IEC 9075-10 で 定 義 さ れ る と お り の イ ン タ フ ェ ー ス sqlj.runtime.

ResultSetIterator

を実装するクラスのオブジェクトとする。

ISO/IEC 9075-2

では,0 個以上の動的結果集合を戻す SQL 呼出し手続を宣言することができ,その動的

結果集合は,

結果集合カーソル

  (result set cursor)  として参照される。戻される結果集合カーソルにするた

めには,カーソル宣言は,WITH RETURN を指定しなければならず,SQL 呼出し手続から抜ける時点で,

そのカーソルが開かれていなければならない。SQL 呼出し手続である外部 Java ルーチンは,同様に,0 個

以上の動的結果集合を戻すように宣言することができるが,他の幾つかの点で,この規格の結果集合カー

ソルの扱いは,ISO/IEC 9075-2 のそれとは異なる。

Java 適用業務プログラムでは,すべての JDBC ResultSet 及び SQLJ Iterator が結果集合カーソルとして暗

に想定される。すなわち,それらの基となるカーソル宣言は,WITH RETURN を暗に想定する。この規格

では,戻される結果集合カーソルに実際にするためには,SQL 呼出し手続から抜けるとき,対応する JDBC

ResultSet 又は SQLJ Iterator の基となるカーソルが開かれているだけでは十分ではない。すなわち,出力パ

ラメタを表す当該 Java ルーチンのパラメタに JDBC ResultSet 又は SQLJ Iterator が陽に代入されなければな

らない。

4.5  パラメタ対応付け”及び“8.3  <ルーチン呼出し>”で規定するとおりに,出力パラメタは,

SQL データ型に対応付けできる Java データ型の 1 次元配列の最初の要素として当該 Java ルーチンに表現

される。動的結果集合に対して,その配列は,インタフェース java.sql.ResultSet 又はインタフェー

ス sqlj.runtime.ResultSetIterator を実装するクラスからならなければならず,JDBC ResultSet

又は SQLJ Iterator は,その配列の最初の要素に陽に代入されなければならず,かつ,その JDBC ResultSet

又は SQLJ Iterator は,閉じられていてはならない。

結果集合カーソルがどのようにして戻される結果集合カーソルになるかというこの違いが,呼び出して

いる適用業務プログラムに対して可視ではないことに注意することは重要である。

8.3  <ルーチン呼出し

>”で規定するとおりに,呼び出している適用業務プログラムには,まさに ISO/IEC 9075-2 のように,カ

ーソルが開かれた順序で 0 個以上の動的結果集合が戻される。すなわち,当該 Java ルーチン中のパラメタ

の順序は,

呼び出している適用業務プログラムが戻される結果集合にアクセスする順序に影響を与えない。

4.5

パラメタ対応付け

ある SQL データ型を ST とし,ある Java データ型を JT とする。

ST

と JT とが

単純に対応付け可能

 (simply mappable)

とは,[JDBC]の“Java 型に対応付けされる JDBC

型  (JDBC Types mapped to Java Types)”という表題の

データ型変換表

  (Data type conversion tables),表 B.1

のある行の最初の列及び 2 番目の列中に,それぞれ,ST 及び JT が指定されていることと同値とする。Java

データ型 JT は,ST 

対応する

Java

データ型

  (corresponding Java data type)  とする。

ST

と JT とが

オブジェクト対応付け可能

  (object mappable)  とは,[JDBC]の“JDBC 型の Java オブジェ

クト型への対応付け  (Mapping from JDBC Types to Java ObjectTypes)”という表題の

データ型変換表

  (Data 

type conversion tables)

表 B.3 のある行の最初の列及び 2 番目の列中に,それぞれ,ST 及び JT が指定され

ているか,又は ST の記述子がその型が外部 Java データ型であることを示し,かつ,その記述子が<JAR

及びクラス名>中の<Java クラス名>として JT を指定していることと同値とする。

ST

と JT とが

出力対応付け可能

  (output mappable)  とは,次の条件を満たすことと同値とする。

−  JT が要素データ型 JT2 をもつ 1 次元配列型(すなわち,JT  が“JT2 [ ]”

)で,かつ,ST が JT2 

単純に対応付け可能か,又は JT2 にオブジェクト対応付け可能かのいずれか。

−  JT が java.lang.StringBuffer で,かつ,拡張された SQL パラメタ宣言リスト中のそれに対応

するパラメタが保存領域データ項目。


11

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

要素データ型 ST をもつ SQL 配列型と JT とが

配列対応付け可能

  (array mappable)  とは,JT が要素デー

タ型 JT2 をもつ 1 次元配列型で,かつ,ST が JT2 に単純に対応付け可能か又は JT2 にオブジェクト対応

付け可能かのいずれかであることと同値とする。

ST

と JT とが

対応付け可能

  (mappable)  とは,ST と JT とが単純に対応付け可能か,オブジェクト対応

付け可能か,出力対応付け可能か,又は配列付け対応付け可能であることと同値とする。

Java データ型が

対応付け可能

  (mappable)  とは,それがいずれかの SQL データ型と対応付け可能である

ことと同値とする。

Java クラスが

結果集合指向

  (result set oriented)  とは,それが次のいずれかであることと同値とする。

− Java インタフェース java.sql.ResultSet を実装するクラス。

− Java インタフェース sqlj.runtime.ResultSetIterator を実装するクラス。

注記 2  これらのクラスは,ISO/IEC 9075-10 で規定しているとおりの反復子宣言  (#sql iterator)

によって生成される。

Java データ型が

結果集合対応付け可能

  (result set mappable)  とは,それが結果集合指向クラスである要素

型をもつ 1 次元配列型であることと同値とする。

M

個のパラメタをもつ Java メソッドが(SQL に)

対応付け可能

  (mappable)  とは,0 ≤ N ≤ のある N

に対して,最初の 個のパラメタのデータ型が対応付け可能で,最後の(MN)個のパラメタが結果集合対

応付け可能で,かつ,結果型が単純に対応付け可能か,オブジェクト対応付け可能か,又は void のいずれ

かであることと同値とする。

Java メソッドが SQL 中で

可視

  (visible)  とは,それが公開されていて,かつ,対応付け可能であること

と同値とする。さらに,SQL 呼出し手続又は SQL 呼出し通常関数の外部 Java ルーチンとして用いられる

ならば,可視であるためには,Java メソッドは,静的でなければならない。

Java クラスが SQL 中で

可視

  (visible)  とは,それが公開されていて,かつ,対応付け可能であることと

同値とする。

[JDBC]

は,JDBC 型対応付け表で規定する JDBC の SQL の Java データ型への対応付けを含んでいる。

ST

が INFORMATION_SCHEMA.USER_DEFINED_TYPES ビュー中に現れる外部 Java データ型ならば,ST

の記述子の<JAR 及びクラス名>中の<Java クラス名>を JT とする。JDBC のデータ型対応付け表を実効的

に拡張する。行(STJT)を

表 B.3JDBC

型の

Java

オブジェクト型への対応付け

  (Mapping from JDBC Types 

to Java Object Types)

”中に追加される行とみなし,行(JTST)を

表 B.4Java

オブジェクト型の

JDBC

への対応付け

  (Mapping from Java Object Types to JDBC Types)”中に追加される行とみなす。

4.6

処理されない Java 例外

SQL 中の Java メソッドを実行している間に投げられる Java 例外は,Java 内で受け取るか,又は処理す

ることができる。すなわち,これが行われるならば,それらの例外は,SQL 処理に影響を与えない。SQL

から呼び出される Java メソッドが完了するとき,受け取られていないすべての Java 例外は,SQL 例外条

件として SQL 環境中に現れる。

メッセージテキストは,Java の throw 文中に指定された Java 例外中で指定してもよい。Java 例外が

java.sql.SQLException

のインスタンスか又はその型の下位型ならば,SQLSTATE 値も,指定しても

よい。その例外が SQLSTATE 値を指定するならば,その SQLSTATE 値の最初の 2 文字は,

“38”でなけれ

ばならない。その例外が SQLSTATE 値を指定しないならば,受け取られていない Java 例外に対して,既

定の SQL 例外条件が引き起こされる(

15.1  受け取られていない Java 例外に対するクラス及びサブクラス

の値”を参照)


12

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

Java メソッドが SQL 文を実行するとき,SQL 文中で引き起こされるどの例外条件も,明確に Java クラ

ス Java.lang.Exception の java.sql.SQLException サブクラスである Java 例外として,Java メソ

ッド中で引き起こされる。SQL から呼び出され,それ自体が SQL 文を実行してその内側の SQL 文からの

SQLException を受け取る Java メソッドは,可搬性のために,その SQLException を再び投げなければなら

ない。

4.7

データ型

この細分箇条は,

ISO/IEC 9075-2

の“

4.1 

データ型”を修正する。

 

4.7.1

既定義でなく,SQL 以外のデータ型

この細分箇条は,

ISO/IEC 9075-2

の“

4.1.3 

既定義でなく,

SQL

以外のデータ型”を修正する。

 

【6 番目の段落を置き換える。

】各ホスト言語は,それ自身のデータ型をもち,それらは,たとえそのデ

ータ型を記述するために類似の名前が用いられるとしても,SQL データ型から分離され,区別される。SQL

データ型のホスト言語のデータ型への対応付けは,ISO/IEC 9075-2 の“11.50 <SQL

呼出しルーチン>”,

ISO/IEC 9075-2

の“20.1 <SQL

埋込みホストプログラム>”,及び ISO/IEC 9075-10 の“8.1 <SQL 埋込みホ

ストプログラム>”で規定している。すべての SQL データ型がすべてのホスト言語において対応するデー

タ型をもつわけではない。

4.8

利用者定義型

この細分箇条は,

ISO/IEC 9075-2

の“

4.7 

利用者定義型”を修正する。

 

4.8.1

利用者定義型の導入

この細分箇条は,

ISO/IEC 9075-2

の“

4.7.1 

利用者定義型の導入”を修正する。

 

【1 番目の段落の後に挿入する。

】利用者定義型は,外見上は類似しているが,基本的に異なる二つの形

式で現れる。それらの形式の重要な相違点は,利用者定義型に対する CREATE TYPE 文が“JAVA”という

外部言語を指定するかどうかによる。JAVA という外部言語が指定されるとき,その利用者定義型は,

Java

データ型

  (external Java data type)  とし,その CREATE TYPE 文は,利用者定義型の属性及びメソッ

ドの,

当該

Java

クラス

  (subject Java class)  の公開された属性及びメソッドへの直接の対応付けを定義する。

これが外部 Java データ型ではない利用者定義型との違いとなる。その違いは,次の点を含む。

−  他のどの利用者定義型に対しても,基となるクラスとの関連において必要な条件はない。すなわち,

外部 Java データ型ではない利用者定義型の各メソッドは,異なる言語で書くことができる(例えば,

あるメソッドは,SQL で書き,別のメソッドは,Fortran で書くことができる)

。このような利用者

定義型は,Java で書かれたメソッドをもつことができない。それに反して,外部 Java データ型のす

べてのメソッドは,Java で書き,JAVA というパラメタ様式を(暗に)もち,かつ,関連付けられ

た Java クラス又はその上位クラスのうちのいずれかの中で定義しなければならない。

−  他のどの利用者定義型に対しても,利用者定義型の属性とそれらの内容のどの外部表現との間にも

陽の関連がない。さらに,利用者定義型のメソッドと外部メソッドとの間の対応付けは,後に続く

CREATE METHOD 文によってそのうち行われる。それに反して,外部 Java データ型に対しては,

利用者定義型の属性及びメソッドと当該 Java クラスの公開された属性及びメソッドとの間の関連

が CREATE TYPE 文によって指定される。

−  外部 Java データ型に対して,利用者定義型のインスタンスの SQL 環境での表現を Java クラスのイ

ンスタンスに変換するために用いる機構は,<インタフェース USING 句>中で指定する。このよう

な変換は,例えば,外部 Java データ型がメソッド若しくは関数呼出しの(当該)パラメタとして指

定されたとき,又はメソッド若しくは関数呼出しから戻される Java オブジェクトが外部 Java デー


13

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

タ型として宣言された列中に格納されるときに実行される。<インタフェース指定>は,Java 定義イ

ン タ フ ェ ー ス java.io.Serializable を 指 定 す る SERIALIZABLE ( 隔 離 性 水 準 の

SERIALIZABLE と混同すべきではない),又は JDBC 定義インタフェース java.sql.SQLData を

指定する SQLDATA のいずれかであってもよい。

9.4 <利用者定義型定義>”を参照。

−  他のどの利用者定義型に対しても,静的属性の陽の提供がない。外部 Java データ型に対しては,当

該 Java クラスの指定された静的属性に対して,観測メソッドを定義する<静的フィールドメソッド

指定>を<利用者定義型定義>が含むことを許す。

Java メソッドを実行している間に行われる静的属性への修正の有効範囲及び永続性は,処理系依

存とする。

−  他のどの利用者定義型に対しても,SQL ルーチンではないどのメソッドの処理系も,SQL 環境の外

部に存在する。外部 Java データ型に対しては,

組み込まれた

JAR (installed JAR)

中の SQL 環境内

に存在する指定された当該 Java クラスによって,そのメソッドの処理系が与えられる。

−  外部 Java データ型は,構造型だけで,個別型であってはならない。

−  外部 Java ルーチンであるメソッドに対して,置換メソッドの指定は,提供されない。

注記 3  外部 Java データ型が一度作成されると,それを含んでいる SQL 処理系によって実行される

SQL 文中でのその利用は,他の利用者定義型のそれと類似している。

4.8.2

利用者定義型記述子

この細分箇条は,

ISO/IEC 9075-2

の“

4.7.2 

利用者定義型記述子”を修正する。

 

“COMPARABLE,

”を挿入することによって,1 番目の段落中の 4 番目のリスト項目を補う。

−  【1 番目の段落中のリスト項目に挿入する。

】利用者定義型が外部 Java データ型かどうかを示す標

識。

【1 番目の段落の後に挿入する。

】利用者定義型が外部 Java データ型ならば,利用者定義型記述子は,

次の項目も含む。

−  利用者定義型の<JAR 及びクラス名>。

− SERIALIZABLE 又は SQLDATA の<インタフェース指定>。

−  利用者定義型のすべての原定義属性及びすべての継承属性の属性記述子。

−  <メソッド指定リスト>が指定されるならば,<メソッド指定リスト>中に含まれる各<メソッド指定>

に対して,次の項目を含む

メソッド指定記述子

  (method specification descriptor)。

・  <メソッド名>。

・  <特定メソッド名>。

・ <SQL パラメタ宣言リスト>。

・  <戻りデータ型>,及び SELF AS RESULT の標識。

・  あるならば,<結果 CAST FROM 型>。

・  このメソッドに対応する Java ルーチンのパッケージ,クラス及び名前,並びに,指定されるなら

ば,その署名。

・ STATIC 又は CONSTRUCTOR が指定されているかどうかを示す標識。

・ STATIC が指定されているならば,これが静的フィールドメソッドかどうかを示す標識。

・  これが静的フィールドメソッドならば,静的フィールドの<Java フィールド名>及びその静的フィ

ールドを宣言するクラスの<Java クラス名>。

・  メソッドが決定的かどうかを示す標識。


14

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

・  メソッドが SQL データを潜在的に修正するか,SQL データを潜在的に読むか,SQL を潜在的に

含むか,又は SQL を潜在的に含まないかどうかを示す標識。

・  いずれかの引数がナル値の場合にメソッドの値がナル値になるならば,メソッドを呼び出さない

のがよいかどうかを示す標識。

利用者定義型が外部 Java データ型でないならば,利用者定義型記述子は,次の項目も含む。

−  利用者定義型が構造型か又は個別型かどうかを示す標識。

−  その表現が既定義データ型ならば,その型の記述子。そうでなければ,利用者定義型のすべての原

定義属性及びすべての継承属性の属性記述子。

−  <メソッド指定リスト>が指定されるならば,<メソッド指定リスト>中に含まれる各<メソッド指定>

に対して,次の項目を含む

メソッド指定記述子

  (method specification descriptor)

・  <メソッド名>。

・  <特定メソッド名>。

・  パラメタ名 SELF をもち,

暗に想定される最初のパラメタを含むように拡張された<SQL パラメタ

宣言リスト>。

・  <言語名>。

・  <言語名>が SQL でないならば,<パラメタ様式>。

・  <戻りデータ型>

・  あるならば,<結果 CAST FROM 型>。

・  <メソッド指定>が<原メソッド指定>か又は<置換メソッド指定>かどうかを示す標識。

・  <メソッド指定>が<原メソッド指定>ならば,STATIC 又は CONSTRUCTOR が指定されているか

どうかを示す標識。

・  メソッドが決定的かどうかを示す標識。

・  メソッドが SQL データを潜在的に修正するか,SQL データを潜在的に読むか,SQL を潜在的に

含むか,又は SQL を潜在的に含まないかどうかを示す標識。

・  いずれかの引数がナル値の場合にメソッドの値がナル値になるならば,メソッドを呼び出さない

ほうがよいかどうかを示す標識。

注記 4  <メソッド名>,<SQL パラメタ宣言リスト>及び<戻りデータ型>以外の<置換メソッド指定>

の特徴は,対応する<原メソッド指定>に対する特徴と同じ。

4.8.3

利用者定義型の比較及び代入

この細分箇条は,

ISO/IEC 9075-2

の“

4.7.6 

利用者定義型の比較及び代入”を修正する。

 

【5 番目の段落を置き換える。

】あるならば,利用者定義型 Ta の比較型の利用者定義型記述子中に含ま

れる順序付け関数を Ta 

比較関数

  (comparison function)  とする。

【6 番目の段落を置き換える。

】最特定型が利用者定義型 T1 及び T2 である二つの値 V1 と V2 とが比較

可能であることは,T1 及び T2 が同じ下位型族中にあり,それらが,それぞれ,ある比較型 CT1 及び CT2

をもつことと同値とする。CT1 及び CT2 は,T1 及び T2 の比較形式及び比較カテゴリがそれらのすべての

上位型のものと同じになるように制約する。比較カテゴリが COMPARABLE ならば,T1 及び T2 に対して

比較関数を指定してはならない。比較カテゴリが STATE 又は RELATIVE ならば,T1 及び T2 の比較関数

が等価であるように制約される。比較カテゴリが MAP ならば,それらの比較関数が等価であるように制

約されない。


15

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

4.8.4

静的フィールドのアクセス

Java クラスのフィールドは,

静的

  (static)  か又は

静的でない

  (non-static)  かのいずれかとして定義する

ことができる。Java クラスの静的フィールドは,更に

終端

  (final)  であることを指定し,それらを読込み

専用にすることができる。Java では,終端でないフィールドは,更新することが許される。

SQL の<利用者定義型定義>は,属性が STATIC であることを指定するための機能を含まない。これは,

一つには,データベース環境で静的属性の有効範囲,永続性及びトランザクション特性を指定することの

難しさによる。しかし,外部 Java データ型の<利用者定義型定義>は,Java 静的フィールドの値に読込み専

用でアクセスするための機構を提供する。<静的フィールドメソッド指定>句は,パラメタなしのメソッド

のメソッド名を定義する。その<外部変数名句>は,当該 Java クラス,又は当該 Java クラスの上位クラス

の静的フィールドの名前を指定する。静的フィールドメソッドは,STATIC メソッドに対する通常の方法

で呼び出され,指定された Java 静的フィールドの値を戻す。終端であるか終端でないかにかかわらず,SQL

は,Java 静的フィールドの値を更新するための機構を提供しない。

4.8.5

SQL

と Java との間のオブジェクトの変換

SQL 文によってデータベース中の Java オブジェクトを操作する適用業務プログラム作成者又は末端利

用者が,変換を実行するために用いる特定の機構を知っている必要がないのに対して,Java クラスそのも

のの開発者は,実装している特殊な Java インタフェース(すなわち,java.io.Serializable 又は

java.sql.SQLData

)の形式でそれを行う準備をする必要がある。<利用者定義型定義>には,SQL 文の

有効範囲中で SQL データベースと Java との間のオブジェクト状態情報を変換するためのインタフェース

を指定する句を導入する。上述のとおり,SQL データベース中に永続的に格納されたオブジェクトが属性

(又はフィールド)値を取り出すために若しくはそのオブジェクトのメソッドを呼び出すために SQL 文の

内側からアクセスされるとき,又はそのオブジェクトがメソッド呼出しでの入力引数として用いられると

きに,SQL から Java への変換を潜在的に行うことができる。新たに作成されるか若しくは修正されるオブ

ジェクト,又はメソッド呼出しの戻り値であるオブジェクトがデータベース中に永続的に格納される必要

があるときに,反対方向の Java から SQL への変換が要求されてもよい。

この規格は,<外部 Java 型句>中でオブジェクト状態変換を指定するための次の選択肢を提供する。

−  <利用者定義型定義>が SERIALIZABLE の<インタフェース指定>を指定するならば,Java インタフ

ェース java.io.Serializable がオブジェクト状態変換のために用いられる。

−  <利用者定義型定義>が SQLDATA の<インタフェース指定>を指定するならば,[JDBC]及び[J2SE]

で規定している Java インタフェース java.sql.SQLData がオブジェクト状態変換のために用いら

れる。

−  <利用者定義型定義>が<インタフェース指定>を指定しないならば,オブジェクト状態変換のために,

Java イ ン タ フ ェ ー ス java.io.Serializable を 用 い る か , 又 は Java イ ン タ フ ェ ー ス

java.sql.SQLData

を用いるかは,処理系定義とする。

4.8.5.1

SERIALIZABLE

<利用者定義型定義>の<インタフェース指定>が SERIALIZABLE を指定するならば,オブジェクト状態

通信は,Java インタフェース java.io.Serializable を基にする。<利用者定義型定義>の<外部 Java

クラス句>中で参照される Java クラスは,

“implements java.io.Serializable”を指定しなければ

ならず,零項構成子を提供しなければならない。

この場合には,永続的に格納され,SQL 型のメソッドに利用可能になる SQL オブジェクト状態は,Java

直列化オブジェクト状態によって完全に定義される。SQL 型に対して定義される属性は,対応する Java


16

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

クラスの公開フィールドに対応しなければならず,それらのフィールドは,各属性の<外部 Java 属性句>

中に列挙されなければならない。したがって,SQL 属性は,SQL 文の内側で可視にしたいオブジェクト状

態のそれらの部分へのアクセスを定義するが,オブジェクトの完全な状態を含まないかもしれない(その

オブジェクトは,Java クラス中にその他のフィールドを含むかもしれない)

4.8.5.2

SQLDATA

<利用者定義型定義>の<インタフェース指定>が SQLDATA を指定するならば,オブジェクト状態通信は,

[JDBC]及び[J2SE]で規定している Java インタフェース java.sql.SQLData を基にする。<利用者定義型

定義>の<外部 Java クラス句>中で参照される Java クラスは,

“implements java.sql.SQLData”を指

定しなければならず,零項構成子を提供しなければならない。

この場合には,文中で定義される属性だけが SQL オブジェクト型の完全な状態を含む。Java クラス中で

定義されるその他の公開属性又は非公開属性は,この規格で規定するオブジェクト状態の一部にはならな

い。Java オブジェクト表現は,必要ならば,SQL オブジェクト属性と全く異なってもよい。例えば,Java

クラスが極座標を用いて位置形状の点を定義するのに対して,それに対応する SQL Point 型は,直交座標

を 用 い て 定 義 し て も よ い 。 Java ク ラ ス の 処 理 系 に よ っ て な さ れ る べ き た だ 一 つ の 要 件 は ,

java.sql.SQLData

メソッド readSQL 及び writeSQL の実装が,<利用者定義型定義>中で定義された

のと同じ順序で属性を読むこと及び書くこととする。

可搬性を向上させるために,たとえ SQLDATA の<インタフェース指定>が指定されたとしても,SQL 属

性に対して<外部 Java 属性句>を指定することもできる。しかし,<外部 Java 属性句>は,SQL 中での属性

アクセスを実装するためにも,SQL と Java との間でオブジェクトを変換するためにも必要ないので,この

場合には無視される。

4.8.5.3

可搬性の向上

次の指針は,SERIALIZABLE 及び SQLDATA の両方の選択肢を提供しなくてもよいこの規格の異なる実

装に対して,Java クラスの最大の可搬性を提供する。

− SQL 型 を 実 装 す る た め に 用 い る Java ク ラ ス は , java.io.Serializable 及 び

java.sql.SQLData

の両方を実装するのがよい。

− Java クラスは,永続する必要があるか,又は公開 Java フィールドに対して維持されなければならな

い完全なオブジェクト状態を定義するのがよい。

− SQL 属性の EXTERNAL NAME は,指定するのがよい。

両方のインタフェースを提供しない処理系が提供するインタフェースを既定にできるように,<利用者

定義型定義>中の<インタフェース USING 句>を省略するのがよい。

4.9

組込み手続

SQL 環境中に外部 Java ルーチン及び外部 Java データ型を組み込むために導入されたスキーマオブジェ

クトの扱い,すなわち,JAR の扱いにおいて,この規格は,この規格群の他の部と少し異なる。この規格

は,

(例えば,

)省略可能な句を用いて,それらに含まれる配置記述子を実行させるために,JAR を追加又

は削除する新しい SQL スキーマ文を規定するのではなく,四つの組込み手続の組,及びそれらの手続が定

義される新しいスキーマを導入する。

SQLJ と名付けられた新しいスキーマは,INFORMATION_SCHEMA と名付けられたスキーマのように,

この規格を実装する SQL システムのすべてのカタログ中に存在し,この規格で規定する組込み手続のすべ

てを含むように定義される。

この規格で規定する組込み手続は,次のとおりとする。


17

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

− SQL システム中の一組の Java クラスをロードするための SQLJ.INSTALL_JAR。

− SQL システム中の一組の Java クラスを取り替えるための SQLJ.REPLACE_JAR。

−  前に組み込まれた一組の Java クラスを削除するための SQLJ.REMOVE_JAR。

− Java クラス内の名前解決用のパスを指定するための SQLJ.ALTER_JAVA_PATH。

4.10

権限

この細分箇条は,

ISO/IEC 9075-2

の“

4.34.2 

権限”を修正する。

 

“JAR,

”を挿入することによって,1 番目の段落中のリストを補う。

【2 番目の段落の 1 番目の規定項目を置き換える。

−  記述子が記述する実表,ビュー,列,定義域,文字集合,照合順,文字変換,利用者定義型,表/

メソッド対,トリガ,SQL 呼出しルーチンモジュール,順序数生成子又は JAR の識別。

【8 番目の段落を置き換える。】USAGE の<動作>をもつ権限記述子は,USAGE

権限記述子

  (usage 

privilege descriptor)

と呼ばれ,権限記述子によって識別される定義域,利用者定義型,文字集合,照合順,

文字変換,順序数生成子又は JAR に関する権限の存在を識別する。

【8 番目の段落の後に挿入する。

】この規格中で規定する機能に対する権限は,次のとおりとする。

− SQLJ.INSTALL_JAR,SQLJ.REPLACE_JAR 及び SQLJ.REMOVE_JAR 手続を呼び出すために必要な

権限は,処理系定義とする。

注記 5  これは,スキーマを作成するために必要な処理系定義の権限と類似している。

− JAR の所有者だけが SQLJ.ALTER_JAVA_PATH 手続を呼び出すことが許され,その所有者は,パス

引数中で参照される各 JAR に関する USAGE 権限ももたなければならない。

−  外部 Java ルーチンを定義及び削除するための<SQL 呼出しルーチン>及び<ルーチン削除文>の呼出

しは,SQL スキーマ文に対する通常のアクセス規則によって決定される。

− SQL 名によって参照される Java メソッドの呼出しは,SQL ルーチン名に関する通常の EXECUTE

権限によって制御される。

SQL 名によって呼び出される Java メソッドを“定義者の権限”で実行するか又は“呼出し元の権

限”で実行するかどうか,すなわち,<SQL 呼出しルーチン>を実行した利用者の利用者名で実行す

るか又は現行利用者の利用者名で実行するかどうかは,処理系定義とする。

4.11  JAR

JAR は,一式の Java  class 及び ser ファイルを含み,配置記述子ファイルを任意に含む zip 形式ファ

イルとする。組み込まれた JAR は,外部 Java ルーチン及び外部 Java データ型の実装を SQL 環境に提供す

る。

JAR は,SQL 環境の外側に作成される。それらは,SQLJ.INSTALL_JAR 手続によって,SQL 環境内に

写される。その後の SQL 文又は手続は,SQL 環境から取り除くこと,完全に置き換えること,又は SQL-Java

パスを変更すること以外のどんな方法でも組み込まれた JAR を修正しない。特に,どの SQL 操作も,JAR

へのクラスの追加,JAR からのクラスの除去,又は JAR 中のクラスの置換えを行わない。組み込まれた JAR

に対して“修正しない”というこの原則の理由は,JAR がしばしば署名されること,及び SQL 環境による

JAR の修正によって正しくなくなるかもしれない

マニフェスト

  (manifest)  データをしばしば含むことによ

る。

それぞれの組み込まれた JAR は,JAR

記述子

  (JAR descriptor)  によって表現される。JAR 記述子は,次

の項目を含む。

− JAR のカタログ名,スキーマ名及び JAR 識別子。


18

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

− JAR の SQL-Java パス。

4.11.1

配置記述子ファイル

JAR が組み込まれると,それに含まれている Java クラスの静的メソッドが SQL 呼出しルーチンとして

用いられる前に,外部 Java ルーチンを定義する一つ以上の<SQL 呼出しルーチン>を実行しなければなら

ず,それに含まれているクラスが利用者定義型として用いられる前に素早く,一つ以上の<利用者定義型

定義>を実行しなければならない。さらに,SQL 呼出しルーチン及び利用者定義型を新しく作成するため

の権限を定義する<GRANT 権限文>が必要になるかもしれない。もっと後で,JAR が取り除かれるとき,<

ルーチン削除文>,<データ型削除文>及び<REVOKE 文>を実行しなければならない。

幾つかの処理系中に JAR が組み込まれることになるならば,<SQL 呼出しルーチン>,<利用者定義型定

義>,<利用者定義順序付け定義>,<GRANT 権限文>,<ルーチン削除文>,<データ型削除文>,<利用者定

義順序付け削除文>及び<REVOKE 文>は,各処理系に対してしばしば同じになる。繰り返される組込みの

自動化を助けるために,配置記述子ファイルは,この規格で規定する SQL スキーマ文の異形を含む。これ

らの文は,配置が要求されるとき,SQLJ.INSTALL_JAR 及び SQLJ.REMOVE_JAR 手続によって,それぞ

れ,実行される複文の

組込み動作

  (install actions)  及び

除去動作

  (remove actions)  にグループ化される。さ

らに,組込み動作及び除去動作の仕立てのための指定を許す処理系定義の

処理系ブロック

 (implementor 

block)

を提供する。SQL スキーマ文は,それらが含んでいる<SQL 呼出しルーチン>及び<利用者定義型定

義>中の JAR を配置記述子ファイル内で参照するので,含んでいる JAR に対するプレースホルダの JAR 名

として,JAR 名“thisjar”が用いられる。

この規格は,SQLJ.INSTALL_JAR 及び SQLJ.REMOVE_JAR 手続の呼出しの間に配置を要求することに

よって,SQL スキーマ文の異形を実行するための新しい機構を提供する。適合する SQL 処理系は,SQL

スキーマ文の実行の基礎をなす配置記述子(

機能 J531“配置”),又は直接起動若しくは埋込み SQL(機能

J511

“コマンド”

)のような別の規格の文実行機構のいずれかを提供することが要求される。すなわち,適

合する SQL 処理系は,両方の機構を提供する必要はない。

5

語い(彙)要素

この箇条は,

ISO/IEC 9075-2

の“

5 

語い(彙)要素”を修正する。

 

5.1

<

トークン>及び<分離符号>

この細分箇条は,

ISO/IEC 9075-2

の“

5.2 <

トークン

>

及び

<

分離符号

>

”を修正する。

 

機能

<トークン>及び<分離符号>(<token> and <separator>)は,SQL 言語中の語い単位(トークン及び分離符号)

を指定する。

形式

<非予約語> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| COMPARABLE

| INTERFACE

| JAVA

| SQLDATA

<予約語> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段


19

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

| JAR

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

追加の適合性規則なし。

5.2

名前及び識別子

この細分箇条は,

ISO/IEC 9075-2

の“

5.4 

名前及び識別子”を修正する。

 

機能

名前及び識別子(Names and identifiers)は,名前を指定する。

形式

<JAR

名> ::= [ <スキーマ名> <ピリオド> ] <JAR 識別子>

<JAR

識別子> ::= <識別子>

<Java

クラス名> ::= [ <パッケージ> <ピリオド> ] <クラス識別子>

<JAR

及びクラス名> ::= <JAR 識別子> <コロン> <Java クラス名>

<

修飾付き Java フィールド名> ::= [<Java クラス名> <ピリオド> ] <Java フィールド名>

<

パッケージ> ::= <パッケージ識別子> [<ピリオド> <パッケージ識別子> ]...

<

パッケージ識別子> ::= <Java 識別子>

<

クラス識別子> ::= <Java 識別子>

<Java

フィールド名> ::= <Java 識別子>

<Java

メソッド名> ::= <Java 識別子>

<Java

識別子> ::= !! 

構文規則参照

構文規則

1)

【この

構文規則を挿入する。】<Java 識別子>は,Java の構文解析及び字句解析の規則に従って正し

い識別子でなければならない。

注記 6 Java の構文解析及び字句解析の規則は,[Java]で規定されている。

2)

【この

構文規則を挿入する。】 提供される文字集合,並びに<パッケージ識別子>,<クラス識別子>,

<Java フィールド名>及び<Java メソッド名>の最大長は,処理系定義とする。

3)

構文規則 18)の後に挿入する。】二つの<JAR 名>が等価であることは,それらが等価な<Java 識別

子>及び暗に想定されるか又は陽に指定される等価な<スキーマ名>をもつことと同値とする。

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

【この

一般規則を挿入する。】<JAR 名>は,JAR を識別する。

2)

【この

一般規則を挿入する。】<Java 識別子>は,修飾なし Java 名を表現する。

3)

【この

一般規則を挿入する。】<Java クラス名>は,完全修飾付き Java クラスを識別する。

4)

【この

一般規則を挿入する。】<パッケージ>は,完全修飾付き Java パッケージを識別する。


20

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

5)

【この

一般規則を挿入する。】<パッケージ識別子>は,修飾なしパッケージ名を表現する。

6)

【この

一般規則を挿入する。】<クラス識別子>は,修飾なし Java クラス名を表現する。

7)

【この

一般規則を挿入する。】<Java フィールド名>は,Java クラス内のフィールドの名前を表現す

る。

8)

【この

一般規則を挿入する。】<Java メソッド名>は,Java クラス内のメソッドの名前を表現する。

適合性規則

追加の適合性規則なし。

 

6

スカラ式

この箇条は,

ISO/IEC 9075-2

の“

6 

スカラ式”を修正する。

 

6.1

<

メソッド呼出し>

この細分箇条は,

ISO/IEC 9075-2

の“

6.16 

メソッド呼出し”を修正する。

 

機能

<メソッド呼出し>(<method invocation>)は,利用者定義型の値の SQL 呼出しメソッドを参照する。

形式

追加の形式項目なし。

 

構文規則

1)

構文規則 2)の後に挿入する。】UDT が外部 Java データ型ならば,<メソッド呼出し>は,<直接呼

出し>を直に含まなければならない。

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

追加の適合性規則なし。

 

6.2

<NEW

指定>

この細分箇条は,

ISO/IEC 9075-2

の“

6.18 NEW

指定”を修正する。

 

機能

<NEW 指定>(<new specification>)は,構造型の新しく生成される値のメソッドを呼び出す。

形式

追加の形式項目なし。

 

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

【この

一般規則を挿入する。】機能 J571“NEW 演算子”が提供されないならば,外部 Java データ

型の構成子を呼び出すために用いる機構は,処理系定義とする。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J571“NEW 演算子”なしでは,適合する SQL 言語は,<NEW


21

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

指定>中に直に含まれる<ルーチン呼出し>中に直に含まれる<ルーチン名>RN の暗に想定されるか

又は陽に指定される<スキーマ名>によって識別されるスキーマが,利用者定義型名が RN であり,

型が外部 Java データ型である利用者定義型を含む<NEW 指定>を含んではならない。

7

述語

この箇条は,

ISO/IEC 9075-2

の“

8 

述語”を修正する。

 

7.1

<

比較述語>

この細分箇条は,

ISO/IEC 9075-2

の“

8.2 

比較述語”を修正する。

 

機能

<比較述語>(<comparison predicate>)は,二つの行値の比較を指定する。

形式

追加の形式項目なし。

 

構文規則

1)

注記 7  【注記 179 を置き換える。】UDT1 及び UDT2 の両方の利用者定義型記述子に含まれる比較

形式及び比較カテゴリは,同じになるように制約され,かつ,それらのすべての上位型の

それと同じになるよう制約される。比較カテゴリが COMPARABLE ならば,T1 及び T2 

対して比較関数が指定されてはならない。

比較カテゴリが STATE 又は RELATIVE ならば,

UDT1

及び UDT2 は,同じ比較関数をもつように制約される。比較カテゴリが MAP なら

ば,同じ比較関数をもつようには制約されない。

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

一般規則  1) b) iv) 3)及びその部分規則の前に挿入する。】UDTx の比較カテゴリが COMPARABLE

ならば,次による。

a)

当該 SQL データ型は,外部 Java データ型でなければならない。その外部 Java データ型の当該 Java

クラスを JC とする。

注記 8  “ 9.11  < 利 用 者 定 義 順 序 付 け 定 義 > ” の 構 文 規 則 は , JC が Java イ ン タ フ ェ ー ス

java.lang.Comparable

を 実 装 す る こ と を 要 求 す る 。 イ ン タ フ ェ ー ス

java.lang.Comparable

は,結果データ型が Javaint であり,名前が compareTo で

あるメソッドをもつ Java クラスを実装することを要求する。

b)

関連付けられる JVM での の値を XJV とする。

関連付けられる JVM での の値を YJV とする。

c)

X = Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。

XJV

.compareTo(YJV ) == 0

d)  X < Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。

XJV

.compareTo(YJV ) < 0

e)

X <> Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。

XJV

.compareTo(YJV ) != 0

f)

X > Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。

XJV

.compareTo(YJV ) > 0

g)

X <= Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。


22

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

XJV

.compareTo(YJV ) <= 0

h)  X >= Y

の結果は,JVM が次の Java ブール式を実行するのと同じ結果とする。

XJV

.compareTo(YJV ) >= 0

適合性規則

追加の適合性規則なし。

 

8

その他の共通要素

この箇条は,

ISO/IEC 9075-2

の“

10 

その他の共通要素”を修正する。

 

8.1

<Java

パラメタ宣言リスト>

機能

<Java パラメタ宣言リスト>(<Java parameter declaration list>)は,Java メソッドのためのパラメタの Java

型を指定する。

形式

<Java

パラメタ宣言リスト> ::= <左括弧> [<Java パラメタ> ] <右括弧>

<Java

パラメタ> ::= <Java データ型> [ { <コンマ> <Java データ型> }... ]

<Java

データ型> ::= !! 

構文規則参照

構文規則

1) <Java

データ型>は,

4.5  パラメタ対応付け”で規定するとおり,対応付け可能か,又は結果集合対

応付け可能な Java データ型とする。<Java データ型>の名前では,大文字と小文字とが区別され,パ

ッケージ名を含むならば,それで完全に修飾されなければならない。

アクセス規則

なし。

 

一般規則

なし。

 

適合性規則

1)

機能 J631“Java 署名”なしでは,適合する SQL 言語は,“8.6 Java ルーチン署名決定”で決定され

る既定の Java メソッド署名と等価でない<Java パラメタ宣言リスト>を含んではならない。

8.2

<SQL Java

パス>

機能

<SQL Java パス>(<SQL Java path>)は,組み込まれた JAR 間にわたって Java クラスの解決を制御する。

形式

<SQL Java

パス> ::= [ <パス要素> ... ]

<

パス要素> ::= <左括弧> <被参照クラス> <コンマ> <解決 JAR> <右括弧>

<

被参照クラス> ::=

  [ <

パッケージ> <ピリオド> ] <アスタリスク>

| [<

パッケージ> <ピリオド> ] <クラス識別子>

<

解決 JAR> ::= <JAR 名>

構文規則

なし。

 

アクセス規則


23

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

なし。

 

一般規則

1) JAR

J

中の Java クラス CJ が SQL 処理系中で実行されるとき,SQLJ.ALTER_JAVA_PATH 手続の呼

出しによって と関連付けられる<SQL Java パス>を とする。

2)

システムクラスでなく,かつ,に含まれない,名前 CN のクラスへの,CJ 中のどの静的又は動的

な参照も,次のとおり解決される。

P

中の(<パス要素>があるならば,

)各<パス要素>PE に対して,それらが指定される順序で,次

による。

a)

PE

中に含まれる<被参照クラス>及び<解決 JAR>を,それぞれ,RC 及び RJ とする。RJ によって

参照される JAR を JR とする。

b) RJ

が組み込まれた JAR の名前でないならば,例外条件:Java

例外−パス中の

JAR

名が正しくな

  (invalid JAR name in path)  が引き起こされる。

注記 9  例外を引き起こした SQLJ.ALTER_JAVA_PATH の呼出しに対して取られる処理系定義

の動作が,SQL Java パス中の不正な<JAR 名>を残すことになる場合にだけ,この例外が

起きる可能性がある。

c)

RC

が CN と等価ならば,次による。

i)

CN

が JR 中のクラス の名前ならば,CN は,クラス に決まる。

ii)  CN

が JR 中のクラス の名前でないならば,例外条件:Java

例外−クラス名が解決されてい

ない

  (unresolved class name)  が引き起こされる。

d)  RC

が<アスタリスク>を単純に含み,かつ,<パッケージ>を単純に含むならば,指定された<パッ

ケージ>を PKG とし,CN の<クラス識別子>を CI とする。CN の<Java クラス名>が PKG.CI なら

ば,次による。

i)

CN

が JR 中のクラス の名前ならば,CN は,クラス に決まる。

ii)  CN

が JR 中のクラス の名前でないならば,例外条件:Java

例外−クラス名が解決されてい

ない

  (unresolved class name)  が引き起こされる。

e)

RC

が<アスタリスク>を単純に含み,かつ,<パッケージ>を単純に含まないならば,次による。

i)

CN

が JR 中のクラス の名前ならば,CN は,クラス に決まる。

ii)  CN

が JR 中のクラスの名前でないならば,

CN

は,

考慮される<パス要素>によって解決されず,

P

中の次の<パス要素>が考慮される。

3)  P

中のすべての<パス要素>が考慮された後に CN が決まっていないならば,例外条件:Java

例外−

クラス名が解決されていない

  (unresolved class name)  が引き起こされる。

適合性規則

1)

機能 J601“SQL-Java パス”なしでは,適合する SQL 言語は,<SQL Java パス>を含んではならない。

8.3

<

ルーチン呼出し>

この細分箇条は,

ISO/IEC 9075-2

の“

10.4 <

ルーチン呼出し

>

”を修正する。

 

機能

<ルーチン呼出し>は,SQL 呼出しルーチンを呼び出す。

形式

追加の形式項目なし。

 

構文規則


24

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

1)

【この

構文規則を挿入する。】SR が外部 Java ルーチンならば,次による。

a) <SQL

引数リスト>に直に含まれる<SQL 引数>は,<一般化式>を直に含んではならない。

b) <Java

パラメタ宣言リスト>の妥当性確認が処理系定義で<ルーチン呼出し>によって実行される

ならば,

8.6 Java ルーチン署名決定”の

構文規則が,<ルーチン呼出し>,0 のメソッド指定指標,

及び当該ルーチン SR に適用される。

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

一般規則  3) b) i)の後に挿入する。】が外部 Java ルーチンならば,宣言型 T

i

の処理系定義のナル

でない値を CPV

i

とする。

2)

一般規則 4)の前に挿入する。】が静的フィールドメソッドでない外部 Java ルーチンならば,R

当該

Java

メソッド

  (subject Java method)  を とする。

注記 10  外部 Java ルーチンの当該 Java メソッドは,“8.6 Java ルーチン署名決定”で規定する。

3)

一般規則 4)の最初の段落を置き換える。】が外部 Java ルーチンでない外部ルーチンならば,次

による。

4)

一般規則 5)  d) ii)の最初の段落を置き換える。】が静的フィールドメソッドでないならば,次に

よる。

5)

一般規則 8) d)の前に挿入する。】が PARAMETER STYLE JAVA を指定するならば,次による。

場合:

a)

R

が配列戻し外部関数又はマルチ集合戻し外部関数である SQL 呼出しルーチンならば,の実効

的な SQL パラメタリスト ESPL は,次のとおりに設定される。

i)

R

が戻す配列の要素型又はマルチ集合の要素型が行型ならば,要素型の次数を FRN とする。そ

うでなければ,1 を FRN とする。

ii) 1

から PN までの各 に対して,ESPL の 番目の項目に CPVi が設定される。

iii)  PN+1

から PN+FRN までの各 に対して,ESPL の 番目の項目に

結果データ項目

  (result data 

item)

が設定される。

iv)  i

が PN+FRN+1 ならば,ESPL の 番目の項目には退避領域データ項目が設定され,

PN+FRN+2

ならば,ESPL の 番目の項目には,

呼出しデータ項目

  (call type data item)  が設定

される。

v)

退避領域データ項目(すなわち,SQL 引数値リストの PN+FRN+1 番目の項目)の値には,ナ

ルを設定し,呼出しデータ項目(すなわち,SQL 引数値リストの PN+FRN+2 番目の項目)に

は,−1 を設定する。

注記 11  退避領域データ項目の初期化は,“8.5  配列戻し関数の実行”で行われる。ここでは,ナ

ルが設定される。

b)

そうでなければ,1 から PN までの各 に対して,CPVi の値のリストを,の実効的な SQL パラ

メタリスト ESPL とする。

6)

一般規則 8) f) ii) 1)の最初の段落を置き換える。】が外部 Java ルーチンではなく,かつ,が配

列戻し外部関数でもマルチ集合戻し外部関数でもなければ,は,そのパラメタ名が PNi であり,

かつ,値が次のとおりに設定された EN 個のパラメタ PDi のリストとともに実行される。

7)

一般規則 8) f) ii) 2)の前に挿入する。】が外部 Java ルーチンで,かつ,が配列戻し外部関数又


25

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

はマルチ集合戻し外部関数でもなければ,は,次のとおりに決定される方法によって,値が次の

とおりに設定されたパラメタ PDi のリストとともに実行される。

a)

R

のルーチン記述子を SRD とする。

b)  R

が SQL 呼出しメソッドであることを SRD が示すならば,その記述子が SR の対応するメソッド

指定記述子 MSD を含む利用者定義型を SRUDT とし,SRUDT の当該 Java クラスを JCLSN とす

る。

c)

場合:

i)

R

が SQL 呼出しメソッドであることを SRD が示し,かつ,が静的フィールドメソッドであ

ることを MSD が示すならば,次による。

1)  R

の当該静的フィールドを JSF とする。

注記 12 SQL 呼出しメソッドの“当該静的フィールド”は,“8.6 Java ルーチン署名決定”で規定

される。

2)  R

の実行的戻りデータ型を ERT とする。

注記 13  “実効的戻りデータ型は,ISO/IEC 9075-2 の“10.4 <ルーチン呼出し>”の構文規則で規

定される。

3)

場合:

A)  ERT

が利用者定義型ならば,次による。

I)

JSF

の値の最特定 Java クラスを SJCE とし,

その当該 Java クラスが SJCE であり,

かつ,

利用者定義型が ERT 又は ERT のサブクラスである利用者定義型を STU とする。

II)  STU

の利用者定義型記述子によって指定された<インタフェース指定>を UIS とする。

場合:

1)  UIS

が SERIALIZABLE ならば,次による。

a)

当該 Java クラス SJCE の writeObject()メソッドが,JSF の Java 値を利用者定義

型 STU の SQL 値 SSFV に変換するために実行される。

b)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 14  UIS が SERIALIZABLE ならば,“9.4 <利用者定義型定義>”で規定するように,

記述子の当該 Java クラスは,[J2SE]で規定するとおりに Java インタフェース

java.io.Serializable

を実装し,インタフェースの writeObject()メソ

ッドを定義する。

2)  UIS

が SQLDATA ならば,次による。

a)

当該 Java クラス SJCE の writeSQL()メソッドが,JSF の Java 値を利用者定義型

STU

の SQL 値 SSFV に変換するために実行される。

b)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 15  UIS が SQLDATA ならば,“9.4  <利用者定義型定義>”で規定するように,記述

子の当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフ

ェース java.sql.SQLData を実装し,インタフェースの writeSQL()メソッ

ドを定義する。

B)

そうでなければ,SSFV の値が JSF の値に設定される。

4)  ISO/IEC 9075-2

の“9.2 <格納代入>”の規則に従って,宣言形 ERT の相手に SSFV を代入し

た結果を<ルーチン呼出し>の結果とする。この細分箇条のこれ以降の一般規則は,適用さ


26

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

れない。

ii)

そうでなければ,次による。

1)  P

のために宣言された Java パラメタのデータ型を の宣言に現れた順に順序付けたリストを

JPDL

とする。

注記 16 Java パラメタが配列クラスとして宣言されるならば,JPDL には,その情報が反映

される。

2)  R

が SQL 呼出しメソッドであることを SRD が示し,かつ,がインスタンスメソッド又は

構成メソッドであることを MSD が示すならば,次のとおりに当該パラメタを JPDL の前に

付ける。

場合:

A)  JPDL

が一つ以上の Java データ型を含むならば,JCLSN を JPDL の前に付ける。

B)

そうでなければ,JPDL を JCLSN で置き換える。

3)  JPDL

の 番目のデータ型を JPi とする。

4) 1

から EN までの各 に対して,JPi が配列クラスならば,JPi の構成要素型を JPi とする。

注記 17 Java 配列の構成要素型は,[Java]で規定している。

5) 1

から EN までの各 に対して,ESPi が SQL ナル値,かつ,JPi が boolean,byte,short,

int

,long,float 又は double ならば,例外条件:

外部ルーチン呼出し例外−ナル値は許

されない

  (external routine invocation exception

null value not allowed)

が引き起こされる。

6) 1

から EN までの各 に対して,

場合:

A)  ESPi

の宣言型の値が利用者定義型ならば,を ESPi の最特定型とし,の利用者定義型

記述子によって指定される<インタフェース指定>を UIS とし,

U

の当該 Java クラスを SJCU

とする。

場合:

I)

UIS

が SERIALIZABLE ならば,次による。

1)

当該 Java クラス SJCE の readObject()メソッドが,

ESPi

の値を PDi の値である Java

オブジェクトに変換するために実行される。

2)  readObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 18  UIS が SERIALIZABLE ならば,“9.4 <利用者定義型定義>”で規定するように,U

の 当 該 Java ク ラ ス は , [J2SE] で 規 定 と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの readObject()メソッ

ドを定義する。

II)  UIS

が SQLDATA ならば,次による。

1)

当該 Java クラス SJCE の readSQL()メソッドが,ESPi の値を PDi の値である Java

オブジェクトに変換するために実行される。

2)  readSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 19  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で規定するように,の当

該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの readSQL()メソッドを定義す

る。


27

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

B)

そうでなければ,Java データ型 JPi の PDi の値には,ESPi の値が設定される。

7) 1

から EN までの各 に対して,Pi が出力 SQL パラメタ又は入出力 SQL パラメタならば,次

による。

A)  [Java]

で規定するように初期化された長さ 1 で,かつ,データ型 JPi の Java 配列を PADi

とする。

注記 20  PADi は,Java 式 new  JPi [1]の実行によって実効的に作成された Java オブジェクトで

ある。

B)  Pi

が入出力パラメタならば,PADi [0]には,PDi が設定される。

C)  PDi

は,PADi に置き換えられる。

8)  JPDL

内の Java データ型の数を JPEN とする。

9)  JPEN

が EN より大きいならば,DYNAMIC RESULT SET パラメタのための Java パラメタを

次のとおり準備する。

EN+1

から JPEN までの各 に対して,

A)  [Java]

で規定するように初期化された長さ 1 で,かつ,データ型 JPi の Java 配列を PADi

とする。

注記 21  PADi は,Java 式 new  JPi [1]の実行によって実効的に作成された Java オブジェクトで

ある。

B)  PDi

の値には,PADi の値が設定される。

10)

当該 Java クラス名,

当該 Java メソッド名及び の実効的戻りデータ型を,

それぞれ,

JCLSN

JMN

及び ERT とする。当該 Java クラスの当該 Java メソッドの呼出しは,次による。

場合:

A)  R

が SQL 呼出し手続ならば,次による。

I)

JPEN

が 0 より大きいならば,次の Java 文を実効的に実行する。

JCLSN

.JMN ( PD

1

, ..., PD

JPEN

 ) ;

II)  JPEN

が 0 ならば,次の Java 文を実効的に実行する。

JCLSN

.JMN ( ) ;

B)  R

が,ルーチン記述子が STATIC を示す SQL 呼出し手続又は SQL 呼出し通常関数ならば,

次による。

I)

ERT

が利用者定義型ならば,

ERT

の当該 Java クラス及び当該 Java クラス名をそれぞれ,

SJCE

及び SJCEN とする。

II)  ERT

が利用者定義型でないならば,当該 Java メソッドの Java 戻りデータ型を SJCEN 

する。

III)  JPEN

が 0 より大きいならば,次の Java 文を実効的に実行する。

SJCEN

 tempU = JCLSN.JMN ( PD

1

, ..., PD

JPEN

 ) ;

IV)  JPEN

が 0 ならば,次の Java 文を実効的に実行する。

SJCEN

 tempU = JCLSN.JMN ( ) ;

C)  R

が SQL 呼出し構成メソッドならば,次による。

I)

JPEN

が 1 より大きいならば,次の Java 文を実効的に実行する。

JCLSN

 PD

1

 = new JCLSN ( PD

2

, ..., PD

JPEN

 ) ;

II)  JPEN

が 1 ならば,次の Java 文を実効的に実行する。


28

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

JCLSN

 PD

1

 = new JCLSN ( ) ;

D)

そうでなければ,次による。

I)

ERT

が利用者定義型ならば,ERT の当該 Java クラス及び当該 Java クラス名を,それぞ

れ,SJCE 及び SJCEN とする。

II)  ERT

が利用者定義型でないならば,当該 Java メソッドの Java 戻りデータ型を SJCEN 

する。

III)  JPEN

が 1 より大きいならば,次の Java 文を実効的に実行する。

SJCEN

 tempU = PD

1

 . JMN PD

2

 , ..., PD

JPEN

 ) ;

IV)  JPEN

が 1 ならば,次の Java 文を実効的に実行する。

SJCEN

 tempU = PD

1

 . JMN ( ) ;

注記 22 Java 文 SJCEN tempU = PD

1

 . JMN ( PD

2

 , ..., PD

JPEN

 ) ;

,又は Java

文 SJCEN tempU = PD

1

 . JMN ( ) ;

のいずれかによって実効的に実行される

Java

メソッドは,[Java]で規定されるとおり,インスタンスメソッドを置換する

ための Java の規則に従って,PD

1

の値に基づいて決定される。

8)

一般規則 8) f) ii) 4)の後に挿入する。】が外部 Java ルーチンならば,の実行終了前にクラス変

数に加えられた変更の有効範囲及び永続性は,処理系依存とする。

9)

一般規則 8) f) ii) 11)を置き換える。】言語が ADA(それぞれ C,COBOL,FORTRAN,JAVA,M,

PASCAL,PLI)を指定し,かつ,が標準適合 Ada プログラム(それぞれ C,COBOL,Fortran,Java,

M,Pascal,PL/I プログラム)でないならば,の実行結果は,処理系依存とする。

10)

一般規則 8) g) i)の前に挿入する。】が外部 Java ルーチンで,かつ,受け取られていない Java 例

外 で の実行が終了するならば,

15.1  受け取られていない Java 例外に対するクラス及びサブク

ラスの値”で規定する例外条件が引き起こされ,これ以上この細分箇条の

一般規則は,適用されな

い。

11)

一般規則 8) g) ii)の最初の文を置き換える。】が外部 Java ルーチンならば,1 から EN までの各 i

に対して,ESPi の値には,PDi の値が設定される。

12)

一般規則 8) h) i) 3)の後に挿入する。】が型保持関数でない外部 Java ルーチンならば,の実効

的戻りデータ型を ERT とする。の戻り値 tempU は,次のとおりに処理される。

a)

場合:

i)

ERT

が利用者定義型ならば,次による。

1)  tempU

の値の最特定 Java クラスを SJCE とし,その当該 Java クラスが SJCE であり,その利

用者定義型が ERT 又は ERT のサブクラスである利用者定義型を STU とする。

2)  STU

の利用者定義型記述によって指定された<インタフェース指定>を UIS とする。

3)

場合:

A)  UIS

が SERIALIZABLE ならば,次による。

I)

当該 Java クラス SJCE の writeObject()メソッドが,tempU の Java 値を利用者定義型

STU

の SQL 値 SSFV に変換するために実行される。

II)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 23  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で規定するように,記

述 子 の 当 該 Java ク ラ ス は ,[J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの writeObject()メソッド


29

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を定義する。

B)  UIS

が SQLDATA ならば,次による。

I)

当該 Java クラス SJCE の writeSQL()メソッドが,

tempU

の Java 値を利用者定義型 STU

の SQL 値 SSFV に変換するために実行される。

II)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 24  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で規定するように,記述子の

当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの writeSQL()メソッドを定義す

る。

ii)

そうでなければ,SSFV の値には,tempU の値が設定される。

b)  SSFV

を RV とする。

13)

一般規則 8) h) i) 3)の後に挿入する。】が型保持関数である外部 Java ルーチンならば,の実効

的戻りデータ型を ERT とする。の戻り値 PD

1

は,次のとおりに処理される。

a)

PD

1

の値の最特定 Java クラスを SJCE とし,その当該 Java クラスが SJCE で,かつ,その利用者

定義型が ERT 又は ERT のサブクラスである利用者定義型を STU とする。

b)  STU

の利用者定義型記述によって指定された<インタフェース指定>を UIS とする。

場合:

i)

UIS

が SERIALIZABLE ならば,次による。

1)

当該 Java クラス SJCE の writeObject()メソッドが,PD

1

の Java 値を利用者定義型 STU

の SQL 値 SSFV に変換するために実行される。

2)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 25  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で規定するように,記述子

の 当 該 Java ク ラ ス は , [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの writeObject()メソッドを定

義する。

ii)  UIS

が SQLDATA ならば,次による。

1)

当該 Java クラス SJCE の writeSQL()メソッドが,

PD

1

の Java 値を利用者定義型 STU の SQL

値 SSFV に変換するために実行される。

2)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 26  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で規定するように,記述子の当該

Java ク ラ ス は , [JDBC] 及 び [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.sql.SQLData

を実装し,インタフェースの writeSQL()メソッドを定義する。

c)

SSFV

を RV とする。

14)

一般規則 8) i) ii)の後に挿入する。】が PARAMETER STYLE JAVA を指定するならば,出力 SQL

パラメタ又は入出力 SQL パラメタである各パラメタは,次のとおりに処理される。

a)

R

の 番目の SQL パラメタを Pi とし,Pi の宣言型を Ti とする。

b)  EPVi

には,PDi [0]の値が設定される。

場合:

i)

Ti

が利用者定義型ならば,次による。

1)  EPVi

の値の最特定 Java クラスを SJCE とし,その当該 Java クラスが SJCE であり,その利


30

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

用者定義型が Ti,又は Ti のサブクラスである利用者定義型を STU とする。

2)  STU

の利用者定義型記述子で指定される<インタフェース指定>を UIS とする。

場合:

A)  UIS

が SERIALIZABLE ならば,次による。

I)

当該 Java クラス SJCE の writeObject()メソッドが,EPVi の Java 値を利用者定義型

STU

の SQL 値 CPVi に変換するために実行される。

II)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 27  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で規定するように,記

述 子 の 当 該 Java ク ラ ス は ,[J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの writeObject()メソッド

を定義する。

B)  UIS

が SQLDATA ならば,次による。

I)

当該 Java クラス SJCE の writeSQL()メソッドが,EPVi の Java 値を利用者定義型 STU

の SQL 値 CPVi に変換するために実行される。

II)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 28  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で規定するように,記述子の

当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの writeSQL()メソッドを定義す

る。

ii)

そうでなければ,CPVi には,EPVi が設定される。

15)

一般規則 10)  b)を置き換える。】が外部 Java ルーチンでないならば,制御が INV に戻ったとき

に開いたままの当該ルーチンの本体で宣言された結果集合カーソルの実際の数を OPN とする。

16)

一般規則 10) b)の後に挿入する。】が外部 Java ルーチンならば,結果集合対応付け可能パラメタ

のために上記で生成された JPEN-EN 個の各配列の最初の要素を含む集合を RSN とし,Java ナル値

でない RSN の要素を RS とし,RS の要素数を OPN とする。

17)

一般規則 10) d)の前に挿入する。】が外部 Java ルーチンならば,次による。

a)

RS

の要素を作成した JDBC コネクションオブジェクトが閉じているならば,その効果は,処理系

定義とする。

b)  RS

の要素が現行 SQL システム及び SQL セションへの接続によって戻されたオブジェクトでない

ならば,その効果は,処理系定義とする。

18)

一般規則 10) d)を置き換える。】が外部 Java ルーチンでないならば,PR が INV に戻ったときに

開いたままの結果集合カーソルの順序付けられた集合を FRC とする。1  ≤  i  ≤  RNT に対して,FRC

の 番目のカーソルを FRCi とし,FRCi を識別する<カーソル名>を FRCNi とし,FRCi の結果集

合を RCSi とする。

19)

一般規則 10) d)の後に挿入する。】が外部 Java ルーチンならば,開いたままの RS の要素の SQL

で開かれた順での写しを FRC とする。

1 ≤ i ≤ RNT に対して,FRC の 番目のカーソルを FRCi とし,

FRCi

を識別する<カーソル名>を FRCNi とし,FRCi の結果集合を RCSi とする。

20)

一般規則 10) h)を置き換える。】が外部 Java ルーチンでないならば,終了条件:

警告−動的結果

集合が戻された

  (warning—dynamic result sets returned)  が引き起こされる。

21)

一般規則 10)  h)の後に挿入する。】が外部 Java ルーチンならば,RS 中の各 RSi に対して,RSi


31

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を閉じ,RSi を作成した文オブジェクトを閉じる。

22)

一般規則 11)の前に挿入する。】が外部 Java ルーチンならば,の呼出しが JDBC で規定すると

おりに更新行数を戻すかどうかは,処理系定義とする。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J611“参照”なしでは,適合する SQL 言語は,<参照値式>を

含んではならない。

2)

【この

適合性規則を挿入する。】機能 J611“参照”なしでは,適合する SQL 言語は,<右矢印>を含

んではならない。

8.4

<LANGUAGE

>

この細分箇条は,

ISO/IEC 9075-2

の“

10.2 <LANGUAGE

>

”を修正する。

 

機能

<LANGUAGE 句>は,標準プログラム言語を指定する。

形式

<

言語名> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| JAVA

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

一般規則 1)を置き換える。】[Java]で標準が規定されている JAVA 言語を除いて,<LANGUAGE 句

>で指定された標準プログラム言語は,<言語名>のキーワードで識別される国際規格(又は一致す

る JIS)で定義される。ISO/IEC 9075-2 

表 15“標準プログラム言語”は,その<言語名>と国際規

格との関係を規定する。

適合性規則

追加の適合性規則なし。

 

8.5

配列戻し関数の実行

この細分箇条は,

ISO/IEC 9075-2

の“

9.14 

配列戻し関数の実行”を修正する。

 

機能

配列値を戻す外部関数の実行を定義する。

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

一般規則 6)を置き換える。】場合:

a)

P

が外部 Java ルーチンならば,EN-FRN-2 を PN 及び とする。

b)

そうでなければ,の静的 SQL 引数リスト中の値の数を PN 及び とする。

2)

一般規則 8)の先頭段落を置き換える。】が外部 Java ルーチンではなく,呼出し型データ項目が


32

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

“open call”を示す)-1 の値をもつならば,は,そのパラメタ名が PNi であり,かつ,値が

次のとおりに設定された EN 個のパラメタ PDi のリストとともに実行される。

3)

一般規則 9)の前に挿入する。】が外部 Java ルーチンで,かつ,呼出し型データ項目が(“open

call

”を示す)-1 の値をもつならば,は,値が次のとおりに設定された EN 個のパラメタ PDi

のリストとともに実行される。

a)

P

のために宣言された Java パラメタのデータ型を の宣言に現れた順に順序付けたリストを

JPDL

とする。

注記 29 Java パラメタが配列クラスとして宣言されるならば,JPDL には,その情報が反映され

る。

b)  JPDL

の 番目の Java データ型を JPDTi とする。

c)

PN+1

から PN+FRN までの に対して,JPDTi の構成要素型を JPi とする。

注記 30 Java 配列の構成要素型は,[Java]で規定されている。

d) 1

から PN までの に対して,

ESPi

の値が SQL ナル値で,

かつ,

JPDTi

が boolean,

byte

short

int

,long,float 又は double のいずれかならば,例外条件:

外部ルーチン呼出し例外−ナ

ル値は許されない

  (external routine invocation exception

null value not allowed)

が引き起こされる。

e) 1

から PN までの に対して,次による。

場合:

i)

ESPi

が利用者定義型ならば,を ESPi の最特定型とし,の利用者定義型記述子によって指

定される<インタフェース指定>を UIS とし,の当該 Java クラスを SJCU とする。

場合:

1)  UIS

が SERIALIZABLE ならば,次による。

A)  SJCU

のメソッド readObject()が実行され,ESPi の値を Java オブジェクト PDi の値に

変換する。

B)  readObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 31  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で記述されるとおり,U

の 当 該 Java ク ラ ス は , [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの readObject()メソッドを

定義する。

2)  UIS

が SQLDATA ならば,次による。

A)  SJCU

のメソッド readSQL()が実行され,ESPi の値を Java オブジェクト PDi の値に変換

する。

B)  readSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 32  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,の当該

Java ク ラ ス は , [JDBC] 及 び [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.sql.SQLData

を実装し,インタフェースの readSQL()メソッドを定義する。

ii)

そうでなければ,PDi の値には,ESPi の値が設定される。

f)

PN+1

から PN+FRN までの に対して,次による。

i)

[Java]

で規定するように初期化された長さ 1 で,

かつ,

データ型 JPi の Java 配列を PADi とする。

注記 33  PADi は,Java 式 new JPi [1]の実行によって実効的に作成された Java オブジェクトである。

ii)  PDi

は,PADi で置き換えられる。


33

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

g)

退避領域データ項目に対して,EN-1 と等しい に対して,次による。

i)

場合:

1) Java

データ型 JPDTi が java.lang.String の配列クラスならば,[Java]で規定するように

初期化された java.lang.String の長さ 1 の Java 配列を PADi とする。

注記 34  PADi は,Java 式 new java.lang.String[1]の実行によって実効的に生成される Java

オブジェクトである。

2)

そうでなければ,退避領域データ項目の処理系定義の長さの java.lang.StringBuffer

を生成する。処理系定義の長さを LN とし,Java 式 new java.lang.StringBuffer(LN)

の実行によって実効的に生成される Java オブジェクトを PADi とする。それから,PADi 

LN

個の

ナル文字

 (null character) (U+0000)

で初期化する。

ii)  PDi

は,PADi で置き換えられる。

h)

呼出し型データ項目に対して,EN と等しい に対して,PDi の値には,

(“open call”を示す)

-1 の値が設定される。

i)

P

の当該 Java クラス名及び当該 Java メソッド名を,それぞれ,JCLSN 及び JMN とする。次の Java

式が実効的に実行される。

JCLSN

.JMNPD

1

, ..., PD

EN

 );

4)

一般規則 9) a)を置き換える。】が外部 Java ルーチンではなく,かつ,例外データ項目の値が(終

了条件

成功終了

  (successful completion)  に対応する)’00000’か,又は が外部 Java ルーチンでは

なく,かつ,例外データ項目の値の最初の 2 文字が(終了条件  部分条件付き

警告

  (warning)  に対

応する)

“01”ならば,呼出し型データ項目には,

fetch call を示す)0 を設定する。

5)

一般規則 9)  b)の前に挿入する。】が外部 Java ルーチンで,かつ,の前の呼出しが処理されて

いない Java 例外(unhandled Java exception)で終了しなかったならば,呼出し型データ項目には,

fetch call を示す)0 を設定する。

6)

一般規則 9)  b)の先頭段落を置き換える。】が外部 Java ルーチンではなく,かつ,例外データ項

目の値が(終了条件

データなし

  (no data)  に対応する)’02000’ならば,次による。

7)

一般規則 9) c)の前に挿入する。】が外部 Java ルーチンであり,クラス java.sql.SQLException,

又はそのようなクラスのサブクラスのインスタンスである処理されていない Java 例外で,の前の

呼出しが終了し,かつ,そのインスタンスに対するメソッド getSQLState()の呼出しの結果が,

(終了条件

データなし

  (no data)  に対応する)’02000’の値をもつ java.lang.String ならば,

次による。

a)

PN+1

から PN+FRN までの に対して,Java クラスである各 JPi が,PDi の最初の要素 ([0]) 中に

Java ナルである関連する値をもつならば,AR にナル値を設定する。

b)

呼出し型データ項目に(

close call”を示す)1 を設定する。

8)

一般規則 10)  a)の先頭段落を置き換える。】が外部 Java ルーチンでないならば,パラメタ名が

PNi

で,かつ,値が次のとおりに設定された EN 個のパラメタ PDi のリストとともに,が実行さ

れる。

9)

一般規則 10)  b)の前に挿入する。】が外部 Java ルーチンならば,値が次のとおりに設定された

EN

個のパラメタ PDi のリストとともに,が実行される。

a) 1

から PN までの に対して,次による。

場合:


34

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

i)

ESPi

が利用者定義型ならば,を ESPi の最特定型とし,の利用者定義型記述子によって指

定される<インタフェース指定>を UIS とし,の当該 Java クラスを SJCU とする。

場合:

1)  UIS

が SERIALIZABLE ならば,次による。

A)  SJCU

のメソッド readObject()が実行され,ESPi の値を Java オブジェクト PDi の値に

変換する。

B)  readObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 35  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で記述されるとおり,U

の 当 該 Java ク ラ ス は , [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの readObject()メソッドを

定義する。

2)  UIS

が SQLDATA ならば,次による。

A)  SJCU

のメソッド readSQL( )が実行され,ESPi の値を Java オブジェクト PDi の値に変

換する。

B)  readSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 36  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,の当該

Java ク ラ ス は , [JDBC] 及 び [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.sql.SQLData

を実装し,インタフェースの readSQL()メソッドを定義する。

ii)

そうでなければ,PDi の値には,ESPi の値が設定される。

b)  PN+1

から PN+FRN までの に対して,次による。

i)

[Java]

で規定するように初期化された長さ 1 で,

かつ,

データ型 JPi の Java 配列を PADi とする。

注記 37  PADi は,Java 式 new  JPi [1]の実行によって実効的に作成された Java オブジェクトであ

る。

ii)  PDi

は,PADi で置き換えられる。

c)

退避領域データ項目に対して,EN-1 と等しい に対して,次による。

i)

場合:

1) Java

データ型 JPi が java.lang.String の配列クラスならば,の前の実行によって戻さ

れた java.lang.String の値を含む,java.lang.String の長さ 1 の Java 配列を PADi

とする。

2)

そうでなければ,の前に実行によって戻された java.lang.StringBuffer の値を含む

長さ LN の java.lang.StringBuffer を PADi とする。

ii)  PDi

は,PADi で置き換えられる。

d)

呼出し型データ項目に対して,EN と等しい に対して,PDi の値には,

(“fetch call”を示

す)値 0 が設定される。

e)

P

の当該 Java クラス名及び当該 Java メソッド名を,それぞれ,JCLSN 及び JMN とする。次の Java

式が実効的に実行される。

JCLSN

.JMNPD

1

, ..., PD

EN

 );

10)

一般規則 10) b) i)の先頭段落を置き換える。】が外部 Java ルーチンではなく,かつ,例外データ

項目の値が(終了条件

成功終了

  (successful completion)  に対応する)’00000’若しくは最初の 2 文

字が(終了条件  部分条件付き

警告

  (warning)  に対応する)“01”か,又は が外部 Java ルーチン


35

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

で,かつ,の前の呼出しが処理されていない Java 例外で終了しなかったならば,次による。

11)

一般規則 10)  b)  i)  3)  A)を置き換える。】が外部 Java ルーチンではなく,かつ,(PN+FRN)+N+1

から(PN+FRN)+N+FRN までの に対して,各 PDi(すなわち,結果データ項目に対応する SQL 標

識引数)が負ならば,ナル値を AR の 番目の要素とする。

12)

一般規則 10)  b)  i)  3)  A)の後に挿入する。】が外部 Java ルーチンで,かつ,PN+1 から PN+FRN

までの に対して,Java クラスである各 JPi が,PDi の最初の要素 ([0]) 中に Java ナルである関連

する値をもつならば,ナル値を AR の 番目の要素とする。

13)

一般規則 10) b) i) 3) B) I)を置き換える。】が外部 Java ルーチンではなく,FRN が 1 ならば,結

果データ項目の値を AR の 番目の要素とする。

14)

一般規則 10) b) i) 3) B) I)の後に挿入する。】が外部 Java ルーチンならば,結果データ項目に対し

て,PN+1 から PN+FRN までの に対して,次による。

a)

場合:

i)

ESPi

が利用者定義型ならば,次による。

1)  ESPi

の値の最特定型を ESTi とする。

2)  PDi [0]

の値の最特定 Java クラスを SJCE とし,当該 Java クラスが SJCE であり,利用者定義

型が ESTi 又は ESTi のサブクラスである利用者定義型を STU とする。

3)  STU

の利用者定義型記述子によって指定される<インタフェース指定>を UIS とする。

4)

場合:

A)  UIS

が SERIALIZABLE ならば,次による。

I)

SJCE

のメソッド writeObject()が実行され,

PDi [0]

の値を利用者定義型 STU の値 SCi

へ変換する。

II)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 38  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で記述されるとおり,

記述子の当該 Java クラスは,[J2SE]で規定するとおりに Java インタフェース

java.io.Serializable

を実装し,インタフェースの writeObject()メソッド

を定義する。

B)  UIS

が SQLDATA ならば,次による。

I)

SJCE

のメソッド writeSQL()が実行され,PDi [0]の値を利用者定義型 STU の値 SCi 

変換する。

II)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 39  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,記述子

の当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの writeSQL()メソッドを定義す

る。

ii)

そうでなければ,SCi の値には,PDi [0]の値が設定される。

b)

場合:

i)

FRN

が 1 ならば,SCi を AR の 番目の要素とする。

ii)

そうでなければ,次の<行値式>の値を AR の 番目の要素とする:

ROW ( SV

1

, ..., SVF

RN

 )

15)

一般規則 10) b) ii)の先頭段落を置き換える。】が外部 Java ルーチンではなく,かつ,例外データ


36

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

項目の値が(終了条件

データなし

  (no data)  に対応する)’02000’か,又は が外部 Java ルーチン

であり,クラス java.sql.SQLException,又はそのようなクラスのサブクラスのインスタンス

である処理されていない Java 例外で,の前の呼出しが終了し,かつ,そのインスタンスに対する

メ ソ ッ ド getSQLState() の 呼 出 し の 結 果 が ,( 終 了 条 件

デ ー タ な し

  (no data)  に対応す

る)’02000’の値をもつ java.lang.String ならば,次による。

16)

一般規則 11)の先頭段落を置き換える。】が外部 Java ルーチンではなく,呼出し型データ項目が

close call”を示す)1 の値をもつならば,は,そのパラメタ名が PNi であり,かつ,値が

次のとおりに設定される EN 個のパラメタ PDi のリストとともに実行される。

17)

一般規則 11)の後に挿入する。】が外部 Java ルーチンで,かつ,呼出し型データ項目が(“close 

call

”を示す)1 の値をもつならば,は,値が次のとおりに設定される EN 個のパラメタ PDi 

リストとともに実行される。

a) 1

から PN までの に対して,次による。

場合:

i)

ESPi

が利用者定義型ならば,を ESPi の最特定型とし,の利用者定義型記述子によって指

定される<インタフェース指定>を UIS とし,の当該 Java クラスを SJCU とする。

場合:

1)  UIS

が SERIALIZABLE ならば,次による。

A)  SJCU

のメソッド readObject()が実行され,ESPi の値を Java オブジェクト PDi の値に

変換する。

B)  readObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 40  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で記述されるとおり,U

の 当 該 Java ク ラ ス は , [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.io.Serializable

を実装し,インタフェースの readObject()メソッドを

定義する。

2)  UIS

が SQLDATA ならば,次による。

A)  SJCU

のメソッド readSQL()が実行され,ESPi の値を Java オブジェクト PDi の値に変換

する。

B)  readSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 41  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,の当該

Java ク ラ ス は , [JDBC] 及 び [J2SE] で 規 定 す る と お り に Java イ ン タ フ ェ ー ス

java.sql.SQLData

を実装し,インタフェースの readSQL()メソッドを定義する。

ii)

そうでなければ,PDi の値には,ESPi の値が設定される。

b)  PN+1

から PN+FRN までの に対して,次による。

i)

[Java]

で規定するように初期化された長さ 1 で,

かつ,

データ型 JPi の Java 配列を PADi とする。

注記 42  PADi は,Java 式 new JPi [1]の実行によって実効的に作成された Java オブジェクトである。

ii)  PDi

は,PADi で置き換えられる。

c)

退避領域データ項目に対して,EN-1 と等しい に対して,次による。

i)

場合:

1) Java

データ型 JPi が java.lang.String の配列クラスならば,の前の実行によって戻さ

れた java.lang.String の値を含む,java.lang.String の長さ 1 の Java 配列を PADi


37

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

とする。

2)

そうでなければ,の前に実行によって戻された java.lang.StringBuffer の値を含む

長さ LN の java.lang.StringBuffer を PADi とする。

ii)  PDi

は,PADi で置き換えられる。

d)

呼出し型データ項目に対して,EN と等しい に対して,PDi の値には,

(“close call”を示

す)値 1 が設定される。

e)

P

の当該 Java クラス名及び当該 Java メソッド名を,それぞれ,JCLSN 及び JMN とする。次の Java

式が実効的に実行される。

JCLSN

.JMNPD

1

, ..., PD

EN

 );

適合性規則

追加の適合性規則なし。

8.6

Java

ルーチン署名決定

機能

Java ルーチン署名決定(Java routine signature determination)は,Java メソッドの署名が陽に指定されないな

らば,それがどのように決定されるのか,及び外部 Java ルーチン若しくは外部 Java データ型を作成した

ときに指定された情報,又は SQL ルーチンを呼び出すときに適用可能な記述子の内容のいずれかに基づい

て,どのように有効化されるのかに関する規則を規定する。

構文規則

1)

この細分箇条の適用において指定される構文要素,メソッド指定指標及び(あるならば,

)当該ルー

チンを,それぞれ,CNTXT及び SR とする。

2)

この細分箇条の後の規則で必要な情報は,次のとおり,この細分箇条が実行される文脈に基づいて

集められる。

場合:

a)

CNTXT

が<SQL 呼出ルーチン>を指定するならば,次による。

i) <

外部 Java 参照文字列>中に含まれる<JAR 名>,<Java クラス名>,<Java メソッド名>及び<Java

パラメタ宣言リスト>を,それぞれ,JNJCLSNJMN 及び JPDL とする。

ii) <SQL

パラメタ宣言リスト>を SPDL とする。

iii) <SQL

呼出ルーチン>が<スキーマ手続>を含むならば,次による。

1)  DYNAMIC RESULT SETS N

が 0 より大きい に対して指定されるならば,を DRSN とす

る。

2)

そうでなければ,0 を DRSN とする。

iv) <SQL

呼出ルーチン>が<スキーマ関数>を含み,<SQL 呼出ルーチン>が配列戻し外部関数又は

マルチ集合戻し外部関数を指定するならば,次による。

1) <

パラメタモード>OUT である<SQL パラメタ宣言>のコンマで区切られたリストを指定する

結果データ領域パラメタリストを RDPL とする。それらの<パラメタ型>は,

9.8 < SQL 呼出

しルーチン>”で規定するとおりに,PN+1 から PN+FRN までの実効的な SQL パラメタリス

ト項目の<パラメタ型>として定義される。

2)  RDPL

に,<コンマ>,並びに<データ型>が処理系定義の長さ及び文字集合 SQL_TEXT の文

字列であり,<パラメタモード>INOUT である<SQL パラメタ宣言>を追加する。

3)  RDPL

に,<コンマ>,及び<データ型>が位取り 0 の真数型であり,<パラメタモード>IN であ


38

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

る<SQL パラメタ宣言>を追加する。

4)

入力パラメタ,結果データ項目パラメタ,並びに退避領域データ項目及び呼出し型データ項

目を含む<SQL パラメタ宣言リスト>を作成するために,SPDL に<コンマ>及び RPDL を追加

する。

b)  CNTXT

が<利用者定義型定義>を指定するならば,次による。

i) <

利用者定義型定義>を UDTD とし,UDTD 中に直に含まれる<利用者定義型本体>を UDTB 

し,UDTB 中に直に含まれる<スキーマ解決利用者定義型名>を UDTN とする。

ii)  UDTB

中に含まれる<外部 Java 型句>中に含まれる<JAR 名>及び<Java クラス名>を,

それぞれ,

JN

及び JCLSN とする。

iii)

4.5  パラメタ対応付け”で規定するパラメタの対応付けのために,UDTD によって定義され

る利用者定義型の記述子が SQL セション中で既に適用可能であるものとして,この細分箇条の

残りの規則が実行される。その記述子は,名前 UDTN をもち,外部 Java データ型であり,UDTD

中に指定された<JAR 及びクラス名>をもつ型を記述する。

iv)  UDTB

によって含まれる<メソッド指定リスト>中の 番目の<メソッド指定>を MSi とする。

v)  MSi

の RETURNS 句中で指定された SQL<データ型>を SRT とする。

vi) 0

を DRSN とする。

vii)  MSi

が<静的フィールドメソッド指定>を直に含むならば,次による。

1)  MSi

の<修飾付き Java フィールド名>を QJFN とする。

2)  QJFN

中に含まれる<Java フィールド名>中に含まれる<Java 識別子>を FI とする。

3)  QJFN

が<Java クラス名>を指定するならば,そのクラス名を SFC とする。そうでなければ,

JCLSN

を SFC とする。

4)

次の<SQL パラメタ宣言リスト>を SPDL とする。

( )

viiiMSi

が<静的フィールドメソッド指定>を直に含まないならば,次による。

1)  MSi

中に含まれる<Java メソッド及びパラメタ宣言>中に含まれる<Java メソッド名>及び

<Java パラメタ宣言リスト>を,それぞれ,JMN 及び JPDL とする。

2)  MSi

の拡張された SQL パラメタ宣言リスト NPLi を SPDL とする。

3)  MSi

が配列戻し外部関数又はマルチ集合戻し外部関数を指定するならば,次による。

A) <

パラメタモード>OUT である<SQL パラメタ宣言>のコンマで区切られたリストを指定す

る結果データ領域パラメタリストを RDPL とする。それらの<パラメタ型>は,

9.8 <SQL

呼出しルーチン>”で規定するとおりに,PN+1 から PN+FRN までの実効的な SQL パラメ

タリスト項目の<パラメタ型>として定義される。

B)  RDPL

に,<コンマ>,並びに<データ型>が処理系定義の長さ及び文字集合 SQL_TEXT の文

字列であり,<パラメタモード>INOUT である<SQL パラメタ宣言>を追加する。

C)  RDPL

に,<コンマ>,及び<データ型>が位取り 0 の真数型であり,<パラメタモード>IN で

ある<SQL パラメタ宣言>を追加する。

D)

拡張された SQL パラメタリスト,結果データ項目パラメタ,並びに退避領域データ項目及

び呼出し型データ項目を含む<SQL パラメタ宣言リスト>を作成するために,SPDL に<コ

ンマ>及び RPDL を追加する。

c)

そうでなければ,記述子が適用できる。


39

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

i)

SR

のルーチン記述子を SRD とする。

ii) SQL

呼出しルーチンが SQL 呼出しメソッドであることを SRD が示すならば,次による。

1)

記述子が SR の対応するメソッド指定記述子 MSD を含む利用者定義型を SRUDT とし,

SRUDT

の利用者定義型記述子を SRUDTD とする。

2)  SRUDTD

の<JAR 及びクラス名>によって含まれる<JAR 名>及び<java クラス名>を,それぞ

れ,JN 及び JCLSN とする。

3)  MSD

中に指定された SQL の<戻りデータ型>を SRT とする。

4) 0

を DRSN とする。

5)  MSD

が静的フィールドメソッドであることを示すならば,次による。

A)  MSD

の<Java フィールド名>中に含まれる<Java 識別子>を FI とする。

B)  MSD

の<Java クラス名>を SFC とする。

C)

次の<SQL パラメタ宣言リスト>を SPDL とする。

( )

6)  MSD

が静的フィールドメソッドではないことを示すならば,次による。

A)  MSD

中に含まれる Java ルーチンのパッケージ,クラス及び名前から構成される Java メソ

ッド名,並びに MSD 中に含まれる署名に含まれる Java パラメタ宣言リストを,それぞれ,

JMN

及び JPDL とする。

B)  MSD

の拡張された SQL パラメタ宣言リストを SPDL とする。

iii) SQL

呼出しルーチンが SQL 呼出し手続又は SQL 呼出し通常関数であることを SRD が示すなら

ば,次による。

1)  SRD

の<外部ルーチン名>中に含まれる<外部 Java 参照文字列>中に含まれる<JAR 名>,<Java

クラス名>,<Java メソッド名>及び<Java パラメタ宣言リスト>を,それぞれ,JNJCLSN

JMN

及び JPDL とする。

2)  SRD

中に含まれる SQL 呼出しルーチンの SQL パラメタからなり,指定されるならば,<SQL

パラメタ名>,<データ型>,順序位置,及び SQL パラメタが入力 SQL パラメタか,出力 SQL

パラメタか,又は入出力 SQL パラメタかを示す標識の記述子リストで指定される SQL パラ

メタ宣言リストを SPDL とする。

3) SQL

呼出しルーチンが SQL 呼出し手続ならば,SRD によって示される動的結果集合の最大

値を DRSN とする。そうでなければ,0 を DRSN とする。

4) SQL

呼出しルーチンが,配列戻し外部関数又はマルチ集合戻し外部関数ではない SQL 呼出し

通常関数ならば,MSD 中で指定された SQL の<戻りデータ型>を SRT とする。そうでなけれ

ば,

“void”を SRT とする。

5) SQL

呼出しルーチンが,配列戻し外部関数又はマルチ集合戻し外部関数である SQL 呼出し通

常関数ならば,次による。

A) <

パラメタモード>OUT である<SQL パラメタ宣言>のコンマで区切られたリストを指定す

る結果データ領域パラメタリストを RDPL とする。それらの<パラメタ型>は,

9.8 <SQL

呼出しルーチン>”で規定するとおりに,PN+1 から PN+FRN までの実効的な SQL パラメ

タリスト項目の<パラメタ型>として定義される。

B)  RDPL

に,<コンマ>,並びに<データ型>が処理系定義の長さ及び文字集合 SQL_TEXT の文

字列であり,<パラメタモード>INOUT である<SQL パラメタ宣言>を追加する。


40

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

C)  RDPL

に,<コンマ>,及び<データ型>が位取り 0 の真数型であり,<パラメタモード>IN で

ある<SQL パラメタ宣言>を追加する。

D)

入力パラメタ,結果データ項目パラメタ,並びに退避領域データ項目及び呼出し型データ

項目を含む<SQL パラメタ宣言リスト>を作成するために,SPDL に<コンマ>及び RPDL 

追加する。

3)

場合:

a)

JMN

が“main”で,かつ,CNTXT が<利用者定義型定義>を指定しないか又は<メソッド呼出し

>を含まないかならば,次による。

i)

CNTXT

が<SQL 呼出しルーチン>を指定するならば,<スキーマ手続>を含まなければならず,<

動的結果集合特性>を含んではならない。

ii)  CNTXT

が<ルーチン呼出し>を含むならば,<CALL 文>を含まなければならない。

iii) Java

パラメタ宣言リスト JPDL が指定されるならば,次のとおりでなければならない。

(java.lang.String[])

iv) Java

パラメタ宣言リストが指定されないならば,次の指定を JPDL とする。

(java.lang.String[])

v)  SPDL

は,次のいずれかを指定しなければならない。

1) SQL

の CHARACTER 型の ARRAY 又は CHARACTER VARYING 型の ARRAY である単一パ

ラメタ。実行時に,このパラメタは,次の Java 配列として渡される。

java.lang.String

注記 43  この<SQL パラメタ宣言>は,SQL システムが機能 S201“配列に関する SQL ルーチン”

を提供するときに限り,指定してもよい。

2)

それぞれが CHARACTER 型又は CHARACTER VARYING 型である 0 個以上のパラメタ。実

行時に,これらのパラメタは,

(潜在的に 0 個の要素をもつ)java.lang.String の Java

配列として渡される。

vi) JAR JN

中でメソッド名が“main”であり,Java パラメタデータ型リストが JPDL であるクラ

ス JCLSN の可視の Java メソッドの集合を JCS とする。

注記 44  “可視”は,“4.5  パラメタ対応付け”で規定している。

b)

そうでなければ,次による。

i)

SPDL

中の<SQL パラメタ宣言>の数,及び JPDL 中の<Java データ型>の数を,それぞれ,SPN

及び JPN とする。

ii)  JPDL

が<SQL パラメタ宣言リスト>を指定するならば,次による。

1)  i

が 0 より大きく,MSi が INSTANCE 若しくは CONSTRUCTOR を指定するか,又は SQL 呼

出しルーチンが SQL 呼出しメソッドであることを SRD が示し,それがインスタンスメソッ

ド若しくは構成子であることを MSD が示すかならば,次のとおり,必要な当該パラメタを

Java パラメタ宣言リスト JPDL の前に付ける。

場合:

A)  JPDL

が一つ以上の<Java データ型>を含むならば,次の指定を,JPDL 中に直に含まれる

<Java パラメタ>中に直に含まれる<Java データ型>の前に付ける。

JCLSN ,

B)

そうでなければ,JPDL を次の<SQL パラメタ宣言リスト>で置き換える。


41

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

( JCLSN )

2)  SPDL

中の各<SQL パラメタ宣言>SP に対して,SP の<データ型>を ST とし,JPDL 中の対応

する<Java データ型>を JT とする。

A)  SP

が IN を指定するか,又は<パラメタモード>を陽に指示しないならば,次による。

I)

SP

が SQL 配列でないならば,JT 及び ST は,単純に対応付け可能か又はオブジェクト

対応付け可能でなければならない。

II)  SP

が SQL 配列ならば,JT 及び ST は,配列対応付け可能でなければならない。

B)  SP

が OUT 又は INOUT を指定するならば,次による。

場合:

I)

SPDL

が退避領域データ項目で拡張され,かつ,SP がリスト中の SPN-1 番目の項目(退

避領域データ項目)ならば,JT 及び ST が出力対応付け可能か,又は JT がクラス

java.lang.StringBuffer

を指定するかのいずれかでなければならない。

II)

そうでなければ,JT 及び ST は,出力対応付け可能でなければならない。

注記 45  “単純に対応付け可能”,“オブジェクト対応付け可能”及び“配列対応付け可能”

は,

4.5  パラメタ対応付け”で規定している。

3)

場合:

A)  DRSN

が 0 より大きいならば,JPN は,SPN より大きくなければならず,順序位置が SPN

より大きい JPDL 中の各<Java データ型>は,結果集合対応付け可能でなければならない。

B)

そうでなければ,JPN は,SPN と等価でなければならない。

iii) Java

パラメタ宣言リストが指定されないならば,SPDL から Java パラメタ宣言リスト JPDL 

最初の SPN 個の要素を次のとおりに決定する。

1) <

パラメタモード>が IN か又は<パラメタモード>を陽に指定しない SPDL の各パラメタ SP 

対して,SP が SQL 配列でないならば,SP の<パラメタ型>の対応する Java データ型を SP 

対応する Java パラメタデータ型とする。SP が SQL 配列ならば,SP の<パラメタ型>の対応

する Java データ型を JT とし,JT の配列,すなわち,JT[]を SP の対応する Java パラメタ

データ型とする。

注記 46  SP の“対応する Java データ型”は,“4.5  パラメタ対応付け”で規定している。

2) <

パラメタモード>が INOUT 又は OUT の SPDL の各パラメタ SP に対して,SP の<パラメタ

型>の対応する Java データ型を JT とし,JT の配列,すなわち,JT[]を SP の対応する Java

パラメタデータ型とする。

3)  JPDL

の<Java パラメタ>は,SPDL の対応する Java パラメタデータ型のリストとする。

注記 47  JPDL は,パラメタ名を指定しない。すなわち,Java メソッドのパラメタ名は,SQL パ

ラメタ名と一致しなくてもよい。

iv) <

静的フィールドメソッド指定>の当該 Java フィールド,又は候補可視の Java メソッドの集合

は,次のとおり決定される。

場合:

1)  CNTXT

が<SQL 呼出しルーチン>を指定するか,又は SQL 呼出しルーチンが SQL 呼出し手

続又は SQL 呼出し通常関数であることを SRD が示すならば,次による。

A)  DRSN

が 0 より大きいならば,次による。

I)

SPDL

中の<SQL パラメタ宣言>の数,

及び JPDL 中の<Java データ型>の数を,

それぞれ,


42

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

SPN

及び JPN とする。

II)  SPN

が JPN と等価ならば,JPDL は,もともと指定されなかった。メソッド名が JMN

で,最初の SPN 個のパラメタデータ型が JPDL のデータ型で,ある正の に対して,最

後の 個のパラメタデータ型が結果集合対応付け可能である JAR JN 中のクラス JCLSN

の可視の Java メソッドの集合を JCS とする。

III)  SPN

が JPN より小さいならば,JPDL は,もともと指定された。メソッド名が JMN で,

Java パラメタデータ型リストが JPDL である JAR  JN 中のクラス JCLSN の可視の Java

メソッドの集合を JCS とする。

B)  DRSN

が 0 ならば,メソッド名が JMN で,Java パラメタデータ型リストが JPDL である

JAR JN 中のクラス JCLSN の可視の Java メソッドの集合を JCS とする。

2)  CNTXT

が<利用者定義型定義>を指定するか,又は SQL 呼出しルーチンが SQL 呼出しメソッ

ドであることを SRD が示すならば,次による。

A)  i

が 0 より大きく,MSi が<静的フィールドメソッド指定>を含むか,又は MSD が静的フィ

ールドメソッドであることを示すかのいずれかならば,次による。

I)

FI

は,SFC のフィールドの名前でなければならない。そのフィールドを JSF とする。

II)  JSF

は,公開静的フィールドでなければならない。

III)  JSF

の Java データ型を JFT とする。

IV)  SRT

及び JFT は,単純に対応付け可能か又はオブジェクト対応付け可能でなければなら

ない。

注記 48  “単純に対応付け可能”及び“オブジェクト対応付け可能”は,“4.5  パラメタ対応

付け”で規定している。

V)  JSF

は,MSi によって定義される SQL 呼出しメソッドの当該静的フィールドとする。

注記 49  当該 Java クラスは,対応する属性及びメソッドが指定されないフィールド及びメソ

ッド(公開 public 及び非公開 private)を含んでもよい。

B)  i

が 0 より大きく,MSi が<静的フィールドメソッド指定>を直に含まないか,又は MSD 

静的フィールドメソッドではないことを示すかのいずれかならば,次による。

I)

場合:

1)  i

が 0 より大きく,MSi が INSTANCE 若しくは CONSTRUCTOR を指定しているか,

又は MSD がインスタンスメソッド若しくは構成子であることを示すならば,

JPDL

は,

このメソッドに対する拡張された Java パラメタ宣言リストを含む。拡張されていない

Java パラメタ宣言リスト UAJPDL を生成するために,次のとおりに,Java パラメタ宣

言リスト JPDL から当該パラメタを取り除く。

場合:

a)  JPDL

が二つ以上の<Java データ型>を含むならば,最初の<Java データ型>JCLSN 

びそれに関連する“,”を除くすべての JPDL を UAJPDL に複写する。

b)

そうでなければ,UAJPDL には,次の<Java パラメタ宣言リスト>を設定する。

( )

2)

そうでなければ,JPDL を UAJPDL に複写する。

II)

The Java Language Specification, Second Edition”で規定している Java オーバロード解

決を用いて,メソッド名が JMN で,Java パラメタデータ型リストが UAJPDL である JAR


43

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

JN

中のクラス JCLSN 又はそのクラスの上位型の可視の Java メソッドの集合を JCS とす

る。

注記 50  “可視”は,“4.5  パラメタ対応付け”で規定している。

III)  i

が 0 より大きく,MSi が STATIC を指定するか,又は STATIC が指定されたことを MSD

が示すならば,静的ではないすべての Java メソッドを JCS から取り除く。そうでなけれ

ば,すべての静的 Java メソッドを JCS から取り除く。

IV)  i

が 0 より大きく,MSi が CONSTRUCTOR を指定するか,又は CONSTRUCTOR が指定

されたことを MSD が示すならば,構成子ではないすべての Java メソッドを JCS から取

り除く。そうでなければ,構成子であるすべての Java メソッドを JCS から取り除く。

4)

当該 Java メソッドは,次のとおり決定される。

場合:

a)

CNTXT

が<SQL 呼出しルーチン>を指定するか,又は SQL 呼出しルーチンが SQL 呼出し手続又

は SQL 呼出し通常関数であることを SRD が示すならば,次による。

i)

JCS

は,ただ一つの Java メソッドを含まなければならない。その Java メソッドを JM とする。

SQL 呼出しルーチンは,JM と関連付けられる。

ii)  JM

は,SQL 呼出しルーチンの当該 Java メソッドとする。

b)  CNTXT

が<利用者定義型定義>を指定するか,又は SQL 呼出しルーチンが SQL 呼出しメソッドで

あることを SRD が示すとき,が 0 より大きく,MSi が<静的フィールドメソッド指定>を直に含

まないか,又は MSD が静的フィールドメソッドではないことを示すならば,次による。

i)

JCS

は,ただ一つの Java メソッドを含まなければならない。その Java メソッドを JM とする。

<Java メソッド名>は,<メソッド名>の

対応する

Java

メソッド名

  (corresponding Java method 

name)

として参照される。

ii)  JM

は,SQL 呼出しメソッドの

当該

Java

メソッド

  (subject Java method)  とする。

5) SQL

呼出しルーチンの結果データ型は,次のとおりに有効化される。

場合:

a)

CNTXT

が<SQL 呼出しルーチン>を指定するか,又は SQL 呼出しルーチンが SQL 呼出し手続若

しくは SQL 呼出し通常関数であることを SRD が示すならば,JM の Java 戻りデータ型を JRT 

する。

i)

JM

が SQL 呼出し手続ならば,JRT は,void でなければならない。

ii)  JM

が配列戻し外部関数又はマルチ集合戻し外部関数ではない SQL 呼出し通常関数ならば,

JRT

及び SRT は,単純に対応付け可能か又はオブジェクト対応付け可能でなければならない。

iii)  JM

が配列戻し外部関数又はマルチ集合戻し外部関数ならば,JRT は,void でなければならな

い。

b)  CNTXT

が<利用者定義型定義>を指定するか,又は SQL 呼出しルーチンが SQL 呼出しメソッドで

あることを SRD が示すとき,が 0 より大きく,MSi が<静的フィールドメソッド指定>を直に含

まないか,又は MSD が静的フィールドメソッドではないことを示すならば,JM の Java 戻りデ

ータ型を JRT とする。SELF AS RESULT が指示されないならば,JRT 及び SRT は,単純に対応付

け可能か又はオブジェクト対応付け可能でなければならない。

注記 51  “単純に対応付け可能”及び“オブジェクト対応付け可能”は,“4.5  パラメタ対応付け”

で規定している。


44

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

c)

そうでなければ,当該静的フィールドの Java データ型を JRT とする。JRT 及び SRT は,単純に

対応付け可能か又はオブジェクト対応付け可能でなければならない。

アクセス規則

なし。

 

一般規則

なし。

適合性規則

なし。

9

スキーマ定義及びスキーマ操作

この箇条は,

ISO/IEC 9075-2

の“

11 

スキーマ定義及びスキーマ操作”を修正する。

9.1

<

スキーマ削除文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.2 <

スキーマ削除文

>

”を修正する。

機能

<スキーマ削除文> (<drop schema statement>)  は,スキーマを破壊する。

形式

追加の形式項目なし。

構文規則

“JAR,

”を追加することによって

構文規則 3)を補う。】

アクセス規則

追加のアクセス規則なし。

一般規則

1)

一般規則 1)の前に挿入する。】SQL 処理系が機能 J531“配置”を提供するならば,次による。

a)

S

中に含まれる任意の JAR の記述子中に含まれる修飾付き<JAR 名>を含む<文字列定数>を,JNS

とする。

b)

次の<CALL 文>が実効的に実行される。

CALL SQLJ.REMOVE_JAR ( JNS, 1 );

2)

一般規則 13)の後に挿入する。】SQL 処理系が機能 J531“配置”を提供しないならば,次による。

a)

S

中に含まれる任意の JAR の記述子中に含まれる修飾付き<JAR 名>を含む<文字列定数>を,JNS

とする。

b)

次の<CALL 文>が実効的に実行される。

CALL SQLJ.REMOVE_JAR ( JNS, 0 );

適合性規則

追加の適合性規則なし。

9.2

表定義

この細分箇条は,

ISO/IEC 9075-2

の“

11.3 <

表定義

>

”を修正する。

機能

表定義 (<table definition>) は,永続実表,作成される局所一時表,又は大域一時表を定義する。

形式

追加の形式項目なし。


45

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

構文規則

1)

構文規則 7)  e)の後に挿入する。】ST は,記述子が SERIALIZABLE の<インタフェース指定>を指

定する外部 Java データ型であってはならない。

アクセス規則

追加のアクセス規則なし。

一般規則

追加の一般規則なし。

適合性規則

追加の適合性規則なし。

9.3

<

ビュー定義>

この細分箇条は,

ISO/IEC 9075-2

の“

11.22 <

ビュー定義

>

”を修正する。

 

機能

<ビュー定義> (<view definition>)  は,ビュー表を定義する。

形式

追加の形式項目なし。

構文規則

1)

構文規則 21) c)の後に挿入する。】ST は,記述子が SERIALIZABLE の<インタフェース指定>を指

定する外部 Java データ型であってはならない。

アクセス規則

追加のアクセス規則なし。

一般規則

追加の一般規則なし。

適合性規則

追加の適合性規則なし。

9.4

<

利用者定義型定義>

この細分箇条は,

ISO/IEC 9075-2

の“

11.41 <

利用者定義型定義

>

”を修正する。

 

機能

<利用者定義型定義> (<user-defined type definition>)  は,利用者定義型を定義する。

形式

<

利用者定義型本体> ::=

<

スキーマ解決利用者定義型名> [ <下位型句> ]

[ <

外部 Java 型句> ]

[ AS <

表現> ]

[ <

利用者定義型選択肢リスト> ] [ <メソッド指定リスト> ]

<

外部 Java 型句> ::=

<

外部 Java クラス句> LANGUAGE JAVA <インタフェース USING 句>

<

インタフェース USING 句> ::= [ USING <インタフェース指定> ]

<

インタフェース指定> ::=

SQLDATA

| SERIALIZABLE


46

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

<

メソッド指定> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| <

静的フィールドメソッド指定>

<

メソッド特性> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| <

外部 Java メソッド句>

<

静的フィールドメソッド指定> ::=

STATIC METHOD <

メソッド名> <左括弧> <右括弧>

<

静的メソッド RETURNS 句> [ SPECIFIC <特定メソッド名> ]

<

外部変数名句>

<

静的メソッド RETURNS 句> ::=

RETURNS <

データ型>

<

外部変数名句> ::=

EXTERNAL VARIABLE NAME <

文字列定数>

<

外部 Java クラス句> ::=

EXTERNAL NAME <

文字列定数>

<

外部 Java メソッド句> ::=

EXTERNAL NAME <

文字列定数>

<Java

メソッド及びパラメタ宣言> ::=

<Java

メソッド名> [ <Java パラメタ宣言リスト> ]

構文規則

1)

構文規則 3)の後に挿入する。】<外部 Java 型句>が指定されるならば,UDT は,

外部

Java

データ

  (external Java data type)  とする。

2)

構文規則 8) j) ii)を置き換える。】<下位型句>中に直に含まれる<上位型名>は,ある構造型 SST 

記述子を識別しなければならない。UDT は,SST の直接下位型とし,SST は,UDT の直接上位型

とする。UDT が外部 Java データ型ならば,SST は,外部 Java データ型でなければならず,UDT 

当該 Java クラスは,SST の当該 Java クラスの直接サブクラスでなければならない。UDT が外部 Java

データ型でないならば,SST は,外部 Java データ型であってはならない。

3)

構文規則 9)の前に挿入する。】<外部 Java 型句>が指定されているならば,次による。

a) <

外部 Java クラス句>中に直に含まれる<文字列定数>の値を VJC とする。VJC は,<JAR 及びク

ラス名>の

形式及び構文規則に適合しなければならない。<JAR 及びクラス名>を直に含んでいる

<JAR 識別子>によって識別される JAR 中の<Java クラス名>によって識別される Java クラスは,

UDT

当該

Java

クラス

  (subject Java class)

とする。

注記 52  UDT の当該 Java クラスは,他の外部 Java データ型の当該 Java クラスであってもよい。

そのような各外部 Java データ型は,他のそのようなデータ型とは異なる。

b)  UDT

の 当 該 Java ク ラ ス は , public ク ラ ス で な け れ ば な ら ず , Java イ ン タ フ ェ ー ス

java.io.Serializable

若しくは Java インタフェース java.sql.SQLData,又はそれらの両

方を実装しなければならない。

c) <

インタフェース USING 句>が陽に指定されないならば,処理系定義の<インタフェース指定>が

暗に想定される。


47

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

d) SERIALIZABLE

が 指 定 さ れ る な ら ば , 当 該 Java ク ラ ス は , Java イ ン タ フ ェ ー ス

java.io.Serializable

を 実 装 し な け れ ば な ら な い 。 メ ソ ッ ド

java.io.Serializable.writeObject()

が Java オブジェクトを SQL 表現に変換するために

実効的に用いられ,メソッド java.io.Serializable.readObject()が SQL 表現を Java オ

ブジェクトに変換するために実効的に用いられる。

e) SQLDATA

が指定されるならば,

当該 Java クラスは,

[JDBC]

及び[J2SE]で規定しているとおりに,

Java イ ン タ フ ェ ー ス java.sql.SQLData を 実 装 し な け れ ば な ら な い 。 メ ソ ッ ド

java.sql.SQLData.writeSQL()

が Java オブジェクトを SQL 表現に変換するために実効的に

用いられ,メソッド java.sql.SQLData.readSQL()が SQL 表現を Java オブジェクトに変換す

るために実効的に用いられる。

f) <

置換メソッド指定>は,指定してはならない。

g) <

既定義型>である<表現>は,指定してはならない。

h) SELF

AS

LOCATOR は,指定してはならない。

i) <

位置付け子標識>は,指定してはならない。

4)

構文規則 9)の前に挿入する。】<外部 Java 型句>が指定されないならば,次による。

a) <

メソッド指定>は,<静的フィールドメソッド指定>を指定してはならない。

b) <

メソッド特性>は,<外部 Java メソッド句>を指定してはならない。

c) <

メソッド特性>中に直に含まれる<LANGUAGE 句>は,JAVA を指定してはならない。

5)

構文規則 9) a)の後に挿入する。】UDT が外部 Java データ型ならば,陽に指定されるか又は暗に想

定される<Java パラメタ宣言リスト>の妥当性確認が,<利用者定義型定義>によって実行されるか,

又は対応する SQL 呼出しメソッドが呼び出されるときに実行されるかは,処理系定義とする。

6)

構文規則 9) b) iii) 6)の後に挿入する。】UDT が外部 Java データ型ならば,MSi の<Java メソッド名

>中に直に含まれる<Java 識別子>は,UDT の<JAR 及びクラス名>中に直に含まれる<クラス識別子>

中に直に含まれる<Java 識別子>と等価でなければならない。

7)

構文規則 9) b) ix) 4) B)の後に挿入する。】UDT は,外部 Java データ型であってはならない。

8)

構文規則 9) b) x) 3)の後に挿入する。】UDT は,外部 Java データ型であってはならない。

9)

構文規則 9)  b) xiii)の後に挿入する。】MSi が<静的メソッドフィールド指定>を指定するならば,

次による。

a)

MSi

は,

静的フィールドメソッド

  (static field method) 

を指定する。

b) <

静的メソッドフィールド指定>中に単純に含まれる<文字列定数>の値を VSF とする。VSF は,<

修飾付き Java フィールド名>の形式及び構文規則に適合しなければならない。

注記 53  <静的メソッドフィールド指定>は,<修飾付き Java フィールド名>によって指定される

Java 静的フィールドの値を戻す利用者定義型の静的メソッドを定義する。これは,当該

Java クラス又は当該 Java クラスのスーパクラスの静的フィールドにアクセスする読込み

専用の SQL で提供する略記である。

10)

構文規則 9)  b) xiv)  1)を置き換える。】MSi の<メソッド特性>は,高々一つの<LANGUAGE 句>,

高々一つの<PARAMETER STYLE 句>,高々一つの<決定的特性>,高々一つの<SQL データアクセ

ス指示>,及び高々一つの<ナル呼出し句>を含まなければならない。UDT が外部 Java データ型なら

ば,各属性の観測関数及び変異関数のために生成された暗に想定される<原メソッド指定>を除いて,

MSi

の<メソッド特性>は,<メソッド特性>の<LANGUAGE 句>又は<PARAMETER STYLE 句>を含


48

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

んではならず,ただ一つの<外部 Java メソッド句>を含まなければならない。外部 Java データ型に

対しては,<LANGUAGE 句>及び<PARAMETER STYLE 句>の両方が JAVA を暗に指定する。

11)

構文規則 9) b) xiv) 1)の後に挿入する。】UDT が外部 Java データ型ならば,<外部 Java メソッド句

>中に直に含まれる<文字列定数>の値を VMP とする。VMP は,<Java メソッド及びパラメタ宣言>

の形式及び構文規則に適合しなければならない。

12)

構文規則 9) b) xiv) 2)を置き換える。】UDT が外部 Java データ型ではなく,<LANGUAGE 句>が指

定されないならば,LANGUAGE SQL が暗に想定される。

13)

構文規則 9) b) xiv) 6) B) I)を置き換える。】<パラメタ様式>が指定されず,UDT が外部 Java デー

タ型でないならば,PARAMETER STYLE SQL が暗に想定される。

14)

構文規則 9) b) xv)の後に挿入する。】UDT が外部 Java データ型で,かつ,<Java パラメタ宣言リス

ト>の妥当性確認が処理系定義で<利用者定義型定義>によって実行されるならば,

8.6 Java ルーチ

ン署名決定”の

構文規則が,<利用者定義型定義>,メソッド指定指標 i,及び当該ルーチンなしで

適用される。

アクセス規則

追加のアクセス規則なし。

一般規則

1)

一般規則 1)  g) vii)を置き換える。】<言語名>が SQL 又は JAVA ならば,陽に指定されるか又は暗

に想定される<パラメタ様式>。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<外部 Java

型句>を含み,かつ,<記述子ファイル>中に含まれない<利用者定義型定義>を含んではならない。

2)

【この

適合性規則を挿入する。】機能 J591“オーバロード”なしでは,適合する SQL 言語は,同じ

<利用者定義型定義>中の他のいずれかの<メソッド指定>の<メソッド名>と等価である<メソッド名

>を含む<メソッド指定>を含んではならない。

3)

【この

適合性規則を挿入する。】機能 J641“静的フィールド”なしでは,適合する SQL 言語は,<

静的フィールドメソッド指定>を含んではならない。

4)

【この

適合性規則を挿入する。】機能 J541“SERIALIZABLE”なしでは,適合する SQL 言語は,

SERIALIZABLE を含む<インタフェース指定>を含んではならない。

5)

【この

適合性規則を挿入する。】機能 J551“SQLDATA”なしでは,適合する SQL 言語は,SQLDATA

を含む<インタフェース指定>を含んではならない。

6)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,<外部

Java 型句>を含む<利用者定義型定義>を含んではならない。

9.5

<

属性定義>

この細分箇条は,

ISO/IEC 9075-2

の“

11.42 <

属性定義

>

”を修正する。

機能

<属性定義>(<attribute definition>)  は,構造型の属性を定義する。

形式

<

属性定義> ::=

<

属性名> <データ型>

[ <

参照有効範囲検査> ] [ <属性既定値> ]


49

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

[ <COLLATE

句> ] [ <外部 Java 属性句> ]

<

外部 Java 属性句> ::= EXTERNAL NAME <文字列定数>

構文規則

1)

構文規則 1)の後に挿入する。】外部 Java データ型でないか又は<型変更文>中に含まれない<利用

者定義型定義>中に<属性定義>が含まれるならば,<属性定義>は,<外部 Java 属性句>を指定しては

ならない。

2)

構文規則 1)の後に挿入する。】<インタフェース指定>が SERIALIZABLE である外部 Java データ

型を指定する<利用者定義型定義>中に<属性定義>が含まれるならば,<属性定義>は,<外部 Java 属

性句>を指定しなければならない。

3)

構文規則 1)の後に挿入する。】<外部 Java 属性句>が指定されるならば,<属性定義>中に直に含ま

れる<文字列定数>の値を VFN とする。VFN は,<Java フィールド名>の

形式及び構文規則に適合し

なければならない。VFN の<Java フィールド名>値は,<属性名>の

対応する

Java

フィールド名

(corresponding Java field name)  として参照される。

4)

構文規則 1)の後に挿入する。】外部 Java データ型を指定する<利用者定義型定義>中に<属性定義>

が含まれるならば,

<参照有効範囲検査>,<属性既定値>及び<COLLATE 句>を指定してはならない。

5)

構文規則 1)の後に挿入する。】外部 Java データ型を指定する<利用者定義型定義>中に<属性定義>

が含まれ,かつ,<属性定義>中に指定される<データ型>が構造型 ST ならば,ST は,外部 Java デ

ータ型でなければならない。

アクセス規則

追加のアクセス規則なし。

一般規則

1)

一般規則 3) e)の後に挿入する。】<属性定義>が<外部 Java 属性句>を含むならば,<属性名>の対応

する Java フィールド名。

2)

一般規則 4)を置き換える。】SQL 呼出しメソッド OF が作成され,その署名及び結果データ型は,

A

の観測関数の原メソッド指定の記述子中で与えられるとおりとする。UDT 中の値を とする。

場合:

a)

V

が SQL ナル値ならば,OF の呼出し V.AN()は,次の結果を戻す。

CAST (NULL AS DT)

b)  UDT

が,その記述子の<インタフェース指定>が SERIALIZABLE を指定する外部 Java データ型で

ないならば,V.AN()は,中の の値を戻す。

c)

UDT

が,その記述子の<インタフェース指定>が SERIALIZABLE を指定する外部 Java データ型な

らば,の当該 Java クラス SJCE の readObject()メソッドが,Java オブジェクトを の値か

ら得るために実効的に用いられ,<属性定義>によって含まれる<Java フィールド名>中に指定され

る属性に対応する Java フィールドがアクセスされる。その Java 値,及びその値の最特定 Java ク

ラスを,それぞれ,JVJCLS とする。

場合:

i)

DT

が利用者定義型ならば,次による。

1)

当該 Java クラスが JCLS で,利用者定義型が DT,又は DT のサブクラスである利用者定義型

を STU とする。

2)  STU

の利用者定義型記述子によって指定される<インタフェース指定>を UIS とする。


50

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

3)

場合:

A)  UIS

が SERIALIZABLE ならば,次による。

I)

当該 Java クラス JCLS の writeObject()メソッドが,Java 値 JV

利用者定義型 STU

の SQL 値 SV に変換するために実行される。

II)  writeObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 54  UIS が SERIALIZABLE ならば,“9.4  <利用者定義型定義>”で記述されるとおり,

記述子の当該 Java クラスは,[J2SE]で規定するとおりに Java インタフェース

java.io.Serializable

を実装し,インタフェースの writeObject()メソッド

を定義する。

B)  UIS

が SQLDATA ならば,次による。

I)

当該 Java クラス JCLS の writeSQL()メソッドが,Java 値 JV を利用者定義型 STU 

SQL 値 SV に変換するために実行される。

II)  writeSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 55  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,記述子

の当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの writeSQL()メソッドを定義す

る。

C)

そうでなければ,SV の値には,JV の値が設定される。

4)  V.AN()

は,SV の値を戻す。

3)

一般規則 5)を置き換える。】SQL 呼出しメソッド MF が作成され,その署名及び結果データ型は,

A

の変異関数の原メソッド指定の記述子中に与えられるとおりとする。UDT 中の値を とし,DT

中の値を AV とする。

場合:

a)

V

が SQL ナル値ならば,MF の呼出し V.AN(AV)は,例外条件:

データ例外

  (data exception )

−変

異関数でナルインスタンスが用いられた

  (null instance used in mutator function) 

が引き起こされる。

b)  UDT

が,その記述子の<インタフェース指定>が SERIALIZABLE を指定する外部 Java データ型で

ないならば,呼出し V.AN(AV)は,V2.AN()=AV であり,UDT の他のすべての観測関数 ANX 

対して,V2.ANX()=V.ANX()であるような V2 を戻す。

c)

UDT

が,その記述子の<インタフェース指定>が SERIALIZABLE を指定する外部 Java データ型な

らば,の当該 Java クラス SJCE の readObject()メソッドが,Java オブジェクトを の値か

ら得るために実効的に用いられる。

AV

の最特定型,

MST

の当該 Java クラス,

及び readObject()

から得られる Java オブジェクトを,それぞれ,MSTJCLSJtemp とする。

i)

場合:

1)  MST

が利用者定義型ならば,次による。

A)  MST

の利用者定義型記述子によって指定される<インタフェース指定>を UIS とする。

B)

場合:

I)

UIS

が SERIALIZABLE ならば,次による。

1)

当該 Java クラス JCLS の readObject()メソッドが,AV の値を Java オブジェクト

JV

に変換するために実行される。

2)  readObject()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。


51

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

注記 56  UIS が SERIALIZABLE ならば,“9.4 <利用者定義型定義>”で記述されるとおり,

U

の 当該 Java ク ラ スは ,[J2SE] で 規定 す ると お りに Java イ ン タフ ェ ー ス

java.io.Serializable

を実装し,インタフェースの readObject()メソッ

ドを定義する。

II)  UIS

が SQLDATA ならば,次による。

1)

当該 Java クラス JCLS の readSQL()メソッドが,AV の値を Java オブジェクト JV 

変換するために実行される。

2)  readSQL()

に関する当該 Java クラスの実装の実行方法は,処理系定義とする。

注記 57  UIS が SQLDATA ならば,“9.4 <利用者定義型定義>”で記述されるとおり,

当該 Java クラスは,[JDBC]及び[J2SE]で規定するとおりに Java インタフェース

java.sql.SQLData

を実装し,インタフェースの readSQL()メソッドを定義す

る。

2)

そうでなければ,JV の値には,AV の値が設定される。

ii) <

属性定義>によって含まれる<Java フィールド名>中に指定される属性に対応する Jtemp の Java

フィールドには,JV の値が代入される。

iii)  V

の writeObject()メソッドの当該 Java クラス SJCE が,Java 値 Jtemp から SQL 値 V2 を得

るために実効的に用いられる。

iv)

呼出し V.AN(AV)は,V2 を戻す。

適合性規則

追加の適合性規則なし。

9.6

<

型変更文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.43 <

型変更文

>

”を修正する。

 

機能

<型変更文> (<alter type statement>)  は,利用者定義型の定義を変更する。

形式

追加の形式項目なし。

 

構文規則

1)

構文規則 1)の後に挿入する。】は,外部 Java データ型であってはならない。

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

追加の適合性規則なし。

 

9.7

<

データ型削除文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.49 <

データ型削除文

>

”を修正する。

 

機能

<データ型削除文> (<drop data type statement>)  は,利用者定義型を破壊する。

形式

追加の形式項目なし。

 


52

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部 Java

データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<記述子ファイル>中に含まれな

い<データ型削除文>を含んではならない。

2)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含む<データ型削除文>を含んではなら

ない。

9.8

<SQL

呼出しルーチン>

この細分箇条は,

ISO/IEC 9075-2

の“

11.50 <SQL

呼出しルーチン

>

”を修正する。

 

機能

<SQL 呼出しルーチン> (<SQL-invoked routine>)  は,SQL 呼出しルーチンを定義する。

形式

<

パラメタ様式> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| Java

<

外部 Java 参照文字列>::=

<JAR

及びクラス名><ピリオド><Java メソッド名>

[<Java

パラメタ宣言リスト>]

構文規則

1)

構文規則 3)の後に挿入する。】<SQL 呼出しルーチン>が LANGUAGE JAVA を指定するならば,

<SQL 呼出し関数>中に指定される<SQL パラメタ宣言>は,RESULT を指定してはならない。

2)

構文規則 3)の後に挿入する。】<SQL 呼出しルーチン>が LANGUAGE JAVA を指定するならば,

<SQL 呼出し関数>中に含まれる<RETURNS 句>も,<SQL 呼出し関数>又は<SQL 呼出し手続>中に

含まれるどの<SQL パラメタ宣言>も,<位置付け子標識>を含んではならない。

3)

構文規則 3)の後に挿入する。】<SQL 呼出しルーチン>が LANGUAGE JAVA を指定するならば,<

変換グループ指定>を指定してはならない。

4)

構文規則 3)の後に挿入する。】<最大動的結果集合数>の最大値は,処理系定義とする。

5)

構文規則 5) b) i)を置き換える。】<メソッド指定指示子>中に直に含まれる<スキーマ解決利用者定

義型名>を UDTN とする。UDTN によって識別される利用者定義型を UDT とする。UDT は,外部

Java データ型であってはならない。

6)

構文規則 6)  a)を置き換える。】<ルーチン特性>は高々一つの<LANGUAGE 句>,高々一つの

<PARAMETER STYLE 句>,高々一つの<特定名>,高々一つの<決定的特性>,高々一つの<SQL デ

ータアクセス指示>,高々一つの<ナル呼出し句>,高々一つの<動的結果集合特性>を含まなければ

ならない。LANGUAGE JAVA が指定されるならば,<PARAMETER STYLE 句>は,<パラメタ様式


53

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

>JAVA を指定しなければならない。

7)

構文規則 6) i)を置き換える。】LANGUAGE SQL を指定するか又は暗に想定する<SQL 呼出しルー

チン>は,SQL

ルーチン

  (SQL routine)  と呼ばれる。LANGUAGE SQL を指定しない<SQL 呼出しル

ーチン>は,

外部ルーチン

  (external routine)  と呼ばれる。LANGUAGE JAVA を指定する外部ルーチ

ンは,

外部

Java

ルーチン

  (external Java routine)  と呼ばれる。

8)

構文規則 6)  i)の後に挿入する。】が外部 Java ルーチンならば,<外部本体参照>中に直に含まれ

る<外部ルーチン名>は,<文字列定数>を指定しなければならない。その<文字列定数>の値を 

する。は,<外部 Java 参照文字列>の

形式及び構文規則に適合しなければならない。

注記 58  は,<SQL 呼出しルーチン>によって指定される SQL 呼出しルーチンであると,ISO/IEC 

9075-2

で規定している。

9)

構文規則 6)  i)の後に挿入する。】が外部 Java ルーチンならば,<Java メソッド名>は,<Jar 名>

によって指定される JAR 中の<Java クラス名>によって指定されるクラス中の一つ以上の Java メソ

ッドの名前とする。<Java クラス名>と<Java メソッド名>との組合せは,完全修飾付き Java クラス

名及びメソッド名を表現する。メソッド名は,クラスのメソッド,又はクラスのスーパクラスのメ

ソッドを参照することができる。

10)

構文規則 6) x) ii)を置き換える。】が外部 Java ルーチンではない配列戻し外部関数又はマルチ集

合戻し外部関数ならば,PARAMETER STYLE SQL が陽に指定されるか又は暗に想定されなければ

ならない。

11)

構文規則 6) x) iii)の最初の段落を置き換える。】が外部の Java ルーチンでないならば,次による。

場合:

12)

構文規則 20) e)の前に挿入する。】PARAMETER STYLE JAVA が指定されるならば,次による。

a)

場合:

i)

R

が配列戻し外部関数又はマルチ集合戻し外部関数で,戻される配列の要素型又は戻されるマ

ルチ集合の要素型が行型ならば,要素型の次数を FRN とする。

ii)

そうでなければ,1 を FRN とする。

b)  R

が配列戻し外部関数又はマルチ集合戻し外部関数ならば,2 を AREF とする。そうでなければ,

0 を AREF とする。

c)

R

が SQL 呼出し関数ならば,次のとおり,PN+FRN+AREF 個の SQL パラメタのリストを

実効的

SQL

パラメタリスト

  (effective SQL parameter list)  とする。:

i) 1

から PN までの に対して,番目の実効的な SQL パラメタリスト項目は,番目の<SQL パラ

メタ宣言>とする。

ii)

場合:

1)  FRN

が 1 ならば,実効的な SQL パラメタリスト項目 PN+FRN は,<パラメタモード> OUT

をもつ。その<パラメタの型>PT は,次のとおりに定義される。

A) <

結果型変換>が指定されるならば,

<結果 CAST FROM 型>を RT とする。そうでなければ,

<戻りデータ型>を RT とする。

B)  R

が配列戻し外部関数又はマルチ集合戻し外部関数ならば,RT の要素型を PT とする。

C)  R

が配列戻し外部関数でもマルチ集合戻し外部関数でもないならば,PT は,RT とする。

2)

そうでなければ,PN+1 から PN+FRN の に対して,番目の実効的な SQL パラメタリスト

項目は,次のとおり定義される。


54

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

A)

その<パラメタモード>は,OUT とする。

B) <

戻りデータ型>の要素型の  (i-PN)  番目のフィールドのデータ型を RFT

i-PN

とする。番目

の実効的な SQL パラメタリスト項目の<パラメタの型>PTi は,RFT

i-PN

とする。

iii)  R

が配列戻し外部関数又はマルチ集合戻し外部関数ならば,次による。

1)

実効的な SQL パラメタリスト項目  (PN+FRN)+1 は,<データ型>が処理系定義の長さ及び文

字集合 SQL_TEXT の文字列であり,<パラメタモード>INOUT の SQL パラメタとする。

2)

実効的な SQL パラメタ型リスト項目  (PN+FRN)+2 は,<データ型>が位取り 0 の真数型であ

り,<パラメタモード>IN の SQL パラメタとする。

d)  R

が SQL 呼出し手続ならば,PN 個の SQL パラメタのリストを実効的な SQL パラメタリストと

する。1 から PN までの に対して,番目の実効的な SQL パラメタリスト項目は,番目の<SQL

パラメタ宣言>とする。

13)

構文規則 20) g)を置き換える。】<LANGUAGE 句>が JAVA を指定しないならば,実効的な SQL パ

ラメタリスト項目のどの<データ型>も,ホストデータ型列中の対応する行が“なし”ではない SQL

データ型列中にリストされたデータ型を指定しなければならない。

14)

構文規則 21)の前に挿入する。】

注記 59 LANGUAGE JAVA が指定されるときのパラメタの型対応のための規則は,“4.5  パラメタ

対応付け”で規定している。

15)

構文規則 21)の前に挿入する。】が外部 Java ルーチンならば,陽に指定されるか又は暗に想定さ

れる<Java パラメタ宣言リスト>の妥当性確認が,<SQL 呼出しルーチン>によって実行されるか,又

はその SQL 呼出しルーチンが呼び出されるときに実行されるかは,処理系定義とする。

16)

構文規則 21)の前に挿入する。】が外部 Java ルーチンで,かつ,<Java パラメタ宣言リスト>の妥

当性確認が処理系定義で<SQL 呼出しルーチン>によって実行されるならば,

8.6  Java ルーチン署

名決定”の

構文規則が,<SQL 呼出しルーチン>,0 のメソッド指定指標,及び当該ルーチンなしで

適用される。

アクセス規則

1)

アクセス規則 1)の後に挿入する。】が外部 Java ルーチンならば,に対する適用可能な権限は,

<外部 Java 参照文字列>中で参照される JAR に関する USAGE 権限を含まなければならない。

注記 60  及び への参照は,ISO/IEC 9075-2 の“11.50 <SQL 呼出しルーチン>”の構文規則で規

定している。

一般規則

1)

一般規則 3) l) ii)を置き換える。】ルーチン記述子は,パラメタ受渡し様式が PARAMETER STYLE

JAVA か,PARAMETER STYLE SQL か又は PARAMETER STYLE GENERAL かどうかの標識を含む。

2)

一般規則 6)  a)  i)の最初のテキストを置き換える。】が外部 Java ルーチンではなく,かつ,

記述子中の<SQL データアクセス指示>が MODIFIES SQL DATA,READ SQL DATA 又は CONTAINS

SQL ならば,次による。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,JAVA を

含む<言語名>を含み,かつ,<記述子ファイル>中に含まれない<SQL 呼出しルーチン>を含んではな

らない。

2)

【この

適合性規則を挿入する。】機能 J581“出力パラメタ”なしでは,適合する SQL 言語は,JAVA


55

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を含む<言語名>を含み,かつ,OUT 又は INOUT のいずれかを含む<パラメタモード>を含む<SQL

呼出しルーチン>を含んではならない。

3)

【この

適合性規則を挿入する。】機能 J521“JDBC データ型”なしでは,適合する SQL 言語は,い

ずれかの SQL データ型に対応する Java データ型ではない<Java データ型>を含んではならない。

4)

【この

適合性規則を挿入する。】機能 J621“外部 Java ルーチン”なしでは,適合する SQL 言語は,

JAVA を含む<言語名>を含む<SQL 呼出しルーチン>を含んではならない。

9.9

<

ルーチン変更文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.51 <

ルーチン変更文

>

”を修正する。

 

機能

<ルーチン変更文> (<alter routine statement>)  は,SQL 呼出しルーチンの特性を変更する。

形式

追加の形式項目なし。

 

構文規則

1)

構文規則 1)の後に挿入する。】SR は,外部 Java ルーチンであってはならない。

注記 61  SR は,<ルーチン変更文>によって識別される SQL 呼出しルーチンとして定義されている。

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

追加の適合性規則なし。

 

9.10  <

ルーチン削除文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.52 <

ルーチン削除文

>

”を修正する。

 

機能

<ルーチン削除文> (<drop routine statement>)  は,SQL 呼出しルーチンを破壊する。

形式

追加の形式項目なし。

 

構文規則

1)

【この

構文規則を挿入する。】SR が外部 Java ルーチンで,かつ,<ルーチン削除文>が<記述子ファ

イル>中に含まれるならば,<ルーチン削除文>は,PROCEDURE 又は FUNCTION の<ルーチン型>

を指定しなければならない。

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部 Java

ルーチンを識別する<特定ルーチン指示子>を含み,かつ,<記述子ファイル>中に含まれない<ルー

チン削除文>を含んではならない。

2)

【この

適合性規則を挿入する。】機能 J621“外部 Java ルーチン”なしでは,適合する SQL 言語は,


56

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

外部 Java ルーチンを識別する<特定ルーチン指示子>を含む<ルーチン削除文>を含んではならない。

9.11  <

利用者定義順序付け定義>

この細分箇条は,

ISO/IEC 9075-2

の“

11.55 <

利用者定義順序付け定義

>

”を修正する。

 

機能

<利用者定義順序付け定義> (<user-defined ordering definition>)  は,利用者定義型のための利用者定義順序

付けを定義する。

形式

<

順序付けカテゴリ> ::=

  !! ISO/IEC 9075-2

中のすべての代替手段

| <

比較可能カテゴリ>

<比較可能カテゴリ>::=RELATIVE WITH COMPARABLE INTERFACE

構文規則

1)

構文規則 4)を置き換える。】<比較可能カテゴリ>,<相対的カテゴリ>,又は<状態カテゴリ>が指

定されるならば,UDT は,最上位型でなければならない。

2)

構文規則 6)の前に挿入する。】<比較可能カテゴリ>が指定されるならば,UDT は,外部 Java デー

タ型でなければならない。その外部 Java データ型の当該 Java クラスを JC とする。JC は,Java イ

ンタフェース java.lang.Comparable を実装しなければならない。

3)

構文規則 6)  b)の最初の段落を置き換える。】<比較可能カテゴリ>が指定されないならば,次によ

る。

アクセス規則

追加のアクセス規則なし。

 

一般規則

1)

一般規則 3) c)の前に挿入する。】<比較可能カテゴリ>が指定されるならば,UDT の利用者定義型

記述子中の順序付けカテゴリには,COMPATIBLE が設定される。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含む<利用者定義順序付け定義>を含ん

ではならない。

2)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部 Java

データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<記述子ファイル>中に含まれな

い<利用者定義順序付け定義>を含んではならない。

9.12  <

利用者定義順序付け削除文>

この細分箇条は,

ISO/IEC 9075-2

の“

11.56 <

利用者定義順序付け削除文

>

”を修正する。

 

機能

<利用者定義順序付け削除文> (<drop user-defined ordering statement>)  は,利用者定義順序付けメソッドを

破壊する。

形式

追加の形式項目なし。

 

構文規則

追加の構文規則なし。

 


57

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

1)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含む<利用者定義順序付け削除文>を含

んではならない。

2)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部 Java

データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<記述子ファイル>中に含まれな

い<利用者定義順序付け削除文>を含んではならない。

10

アクセス制御

この箇条は,

ISO/IEC 9075-2

の“

12 

アクセス制御”を修正する。

 

10.1  <GRANT

権限文>

この細分箇条は,

ISO/IEC 9075-2

の“

12.2 <GRANT

権限文

>

”を修正する。

 

機能

<GRANT 権限文> (<grant privilege statement>)  は,権限を定義する。

形式

追加の形式項目なし。

 

構文規則

追加の構文規則なし。

 

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<JAR 名>

を直に含む<対象名>を含み,かつ,<記述子ファイル>中に含まれない<GRANT 権限文>を含んでは

ならない。

10.2  <

権限>

この細分箇条は,

ISO/IEC 9075-2

の“

12.3 <

権限

>

”を修正する。

 

機能

<権限> (<privileges>)  は,権限を指定する。

形式

<

対象名> ::=

!! ISO/IEC 9075-2

中のすべての代替手段

| JAR<JAR

名>

構文規則

1)

構文規則 3)を置き換える。】<対象名>が<定義域名>,<照合順名>,<文字集合名>,<文字変換名>,


58

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

<スキーマ解決利用者定義型名>,<順序数生成子名>又は<JAR 名>を指定するならば,<権限>は

USAGE を指定しなければならない。そうでなければ,USAGE を指定してはならない。

アクセス規則

追加のアクセス規則なし。

 

一般規則

追加の一般規則なし。

 

適合性規則

1)

【この

適合性規則を挿入する。】機能 J561“JAR 権限”なしでは,適合する SQL 言語は,<JAR 名>

を直に含む<対象名>を含んではならない。

10.3  <REVOKE

>

この細分箇条は,

ISO/IEC 9075-2

の“

12.7 <REVOKE

>

”を修正する。

機能

<REVOKE 文> (<revoke statement>)  は,権限及び役割認可を破壊する。

形式

追加の形式項目なし。

構文規則

1)

構文規則 10) a) iii) 4)を置き換える。】及び は,両方とも USAGE 権限記述子とする。の動作,

及び識別される定義域,文字集合,照合順,文字変換,利用者定義型,順序数生成子又は JAR は,

それぞれ,の動作,及び識別される定義域,文字集合,照合順,文字変換,利用者定義型,順序

数生成子又は JAR と同じとする。

2)

構文規則 29) b)の後に挿入する。】DT が外部 Java データ型で,かつ,REVOKE 破壊動作のために,

DT

の記述子の<JAR 及びクラス名>中に<JAR 名>が含まれる JAR に関する適用可能な USAGE 権限

を A1 がもたなくなる。

3)

構文規則 33)の後に挿入する。】S1 中に含まれる任意の JAR 記述子を JR とする。REVOKE 破壊

動作のために,JR の SQL-Java パス中に含まれる<解決 JAR>中に名前が含まれる JAR に関する適用

可能な USAGE 権限を A1 がもたなくなるならば,JR は,

影響を受ける

  (impacted)  という。

4)

構文規則 34) r)の後に挿入する。】RD が外部 Java ルーチンならば,RD の記述子の<外部ルーチン

名>中に含まれる<外部 Java 参照文字列>中に<JAR 名>が含まれる JAR に関する USAGE 権限。

5)

構文規則 36)の後に挿入する。】RESTRICT が指定されるならば,JAR は,影響を受けてはならな

い。

アクセス規則

追加のアクセス規則なし。

一般規則

1)

一般規則 16)の後に挿入する。】<REVOKE 文>の<対象名>によって識別されるオブジェクトが

<JAR 名>を指定するならば,<JAR 名>によって識別される JAR を とする。影響を受けるどの JAR

記述子 JR に対しても,直に含まれる<解決 JAR>が である JR の SQL-Java パス中に含まれる各<

パス要素>PE 対して,JAR 記述子 JR の SQL-Java パスが,PE を含まないように修正される。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<JAR 名>

を直に含む<対象名>を含み,かつ,<記述子ファイル>中に含まれない<REVOKE 文>を含んではな


59

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

らない。

11

組込み手続

11.1  SQLJ.INSTALL_JAR

手続

機能

SQLJ.INSTALL_JAR 手続 (SQLJ.INSTALL_JAR procedure) は,現行 SQL カタログ及びスキーマに一連の

Java クラスを組み込む。

署名

SQLJ.INSTALL_JAR (

url

IN

CHARACTER VARYING (L ),

jar

IN

CHARACTER VARYING (L ),

deploy IN

INTEGER

)

ここで,は,処理系定義の整数値とする。

アクセス規則

1)  SQLJ.INSTALL_JAR

手続を呼び出すために必要な権限は,処理系定義とする。

一般規則

1)  SQLJ.INSTALL_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理系

定義の規則に従う。SQLJ.INSTALL_JAR の呼出しが例外条件を引き起こすならば,組込み動作に

対する効果は,処理系定義とする。

2)

正しい url パラメタの値は,処理系定義とし,形式が処理系定義である URL を含んでもよい。url

パラメタの値が処理系定義の制限に適合しないで,正しい JAR を識別しないならば,例外条件:Java 

DDL

URL 

が正しくない

  (invalid URL)  が引き起こされる。

3)  jar

パラメタの値を とする。次の値を TJ とする。

TRIM ( BOTH ' ' FROM J )

TJ

が<JAR 名>の

形式及び構文規則に適合しないならば,例外条件:Java DDL

JAR

名が正しく

ない

  (invalid JAR name)

が引き起こされる。

4)  TJ

によって指定される<JAR 名>中に指定され,陽に修飾されるか又は修飾が暗に想定される<JAR

識別子>を JN とする。

5)

名前が JN である組み込まれた JAR が存在するならば,例外条件:Java DDL

JAR

名が正しくない

が引き起こされる。

6) JAR

は,組み込まれ,名前 JN と関連付けられる。JAR 中に含まれる可視の Java クラス及び可視で

ない Java クラスの両方,並びに他の項目を含む,JAR のすべての内容が組み込まれる。この JAR

は,それぞれの新しいクラスの

関連付けられた

JAR (associated JAR)

となる。可視でない Java クラ

ス及びその他の項目は,他の Java メソッドによって参照することができる。

7)  jar

パラメタの暗に想定されるか又は陽に指定される<スキーマ名>によって識別されるスキーマ

を所有する<認可識別子>に対して,jar パラメタによって識別される JAR に関する USAGE 権限を

定義する権限記述子が作成される。権限記述子に対する権限付与者には,特別な付与者の値

“_SYSTEM”が設定される。この権限は,付与可能とする。

8)  deploy

パラメタの値が 0 ではなく,かつ,JAR が一つ以上の配置記述子ファイルを含むならば,

これらのインスタンスによって想定される組込み動作は,配置記述子ファイルがマニフェスト中に


60

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

現れる順序で実行される。

注記 62  配置記述子ファイル及びそれらの組込み動作は,“4.11.1  配置記述子ファイル”で規定して

いる。

適合性規則

1)

機能 J531“配置”なしでは,適合する SQL 言語は,deploy パラメタに 0 でない値を指定する

SQLJ.INSTALL_JAR 手続の呼出しを含んではならない。

11.2  SQLJ.REPLACE_JAR

手続

機能

SQLJ.REPLACE_JAR

手続 (SQLJ.REPLACE_JAR procedure) は,組み込まれた JAR を置き換える。

署名

SQLJ.REPLACE_JAR (

url

IN

CHARACTER VARYING (L ),

jar

IN

CHARACTER VARYING (L ) )

ここで,は,処理系定義の整数値とする。

アクセス規則

1)  SQLJ.INSTALL_JAR

手続を呼び出すために必要な権限は,処理系定義とする。

2)

現行利用者は,jar パラメタの値によって指定される JAR の所有者でなければならない。

一般規則

1)  SQLJ.REPLACE_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理系

定義の規則に従う。

2)

正しい url パラメタの値は,処理系定義とし,形式が処理系定義である URL を含んでもよい。url

の値が正しい JAR を識別するならば,その JAR 中のクラスを

新しいクラス

  (new class)  と呼ぶ。url

パラメタの値が正しい JAR を識別しないならば,例外条件:Java DDL

URL 

が正しくない

  (invalid 

URL)

が引き起こされる。

3)  jar

パラメタの値を とする。次の値を TJ とする。

TRIM ( BOTH ' ' FROM J )

TJ

が<JAR 名>の

形式及び構文規則に適合しないならば,例外条件:Java DDL

JAR

名が正しく

ない

  (invalid JAR name)

が引き起こされる。

4)  TJ

によって指定される<JAR 名>中に指定され,陽に修飾されるか又は修飾が暗に想定される<JAR

識別子>を JN とする。

5) <JAR

名>  JN をもつ組み込まれた JAR が存在するならば,その JAR を

古い

JAR  (old JAR)

と呼ぶ。

古い JAR 中のクラスを

古いクラス

  (old class)  と呼ぶ。<JAR 名>  JN をもつ組み込まれた JAR が存

在しないならば,例外条件:Java DDL

−組み込まれていない

JAR

の置換えを試みた

  (attempt to 

replace uninstalled JAR)

が引き起こされる。JAR 名の等価性は,ISO/IEC 9075-2  の“5.1 <トークン>

及び<分離符号>”で規定するとおりに,識別子の等価性のための規則によって決定される。

6)

完全修飾付きクラス名が新しいクラスの名前である古いクラスを,

一致する古いクラス

  (matching 

old class)

とし,完全修飾付きクラス名が古いクラスの名前である新しいクラスを,

一致する新しい

クラス

  (matching new class)  とする。一致する古いクラスではない古いクラスを,

一致しない古いク

ラス

  (unmatched old class)  とし,一致する新しいクラスではない新しいクラスを,

一致しない新し

いクラス

  (unmatched new class)  とする。


61

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

7)

ある JAR の JAR 名と直に含まれる<JAR 名>とが等価である<外部 Java 参照文字列>を記述子の<外

部ルーチン名>が指定するルーチンを,その JAR の

従属

SQL

ルーチン

  (dependent SQL routine)  とす

る。

8)

古い JAR の任意の従属 SQL ルーチンが,一致しない古いクラス中のメソッドを参照するならば,

例外条件:Java DDL

−クラスの削除が正しくない

  (invalid class deletion)  が引き起こされる。

注記 63  この規則は,外部 Java ルーチンによって参照されるクラスの削除を禁止する。しかし,こ

の禁止は,他の Java クラスによって間接的にだけ参照されるクラスの削除を妨げない。

9)

一致する古いクラス中のメソッドを参照する古い JAR の各従属 SQL ルーチンに対して,SQL ルー

チンを作成した<SQL 呼出しルーチン>を CS とする。CS が,対応する新しいルーチンに対して正し

い<SQL 呼出しルーチン>でないならば,例外条件:Java DDL

−置換えが正しくない

  (invalid 

replacement)

が引き起こされる。

10)

ある JAR 中に含まれる Java クラスを当該 Java クラスとしてもつ外部 Java データ型を,その JAR の

従属

SQL

  (dependent SQL type)  とする。

注記 64  “当該 Java クラス”は,“9.4 <利用者定義型定義>”で規定している。

11)

指定された JAR の任意の従属 SQL 型が存在し,それが一致しない古いクラスならば,例外条件:

Java DDL

−クラスの削除が正しくない

が引き起こされる。

注記 65  この規則は,外部 Java ルーチンによって参照されるクラスの削除を禁止する。しかし,こ

の禁止は,他の Java クラスによって間接的にだけ参照されるクラスの削除を妨げない。

12)

各従属 SQL 型に対して,SQL 型を作成した<利用者定義型定義>を CT とする。CT が,対応する新

しいクラスに対して正しい<利用者定義型定義>でないならば,例外条件:Java DDL

−置換えが正し

くない

が引き起こされる。

13)

古い JAR,並びにそれに含まれるすべての可視の古いクラス及び可視でない古いクラスが削除され

る。

14)

新しい JAR,並びに可視の新しいクラス及び可視でない新しいクラスが組み込まれ,指定された

<JAR 名>と関連付けられる。その JAR は,それぞれの新しいクラスの

関連付けられた

JAR (associated 

JAR)

となる。JAR 中に含まれる可視の Java クラス及び可視でない Java クラスの両方,並びに他の

項目を含む,新しい JAR のすべての内容が組み込まれる。可視でない Java クラス及び他の項目は,

他の Java メソッドによって参照することができる。

15)

実 装 が 置 き 換 え ら れ た SQL ル ー チ ン 又 は 構 造 型 を 用 い る 現 在 実 行 中 の SQL 文 に 対 す る

SQLJ.REPLACE_JAR

の効果は,処理系依存とする。

適合性規則

なし。

11.3  SQLJ.REMOVE_JAR

手続

機能

SQLJ.REMOVE_JAR 手続 (SQLJ.REMOVE_JAR procedure) は,組み込まれた JAR 及びそのクラスを除去

する。

署名

SQLJ.INSTALL_JAR (

jar

  IN

CHARACTER  VARYING  (L ),

undeploy IN  INTEGER )


62

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

ここで,は,処理系定義の整数値とする。

アクセス規則

1)  SQLJ.REMOVE_JAR

手続を呼び出すために必要な権限は,処理系定義とする。

2)

現行利用者は,jar パラメタの値によって指定される JAR の所有者でなければならない。

一般規則

1)  SQLJ.REMOVE_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理系

定義の規則に従う。SQLJ.REMOVE_JAR の呼出しが例外条件を引き起こすならば,除去動作に対す

る効果は,処理系定義とする。

2)  jar

パラメタの値を とする。次の値を TJ とする。

TRIM ( BOTH ' ' FROM J )

TJ

が<JAR 名>の

形式及び構文規則に適合しないならば,例外条件:Java DDL

JAR

名が正しく

ない

  (invalid JAR name)

が引き起こされる。

3)  TJ

によって指定される<JAR 名>中に指定され,陽に修飾されるか又は修飾が暗に想定される<JAR

識別子>を JN とする。

4) <JAR

名>  JN をもつ組み込まれた JAR が存在するならば,その JAR を

古い

JAR  (old JAR)

と呼ぶ。

古い JAR 中のクラスを

古いクラス

  (old class)  と呼ぶ。<JAR 名>  JN をもつ組み込まれた JAR が存

在しないならば,例外条件:Java DDL

−組み込まれていない

JAR

の除去を試みた

  (attempt to remove 

uninstalled JAR)

が引き起こされる。JAR 名の等価性は,ISO/IEC 9075-2 の“5.2  <トークン>及び<

分離符号>”で規定するとおりに,識別子の等価性のための規則によって決定される。

5)  undeploy

パラメタの値が 0 ではなく,

かつ,

JAR が一つ以上の配置記述子ファイルを含むならば,

これらのインスタンスによって暗に想定される除去動作は,配置記述子ファイルがマニフェスト中

に現れる順序の逆の順序で実行される。

注記 66  配置記述子ファイル及びそれらの除去動作は,“4.11.1  配置記述子ファイル”で規定してい

る。

注記 67  これらの動作は,次の段階で指定される条件の検証に先立って実行される。

6)

ある JAR の JAR 名と直に含まれる<JAR 名>とが等価である<外部 Java 参照文字列>を記述子の<外

部ルーチン名>が指定するルーチンを,その JAR の

従属

SQL

ルーチン

  (dependent SQL routine)  とす

る。

7)

指定された JAR の任意の従属 SQL ルーチンが存在するならば,例外条件:Java DDL

−クラスの削

除が正しくない

  (invalid class deletion)  が引き起こされる。

注記 68  この規則は,外部 Java ルーチンによって参照されるクラスの削除を禁止する。しかし,こ

の禁止は,他の Java クラスによって間接的にだけ参照されるクラスの削除を妨げない。

8)

ある JAR 中に含まれる Java クラスを当該 Java クラスとしてもつ外部 Java データ型を,その JAR の

従属

SQL

  (dependent SQL type)  とする。

注記 69  “当該 Java クラス”は,“9.4 <利用者定義型定義>”で規定している。

9)

指定された JAR の任意の従属 SQL 型が存在するならば,例外条件:Java DDL

−クラスの削除が正

しくない

  が引き起こされる。

注記 70  この規則は,外部 Java ルーチンによって参照されるクラスの削除を禁止する。しかし,こ

の禁止は,他の Java クラスによって間接的にだけ参照されるクラスの削除を妨げない。

10)

指定された JAR,

並びにそれに含まれるすべての可視のクラス及び可視でないクラスが削除される。


63

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

11)

指定された JAR に関する USAGE 権限が,それをもつすべての利用者からはく(剥)奪される。

12)

実 装 が 除 去 さ れ た SQL ル ー チ ン 又 は 構 造 型 を 用 い る 現 在 実 行 中 の SQL 文 に 対 す る

SQLJ.REMOVE_JAR

の効果は,処理系依存とする。

適合性規則

1)

機能 J531“配置”なしでは,適合する SQL 言語は,undeploy パラメタに 0 でない値を指定する

SQLJ.REMOVE_JAR

手続の呼出しを含んではならない。

11.4  SQLJ.ALTER_JAVA_PATH

手続

機能

SQLJ.ALTER_JAVA_PATH 手続 (SQLJ.ALTER_JAVA_PATH procedure) は,JAR の SQL-Java パスを変更す

る。

署名

SQLJ.ALTER_JAVA_PATH (

jar

  IN

CHARACTER  VARYING  (L ),

path    IN

CHARACTER  VARYING  (L ) )

ここで,は,処理系定義の整数値とする。

アクセス規則

1)  SQLJ.ALTER_JAVA_PATH

手続を呼び出すために必要な権限は,処理系定義とする。

2)

現行利用者は,jar パラメタの値によって指定される JAR の所有者でなければならない。

3)

現行利用者は,path パラメタ中で参照される各 JAR に関する USAGE 権限がもたなければならな

い。

一般規則

1)  SQLJ.ALTER_JAVA_PATH

手続は,SQL トランザクション内で SQL スキーマ文を実行するための

処理系定義の規則に従う。

2)  jar

パラメタの値を とする。次の値を TJ とする。

TRIM ( BOTH ' ' FROM J )

TJ

が<JAR 名>の

形式及び構文規則に適合しないならば,例外条件:Java DDL

JAR

名が正しく

ない

  (invalid JAR name)

が引き起こされる。

3)  TJ

によって指定される<JAR 名>中に指定され,陽に修飾されるか又は修飾が暗に想定される<JAR

識別子>を JN とする。

4)  SQLJ.ALTER_JAVA_PATH

手続が呼び出されるとき,呼出し時点の現行カタログ及び現行スキーマ

は,path パラメタの<解決 JAR>中のそれぞれの省略された<カタログ名>及び<スキーマ名>のため

の既定値とする。これらの既定値は,後で規定するとおり,path パラメタの後続するどの利用に

も適用される。

5)  path

パラメタの値が<SQL Java パス>の形式に適合しないならば,例外条件:Java DDL

−パス名が

正しくない

  (invalid path name)  が引き起こされる。

注記 71  path パラメタは,空又は空白文字列であってもよい。

6)  JN

で示される JAR と関連付けられた現行パス(があるならば,それ)を置き換えて,path パラメ

タの値は,その JAR と関連付けられたパスになる。

7)  SQLJ.ALTER_JAVA_PATH

手続の呼出しが例外条件を引き起こすならば,JAR と関連付けられたパ

スに対する効果は,処理系定義とする。


64

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

8)

既に準備されたか又は現在実行中の SQL 文に対する SQLJ.ALTER_JAVA_PATH の効果は,処理系

依存とする。

適合性規則

1)

機能 J601“SQL-Java パス”なしでは,適合する SQL 言語は,SQLJ.ALTER_JAVA_PATH 手続の呼

出しを含んではならない。

12  Java

について

12.1

この規格で提供する Java の機能

12.1.1

パッケージ java.sql

この規格を実装する SQL システムは,パッケージ java.sql を提供し,それは,JDBC ドライバ,及び

そのパッケージによって必要とされるすべてのクラスとする。この規格を実装する SQL システムが提供す

る他の Java パッケージについては,処理系定義とする。

この規格を実装する SQL システムでは,

パッケージ java.sql は,

既定コネクション

  (default connection)

を提供する。SQL ルーチンとして呼び出される Java メソッドに対する既定コネクションは,次の特性をも

つ。

−  既定コネクションは,データベースへの効率的なアクセスを提供するために先行して割り当てられ

る。

−  既定コネクションは,現行セション及び現行トランザクション中に含まれる。

−  既定コネクションの認可識別子は,現行認可識別子とする。

−  既定コネクションの JDBC AUTO COMMIT の設定は,

  (false)  とする。

java.sql

によって提供されるその他のデータ源の URL は,処理系定義とする。

12.1.2

システム特性

この規格を実装する SQL システムは,java.lang.System の getProperty メソッドによって利用す

るための次のシステム特性を提供する。

表 1−システム特性

キー 

関連する値の説明 

sqlj.defaultconneciton Java

メソッドが SQL 処理系中で実行しているならば,文字列

“jdbc:default:connection”

1)

sqlj.runtime

実行時文脈クラスのクラス名

2)

1)

  そうでなければ,ナル値。

2)

  このクラスは,クラス sqlj.runtime.RuntimeContext のサブクラスとする。名前が戻されるクラ

スの getDefaultContex()メソッドでは,

12.1.1 パッケージ java.sql”で規定している既定コネク

ションを戻す。

12.2

配置記述子ファイル

機能

配置記述子ファイル  (Deployment descriptor files)  は,SQLJ.INSTAfLL_JAR 及び SQLJ.REMOVE_JAR 手

続によって実行される動作の情報を与える。

モデル

配置記述子ファイルは,JAR 中に含まれるテキストファイルで,その JAR のマニフェスト中で次の特性


65

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を指定する。

Name: file_name

SQLJDeploymentDescriptor: TRUE

特性

配置記述子ファイル中に含まれるテキストは,次の形式でなければならない。

<

記述子ファイル> ::=

SQLActions <

左角括弧> <右角括弧> <等号演算子>

{ [ <2

重引用符> <アクショングループ> <2 重引用符>

 [

<

コンマ> <2 重引用符> <アクショングループ> <2 重引用符> ] ] }

<

アクショングループ> ::=

  <

組込み動作>

| <

除去動作>

<

組込み動作> ::=

BEGIN INSTALL [ <

コマンド> <セミコロン> ]... END INSTALL

<

除去動作> ::=

BEGIN REMOVE [ <

コマンド> <セミコロン> ]... END REMOVE

<

コマンド> ::=

  <SQL

文>

| <

処理系ブロック>

<SQL

文> ::= !! 

記述参照

<

処理系ブロック> ::=

BEGIN <

処理系名> <SQL トークン>... END <処理系名>

<

処理系名> ::= <識別子>

<SQL

トークン> ::= !! 

記述参照

記述

1) <

記述子ファイル>は,高々一つの<組込み動作>及び高々一つの<除去動作>を含まなければならない。

2)

(あるならば,

)<組込み動作>,及び(あるならば,

)<除去動作>中に指定される<コマンド>は,そ

れぞれ,配置記述子ファイルの

組込み動作

  (install action)  及び

除去動作

  (remove action)  を指定する。

3) <

組込み動作>中で指定する<SQL 文>は,次のいずれかでなければならない。

a) <LANGUAGE

句>に JAVA を指定する<SQL 呼出しルーチン>。それらの文によって作成される手

続及び関数は,配置記述子ファイルの

配置ルーチン

  (deployed routine)  と呼ぶ。

b)

配置ルーチンに関する EXECUTE 権限を指定する<GRANT 権限文>。

c) <

外部 Java 型句>を指定する<利用者定義型定義>。それらの文によって作成される型は,配置記述

子ファイルの

配置型

  (deployed type)  と呼ぶ。

d)

配置型に関する USAGE 権限を指定する<GRANT 権限文>。

e)

配置型の順序付けを指定する<利用者定義順序付け定義>。

4)

配置記述子ファイルが SQLJ.INSTALL_JAR 手続の呼出しによって実行されるとき,任意の<外部

ルーチン名>の<JAR 名>又は<組込み動作>中の<SQL 呼出しルーチン>が<JAR 名>“thisjar”なら

ば,その実行のために,SQLJ.INSTALL_JAR 手続の jar パラメタで“thisjar”が実効的に置き

換えられる。


66

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

5) <

除去動作>中で指定する<SQL 文>は,次のいずれかでなければならない。

a)

配置ルーチンに対する<ルーチン削除文>。

b)

配置ルーチンに関する EXECUTE 権限の<REVOKE 文>。

c)

配置型に対する<データ型削除文>。

d)

配置型に関する USGAE 権限の<REVOKE 文>。

e)

配置型の順序付けを指定する<利用者定義順序付け削除文>。

6) <

組込み動作>(<除去動作>)中に指定されるとき,<処理系ブロック>は,処理系定義の組込み動作

(除去動作)を指定する。

7) <SQL

トークン>は,ISO/IEC 9075-2 の“5.2 <トークン>及び<分離符号>”中の“<トークン>”とい

う用語で規定する SQL 語い単位とする。すなわち,<処理系ブロック>中の注釈,引用符及び 2 重引

用符は,SQL トークン規約に従う。

8) <

処理系名>は,処理系定義の SQL 識別子とする。BEGIN キーワードに続けて指定する<処理系名>

と,END キーワードに続けて指定する<処理系名>とは,等価でなければならない。

9) <

組込み動作>(<除去動作>)中に含まれる<処理系名>をもつ<処理系ブロック>を組込み動作(除去

動作)として解釈するかどうかは,処理系定義とする。すなわち,処理系は,他の処理系によって

指定される組込み動作(除去動作)を実行してもよいし,しなくてもよい。

注記 72  配置記述子ファイルの形式は,索引付き特性を提供する特性ファイルのより一般的な概念

に対応する。したがって,配置記述子ファイルは,[JavaBeans]中で規定しているとおりに,

索引付き特性 SQLActions をもつ Java Beans をインスタンス化するために SQL 処理系に

よって用いることができる。結果の Java Beans のインスタンスを普通の Java Beans ツール

で仕立てることができる。例えば,SQLActions 特性中に格納されているルーチン記述子

を変更することによって,SQL 手続又は許可を変更することができる。そして,SQL シス

テムは,JAR の改訂版中で用いる配置記述子ファイルの修正版を生成するために,仕立て

られた Java Beans のインスタンスを用いることができる。

適合性規則

1)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義型定義>を含む<SQL 文>を含んで

はならない。

2)

機能 J531“配置”なしでは,適合する SQL 言語は,<データ型削除文>を含む<SQL 文>を含んでは

ならない。

3)

機能 J531“配置”なしでは,適合する SQL 言語は,<SQL 呼出しルーチン>を含む<SQL 文>を含ん

ではならない。

4)

機能 J531“配置”なしでは,適合する SQL 言語は,<ルーチン削除文>を含む<SQL 文>を含んでは

ならない。

5)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義順序付け定義>を含む<SQL 文>を

含んではならない。

6)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義順序付け削除文>を含む<SQL 文>

を含んではならない。

7)

機能 J531“配置”なしでは,適合する SQL 言語は,<GRANT 権限文>を含む<SQL 文>を含んでは

ならない。

8)

機能 J531“配置”なしでは,適合する SQL 言語は,<REVOKE 文>を含む<SQL 文>を含んではなら


67

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

ない。

13

情報スキーマ

この箇条は,

ISO/IEC 9075-11

の“

5 

情報スキーマ”を修正する。

 

13.1  JAR_JAR_USAGE

ビュー

機能

JAR_JAR_USAGE ビュー (JAR_JAR_USAGE view) は,このカタログ中で定義される JAR が依存してい

る特定の利用者又は役割によって所有される各 JAR を識別する。

定義

CREATE VIEW JAR_JAR_USAGE AS

  SELECT SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME,

   JAR_CATALOG,

JAR_SCHEMA,

JAR_NAME

  FROM ( DEFINITION_SCHEMA.JAR_JAR_USAGE JJU

   JOIN

     DEFINITION_SCHEMA.JARS

J

      USING ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME ) )

  JOIN

    DEFINITION_SCHEMA.SCHEMATA

S

    ON ( ( JJU.PATH_JAR_CATALOG, JJU.PATH_JAR_SCHEMA )

        = ( S.CATALOG_NAME, S.SCHEMA_NAME ) )

  WHERE ( SCHEMA_OWNER = CURRENT_USER

        OR

     SCHEMA_OWNER

IN

     (

SELECT

ROLE_NAME

      FROM

ENABLED_ROLES

)

)

   AND

    JAR_CATALOG

=

    (

SELECT

CATALOG_NAME

     FROM

INFORMATION_SCHEMA_CATALOG_NAME

)

;

GRANT SELECT ON TABLE JAR_JAR_USAGE

    TO PUBLIC WITH GRANT OPTION;

適合性規則

1)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

JAR_JAR_USAGE.を参照してはならない。

13.2  JARS

ビュー

機能

JARS ビュー (JARS view) は,現行利用者にアクセス可能なこのカタログ中で定義される組み込まれた

JAR を識別する。

定義

CREATE VIEW JARS AS


68

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  SELECT JAR_CATALOG, JAR_SCHEMA, JAR_NAME

 FROM

DEFINITION_SCHEMA.JARS

  WHERE ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME, 'JAR' ) IN

    ( SELECT OBJECT_CATALOG, OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE

   FROM

DEFINITION_SCHEMA.USAGE_PRIVILEGES

   WHERE

GRANTEE

IN

      (

'PUBLIC',

CURRENT_USER

)

          OR

      GRANTEE

IN

      (

SELECT

ROLE_NAME

   

FROM

ENABLED_ROLES

)

)

    AND

     JAR_CATALOG

=

     (

SELECT

CATALOG_NAME

      FROM

INFORMATION_SCHEMA_CATALOG_NAME

)

;

GRANT SELECT ON TABLE JARS

    TO PUBLIC WITH GRANT OPTION;

適合性規則

1)

機能 J651“SQL/JRT 情報スキーマ“なしでは,適合する SQL 言語は,INFORMATION_SCHEMA . JARS

を参照してはならない。

13.3  METHOD_SPECIFICATIONS

ビュー

この細分箇条は,

ISO/IEC 9075-11

の“

5.33 METHOD_SPECIFICATIONS

ビュー”を修正する。

 

機能

METHOD_SPECIFICATIONS ビュー (METHOD_SPECIFICATIONS view) は,特定の利用者又は役割にア

クセス可能なカタログ中のメソッドを識別する。

定義

ISO/IEC 9075-11 中に列 EXTERNAL_NAME 及び IS_FIELD を追加する。

】<ビュー定義>の最も外側の

<選択リスト>の最後に,“, EXTERNAL_NAME, IS_FIELD”を追加する。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . METHOD_SPECIFICATIONS . EXTERNAL_NAME を参照してはな

らない。

2)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . METHOD_SPECIFICATIONS . IS_FIELD を参照してはならない。

13.4  ROUTINE_JAR_USAGE

ビュー

機能

ROUTINE_JAR_USAGE ビュー (ROUTINE_JAR_USAGE view) は,このカタログ中で定義される外部

Java ルーチンが依存している特定の利用者又は役割によって所有される JAR を識別する。

定義

CREATE VIEW ROUTINE_JAR_USAGE AS


69

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  SELECT SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME,

   JAR_CATALOG,

JAR_SCHEMA,

JAR_NAME

  FROM ( DEFINITION_SCHEMA.ROUTINE_JAR_USAGE

   JOIN

     DEFINITION_SCHEMA.ROUTINES

      USING ( SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME ) )

  JOIN

    DEFINITION_SCHEMA.SCHEMATA

S

    ON ( ( JAR_CATALOG, JAR_SCHEMA ) =

      ( S.CATALOG_NAME, S.SCHEMA_NAME ) )

  WHERE ( SCHEMA_OWNER = CURRENT_USER

   OR

    SCHEMA_OWNER

IN

     (

SELECT

ROLE_NAME

      FROM

ENABLED_ROLES

)

)

  AND

   SPECIFIC_CATALOG

=

   (

SELECT

CATALOG_NAME

    FROM

INFORMATION_SCHEMA_CATALOG_NAME

)

;

GRANT SELECT ON TABLE ROUTINE_JAR_USAGE

    TO PUBLIC WITH GRANT OPTION;

適合性規則

1)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

ROUTINE_JAR_USAGE を参照してはならない。

13.5  TYPE_JAR_USAGE

ビュー

機能

TYPE_JAR_USAGE ビュー (TYPE_JAR_USAGE view) は,このカタログ中で定義される外部 Java デー

タ型が依存している特定の利用者又は役割によって所有される JAR を識別する。

定義

CREATE VIEW TYPE_JAR_USAGE AS

  SELECT USER_DEFINED_TYPE_CATALOG AS UDT_CATALOG,

   USER_DEFINED_TYPE_SCHEMA

AS

UDT_SCHEMA,

   USER_DEFINED_TYPE_NAME

AS

UDT_NAME,

   JAR_CATALOG,

JAR_SCHEMA,

JAR_NAME

  FROM ( DEFINITION_SCHEMA.TYPE_JAR_USAGE

   JOIN

    DEFINITION_SCHEMA.USER_DEFINED_TYPES

      USING ( USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA,

     USER_DEFINED_TYPE_NAME

)

)

  JOIN


70

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

   DEFINITION_SCHEMA.SCHEMATA

S

    ON ( ( JAR_CATALOG, JAR_SCHEMA ) =

      ( S.CATALOG_NAME, S.SCHEMA_NAME ) )

  WHERE ( SCHEMA_OWNER = CURRENT_USER

   OR

    SCHEMA_OWNER

IN

    (

SELECT

ROLE_NAME

     FROM

ENABLED_ROLES

)

)

  AND

   USER_DEFINED_TYPE_CATALOG

=

   (

SELECT

CATALOG_NAME

    FROM

INFORMATION_SCHEMA_CATALOG_NAME

)

;

GRANT SELECT ON TABLE TYPE_JAR_USAGE

    TO PUBLIC WITH GRANT OPTION;

適合性規則

1)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

TYPE_JAR_USAGE を参照してはならない。

13.6  USER_DEFINED_TYPES

ビュー

この細分箇条は,

ISO/IEC 9075-11

の“

5.72 USER_DEFINED_TYPES

ビュー”を修正する。

 

機能

USER_DEFINED_TYPES ビュー (USER_DEFINED_TYPES view) は,特定の利用者又は役割にアクセス

可能なこのカタログ中で定義される利用者定義型を識別する。

定義

ISO/IEC 9075-11 の USER_DEFINED_TYPES ビューに列を追加する。

】<ビュー定義>の最も外側の<選

択リスト>の最後に,

“, EXTERNAL_NAME, EXTERNAL_LANGUAGE, JAVA_INTERFACE”を追加する。

適合性規則

1)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_NAME を参照してはならない。

2)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_LANGUAGE を参照してはならない。

3)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . JAVA_INTERFACE を参照してはならない。

13.7

短い名前のビュー

この細分箇条は,

ISO/IEC 9075-11

の“

5.77 

短い名前のビュー”を修正する。

 

機能

短い名前のビュー  (Short name views)  は,

機能 F391“長い識別子”を必要としない識別子だけを用いる

代替ビューを提供する。

定義

ISO/IEC 9075-11 のビューMETHOD_SPECS を置き換える。

CREATE VIEW METHOD_SPECS


71

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

    (

SPECIFIC_CATALOG,

SPECIFIC_SCHEMA,

SPECIFIC_NAME,

    UDT_CATALOG,

UDT_SCHEMA,

UDT_NAME,

    METHOD_NAME,

IS_STATIC,

IS_OVERRIDING,

    IS_CONSTRUCTOR,

DATA_TYPE,

CHAR_MAX_LENGTH,

    CHAR_OCTET_LENGTH,

CHAR_SET_CATALOG,

CHAR_SET_SCHEMA,

    CHARACTER_SET_NAME,

COLLATION_CATALOG,

COLLATION_SCHEMA,

    COLLATION_NAME,

NUMERIC_PRECISION,

NUMERIC_PREC_RADIX,

    NUMERIC_SCALE,

DATETIME_PRECISION,

INTERVAL_TYPE,

    INTERVAL_PRECISION,

RETURN_UDT_CATALOG,

RETURN_UDT_SCHEMA,

    RETURN_UDT_NAME,

SCOPE_CATALOG,

SCOPE_SCHEMA,

    SCOPE_NAME,

MAX_CARDINALITY,

DTD_IDENTIFIER,

    METHOD_LANGUAGE,

PARAMETER_STYLE,

IS_DETERMINISTIC,

    SQL_DATA_ACCESS,

IS_NULL_CALL,

TO_SQL_SPEC_CAT,

    TO_SQL_SPEC_SCHEMA,

TO_SQL_SPEC_NAME,

AS_LOCATOR,

    EXTERNAL_NAME,

IS_FIELD,

CREATED,

    LAST_ALTERED

)

AS

  SELECT SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME,

    USER_DEFINED_TYPE_CATALOG,

USER_DEFINED_TYPE_SCHEMA,

USER_DEFINED_TYPE_NAME,

    METHOD_NAME,

IS_STATIC,

IS_OVERRIDING,

    IS_CONSTRUCTOR,

DATA_TYPE,

CHARACTER_MAXIMUM_LENGTH,

    CHARACTER_OCTET_LENGTH,

CHARACTER_SET_CATALOG,

CHARACTER_SET_SCHEMA,

    CHARACTER_SET_NAME,

COLLATION_CATALOG,

COLLATION_SCHEMA,

    COLLATION_NAME,

NUMERIC_PRECISION,

NUMERIC_PRECISION_RADIX,

    NUMERIC_SCALE,

DATETIME_PRECISION,

INTERVAL_TYPE,

    INTERVAL_PRECISION,

RETURN_UDT_CATALOG,

RETURN_UDT_SCHEMA,

    RETURN_UDT_NAME,

SCOPE_CATALOG,

SCOPE_SCHEMA,

    SCOPE_NAME,

MAXIMUM_CARDINALITY,

DTD_IDENTIFIER,

    METHOD_LANGUAGE,

PARAMETER_STYLE,

IS_DETERMINISTIC,

    SQL_DATA_ACCESS,

IS_NULL_CALL,

TO_SQL_SPECIFIC_CATALOG,

    TO_SQL_SPECIFIC_SCHEMA,

TO_SQL_SPECIFIC_NAME,

AS_LOCATOR,

    EXTERNAL_NAME,

IS_FIELD,

CREATED,

    LAST_ALTERED

 FROM

INFORMATION_SCHEMA.METHOD_SPECIFICATIONS;

ISO/IEC 9075-11 中のビューUDT_S を置き換える。

CREATE VIEW UDT_S

    (

UDT_CATALOG,

UDT_SCHEMA,

UDT_NAME,

    UDT_CATEGORY,

IS_INSTANTIABLE,

IS_FINAL,

    ORDERING_FORM,

ORDERING_CATEGORY,

ORDERING_ROUT_CAT,

    ORDERING_ROUT_SCH,

ORDERING_ROUT_NAME,

REFERENCE_TYPE,

    DATA_TYPE,

CHAR_MAX_LENGTH,

CHAR_OCTET_LENGTH,


72

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

    CHAR_SET_CATALOG,

CHAR_SET_SCHEMA,

CHARACTER_SET_NAME,

    COLLATION_CATALOG,

COLLATION_SCHEMA,

COLLATION_NAME,

    NUMERIC_PRECISION,

NUMERIC_PREC_RADIX,

NUMERIC_SCALE,

    DATETIME_PRECISION,

INTERVAL_TYPE,

INTERVAL_PRECISION,

    SOURCE_DTD_ID,

REF_DTD_IDENTIFIER,

EXTERNAL_NAME,

    EXTERNAL_LANGUAGE,

JAVA_INTERFACE

)

AS

  SELECT USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA, USER_DEFINED_TYPE_NAME,

    CATEGORY,

IS_INSTANTIABLE,

IS_FINAL,

    ORDERING_FORM,

ORDERING_CATEGORY,

ORDERING_ROUTINE_CATALOG,

    ORDERING_ROUTINE_SCHEMA,

ORDERING_ROUTINE_NAME,

REFERENCE_TYPE,

    DATA_TYPE,

CHARACTER_MAXIMUM_LENGTH,

CHARACTER_OCTET_LENGTH,

    CHARACTER_SET_CATALOG,

CHARACTER_SET_SCHEMA,

CHARACTER_SET_NAME,

    COLLATION_CATALOG,

COLLATION_SCHEMA,

COLLATION_NAME,

    NUMERIC_PRECISION,

NUMERIC_PRECISION_RADIX,

NUMERIC_SCALE,

    DATETIME_PRECISION,

INTERVAL_TYPE,

INTERVAL_PRECISION,

    SOURCE_DTD_IDENTIFIER,

REF_DTD_IDENTIFIER,

EXTERNAL_NAME,

    EXTERNAL_LANGUAGE,

JAVA_INTERFACE

 FROM

INFORMATION_SCHEMA.USER_DEFINED_TYPES;

適合性規則

1)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . METHOD_SPECS . EXTERNAL_NAME を参照してはならない。

2)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . METHOD_SPECS . IS_FIELD を参照してはならない。

3)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_NAME を参照してはならない。

4)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_LANGUAGE を参照してはならない。

5)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL 言語

は,INFORMATION_SCHEMA . UDT_S . JAVA_INTERFACE を参照してはならない。

14

定義スキーマ

この細分箇条は,

ISO/IEC 9075-11

の“

6 

定義スキーマ”を修正する。

 

14.1  JAR_JAR_USAGE

実表

機能

JAR_JAR_USAGE 実表は,JAR の SQL-Java パス中に含まれる各 JAR に対して一つの行をもつ。

定義

CREATE TABLE JAR_JAR_USAGE (

 JAR_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,


73

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

 PATH_JAR_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 PATH_JAR_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 PATH_JAR_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 CONSTRAINT

JAR_JAR_USAGE_PRIMARY_KEY

    PRIMARY KEY ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME,

      PATH_JAR_CATALOG, PATH_JAR_SCHEMA, PATH_JAR_NAME ),

  CONSTRAINT

JAR_JAR_USAGE_CHECK_REFERENCES_JARS

      CHECK ( PATH_JAR_CATALOG NOT IN

    (

SELECT

CATALOG_NAME

    FROM

SCHEMATA

)

        OR

        ( PATH_JAR_CATALOG, PATH_JAR_SCHEMA, PATH_JAR_NAME ) IN

        ( SELECT JAR_CATALOG, JAR_SCHEMA, JAR_NAME

    FROM

JARS

)

),

 CONSTRAINT

JAR_JAR_USAGE_FOREIGN_KEY_JARS

    FOREIGN KEY ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME )

   REFERENCES

JARS

 )

記述

1) JAR_JAR_USAGE

実表は,JAR  J  に関連付けられた<SQL Java パス>中に含まれる<JAR 名>によっ

て識別される各 JAR JP に対して一つの行をもつ。

2) JAR_CATALOG

,JAR_SCHEMA 及び JAR_NAME の値は,それぞれ,記述されている JAR(J)  の<JAR

名>の<カタログ名>,<修飾なしスキーマ名>及び<JAR 識別子>とする。

3) PATH_JAR_CATALOG

,PATH_JAR_SCHEMA 及び PATH_JAR_NAME の値は,それぞれ,記述され

ている JAR に関連付けられた<SQL Java パス>中の JAR(JP)  の<JAR 名>の<カタログ名>,<修飾な

しスキーマ名>及び<JAR 識別子>とする。

14.2  JARS

実表

機能

JARS 実表は,組み込まれた各 JAR に対して一つの行をもつ。

定義

CREATE TABLE JARS (

 JAR_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 CONSTRAINT

JARS_PRIMARY_KEY

    PRIMARY KEY ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME ),

 CONSTRAINT

JAR_FOREIGN_KEY_SCHEMATA

    FOREIGN KEY ( JAR_CATALOG, JAR_SCHEMA )

   REFERENCES

SCHEMATA

 )


74

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

記述

1) JAR_CATALOG

,JAR_SCHEMA 及び JAR_NAME の値は,それぞれ,記述されている JAR の<JAR

名>の<カタログ名>,<修飾なしスキーマ名>及び<JAR 識別子>とする。

14.3  METHOD_SPECIFICATIONS

実表

この細分箇条は,

ISO/IEC 9075-11

の“

6.30 METHOD_SPECIFICATIONS

実表”を修正する。

 

機能

METHOD_SPECIFICATIONS 実表は,各メソッド指定に対して一つの行をもつ。

定義

ISO/IEC 9075-11 中の CONSTRAINT METHOD_SPECIFICATIONS_LANGUAGE_CHECK を置き換え

る。

 CONSTRAINT

METHOD_SPECIFICATIONS_LANGUAGE_CHECK

    CHECK ( METHOD_LANGUAGE IN

      ( 'SQL', 'ADA', 'C', 'COBOL',

      'FORTRAN', 'MUMPS', 'PASCAL','PLI', 'JAVA' ) )

ISO/IEC 9075-11 中に二つの列及び三つの制約を追加する。

】METHOD_SPECIFICATIONS 実表の<表要

素リスト>に次の<表要素>を追加する。

 EXTERNAL_NAME

INFORMATION_SCHEMA.CHARACTER_DATA,

 IS_FIELD

INFORMATION_SCHEMA.CHARACTER_DATA

 CONSTRAINT

METHOD_SPECIFICATIONS_IS_FIELD_CHECK

    CHECK ( IS_FIELD IN ( 'YES', 'NO' ) ),

 CONSTRAINT

METHOD_SPECIFICATIONS_METHOD_COMBINATIONS

    CHECK ( ( ( METHOD_LANGUAGE = 'JAVA' )

   AND

      ( EXTERNAL_NAME, IS_FIELD ) IS NOT NULL )

   OR

      ( ( METHOD_LANGUAGE <> 'JAVA' )

   AND

      ( ( EXTERNAL_NAME, IS_FIELD )

      IS NULL ) ) ),

 CONSTRAINT

METHOD_SPECIFICATIONS_FIELD_COMBINATIONS

    CHECK ( IS_FIELD = 'NO' OR IS_STATIC = 'YES' )

記述

1)

【この記述を挿入する。

】場合:

a)

記述されているメソッドが外部 Java ルーチンならば,EXTERNAL_NAME の値は,その外部 Java

データ型に対して<外部 Java メソッド句>中に指定された<Java メソッド及びパラメタ宣言>とす

る。

b)

記述されているメソッドが外部 Java データ型の静的フィールドならば,EXTERNAL_NAME の値

は,そのメソッドの<静的フィールドメソッド指定>中に指定された<修飾される Java フィールド

名>とする。

c)

そうでなければ,EXTERNAL_NAME の値は,ナル値とする。


75

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

2)

【この記述を挿入する。

】場合:

a)

記述されているメソッドが外部 Java データ型の静的フィールドならば,IS_FIELD の値は,'YES'

とする。

b)

記述されているメソッドが外部 Java データ型ならば,IS_FIELD の値は,'NO'とする。

c)

そうでなければ,IS_FIELD の値は,ナル値とする。

14.4  ROUTINE_JAR_USAGE

実表

機能

ROUTINE_JAR_USAGE 実表は,<外部 Java 参照文字列>で JAR に名前を付けた各外部 Java ルーチンに

対して一つの行をもつ。

定義

CREATE TABLE ROUTINE_JAR_USAGE (

 SPECIFIC_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 SPECIFIC_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 SPECIFIC_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 CONSTRAINT

ROUTINE_JAR_USAGE_PRIMARY_KEY

    PRIMARY KEY ( SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME,

      JAR_CATALOG, JAR_SCHEMA, JAR_NAME ),

 CONSTRAINT

JAR_JAR_USAGE_CHECK_REFERENCES_JARS

    CHECK ( JAR_CATALOG NOT IN

   (

SELECT

CATALOG_NAME

   FROM

SCHEMATA

)

   OR

      ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME ) IN

      ( SELECT JAR_CATALOG, JAR_SCHEMA, JAR_NAME

      FROM JARS ) ),

 CONSTRAINT

JAR_JAR_USAGE_FOREIGN_KEY_ROUTINES

    FOREIGN KEY (SPECIFIC_CATALOG, SPECIFIC_SCHEMA, SPECIFIC_NAME )

   REFERENCES

ROUTINES

 )

記述

1) ROUTINE_JAR_USAGE

実表は,<外部 Java 参照文字列>で JAR に名前を付けた各外部 Java ルーチ

ンに対して一つの行をもつ。

2) SPECIFIC_CATALOG

,SPECIFIC_SCHEMA 及び SPECIFIC_NAME の値は,それぞれ,記述されて

いる外部 Java ルーチンの<特定名>の<カタログ名>,<修飾なしスキーマ名>及び<修飾される識別子

>とする。

3) JAR_CATALOG

,JAR_SCHEMA 及び JAR_NAME の値は,それぞれ,外部 Java ルーチンの<外部 Java

参照文字列>中で参照されている JAR の<JAR 名>の<カタログ名>,

<修飾なしスキーマ名>及び<JAR


76

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

識別子>とする。

14.5  ROUTINES

実表

この細分箇条は,

ISO/IEC 9075-11

の“

6.40 ROUTINES

実表”を修正する。

 

機能

ROUTINES 実表は,各 SQL 呼出しルーチンに対して一つの行をもつ。

定義

ISO/IEC 9075-11 中の CONSTRAINT EXTERNAL_LANGUAGE_CHECK を置き換える。】 正し い

EXTERNAL_LANGUAGE 値の<IN 値リスト>に,“, 'JAVA'”を追加する。

記述

追加の記述なし。

 

14.6  TYPE_JAR_USAGE

実表

機能

TYPE_JAR_USAGE 実表は,各外部 Java データ型に対して一つの行をもつ。

定義

CREATE TABLE TYPE_JAR_USAGE (

 USER_DEFINED_TYPE_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 USER_DEFINED_TYPE_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 USER_DEFINED_TYPE_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_CATALOG

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_SCHEMA

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 JAR_NAME

INFORMATION_SCHEMA.SQL_IDENTIFIER,

 CONSTRAINT

TYPE_JAR_USAGE_PRIMARY_KEY

    PRIMARY KEY (USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA,

      USER_DEFINED_TYPE_NAME, JAR_CATALOG, JAR_SCHEMA, JAR_NAME),

 CONSTRAINT

TYPE_JAR_USAGE_CHECK_REFERENCES_JARS

    CHECK ( JAR_CATALOG NOT IN

   (

SELECT

CATALOG_NAME

   FROM

SCHEMATA

)

   OR

      ( JAR_CATALOG, JAR_SCHEMA, JAR_NAME ) IN

      ( SELECT JAR_CATALOG, JAR_SCHEMA, JAR_NAME

      FROM JARS ) ),

 CONSTRAINT

TYPE_JAR_USAGE_FOREIGN_KEY_USER_DEFINED_TYPES

    FOREIGN KEY (USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_SCHEMA,

      USER_DEFINED_TYPE_NAME ) REFERENCES USER_DEFINED_TYPES

 )

記述

1) TYPE_JAR_USAGE

実表は,各外部 Java データ型に対して一つの行をもつ。

2) USER_DEFINED_TYPE_CATALOG

,USER_DEFINED_TYPE_SCHEMA 及び

USER_DEFINED_TYPE_NAME の値は,それぞれ,記述されている外部 Java データ型の<利用者定


77

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

義型名>の<カタログ名>,<修飾なしスキーマ名>及び<修飾される識別子>とする。

3) JAR_CATALOG

,JAR_SCHEMA 及び JAR_NAME の値は,それぞれ,外部 Java データ型の<外部 Java

クラス句>中で参照されている JAR の<JAR 名>の<カタログ名>,<修飾なしスキーマ名>及び<JAR

識別子>とする。

14.7  USAGE_PRIVILEGES

実表

この細分箇条は,

ISO/IEC 9075-11

の“

6.60 USAGE_PRIVILEGES

実表”を修正する。

 

機能

USAGE_PRIVILEGES 実表は,各 USAGE 権限記述子に対して一つの行をもつ。それは,USAGE 権限記

述子の表現を実効的に含む。

定義

ISO/IEC 9075-11 中の CONSTRAINT USAGE_PRIVILEGES_OBJECT_TYPE_CHECK を置き換える。

正しい OBJECT_TYPE 値の<IN 値リスト>に,

“, 'JAR'”を追加する。

ISO/IEC 9075-11 中の CONSTRAINT USAGE_PRIVILEGES_CHECK_REFERENCES_OBJECT を置き換

える。

】<IN 述語>中に含まれる<問合せ式>の最後に次の指定を追加する。

  UNION

      SELECT JAR_CATALOG, JAR_SCHEMA, JAR_NAME, 'JAR'

   FROM

JARS

記述

1)

記述 4)を補う。】

JAR

権限を適用する対象が JAR。

14.8  USER_DEFINED_TYPES

実表

この細分箇条は,

ISO/IEC 9075-11

の“

6.62 USER_DEFINED_TYPES

実表”を修正する。

 

機能

USER_DEFINED_TYPES 実表は,各利用者定義型に対して一つの行をもつ。

定義

ISO/IEC 9075-11 中の USER_DEFINED_TYPES 実表に三つの列を追加する。

ISO/IEC 9075-11 中に CONSTRAINT USER_DEFINED_TYPES_COMBINATIONS を追加する。

USER_DEFINED_TYPES 実表の<表要素リスト>に次の<表要素>を追加する。

 EXTERNAL_NAME

INFORMATION_SCHEMA.CHARACTER_DATA,

 EXTERNAL_LANGUAGE

INFORMATION_SCHEMA.CHARACTER_DATA

  CONSTRAINT

USER_DEFINED_TYPE_EXTERNAL_LANGUAGE_CHECK

      CHECK ( EXTERNAL_LANGUAGE IN ( 'JAVA' ) ),

 JAVA_INTERFACE

INFORMATION_SCHEMA.CHARACTER_DATA

  CONSTRAINT

USER_DEFINED_TYPE_JAVA_INTERFACE_CHECK

      CHECK ( JAVA_INTERFACE IN ( 'SERIALIZABLE', 'SQLDATA' ) ),

 CONSTRAINT

USER_DEFINED_TYPES_COMBINATIONS

    CHECK ( ( ( EXTERNAL_LANGUAGE = 'JAVA' ) AND

      ( EXTERNAL_NAME, JAVA_INTERFACE ) IS NOT NULL )

   OR

      ( ( EXTERNAL_LANGUAGE, EXTERNAL_NAME, JAVA_INTERFACE )


78

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

      IS NULL ) )

ISO/IEC 9075-11 中の CONSTRAINT  USER_DEFINED_TYPES_ORDERING_CATEGORY_CHECK を

補う。

正しい ORDERING_CATEGORY 値の<IN 値リスト>に“, 'COMPARABLE'”を追加する。

記述

1)

記述 7)を補う。】

COMPARABLE

この型の二つの値は,java.lang.Comparable の compareTo( )メソッドで比較してもよ
い。

2)

【この

記述を挿入する。】場合:

a)

記述されている利用者定義型が外部 Java データ型ならば,EXTERNAL_NAME の値は,その外部

Java データ型に対して<外部 Java クラス句>中に指定された<JAR 及びクラス名>とする。

b)

そうでなければ,EXTERNAL_NAME の値は,ナル値とする。

3)

【この

記述を挿入する。】場合:

a)

記述されている利用者定義型が外部 Java データ型ならば,EXTERNAL_LANGUAGE の値は,

'JAVA'とする。

b)

そうでなければ,EXTERNAL_LANGUAGE の値は,ナル値とする。

4)

【この

記述を挿入する。】場合:

a)

記述されている利用者定義型が外部 Java データ型ならば,JAVA_INTERFACE の値は,その外部

Java データ型に対して指定した<インタフェース指定>とする。

b)

そうでなければ,JAVA_INTERFACE の値は,ナル値とする。

15

状態コード

この箇条は,

ISO/IEC 9075-2

の“

23. 

状態コード”を修正する。

 

15.1

受け取られていない Java 例外に対するクラス及びサブクラスの値

Java メソッドの実行が,受け取られていない Java 例外 で完了するときは,次による。

1) Java

メソッド呼出し E.getMessage()の結果を EM とする。

2)  EM

は,SQL 例外と関連付けられるメッセージテキストとする。

3)

場合:

a)

E

のクラスが java.sql.SQLException ならば,Java メソッド呼出し E.getSQLState()の結

果を SS とする。

i)

SS

の長さが 5 以上で,SS の先頭の 2 文字が(

外部ルーチン例外

  (external routine exception)  に

対応する)

“38”で,かつ,3,4 及び 5 番目の文字列が“000”でないならば,

外部ルーチン

例外

に対応する)

“38”を とし,SS の 3,4 及び 5 番目の文字列を SC とする。

ii)

そうでなければ,

外部ルーチン呼出し例外

  (external routine invocation exception)  に対応する)

“39”を とし,(

不正な

SQLSTATE

が戻された

  (invalid SQLSTATE returned)  に対応する)

“001”を SC とする。

b)  E

のクラスが java.sql.SQLException でないならば,

外部ルーチン例外

に対応する)

“38”

を とし,

サブクラスなし

  (no subclass)  に対応する)“000”を SC とする。

4)  C

及び SC は,SQL 例外に対する SQLSTATE のクラス及びサブクラスとする。


79

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

15.2  SQLSTATE

この細分箇条は,

ISO/IEC 9075-2

の“

23.1 SQLSTATE

”を修正する。

 

2

SQLSTATE

のクラス及びサブクラスの値”は,

ISO/IEC 9075-2

32

SQLSTATE

のクラス及びサ

ブクラスの値”を修正する。

 

表 2SQLSTATE のクラス及びサブクラスの値

カテゴリ 

条件 

クラス

部分条件 

サブクラス

ISO/IEC 9075-2

中のすべての

代替手段

 

X

Java DDL

1)

 46

(サブクラスなし)

 

000

URL

が正しくない

 

001

JAR

名が正しくない

 

002

クラスの削除が正しくない

 

003

クラスの置換えが正しくない

 

005

組み込まれていない

JAR

の置換えを試みた

 

00A

組み込まれていない

JAR

の除去を試みた

 

00B

X

Java

実行

1)

 46

(サブクラスなし)

 

000

パス中の

JAR

名が正しくない

 

102

クラス名が解決されていない

 

103

1)

  条件名“Java DDL”及び“Java

実行

”には,ISO/IEC 9075-10 の条件名“OLB-

特有誤り

”と同じクラスコー

ドが与えられる。クラスコードに対する部分条件の値に重複はない。

16

適合性

16.1  SQL/JRT

に対する適合性の主張

ISO/IEC 9075-1

の“8  適合性”の要件に加えて,この規格に対する適合性の主張は,次の適合性を主張

しなければならない。

1)

次の少なくとも一つに対する適合性の主張。

機能 J621“外部 Java ルーチン”

機能 J541“SERIALIZABLE”

機能 J551“SQLDATA”

2)

次の少なくとも一つに対する適合性の主張。

機能 J511“コマンド”

機能 J531“配置”

16.2  SQL/JRT

に対するその他の適合性要件

次の機能のうちの一つに対する適合性への各主張は,

機能 J511“コマンド”若しくは機能 J531“配置”

又はその両方がそれを提供することを述べなければならない。

機能 J621“外部 Java ルーチン”

機能 J622“外部 Java 型”

機能 J561“JAR 権限”

16.3  SQL/JRT

の前提機能の関係


80

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

表 3SQL/JRT の前提機能の関係

機能 ID 

機能名 

前提機能 ID

前提機能名 

J541 SERIALIZABLE

J622

外部 Java 型

J551 SQLDATA

J622

外部 Java 型


81

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 A

参考)

SQL

適合性の要約

この附属書は,

ISO/IEC 9075-2

の“

附属書

A SQL

適合性の要約”を修正する。

 

この附属書の内容は,

機能 ID 及び細分箇条で順序付けて,すべての適合性規則を要約する。

1)

機能 J511“コマンド”に対する規定

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<外

部 Java 型句>を含み,かつ,<記述子ファイル>中に含まれない<利用者定義型定義>を含んでは

ならない。

b)

9.7 <データ型削除文>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<記述子ファイル>中に

含まれない<データ型削除文>を含んではならない。

c)

9.8 <SQL 呼出しルーチン>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,JAVA

を含む<言語名>を含み,かつ,<記述子ファイル>中に含まれない<SQL 呼出しルーチン>を含ん

ではならない。

d)

9.10 <ルーチン削除文>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部

Java ルーチンを識別する<特定ルーチン指示子>を含み,かつ,<記述子ファイル>中に含まれな

い<ルーチン削除文>を含んではならない。

e)

9.11 <利用者定義順序付け定義>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<配置ファイル>中に含

まれない<利用者定義順序付け定義>を含んではならない。

f)

9.12 <利用者定義順序付け削除文>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,外部

Java データ型を識別する<スキーマ解決利用者定義型名>を含み,かつ,<配置ファイル>中に含

まれない<利用者定義順序付け削除文>を含んではならない。

g)

10.1 <GRANT 権限文>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<JAR

名>を直に含む<対象名>を含み,かつ,<記述子ファイル>中に含まれない<GRANT 権限文>を

含んではならない。

h)

10.3 <REVOKE 文>”

i)

【この

適合性規則を挿入する。】機能 J511“コマンド”なしでは,適合する SQL 言語は,<JAR

名>を直に含む<対象名>を含み,かつ,<記述子ファイル>中に含まれない<REVOKE 文>を含ん

ではならない。


82

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

2)

機能 J521“JDBC データ型”に対する規定

a)

9.8 <SQL 呼出しルーチン>”

i)

【この

適合性規則を挿入する。】機能 J521“JDBC データ型”なしでは,適合する SQL 言語は,

いずれかの SQL データ型に対応する Java データ型ではない<Java データ型>を含んではならな

い。

3)

機能 J531“配置”に対する規定

a)

11.1 SQLJ.INSTALL_JAR 手続”

i)

機能 J531“配置”なしでは,適合する SQL 言語は,deploy パラメタに 0 でない値を指定する

SQLJ.INSTALL_JAR 手続の呼出しを含んではならない。

b)

11.3 SQLJ.REMOVE_JAR 手続”

i)

機能 J531“配置”なしでは,適合する SQL 言語は,undeploy パラメタに 0 でない値を指定

する SQLJ.REMOVE_JAR 手続の呼出しを含んではならない。

c)

12.2  配置記述子ファイル”

i)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義型定義>を含む<SQL 文>を含

んではならない。

ii)

機能 J531“配置”なしでは,適合する SQL 言語は,<データ型削除文>を含む<SQL 文>を含ん

ではならない。

iii)

機能 J531“配置”なしでは,適合する SQL 言語は,<SQL 呼出しルーチン>を含む<SQL 文>を

含んではならない。

iv)

機能 J531“配置”なしでは,適合する SQL 言語は,<ルーチン削除文>を含む<SQL 文>を含ん

ではならない。

v)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義順序付け定義>を含む<SQL 文

>を含んではならない。

vi)

機能 J531“配置”なしでは,適合する SQL 言語は,<利用者定義順序付け削除文>を含む<SQL

文>を含んではならない。

vii)

機能 J531“配置”なしでは,適合する SQL 言語は,<GRANT 権限文>を含む<SQL 文>を含ん

ではならない。

viii)

機能 J531“配置”なしでは,適合する SQL 言語は,<REVOKE 文>を含む<SQL 文>を含んでは

ならない。

4)

機能 J541“SERIALIZABLE”に対する規定

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J541“SERIALIZABLE”なしでは,適合する SQL 言語は,

SERIALIZABLE を含む<インタフェース指定>を含んではならない。

5)

機能 J551“SQLDATA”に対する規定

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J551“SQLDATA”なしでは,適合する SQL 言語は,

SQLDATA を含む<インタフェース指定>を含んではならない。

6)

機能 J561“JAR 権限”に対する規定

a)

10.2 <権限>”

i)

【この

適合性規則を挿入する。】機能 J561“JAR 権限”なしでは,適合する SQL 言語は,<JAR


83

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

名>を直に含む<対象名>を含んではならない。

7)

機能 J571“NEW 指定”に対する規定

a)

6.2 <NEW 指定>”

i)

【この

適合性規則を挿入する。】機能 J571“NEW 演算子”なしでは,適合する SQL 言語は,

<NEW 指定>中に直に含まれる<ルーチン呼出し>中に直に含まれる<ルーチン名>RN の暗に想

定されるか又は陽に指定される<スキーマ名>によって識別されるスキーマが,利用者定義型名

が RN であり,型が外部 Java データ型である利用者定義型を含む<NEW 指定>を含んではなら

ない。

8)

機能 J581“出力パラメタ”に対する規定

a)

9.8 <SQL 呼出しルーチン>”

i)

【この

適合性規則を挿入する。】機能 J581“出力パラメタ”なしでは,適合する SQL 言語は,

JAVA を含む<言語名>を含み,かつ,OUT 又は INOUT のいずれかを含む<パラメタモード>を

含む<SQL 呼出しルーチン>を含んではならない。

9)

機能 J591“オーバロード”に対する規定

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J591“オーバロード”なしでは,適合する SQL 言語は,

同じ<利用者定義型定義>中の他のいずれかの<メソッド指定>の<メソッド名>と等価である<メ

ソッド名>を含む<メソッド指定>を含んではならない。

10)

機能 J601“SQL-Java パス”に対する規定

a)

8.2 <SQL Java パス>”

i)

機能 J601“SQL-Java パス”なしでは,適合する SQL 言語は,<SQL Java パス>を含んではなら

ない。

b)

11.4 SQLJ.ALTER_JAVA_PATH 手続”

i)

機能 J601“SQL-Java パス”なしでは,適合する SQL 言語は,SQLJ.ALTER_JAVA_PATH 手続

の呼出しを含んではならない。

11)

機能 J611“参照”に対する規定

a)

8.3 <ルーチン呼出し>”

i)

【この

適合性規則を挿入する。】機能 J611“参照”なしでは,適合する SQL 言語は,<参照式>

を含んではならない。

ii)

【この

適合性規則を挿入する。】機能 J611“参照”なしでは,適合する SQL 言語は,<右矢印>

を含んではならない。

12)

機能 J621“外部 Java ルーチン”に対する規定

a)

9.8 <SQL 呼出しルーチン>”

i)

【この

適合性規則を挿入する。】機能 J621“外部 Java ルーチン”なしでは,適合する SQL 言語

は,JAVA を含む<言語名>を含む<SQL 呼出しルーチン>を含んではならない。

b)

9.10 <ルーチン削除文>”

i)

【この

適合性規則を挿入する。】機能 J621“外部 Java ルーチン”なしでは,適合する SQL 言語

は,外部 Java ルーチンを識別する<特定ルーチン指示子>を含む<ルーチン削除文>を含んではな

らない。

13)

機能 J622“外部 Java 型”に対する規定


84

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,<

外部 Java 型句>を含む<利用者定義型定義>を含んではならない。

b)

9.7 <データ型削除文>”

i)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外

部 Java データ型を識別する<スキーマ解決利用者定義型名>を含む<データ型削除文>を含んで

はならない。

c)

9.11 <利用者定義順序付け定義>”

i)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外

部 Java データ型を識別する<スキーマ解決利用者定義型名>を含む<利用者定義順序付け定義>

を含んではならない。

d)

9.12 <利用者定義順序付け削除文>”

i)

【この

適合性規則を挿入する。】機能 J622“外部 Java 型”なしでは,適合する SQL 言語は,外

部 Java データ型を識別する<スキーマ解決利用者定義型名>を含む<利用者定義順序付け削除文

>を含んではならない。

14)

機能 J631“Java 署名”に対する規定

a)

8.1 <Java パラメタ宣言リスト>”

i)

機能 J631“Java 署名”なしでは,適合する SQL 言語は,“8.6 Java ルーチン署名の決定”で決

定される既定の Java メソッド署名と等価でない<Java パラメタ宣言リスト>を含んではならな

い。

15)

機能 J641“静的フィールド”に対する規定

a)

9.4 <利用者定義型定義>”

i)

【この

適合性規則を挿入する。】機能 J641“静的フィールド”なしでは,適合する SQL 言語は,

<静的フィールドメソッド指定>を含んではならない。

16)

機能 J651“SQL/JRT 情報スキーマ”に対する規定

a)

13.2 JARS ビュー”

i)

機能 J651“SQL/JRT 情報スキーマ“なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

JARS を参照してはならない。

b)

13.3 METHOD_SPECIFICATIONS ビュー”

i)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . METHOD_SPECIFICATIONS . EXTERNAL_NAME を参照

してはならない。

ii)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . METHOD_SPECIFICATIONS . IS_FIELD を参照してはなら

ない。

c)

13.6 USER_DEFINED_TYPES ビュー”

i)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_NAME を参照してはならない。

ii)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_LANGUAGE を参照してはならない。


85

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

iii)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . JAVA_INTERFACE を参照してはならない。

d)

13.7  短い名前のビュー”

i)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . METHOD_SPECS . EXTERNAL_NAME を参照してはなら

ない。

ii)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . METHOD_SPECS . IS_FIELD を参照してはならない。

iii)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_NAME を参照してはならない。

iv)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . EXTERNAL_LANGUAGE を参照してはならない。

v)

【この

適合性規則を挿入する。】機能 J651“SQL/JRT 情報スキーマ”なしでは,適合する SQL

言語は,INFORMATION_SCHEMA . UDT_S . JAVA_INTERFACE を参照してはならない。

17)

機能 J652“SQL/JRT USAGE 表”に対する規定

a)

13.1 JAR_JAR_USAGE ビュー”

i)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

JAR_JAR_USAGE.を参照してはならない。

b)

13.4 ROUTINE_JAR_USAGE ビュー”

i)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

ROUTINE_JAR_USAGE を参照してはならない。

c)

13.5 TYPE_JAR_USAGE ビュー”

i)

機能 J652“SQL/JRT USAGE 表”なしでは,適合する SQL 言語は,INFORMATION_SCHEMA .

TYPE_JAR_USAGE を参照してはならない。


86

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 B

参考)

処理系定義要素

この附属書は,

ISO/IEC 9075-2

の“

附属書

B 

処理系定義要素”を修正する。

 

この附属書は,この規格の本体で処理系定義として識別している機能を参照する。

1)

4.8.5 SQL と Java との間のオブジェクトの変換”

a) <

利用者定義型定義>が<インタフェース指定>を指定しないならば,オブジェクト状態変換のため

に,Java インタフェース java.io.Serializable が用いるか,又は Java インタフェース

java.sql.SQLData

が用いるかは,処理系定義とする。

2)

4.10  権限”

a) SQLJ.INSTALL_JAR

,SQLJ.REPLACE_JAR 及び SQLJ.REMOVE_JAR 手続を呼び出すために必要

な権限は,処理系定義とする。

注記 73  これは,スキーマを作成するために必要な処理系定義の権限と類似している。

b) SQL

名によって参照される Java メソッドの呼出しは,SQL ルーチン名に関する通常の EXECUTE

権限によって制御される。SQL 名によって呼び出される Java メソッドを“定義者の権限”で実行

するか又は“呼出し元の権限”で実行するかどうか,すなわち,<SQL 呼出しルーチン>を実行

した利用者の利用者名で実行するか又は現行利用者の利用者名で実行するかどうかは,処理系定

義とする。

3)

4.11.1  配置記述子ファイル”

a)

組込み動作及び除去動作の仕立てのための指定を許す処理系定義の処理系ブロックを提供する。

4)

5.2  名前及び識別子”

a)

提供される文字集合,並びに<パッケージ識別子>,<クラス識別子>,<Java フィールド名>及び

<Java メソッド名>の最大長は,処理系定義とする。

5)

6.2 NEW 指定”

a)

機能 J571“NEW 演算子”が提供されないならば,外部 Java データ型の構成子を呼び出すために

用いる機構は,処理系定義とする。

6)

8.3 <ルーチン呼出し>”

a) <Java

パラメタ宣言リスト>の妥当性確認が処理系定義で<ルーチン呼出し>によって実行される

ならば,

8.6 Java ルーチン署名決定”の

構文規則が,<ルーチン呼出し>,0 のメソッド指定指標,

及び当該ルーチン SR に適用される。

b)

外部 Java ルーチンに対して,宣言型 T

i

の処理系定義のナルでない値を CPV

i

とする。

c) Java

値を SQL 値に変換するための writeObject()に関する当該 Java クラスの実装の実行方法

は,処理系定義とする。

d) Java

値を SQL 値に変換するための writeSQL()に関する当該 Java クラスの実装の実行方法は,

処理系定義とする。

e) SQL

値を Java オブジェクトに変換するための readObject()に関する当該 Java クラスの実装の

実行方法は,処理系定義とする。

f) SQL

値を Java オブジェクトに変換するための readSQL()に関する当該 Java クラスの実装の実行


87

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

方法は,処理系定義とする。

g)

R

が外部 Java ルーチンならば,RS の要素を作成した JDBC コネクションオブジェクトが閉じて

いるならば,その効果は,処理系定義とする。

h)  R

が外部 Java ルーチンならば,RS の要素が現行 SQL システム及び SQL セションへの接続によっ

て戻されたオブジェクトでないならば,その効果は,処理系定義とする。

i)

R

が外部 Java ルーチンならば,の呼出しが JDBC で規定するとおりに更新行数を戻すかどうか

は,処理系定義とする。

7)

9.4 <利用者定義型定義>”

a) <

インタフェース USING 句>が陽に指定されないならば,処理系定義の<インタフェース指定>が

暗に想定される。

b)  UDT

が外部 Java データ型ならば,陽に指定されるか又は暗に想定される<Java パラメタ宣言リス

ト>の妥当性確認が,<利用者定義型定義>によって実行されるか,又は対応する SQL 呼出しメソ

ッドが呼び出されるときに実行されるかは,処理系定義とする。

8)

9.5 <属性定義>”

a) Java

値を SQL 値に変換するための writeObject() に関する当該 Java クラスの実装の実行方法

は,処理系定義とする。

b) Java

値を SQL 値に変換するための writeSQL() に関する当該 Java クラスの実装の実行方法は,

処理系定義とする。

c) SQL

値を Java オブジェクトに変換するための readObject() に関する当該 Java クラスの実装

の実行方法は,処理系定義とする。

d) SQL

値を Java オブジェクトに変換するための readSQL() に関する当該 Java クラスの実装の実

行方法は,処理系定義とする。

9)

9.8 <SQL 呼出しルーチン>”

a) <

最大動的結果集合数>の最大値は,処理系定義とする。

b)  R

が外部 Java ルーチンならば,陽に指定されるか又は暗に想定される<Java パラメタ宣言リスト>

の妥当性確認が,<SQL 呼出しルーチン>によって実行されるか,又はその SQL 呼出しルーチン

が呼び出されるときに実行されるかは,処理系定義とする。

10)

11.1 SQLJ.INSTALL_JAR 手続”

a) CHARACTER

VARYING パラメタの最大長は,処理系定義の整数値とする。

b)  SQLJ.INSTALL_JAR

手続を呼び出すために必要な権限は,処理系定義とする。

c)

SQLJ.INSTALL_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理

系定義の規則に従う。

d)  SQLJ.INSTALL_JAR

の呼出しが例外条件を引き起こすならば,組込み動作に対する効果は,処

理系定義とする。

e)

正しい url パラメタの値は,処理系定義とし,形式が処理系定義である URL を含んでもよい。

url

パラメタの値が処理系定義の制限に適合しないで,正しい JAR を識別しないならば,例外条

件:Java DDL

URL

が正しくない

  (invalid URL)

が引き起こされる。

11)

11.2 SQLJ.REPLACE_JAR 手続”

a) CHARACTER

VARYING パラメタの最大長は,処理系定義の整数値とする。

b) SQLJ.REPLACE_JAR

手続を呼び出すために必要な権限は,処理系定義とする。


88

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

c) SQLJ.REPLACE_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理

系定義の規則に従う。

d)

正しい url パラメタの値は,処理系定義とし,形式が処理系定義である URL を含んでもよい。

url

パラメタの値が処理系定義の制限に適合しないで,正しい JAR を識別しないならば,例外条

件:Java DDL

URL

が正しくない

  (invalid URL)

が引き起こされる。

12)

11.3 SQLJ.REMOVE_JAR 手続”

a) CHARACTER

VARYING パラメタの最大長は,処理系定義の整数値とする。

b) SQLJ.REMOVE_JAR

手続を呼び出すために必要な権限は,処理系定義とする。

c) SQLJ.REMOVE_JAR

手続は,SQL トランザクション内で SQL スキーマ文を実行するための処理

系定義の規則に従う。

d) SQLJ.REMOVE_JAR

の呼出しが例外条件を引き起こすならば,除去動作に対する効果は,処理系

定義とする。

13)

11.4 SQLJ.ALTER_JAVA_PATH 手続”

a) CHARACTER

VARYING パラメタの最大長は,処理系定義の整数値とする。

b) SQLJ.ALTER_JAVA_PATH

手続を呼び出すために必要な権限は,処理系定義とする。

c) SQLJ.ALTER_JAVA_PATH

手続は,SQL トランザクション内で SQL スキーマ文を実行するための

処理系定義の規則に従う。

d)  SQLJ.ALTER_JAVA_PATH

手続の呼出しが例外条件を引き起こすならば,JAR と関連付けられた

パスに対する効果は,処理系定義とする。

14)

12.1.1  パッケージ java.sql”

a)

この規格を実装する SQL システムは,パッケージ java.sql を提供し,それは,JDBC ドライバ,

及びそのパッケージによって必要とされるすべてのクラスとする。この規格を実装する SQL シス

テムが提供する他の Java パッケージについては,処理系定義とする。

b)

この規格を実装する SQL システムでは,パッケージ java.sql は,既定コネクションを提供す

る。java.sql によって提供されるその他のデータ源の URL は,処理系定義とする。

15)

12.2  配置記述子ファイル”

a) <

処理系名>は,処理系定義の SQL 識別子とする。

b) <

組込み動作>(<除去動作>)中に指定されるとき,<処理系ブロック>は,処理系定義の組込み動

作(除去動作)を指定する。

c) <

組込み動作>(<除去動作>)中に含まれる<処理系名>をもつ<処理系ブロック>を組込み動作(除

去動作)として解釈するかどうかは,処理系定義とする。すなわち,処理系は,他の処理系によ

って指定される組込み動作(除去動作)を実行してもよいし,しなくてもよい。


89

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 C 

参考)

処理系依存要素

 

この附属書は,

ISO/IEC 9075-2

の“

附属書

C

処理系依存要素”を修正する。

 

この附属書は,この規格で適合する処理系の動作が処理系依存と陽に述べる箇所を参照する。

1)

3.2.1  組込み手続の規定”

a)

組込み手続を定義する方法は,処理系依存とする。

2)

4.8  利用者定義型”

a) Java

メソッドを実行している間に行われる静的属性への修正の有効範囲及び永続性は,処理系依

存とする。

3)

8.3 <ルーチン呼出し>”

a)

R

が外部 Java ルーチンならば,の実行終了前にクラス変数に加えられた変更の有効範囲及び永

続性は,処理系依存とする。

b)

言語が ADA(それぞれ C,COBOL,FORTRAN,JAVA,M,PASCAL,PLI)を指定し,かつ,P

が標準適合 Ada プログラム(それぞれ C,COBOL,Fortran,Java,M,Pascal,PL/I プログラム)

でないならば,の実行結果は,処理系依存とする。

4)

11.2 SQLJ.REPLACE_JAR 手続”

a)

実 装 が 置 き 換 え ら れ た SQL ル ー チ ン 又 は 構 造 型 を 用 い る 現 在 実 行 中 の SQL 文 に 対 す る

SQLJ.REPLACE_JAR

の効果は,処理系依存とする。

5)

11.3 SQLJ.REMOVE_JAR 手続”

a)

実 装 が 除 去 さ れ た SQL ル ー チ ン 又 は 構 造 型 を 用 い る 現 在 実 行 中 の SQL 文 に 対 す る

SQLJ.REMOVE_JAR

の効果は,処理系依存とする。

6)

11.4 SQLJ.ALTER_JAVA_PATH 手続”

a)

既に準備されたか又は現在実行中の SQL 文に対する SQLJ.ALTER_JAVA_PATH の効果は,処理

系依存とする。


90

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 D 

参考)

SQL

の機能の分類

この附属書は,この規格中で規定している機能の分類を記述する。

表 4“選択機能の機能分類”は,この規格で規定している SQL 言語の機能の分類を含む。

この表では,最初の列は,表の行の位置を素早く示すために用いてもよい項番を含む。その他の点では,

これらの値は,役に立たず,不変ではない。すなわち,これらの値は,JIS X 3005 (ISO/IEC 9075)  規格群

の将来の版において,又は技術訂正票でさえも予告なく変更されることがある。

この表の“機能 ID”列は,表中に含まれる各機能及び各副機能の正式な識別を指定する。

この表の“機能名”列は,機能 ID の値に関連付けられている機能及び副機能の簡潔な記述を含む。

表 4−選択機能の機能分類

機能 ID 

機能名 

1 J511

コマンド

2 J521

JDBC データ型

3 J531

配置

4 J541

SERIALIZABLE

5 J551

SQLDATA

6 J561

JAR 権限

7 J571

NEW 演算子

8 J581

出力パラメタ

9 J591

オーバロード

10 J601

SQL-Java パス

11 J611

参照

12 J621

外部 Java ルーチン

13 J622

外部 Java 型

14 J631

Java 署名

15 J641

静的フィールド

16 J651

SQL/JRT 情報スキーマ

17 J652

SQL/JRT

USAGE 表

表 4“選択機能の機能分類”では,機能の定義は,提供していない。これらの機能の定義は,適合性規

則中にあり,更に,“附属書 A SQL 適合性の要約”中で要約している。


91

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 E

参考)

ルーチン入門

E.1

技術構成要素

この規格は,次の仕様を含む。

−  新しい組込み手続。

・  SQLJ.INSTALL_JAR−SQL システム中に一組の Java クラスをロードする。

・  SQLJ.REPLACE_JAR−SQL システム中の一組の Java クラスを取り替える。

・  SQLJ.REMOVE_JAR−前に組み込まれた一組の Java クラスを削除する。

・  SQLJ.ALTER_JAVA_PATH−Java クラス内の名前解決用のパスを指定する。

−  新しい組込みスキーマ。

SQL/JRT 機能を実装する SQL システムのすべてのカタログ中に存在し,SQL/JRT 機能のすべての

組込み手続を含む SQLJ という名前の組込みスキーマを想定する。

−  次の SQL 文の拡張。

・ CREATE

PROCEDURE/FUNCTION−Java メソッドのための SQL 名を指定する。

・ DROP

PROCEDURE/FUNCTION−Java メソッドの SQL 名を削除する。

・ CREATE

TYPE−Java クラスのための SQL 名を指定する。

・ DROP

TYPE−Java クラスの SQL 名を削除する。

・ GRANT−Java の JAR に関する USAGE 権限を付与する。

・ REVOKE−Java の JAR に関する USAGE 権限を取り消す。

− OUT 及び INOUT パラメタの値を戻すための規約,及び SQL 結果集合を戻すための規約。

−  参照の新しい形式:データ型が Java クラスで定義されている列のフィールド及びメソッドへの修飾

付き参照。

−  情報スキーマ中の追加のビュー及び列。

E.2

概要

この入門は,一連の Java クラスの例を説明し,それらをどのように組み込むことができるかを示し,SQL

環境においてそれらの静的及び公開メソッドを SQL/JRT 機能によってどのように参照することができる

かを説明する。

Java メソッドの例では,次の列をもつ EMPS という名前の SQL 表を仮定する。

− NAME−従業員の名前。

− ID−従業員の識別。

− STATE−従業員の住む州。

− SALES−従業員の売上げの総額。

− JOBCODE−従業員の職務コード。

表の定義は,次のとおりとする。

CREATE TABLE emps (

      name     VARCHAR(50),


92

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

      id       CHARACTER(5),

      state    CHARACTER(20),

      sales    DECIMAL  (6,2),

   jobcode

INTEGER

);

例のクラス及びメソッドは,次のとおりとする。

−  Routines1.region−US の州コードと地域番号とを対応付ける Java メソッド。このメソッドは,

内部で SQL を用いない。

−  Routines1.correctState−state

)コードのつづり方を訂正するための SQL の UPDATE 文

を実行する Java メソッド。古いつづり方及び新しいつづり方は,入力モードのパラメタで指定する。

−  Routines2.bestTwoEmps−売上げが上位 2 位までの従業員を決定し,二人の従業員の行の列を

出力モードのパラメタ値として戻す Java メソッド。このメソッドは,内部で SQL 結果集合を作成

し,処理する。

−  Routines3.orderedEmps−売上げの列によって順序付けられ,選択された従業員の行からなる

SQL 結果集合を作成し,その結果集合をクライアントに戻す。

−  Over1.isOdd 及び Over2.isOdd−オーバーロードの規則を説明するために考案された Java メソ

ッド。

−  Routines4.job1 及び Routines5.job2−職務コードの整数値に対応したデータ列値を戻す Java

メソッド。これらのメソッドは,ナルの引数の扱い方を説明する。

−  Routines6.job3−職務コードの整数値に対応したデータ列値を戻すもう一つの Java メソッド。

このメソッドは,静的 Java 変数の振る舞いを説明する。

特に断りのない限り,SQL を呼び出すメソッドは,JDBC を用いる。メソッドの一つは,JDBC を用い

る版及び SQL/OLB を用いる版の両方で示す。その他は,SQL/OLB のコードでも記述するかもしれない。

すべてのクラスにおいて,import 文,import java.sql.*;  及び java.math.*;  が含まれると仮定

する。

E.3

Java

メソッド region 及び correctStates の例

この箇条は,二つの単純なメソッドをもつ Java クラス Routines1 の例を説明する。

−  int 値の静的メソッド region は,九つの州を三つの地理的な地域に分類し,正しい州に関連付け

られた地域を示す整数値を戻すか,又は正しくない州に対して例外を投げる。このメソッドは,SQL

では関数として呼び出される。

−  void メソッド correctStates は,state 列のつづりの誤りを訂正するために,EMPS 表を更新す

る。このメソッドは,SQL では手続として呼び出される。

public class Routines1 {

 // 関数として呼び出される int メソッド

  public static int region(String s) throws SQLException {

    if (s.equals("MN") || s.equals("VT") || s.equals("NH")) return 1;

      else if (s.equals("FL") || s.equals("GA") || s.equals("AL")) return 2;

      else if (s.equals("CA") || s.equals("AZ") || s.equals("NV")) return 3;

      else throw new SQLException("Invalid state code", "38001");

 }


93

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

 // 格納手続として呼び出される void メソッド

  public static void correctStates (String oldSpelling, String newSpelling)

   throws

SQLException {

    Connection conn = DriverManager.getConnection ("jdbc:default:connection");

    PreparedStatement stmt = conn.prepareStatement

      ("UPDATE emps SET state = ? WHERE state = ?");

    stmt.setString(1,

newSpelling);

  stmt.setString(2,

oldSpelling);

  stmt.executeUpdate();

  stmt.close();

  conn.close();

  return;

 }

}

E.4

region

及び correctStates の SQL への組込み

Routine1

のような Java クラスのソースコードは,通常,一つ以上の Java ファイル(すなわち,ファ

イル拡張子が“java”のファイル)中にある。それらを(javac コンパイルコマンドを用いて,

)コンパイ

ルするとき,結果コードは,一つ以上のクラスファイル(すなわち,ファイル拡張子が“class”のファイ

ル)中に置かれる。クラスファイルの集合は,典型的に,ZIP コード化されたファイルの集まりである Java

JAR にまとめられる。

SQL で Java クラスを用いるためには,SQLJ.INSTALL_JAR 手続を呼び出して,それらを含む JAR を

SQL システムにロードする。SQLJ.INSTALL_JAR 手続は,指定された JAR 中に含まれる Java クラスの

集まりを現行 SQL カタログで利用できるようにするための新しい組込み SQL 手続である。例えば,次の

ように,局所ファイル名が“~/classes/Routines1.jar”である JAR に上述の Routines1 クラスを

集めたと仮定する。

SQLJ.INSTALL_JAR('file:~/classes/Routines1.jar', 'routines1_jar', 0)

−  SQLJ.INSTALL_JAR 手続の最初のパラメタは,

与えられた JAR の URL を指定する文字列である。

このパラメタは,決して大文字に変換されない。

−  SQLJ.INSTALL_JAR 手続の 2 番目のパラメタは,SQL システムでの JAR の名前として用いる文字

列である。JAR 名は,SQL の修飾付きの名前であり,修飾付きの名前に対する SQL 規約に従う。

SQLJ.INSTALL_JAR

手続の 2 番目のパラメタとして指定する JAR 名は,SQL システム内の JAR

を識別する。すなわち,指定する JAR 名は,SQL でだけ用いられ,JAR 自体の内容とは何も関係し

ない。JAR 名は,後述の箇条で記述する次の文脈で用いる。

・  SQLJ.REMOVE_JAR 及び SQLJ.REPLACE_JAR 手続のパラメタとして。

・ SQL の CREATE PROCEDURE/FUNCTION 文中の Java クラス名の修飾子として。

・  拡張された SQL の GRANT 及び REVOKE 文のオペランドとして。

・ SQL の CREATE TYPE 文中の Java クラス名の修飾子として。

JAR 名は,SQL システムから JAR を取得するための後続の機能で用いてもよい。

− JAR は,SQLJ.INSTALL_JAR 及び SQLJ.REMOVE_JAR 手続によって取られる暗に想定される動作


94

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を指定する

配置記述子

  (deployment descriptor)

を含むこともできる。SQLJ.INSTALL_JAR 手続の 3

番目のパラメタは,JAR 中の配置記述子によって指定する動作を SQLJ.INSTALL_JAR 手続に実行さ

せたいか又は実行させたくないかを指定する整数値(それぞれ,0 でない値又は 0 の値で示す)で

ある。配置記述子は,

12.2  配置記述子ファイル”で更に記述している。

INSTALL_JAR 手続の名前は,スキーマ名 SQLJ で修飾される。SQL/JRT 機能のすべての組込み手続は,

その組込みスキーマ中に含まれるよう定義される。SQLJ スキーマは,SQL/JRT 機能を実装する SQL シス

テムの各カタログ中に存在すると仮定される。

SQLJ.INSTALL_JAR

の最初の二つのパラメタは,文字列であり,そのため,それらを定数で指定する

ならば,SQL 区切り識別子に対して用いる 2 重引用符ではなく,引用符を用いる。

SQLJ.INSTALL_JAR

手続の動作は,次のとおりである。

−  最初のパラメタで指定される JAR を取得する。

−  それが含むクラスファイルを抜き出し,それらを現行 SQL スキーマに組み込む。

− JAR 自体の写しを保持し,それを 2 番目のパラメタの値と関連付ける。

−  3 番目のパラメタが 0 でないならば,JAR の配置記述子で指定される動作を実行する。

SQLJ.INSTALL_JAR

手続で JAR を組み込んだ後,次の細分箇条で記述するとおり,その JAR 中に含ま

れるクラスの静的メソッドを CREATE PROCEDURE/FUNCTION 文で参照できる。

E.5

region

及び correctStates に対する SQL 名の定義

SQL で Java メソッドを呼び出す前に,それに対する SQL 名を定義しなければならない。SQL の CREATE

PROCEDURE/FUNCTION 文の新しい選択肢でこれを行う。例を次に示す。

CREATE PROCEDURE correct_states(old CHARACTER(20), new CHARACTER(20))

  MODIFIES SQL DATA

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines1_jar:Routines1.correctStates';

CREATE FUNCTION region_of(state CHARACTER(20)) RETURNS INTEGER

 NO

SQL

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines1_jar:Routines1.region';

CREATE PROCEDURE 文及び CREATE FUNCTION 文は,SQL 名,及び EXTERNAL NAME に続けて指

定される Java メソッドに対する Java メソッド署名を指定する。EXTERNAL NAME に続けて指定されるメ

ソッド名の形式は,SQLJ.INSTALL_JAR 手続中で指定された JAR 名,それに続いて,パッケージ名(が

あるならば,そのパッケージ名)及びクラス名で完全に修飾された Java メソッド名からなる。

correct_states

に対する CREATE PROCEDURE 文は,MODIFIES SQL DATA を指定する。これは,

指定された Java メソッドが(INSERT,UPDATE 又は DELETE 文によって,

)SQL 表のデータを修正する

ことを示す。region_of に対する CREATE FUNCTION 文は,NO SQL を指定する。これは,指定された

Java メソッドが SQL 操作を実行しないことを示す。

指定された Java メソッドが SQL 表のデータを(SELECT 文によって)読むが,SQL データを修正しな

いことを示す READS SQL DATA,及び,指定されたメソッドが SQL 操作を呼び出すが,SQL データを読


95

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

むことも修正することもしないことを示す CONTAINS SQL がほかに指定できる。代替手段 CONTAINS

SQL が既定値である。

通常の SQL 手続及び関数の名前として,CREATE PROCEDURE/FUNCTION 文で定義する SQL 手続及び

関数の名前を用いる。

SELECT name, region_of(state) AS region

FROM emps

WHERE region_of(state) = 3;

CALL correct_states ('GEO', 'GA');

同じ Java メソッドに対して,複数の SQL 名を定義することができる。

CREATE PROCEDURE state_correction(old CHARACTER(20), new CHARACTER(20))

  MODIFIES SQL DATA

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines1_jar:Routines1.correctStates';

CREATE FUNCTION state_region(state CHARACTER(20)) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines1_jar:Routines1.region';

Java メソッドに対する様々な SQL 関数及び手続を等価的に用いることができる。

SELECT name, state_region(state) AS region

FROM emps

WHERE region_of(state) = 2;

CALL state_correction ('ORE', 'OR');

SQL 名は,通常の 3 部名であり,3 部名の最初の二つの部は,CREATE PROCEDURE 文及び CREATE

FUNCTION 文に対して SQL で定義されるとおり省略されている。

CREATE PROCEDURE/FUNCTION 文に対する他の考慮点は,パラメタデータ型の扱い,オーバロード

される名前,及び権限であり,後の細分箇条で議論する。

E.6

出力パラメタをもつ Java メソッド bestTwoEmps

region

及び correctStates メソッドのパラメタは,すべて入力専用のパラメタである。これは,通

常の Java パラメタの規約である。

SQL 手続は,OUT 及び INOUT モードをもつパラメタも提供する。Java 言語は,出力パラメタの概念を

直接もたない。したがって,SQL/JRT は,Java メソッドのパラメタに対する出力値を戻すために配列を用

いる。すなわち,Integer パラメタで呼出し元に値を戻したいならば,そのパラメタの型に Integer の

配列である Integer[ ]を指定する。そのような配列は,ただ一つの要素を含み,メソッドが呼び出され

るときにパラメタの入力値がその要素中に含まれ,

メソッドがその要素の値に望まれた出力値を設定する。


96

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

次の箇条で示すように,Java メソッドの出力パラメタに対して配列を用いることは,Java メソッドにだ

け可視である。そのようなメソッドを SQL 手続として呼び出すとき,パラメタとして通常のスカラデータ

項目を与える。SQL システムは,これらのスカラデータ項目と Java 配列との間の対応付けを暗に実行する。

次の Java メソッドは,Java 中で出力パラメタをコーディングする方法を説明する。このメソッド

bestTwoEmps

は,パラメタ値を超える番号の地域で最高の sales をもつ二人の従業員の name,id,

region

及び sales を戻す。すなわち,最初の八つのパラメタのそれぞれは,OUT パラメタであり,し

たがって,与えられた型の配列として宣言されている。

BestTwoEmps

メソッドの次に示す版は,SQL をアクセスする文に対して,SQL/OLB を用いる。

public class Routines2 {

  public static void bestTwoEmps (

      String[ ] n1, String[ ] id1, int[ ] r1, BigDecimal[ ] s1,

      String[ ] n2, String[ ] id2, int[ ] r2, BigDecimal[ ] s2,

      int regionParm) throws SQLException {

    #sql iterator ByNames (String name, String id, int region, BigDecimal sales);

    n1[0]= "****"; n2[0]= "****"; id1[0]= ""; id2[0]= "";

    r1[0]=0; r2[0]=0; s1[0]= new BigDecimal(0); s2[0]= new BigDecimal(0);

  ByNames

r;

  try

{

      #sql r = {SELECT name, id, region_of(state) AS region, sales

     FROM

emp

     WHERE

region_of(state)

>

:regionParm

      AND

sales

IS

NOT

NULL

     ORDER

BY

sales

DESC};

   if

(r.next())

{

    n1[0]

=

r.name();

    id1[0]

=

r.id();

    r1[0]

=

r.region();

    s1[0]

=

r.sales();

      }

   else

return;

   if

(r.next())

{

    n2[0]

=

r.name();

    id2[0]

=

r.id();

    r2[0]

=

r.region();

    s2[0]

=

r.sales();

      }

   else

return;

    } finally r.close();

 }


97

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

}

上記の Java メソッドは,SQL 操作のために SQL/OLB を用いるので,SQL システムへのコネクションを

陽に獲得する必要がないことに注意を要する。既定によって,SQL/OLB は,ルーチンを呼び出す SQL 文

の文脈中でそのルーチン中に含まれるどの SQL をも実行する。

比較のために,SQL/OLB の代わりに JDBC を用いる BestTwoEmps メソッドの版を次に示す。

public class Routines2 {

  public static void bestTwoEmps (

      String[ ] n1, String[ ] id1, int[ ] r1, BigDecimal[ ] s1,

      String[ ] n2, String[ ] id2, int[ ] r2, BigDecimal[ ] s2,

      int regionParm) throws SQLException {

    n1[0]= "****"; n2[0]= "****"; id1[0]= ""; id2[0]= "";

    r1[0]=0; r2[0]=0; s1[0]= new BigDecimal(0); s2[0]= new BigDecimal(0);

  try

{

      Connection conn = DriverManager.getConnection

     ("jdbc:default:connection");

      java.sql.PreparedStatement stmt = conn.prepareStatement

          ("SELECT name, id, region_of(state) AS region, sales

     FROM

emp

     WHERE

region_of(state)

>

?

      AND

sales

IS

NOT

NULL

     ORDER

BY

sales

DESC");

   stmt.setInt(1,

regionParm)

      ResultSet r = stmt.executeQuery();

   if

(r.next())

{

    n1[0]

=

r.getString("name");

    id1[0]

=

r.getString("id");

    r1[0]

=

r.getInt("region");

    s1[0]

=

r.getBigDecimal("sales");

      }

   elsereturn;

   if

(r.next())

{

    n2[0]

=

r.getString("name");

    id2[0]

=

r.getString("id");

    r2[0]

=

r.getInt("region");

    s2[0]

=

r.getBigDecimal("sales");

      }

   else

return;

    } finally { stmt.close() };

 }


98

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

}

E.7

bestTwoEmps

に対する CREATE PROCEDURE best2

bestTwoEmps

メソッドをもつ Routines2 クラスを含む JAR に対する SQLJ.INSTALL_JAR 手続を呼

び出すことを仮定する。

SQLJ.INSTALL_JAR ('file:~/classes/Routines2.jar', 'routines2_jar', 0)

前で示したように,

SQL で bestTwoEmps のようなメソッドを呼び出すためには,CREATE PROCEDURE

文を用いて,それに対する SQL 名を定義しなければならない。

CREATE PROCEDURE best2 (

    OUT n1 CHARACTER VARYING(50), OUT id1 CHARACTER VARYING(5), OUT r1 INTEGER,

    OUT s1 DECIMAL(6,2),

    OUT n2 CHARACTER VARYING(50), OUT id2 CHARACTER VARYING(5), OUT r2 INTEGER,

    OUT s2 DECIMAL(6,2), region INTEGER)

  READS SQL DATA

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines2_jar:Routines2.bestTwoEmps';

OUT 又は INOUT を指定するパラメタに対して,対応する Java パラメタは,対応するデータ型の配列で

なければならない。

E.8

best2

手続の呼出し

SQL システムで Routines2 クラスを組み込み,best2 に対する CREATE PROCEDURE 文を実行した

後で,OUT パラメタに対する通常の規約を用いて,SQL 格納手続であるかのように bestTwoEmps メソ

ッドを呼び出すことができる。このような呼出しは,埋込み SQL,CLI,ODBC 又は JDBC で書くことが

できる。次は,JDBC を利用した呼出しの例である。

java.sql.CallableStatement stmt = conn.prepareCall(

  "{call

best2(?,?,?,?,?,?,?,?,?)}");

 stmt.registerOutParameter(1,

java.sql.Types.STRING);

 stmt.registerOutParameter(2,

java.sql.Types.STRING);

 stmt.registerOutParameter(3,

java.sql.Types.INTEGER);

 stmt.registerOutParameter(4,

java.sql.Types.DECIMAL);

 stmt.registerOutParameter(5,

java.sql.Types.STRING);

 stmt.registerOutParameter(6,

java.sql.Types.STRING);

 stmt.registerOutParameter(7,

java.sql.Types.INTEGER);

 stmt.registerOutParameter(8,

java.sql.Types.DECIMAL);

 stmt.setInt(9,

3);


99

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

 stmt.executeUpdate();

  String n1 = stmt.getString(1);

  String id1 = stmt.getString(2);

  int r1 = stmt.getInt(3);

  BigDecimal s1 = stmt.getBigDecimal(4);

  String n2 = stmt.getString(5);

  String id2 = stmt.getString(6);

  int r2 = stmt.getInt(7);

  BigDecimal s2 = stmt.getBigDecimal(8);

E.9

結果集合を戻す Java メソッド orderedEmps

SQL 格納手続は,それらの出力として SQL 結果集合を生成することができる。(JDBC 及び SQL で定義

されるとおり,

)SQL 結果集合は,SQL 行の順序付けされた並びである。SQL 結果集合は,通常の関数結

果値として処理されるのではなく,代わりに呼出し元指定の反復子又はカーソルに結合され,結果集合の

行を処理するためにその反復子又はカーソルが引き続いて用いられる。

次の Java メソッド orderedEmps は,SQL 結果集合を生成し,それからクライアントに結果集合を戻

す。orderedEmps メソッドは,bestTwoEmps メソッドと同じ方法で結果集合を内部的に生成すること

に注意を要する。しかし,bestTwoEmps メソッドが bestTwoEmps メソッド自体の中で結果集合を処理

するのに対して,この orderedEmps メソッドは,SQL 結果集合としてクライアントに結果集合を戻す。

クライアントに結果集合を戻す Java メソッドを書くために,Java の ResultSet クラス,又は SQL/OLB

反復子宣言(

“#sql iterator...”

)によって生成されるクラスのいずれかの単一要素の配列である付

加的なパラメタをもつメソッドを指定する。

orderedEmps

手続の次に示す版は,SQL サーバをアクセスする SQL/OLB を用いて,SQL/OLB 反復子

SalesReport

として結果集合を戻す。

// #sql public iterator SalesReport (String name, int region, BigDecimal sales);

  public class Routines3 {

    public static void orderedEmps (int regionParm, SalesReport[ ] rs)

    throws

SQLException {

      #sql rs[0] = { SELECT name, region_of(state) AS region, sales

     FROM

emp

     WHERE

region_of(state)

>

:regionParm

      AND

sales

IS

NOT

NULL

     ORDER

BY

sales

DESC };

   return;

  }

 }

SalesReport

反復子クラスは,Routines3 の公開静的内部クラスであるかもしれない。しかし,上記

の例は,

SalesReport

反復子の公開定義を含む Routines3 と同じパッケージ中で,

SalesReport.sqlj


100

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

と名付けられた“*.sqlj”ファイルの存在を仮定する。すなわち,SalesReport.sqlj は,次を含む。

#sql public iterator SalesReport (String name, int region, BigDecimal sales);

この例では,クラス Routines3 及び反復子 SalesReport の両方が classes と名付けられたパッケ

ージ中で定義されていると仮定する。

比較のために,SQL/OLB の代わりに JDBC を用いて書かれた orderedEmps を次に示す。

public class Routines3 {

  public static void orderedEmps(int regionParm, ResultSet[ ] rs)

   throws

SQLException {

    Connection conn = DriverManager.getConnection ("jdbc:default:connection");

    java.sql.PreparedStatement stmt = conn.prepareStatement

        ("SELECT name, region_of(state) AS region, sales

        FROM emp WHERE region_of(state) > ?

          AND sales IS NOT NULL

    ORDER

BY

sales

DESC");

    stmt.setInt (1, regionParm);

    rs[0] = stmt.executeQuery();

  return;

 }

}

メソッドは,戻される SQL 結果集合を含む Java の ResultSet を参照する ResultSet[]パラメタの最

初の要素を設定する。メソッドは,戻される ResultSet オブジェクト,又は結果集合を生成した Java 文

オブジェクトのいずれも閉じることは

ない

。SQL システムは,それらのオブジェクトの両方を暗に閉じる。

両方のパラメタに対して陽に引数を与えることによって,通常の方法で Java 中で orderedEmps のよう

なメソッドを呼び出すことができる。SQL の方法で処理される結果集合を生成する格納手続として,SQL

でそれを呼び出すこともできる。これがどのようにして行われるかは,次の二つの箇条で説明する。

上記の orderedEmps の例のそれぞれは,単一の結果集合パラメタ rs をもち,そのパラメタで単一の

結果集合だけを戻すことができる。複数の結果集合パラメタを指定することもできる。

9.8  <SQL 呼出し

ルーチン>”を参照。

bestTwoEmps

の前の例と比較して,SQL/OLB 反復子若しくは ResultSet rs[0],又は JDBC の

PreparedStatement である stmt を閉じるための try...finally ブロックがないことに注意を要する。格

納手続から戻される結果集合に対して,それを陽に閉じてはならず,これは,JDBC の場合,結果集合を

生成するために実行される文も陽に閉じてはならないことを意味する。

E.10  orderedEmps

に対する CREATE PROCEDURE rankedEmps

orderedEmps

メソッドをもつ Routines3 クラスを含む JAR に対する SQLJ.INSTALL_JAR 手続を呼

び出すと仮定する。


101

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

SQLJ.INSTALL_JAR( 'file:~/classes/Routines3.jar', 'routines3_jar', 0)

前のメソッドと同様に,SQL 手続として呼び出す前に,orderedEmps メソッドに対する SQL 名を定義

する必要がある。上記のとおり,orderedEmps メソッドを参照する EXTERNAL...LANGUAGE JAVA を指

定する CREATE PROCEDURE 文で行う。次は,上記の orderedEmps メソッドに対する CREATE

PROCEDURE...DYNAMIC RESULT SETS の例である。

CREATE PROCEDURE ranked_emps (region INTEGER)

  READS SQL DATA

  DYNAMIC RESULT SETS 1

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines3_jar:classes.Routines3.orderedEmps';

SQL 結果集合を生成する Java メソッドに対する CREATE PROCEDURE 文は,次の特性をもつ。

−  DYNAMIC RESULT SETS は,手続が一つ以上の結果集合を生成することを示す。DYNAMIC

RESULT SETS で指定される整数は,手続が生成する結果集合の最大数である。実行によってこの数

を超える結果集合が生成されるならば,

警告が発行され,指定された数の結果集合だけが戻される。

− SQL 署名は,呼出し元が陽に与えるパラメタだけを指定する。

−  指定された Java メソッドは,実際には一つ以上の追加の後続するパラメタをもち,そのデータ型は,

java.sql.ResultSet

,又は sqlj.runtime.Result-SetIterator の実装のいずれかの Java

配列でなければならない。

上記の CREATE PROCEDURE 文は,Routines3.orderedEmps の SQL/OLB を基にした版,又は JDBC

を基にした版のいずれかを参照して用いるかもしれない。特定の実装を選ぶ必要があるとき,要求される

Java メソッドの Java メソッド署名を陽に示さなければならない。SQL/OLB を基にした orderedEmps に

対しては,次のとおりである。

CREATE PROCEDURE ranked_emps (region INTEGER)

  READS SQL DATA

  DYNAMIC RESULT SETS 1

  LANGUAGE JAVA PARAMETER STYLE JAVA

 EXTERNAL

NAME

  'routines3_jar:classes.Routines3.orderedEmps(int,

classes.SalesReport[])';

JDBC を基にした orderedEmps に対しては,次のとおりである。

CREATE PROCEDURE ranked_emps (region INTEGER)

  READS SQL DATA

  DYNAMIC RESULT SETS 1

  LANGUAGE JAVA PARAMETER STYLE JAVA

 EXTERNAL

NAME


102

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  'routines3_jar:classes.Routines3.orderedEmps(int,

java.sql.ResultSet[])';

上記の CREATE PROCEDURE ranked_emps 文中でのただ一つの相違点は,戻される動的結果集合の

Java メソッド署名の記述中にある。両方の場合,完全修飾付きクラス名が,それぞれ,SQL/OLB 反復子

(SalesReport が classes と名付けられたパッケージ中にあることを思い出すこと)

及び JDBC 結果集

合に対して与えられる。

次の箇条は,この手続の呼出し例を説明する。

E.11  rankedEmps

手続の呼出し

SQL システム中に Routines3 クラスを組み込み,rankedEmps に対する CREATE PROCEDURE を実

行した後で,SQL 格納手続であるかのように rankedEmps 手続を呼び出すことができる。そのような呼

出しは,SQL 結果集合を処理するための機構を定義するいずれかの機能,すなわち,SQL/CLI,JDBC 及

び SQL/OLB で書かれるかもしれない。次は,JDBC を用いたそのような呼出しの例である。

java.sql.CallableStatement stmt = conn.prepareCall( "{call ranked_emps(?)}");

 stmt.setInt(1,

3);

  ResultSet rs = stmt.executeQuery();

  while (rs.next()) {

    String name = rs.getString(1);

    int region = rs.getInt(2);

    BigDecimal sales = rs.getBigDecimal(3);

    System.out.print("Name = " + name);

    System.out.print("Region = " + region);

    System.out.print("Sales = " + sales);

  System.out.println();

}

ranked_emps

手続の呼出しは,CREATE PROCEDURE 文中で宣言された単一のパラメタだけを与える

ことに注意を要する。SQL システムは,適用可能なパラメタとして,ResultSet の空の配列又は

classes.SalesReport

の空の配列を暗に与えて,Java メソッドを呼び出す。その Java メソッドは,配

列パラメタに出力結果集合又は反復子を代入する。そして,Java メソッドが完了するとき,SQL システム

は,SQL 結果集合としてその出力配列要素中の結果集合又は反復子を戻す。

E.12  Java

メソッド名及び SQL 名のオーバロード

Java メソッドに対して SQL 名を指定する CREATE PROCEDURE/FUNCTION 文を用いるとき,SQL 名を

オーバロードすることができる。すなわち,複数の CREATE PROCEDURE/FUNCTION 文で同じ SQL 名を

指定することができる。そのような SQL のオーバロードの提供が選択機能であることに注意を要する。

次の Java クラス及びメソッドを考える。これらは,オーバロードを説明するためだけの意図で考案され

たルーチンであり,ルーチン本体は示していない。


103

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

public class Over1 {

  public static int isOdd (int i) {...};

  public static int isOdd (float f) {...};

  public static int testOdd (double d) {...};

}

public class Over2 {

  public static int isOdd (java.sql.Timestamp t) {...};

  public static int oddDateTime (java.sql.Date d) {...};

  public static int oddDateTime (java.sql.Time t) {...};

}

isOdd

メソッド名は,Over1 クラス中でオーバロードされ,oddDateTime メソッド名は,Over2 ク

ラス中でオーバロードされることに注意を要する。

上記のクラスは,組み込まれた JAR ~/classes/Over.jar 中にあると仮定する。

SQLJ.INSTALL_JAR ('file:~/classes/Over.jar', 'over_jar', 0)

SQL でこれらのメソッドを参照するためには,もちろん,CREATE FUNCTION 文でそれらに対して SQL

名を指定する必要がある。これらの CREATE FUNCTION 文は,オーバロードされる SQL 名を指定するこ

とができる。SQL 名のオーバロードは,Java 名でのオーバロードとは完全に独立している。これは,次で

説明する。

複数の CREATE PROCEDURE/FUNCTION 文で同じ Java メソッドを指定することができることを思い出

す。

CREATE FUNCTION odd (INTEGER) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd';

CREATE FUNCTION odd (REAL) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd';

CREATE FUNCTION odd (DOUBLE PRECISION) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.testOdd';

CREATE FUNCTION odd (TIMESTAMP) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over2.isOdd';

CREATE FUNCTION odd (DATE) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over2.oddDateTime';

CREATE FUNCTION odd (TIME) RETURNS INTEGER


104

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over2.oddDateTime';

CREATE FUNCTION is_odd (INTEGER) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd';

CREATE FUNCTION test_odd (REAL) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd';

これらの CREATE FUNCTION 文の次の特性に注意を要する。

− SQL 名 odd は,Over1 の二つの isOdd メソッド及び testOdd メソッドに対して定義され,Over2

の isOdd メソッド及び二つの oddDateTime メソッドに対しても定義されている。すなわち,SQL

名 odd は,オーバロードされる Java 名とオーバロードされない Java 名とに

及ぶ

  (span)

− SQL 名 is_odd 及び test_odd は,Over1 の二つの isOdd メソッドでに対して定義されている。

すなわち,それらの二つの異なる SQL 名は,同じ Java 名に対して定義されている。

オーバロードを制御する規則は,ISO/IEC 9075-2 の“11.50 <SQL 呼出しルーチン>”及び“10.4 <ルーチ

ン呼出し>”で規定しているとおりの SQL 言語の規則である。これは,次の規則を含む。

−  どのようなパラメタの組合せがオーバロードできるかを制御する規則。すなわち,次の CREATE 文

の正当性(又は不当性)は,SQL 言語の規則によって決定される。

      CREATE FUNCTION is_odd (INTEGER) RETURNS INTEGER...

      CREATE FUNCTION is_odd (SMALLINT) RETURNS INTEGER...

      CREATE PROCEDURE is_odd (SMALLINT) ...

−  オーバロードされる SQL 名を用いた呼出しの解決を制御する規則。すなわち,あるデータ項目“x”

に対して“odd(x)”によって呼び出される Java メソッドの決定は,SQL 言語の規則によって決定

される。

上記の CREATE FUNCTION 文の EXTERNAL NAME では,Java メソッドの JAR 名及びメソッド名だけ

を指定する。例えば,次のとおりである。

CREATE FUNCTION odd (INTEGER) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd';

EXTERNAL NAME でメソッドの Java メソッド署名(すなわち,パラメタデータ型のリスト)を含める

こともできる。例えば,次のとおりである。

CREATE FUNCTION odd (INTEGER) RETURNS INTEGER

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'over_jar:Over1.isOdd (int)';


105

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

この細分箇条の前の方で示した八つの例の CREATE FUNCTION 文のグループは,Java メソッド署名を

必要とはしないが,明確化のために含めることができる。

E.14 CREATE 文での Java メソッド署名”は,

Java メソッド署名が必要とされる場合を記述する。

E.13  Java

の main メソッド

[Java]

は,main と名付けられたメソッドに関して特別の要求をしていない。しかし,JVM は,クラス

名だけが与えられたときに呼び出すメソッドとして,次の Java メソッド署名をもつ main と名付けられた

メソッドを認識する。

public static void main (String[ ]);

SQL の CREATE PROCEDURE...EXTERNAL 文中で main と名付けられた Java メソッドを指定するなら

ば,その Java メソッドは,上記の Java メソッド署名をもたなければならない。SQL 手続の署名は,次の

いずれかであってもよい。

− CHARACTER 又は CHARACTER VARYING の配列である単一のパラメタ。その配列は,String 配列

パラメタとして Java メソッドに渡される。

注記  この SQL メソッド署名は,SQL で配列データ型を提供する SQL システムだけで用いるこ

とができる。

−  それぞれが CHARACTER 又は CHARACTER VARYING である 0 個以上のパラメタ。それらの 

パラメタは,String の 個の要素の単一の配列として Java メソッドに渡される。

E.14  CREATE

文での Java メソッド署名

整数のパラメタをもち,jobcode 値に対応する職務を示す String を戻す次のメソッド job1 を考える。

public class Routines4 {

 //

関数として呼び出される String メソッド

  public static String job1 (Integer jc) throws SQLException {

    if (jc == 1) return "Admin";

    else if (jc == 2) return "Sales";

    else if (jc == 3) return "Clerk";

    else if (jc == null) return null;

    else return "unknown jobcode";

 }

}

後続するメソッドの変形を見越して,メソッド名の末尾に“1”を添えていることに注意を要する。

SQL にこのクラスを組み込むことを仮定する。

SQLJ.INSTALL_JAR ('file:~/classes/Routines4.jar', 'routines4_jar', 0)


106

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

job1

メソッドに対して定義された SQL 関数 job_of1 を指定したいかもしれない。

CREATE FUNCTION job_of1(jc INTEGER) RETURNS CHARACTER VARYING(20)

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines4_jar:Routines4.job1';

しかし,上記のこの CREATE 文は正しくない。Java メソッド job1 のパラメタのデータ型は,Java の

Integer

(java.lang.Integer の略)であり,SQL の job_of1 関数の対応するパラメタに対して SQL

データ型 INTEGER を指定していたことに注意を要する。

しかし,

SQL の CREATE PROCEDURE/FUNCTION

文の外部 Java 形式に対する詳細な規則(

9.8 <SQL 呼出しルーチン>”参照)は,SQL の INTEGER パラメ

タに対する既定の Java パラメタデータ型が,Java の int データ型であり,Java の Integer データ型では

ないことを規定している。

E.15  ナル引数値及び RETURNS NULL 句”で,Java の int ではなく Java の

Integer

をなぜ指定したいのかという理由を記述する。

パラメタのデータ型がそれらの既定の Java 型とは異なる Java 型を含む Java メソッドに対して,SQL の

CREATE PROCEDURE/FUNCTION 文を指定したいならば,CREATE 文の Java メソッド署名中でそれらの

データ型を指定する。この Java メソッド署名は,EXTERNAL NAME に続けて指定する Java メソッド名の

後に書く。例えば,job1 メソッドに対する上記の CREATE 文は,次のように書かれる。

CREATE FUNCTION job_of1(jc INTEGER) RETURNS CHARACTER VARYING(20)

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines4_jar:Routines4.job1(java.lang.Integer)';

DYNAMIC RESULT SETS  を指定する CREATE 文の Java メソッド署名中でデータ型を指定するならば,

その Java メソッド署名中の末尾に暗に想定される結果集合又は反復子のパラメタを含まなければならな

い。しかし,SQL 署名中には,それらの末尾のパラメタを含めない。例えば,

E.10 orderedEmps に対する

CREATE PROCEDURE rankedEmps”の CREATE 文は,次のように書かれる。

CREATE PROCEDURE ranked_emps (region INTEGER)

  READS SQL DATA

  DYNAMIC RESULT SETS 1

  LANGUAGE JAVA PARAMETER STYLE JAVA

 EXTERNAL

NAME

'routines3_jar:Routines3.orderedEmps

(int,

java.sql.ResultSet[

]);

9.8 <SQL 呼出しルーチン>”を参照。

E.15

ナル引数値及び RETURNS NULL 

E.14  CREATE 文での Java メソッド署名”で定義した,Java メソッド job1 及びそれに対応する SQL

関数 job_of1 を考える。

次のような SQL 文中で SQL 関数 job_of1 を呼び出すことができる。


107

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

SELECT name, job_of1(jobcode)

FROM emps

WHERE job_of1(jobcode) <> 'Admin';

EMPS 表の行が JOBCODE 列中にナル値をもつと仮定する。job1 メソッドのパラメタの Java データ型

が Java の Integer(すなわち,Java.lang.Integer)であることに注意を要する。Java の Integer  デ

ータ型は,スカラデータ型ではなくクラスであり,その値は,数値及びナル参照値の両方を含む。データ

型が Java クラスである Java パラメタに SQL のナル値が引数として受け渡されるとき,SQL のナル値は,

Java のナル参照として受け渡される。Routines4.job1 に示されるように,そのようなナル参照は,Java

メソッド内で試験することができる。

さて,Java クラス Integer ではなく,Java スカラデータ型 int をパラメタデータ型に指定する次の同

様のメソッドを考える。

public class Routines5 {

 //

関数として呼び出される String メソッド

  public static String job2 (int jc)

   throws

SQLException {

    if (jc == 1) return "Admin";

    else if (jc == 2) return "Sales";

    else if (jc == 3) return "Clerk";

    else return "unknown jobcode";

 }

}

SQL にこのクラスを組み込むことを仮定する。

SQLJ.INSTALL_JAR( 'file:~/classes/Routines5.jar', 'routines5_jar', 0)

CREATE FUNCTION job_of2 (jc INTEGER) RETURNS CHARACTER VARYING(20)

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines5_jar:Routines5.job2';

次のように SQL 文中で SQL 関数 job_of2 を呼び出すことができる。

SELECT name, job_of2 (jobcode)

FROM emps

WHERE job_of2(jobcode) <> 'Admin';

JOBCODE 列がナルである EMS 表の行に,この SELECT 文が出会うとき,job_of2 関数の呼出しでの

ナ ル 値の 効 果 は , 前の job_of1 関 数 と は 異 なる 。job_of2 関 数 は , パ ラ メ タが ク ラ ス デ ー タ型

java.lang.Integer

ではなく,スカラデータ型 int であるメソッド Routines5.job2 に対して定義


108

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

されている。Java の int データ型(及び Java の他のスカラデータ型)は,ナル参照値をもたず,ナル値

の他の表現をもたない。したがって,job2 メソッドが,SQL のナル値で呼び出されるならば,例外条件

が引き起こされる。

要約すると,次のとおりである。

−  次の Java データ型は,ナル参照値をもち,ナルである SQL 引数を受け入れることができる。

  java.lang.String,

java.math.BigDecimal, byte[], java.sql.Date, java.sql.Time,

    java.sql.Timestamp, java.lang.Double, java.lang.Float, java.lang.Integer,

    java.lang.Short, java.lang.Long, java.lang.Boolean

−  次の Java データ型は,ナルを受け入れることができないスカラデータ型である。そのようなパラメ

タデータ型として渡される引数値がナルならば,例外条件が引き起こされる。

    boolean, byte, short, int, long, float, double

ナル可能でないデータ型である Java パラメタにナル引数を渡そうとするときに引き起こされる例外条

件は,ナル標識変数を指定しなかったホスト変数にナルの列値を FETCH 又は SELECT しようとしたとき

に引き起こされる従来の SQL 例外条件に類似している。両方の場合に,

“受け取る”パラメタ又は変数は,

実際の実行時のナル値を受け入れることができないので,例外条件が引き起こされる。

Java メソッドを特に SQL 中で用いるためにコーディングするとき,ナル可能の Java データ型である Java

パラメタデータ型を指定する傾向がおそらくある。しかし,SQL 中で用いるためにコーディングされたの

ではない Java メソッドで,

(ナル可能でない)スカラ Java データ型である Java パラメタデータ型を指定し

ている Java メソッドを SQL 中でも用いたいかもしれない。

CASE 式中などで条件付きでそれらを呼び出すことによってナル値が発生する文脈中で,そのような関

数を呼び出すことができる。例えば,次のとおりである。

SELECT name,

    CASE

          WHEN jobcode IS NOT NULL THEN job_of2 (jobcode)

     ELSE

NULL

    END

FROM emps

WHERE CASE

          WHEN jobcode IS NOT NULL THEN job_of2 (jobcode)

     ELSE

NULL

    END<>

'Administrator';

CREATE FUNCTION 文中で RETURNS NULL ON NULL INPUT 選択肢を指定することによって,そのよ

うな CASE 式を暗に作ることもできる。

CREATE FUNCTION job_of22 (jc INTEGER) RETURNS CHARACTER VARYING(20)

  RETURNS NULL ON NULL INPUT

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines5_jar:Routines5.job2';


109

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

CREATE FUNCTION 文が RETURN NULL ON NULL INPUT を指定する SQL 関数が呼出されるとき,い

ずれかの引数の実行時の値がナルならば,関数呼出しの結果には,ナルが設定され,その関数自体は,呼

び出されない。

次の SELECT 文は,job_of22 関数を呼び出す。

SELECT name, job_of22(jobcode)

FROM emps

WHERE job_of22(jobcode) <> 'Administrator';

この SELECT は,

前に示した CASE 式内で job_of2 関数を呼び出す SELECT と等価である。

すなわち,

job_of22

のための CREATE FUNCTION 文中の RETURNS NULL ON NULL INPUT は,ナルを試験する

CASE 式を暗に作る。

RETURNS NULL ON NULL INPUT 選択肢は,関数の

すべて

  (all) 

のパラメタに適用され,Java データ型

がナル可能でないパラメタだけに適用されるわけではない。

RETURNS NULL ON NULL INPUT 選択肢が関数に対して定義する規約は,ほとんどの組込み SQL 関数

及び演算子に対して従うのと同じ規約である。すなわち,いずれかのオペランドがナルならば,演算の値

は,ナルである。

RETURNS NULL ON NULL INPUT の代替手段は,CALLED ON NULL INPUT であり,それは,既定であ

る。

上記の job_of2 及び job_of22 によって説明したように,

複数の CREATE FUNCTION 文中で同じ Java

メソッドを指定すること(すなわち,SQL の同義語を定義すること)ができ,これらの CREATE FUNCTION

文は,RETURNS NULL ON NULL INPUT 又は CALLED ON NULL INPUT のいずれかを指定することがで

きる。

(異なる数及び/又は型のパラメタをもつ)job_of22 と名付けられた複数の SQL 関数を作成するなら

ば,CREATE FUNCTION job_of22 文の幾つかでは,CALLED ON NULL INPUT を指定(又は既定として

省略)し,他では,RETURNS NULL ON NULL INPUT を指定することができる。オーバロード解決が行わ

れ,特定の CREATE FUNCTION 文が識別された後に,RETURNS NULL ON NULL INPUT の動作が行われ

る。

RETURNS NULL ON NULL INPUT 及び CALLED ON NULL INPUT は,CREATE FUNCTION 文中でだけ

指定することができる,すなわち,CREATE PROCEDURE 文中では指定することができない。これは,手

続の呼出しには,一般的に有益であろう等価な条件付きの扱い方がないからである。

E.16

静的変数

Java 静的メソッドは,静的変数をもつ Java クラス中に含めることができ,Java では,静的メソッドは,

静的変数を参照することができるし,静的変数に設定をすることもできる。

例えば,次のとおりである。

public class Routines6 {

  static String jobs;

  public static void setJobs (String js) throws SQLException {jobs=js;}


110

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  public static String job3(int jc) throws SQLException {

    if (jc < 1 || jc * 5 > length(jobs)+1) return "Invalid jobcode";

    else return jobs.substring(5*(jc-1), 5*jc);

 }

}

SQL システムにこのクラスを組み込むことを仮定する。

SQLJ.INSTALL_JAR('file:~/classes/Routines6.jar', 'routines6_jar', 0);

クラス Routines6 は,静的変数 jobs をもち,それは,静的メソッド setJobs によって設定され,静

的メソッド job3 によって参照される。静的変数の値を動的に修正する Routines6 のようなクラスは,

Java で明確に定義されており,役に立てることができる。しかし,そのようなクラスが SQL システムに組

み込まれ,メソッド setJobs 及び Job3 が SQL 手続及び関数(<SQL 呼出しルーチン>)として定義され

るとき,静的変数 jobs への代入の有効範囲は,処理系依存である。すなわち,その変数の有効範囲は,

規定されず,おそらく処理系間で(場合によっては,与えられた処理系の公開ごとに)異なる。

例えば,次のとおりである。

CREATE PROCEDURE set_jobs (js CHARACTER VARYING(100))

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines6_jar:Routines6.setJobs';

CREATE FUNCTION job_of3 (jc integer) RETURNS CHARACTER VARYING(20)

  RETURNS NULL ON NULL INPUT

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'routines6_jar:Routines6.job3';

CALL set_jobs ('AdminSalesClerk');

SELECT name, job_of3 (jobcode)

FROM emps

WHERE job_of3(jobcode) <> 'Admin';

これは,SQL で Routines6 クラスを直接用いたように見える。set_jobs の呼出しは,職務コードの

値のリストを指定し,それが SQL 環境によって“キャッシュされ”

,job_of3 の後続の呼出しで用いられ

ると利用者が合理的に考えるかもしれない。しかし,SQL 環境での静的変数 jobs の有効範囲が処理系依

存なので,set_jobs 手続に渡される値に関する次の問いに対する答えは,おそらく処理系間で異なる。

−  set_jobs の値は,現行セションにだけ可視か?又は,並行セション及び最近の並行でないセショ

ンにも可視か?

−  set_jobs の値は,COMMIT をまたがって永続するか?それは,ROLLBACK によって再設定され

るか?

この不確定の含意は,静的変数に代入するクラスを SQL 中で用いないほうがよいことである。しかし,

CREATE PROCEDURE/FUNCTION を実行するとき,又はルーチンを呼び出すときに,そのような代入が


111

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

SQL 処理系によって(必ずしも)検出されないことに注意を要する。

final

特性をもつそれらを宣言することによって,Java で静的変数への代入を防ぐことができる。

E.17  Java

メソッドの SQL 名の削除

Java メソッドに対する SQL 手続名又は関数名を作成した後,通常の SQL の DROP 文でそれらの SQL 名

を削除することができる。

DROP FUNCTION region RESTRICT;

DROP 文は,SQL 名が定義された Java メソッド(又はクラス)に効果を及ぼさない。SQL 手続又は関数

を削除することは,そのルーチンに対して付与されたいずれの権限も暗に取り消す。

E.18  SQL

から Java クラスの削除

SQLJ.REMOVE_JAR 手続で JAR を完全に除去することができる。例えば,次のとおりである。

SQLJ.REMOVE_JAR ('routines_jar', 0);

前もって注意したように,JAR は,

配置記述子

  (deployment descriptor)  を含むことができ,それは,

SQLJ.INSTALL_JAR

及び SQLJ.REMOVE_JAR 手続によってとられる動作を暗に指定する。2 番目のパラ

メタは,JAR 中の配置記述子によって指定される動作を SQLJ.REMOVE_JAR 手続に実行させたいか又は

させたくないかを(それぞれ,0 でない値か又は 0 の値かで示して)指定する整数である。配置記述子は,

12.2  配置記述子ファイル”で更に記述している。

SQLJ.REMOVE_JAR

手続が JAR の配置記述子ファイルによって指定される動作を実行した後に,指定

された JAR 中のクラスのいずれかのメソッドを外部名が参照する SQL 手続又は関数が残っていてはなら

ない。SQLJ.REMOVE_JAR 手続が成功終了する前に,残っているそのようなどの SQL 手続又は関数も,

陽に削除されなければならない。

E.19  SQL

での Java クラスの置換え

SQL 中に Java の JAR を組み込み,例えば,それに含まれているクラスの幾つか又はすべてを訂正又は

改良するために,それらを置き換えたいと仮定する。現在の JAR を除去するために SQLJ.REMOVE_JAR

手続を用いて,その後,新しい版を組み込むために SQLJ.INSTALL_JAR 手続を用いることによって,こ

れを行うことができる。しかし,置き換えたいクラスのメソッドに依存する一つ以上の SQL DDL 文をお

そらく実行していたということになる。すなわち,次の DDL 操作の一つ以上を実行していたかもしれな

い。

−  クラスを参照する CREATE PROCEDURE/FUNCTION 文。

−  それらの SQL 手続及び関数を参照する GRANT 文。

−  そ れ ら の SQL 手 続 及 び 関 数 を 呼 び 出 す SQL 手 続 及 び 関 数 の た め の CREATE

PROCEDURE/FUNCTION 文。

−  それらの SQL 手続及び関数を呼び出す SQL ビュー及び表のための CREATE VIEW/TABLE 文。

SQLJ.REMOVE_JAR

手続に対する規則では,JAR が含んでいるクラスを除去する前に,クラスのメソッ


112

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

ドを直接参照するすべての SQL 手続/関数を削除することが必要である。そして,RESTRICT に対する SQL

の規則では,SQL の<ルーチン削除文>で規定しているとおり,手続/関数を削除する前に,手続/関数を呼

び出すすべての SQL オブジェクト(表,ビュー,SQL サーバモジュール,及び本体が SQL で書かれたル

ーチン)を削除する必要がある。

したがって,JAR を置き換えるために SQLJ.REMOVE_JAR 及び SQL.INSTALL_JAR 手続を用いるなら

ば,JAR 中のクラスのメソッドに直接又は間接的に依存する SQL オブジェクトを削除しなければならず,

それらの項目を再作成しなければならない。

SQLJ.REPLACE_JAR

手続は,適当な有効性検査とともに瞬時に

除去

  (remove) 

及び

組込み

  (install) 

実行することによって,この要件を回避する。したがって,依存している SQL オブジェクトを最初に削除

することなく SQLJ.REPLACE_JAR 手続を呼び出すことができる。

例えば,

E.4  region 及び correctStates の SQL への組込み”では,次の文で Routines1 のクラスを組み

込んだ。

SQLJ.INSTALL_JAR( 'file:~/classes/Routines1.jar', 'routines1_jar', 0)

この JAR を次のような文で置き換えることができる。

SQLJ.REPLACE_JAR( 'file:~/revised_classes/Routines1.jar', 'routines1_jar')

JAR 名が同じでなければならないことに注意を要する。それは,現存する JAR を識別し,置換え後の JAR

を引き続き識別する。置換え後の JAR の URL は,元の JAR の URL と同じでもよいし異なっていてもよ

い。

一般的な場合には,新しい JAR 中にはない古い JAR 中のクラス,両方の JAR 中にあるクラス,及び新

しい JAR 中にあり古い JAR 中にないクラスがある。これらは,それぞれ,一致しない古いクラス,一致

する古い/新しいクラス,及び一致しない新しいクラスとして参照する。

置換え後の JAR に関する妥当性の要件は,次のとおりである。

−  (すべての一致しない古いクラスは,取り除かれるので,

)一致しない古いクラスのいずれかのメソ

ッドを参照する<外部 Java 参照文字列>をルーチン記述子の<外部ルーチン名>が指定した SQL 手続

又は関数があってはならない。

−  一致するクラスのメソッドを参照するどの CREATE PROCEDURE/FUNCTION 文も,新しいクラス

に対して正しい文でなければならない。

−  記述子の<JAR 及びクラス名>がいずれかの一致しない古いクラスを参照する SQL 利用者定義型が

あってはならない。

−  一致するクラスのメソッドを参照するどの CREATE TYPE 文も,新しいクラスに対して正しい文で

なければならない。

これらの要件を満たすならば,SQLJ.REPLACE_JAR 手続は,

(一致しないクラス及び一致するクラスの

両方の)

古いクラスを削除し,

(一致しないクラス及び一致するクラスの両方の)

新しいクラスを組み込む。

E.20

可視性

SQLJ.INSTALL_JAR

手続は,SQL システムに任意の Java クラスを組み込む。しかし,すべてのクラス


113

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

のすべてのメソッドを SQL 中で参照することができるわけではない。

可視

  (visible) 

のクラスの

可視

 

のメ

ソッドだけを SQL 中で参照することができる。可視のクラス及びメソッドの考えは,

対応付け可能

 

(mappable)  なデータ型の概念を基にしている。

対応付け可能

 

及び

可視

 

の詳細な定義は,

4.5  パラメタ対

応付け”で規定している。それらは,次のように要約される。

− Java データ型が SQL に

対応付け可能

 

(及びその逆)とは,それが対応する SQL データ型をもつか,

それが OUT パラメタに対して用いられる配列であるか,又はそれが結果集合に対して用いられる

配列であることと同値である。

− Java メソッドが(SQL に)

対応付け可能

 

とは,各パラメタのデータ型が対応付け可能で,かつ,

結果型が対応付け可能なデータ型か又は void かのいずれかであることと同値である。

Java メソッドが SQL 中で

可視

 

とは,それが public で,static で,かつ,対応付け可能であること

と同値である。

組み込まれた可視のメソッドだけを SQL 中で参照することができる。他のメソッドは,SQL 中には単

純に存在しない。それらを参照しようとすると,

名前が知られていない

  (unknown name) 

のような処理系

定義の構文誤りを引き起こす。

しかし,可視でないクラス及びメソッドは,可視のメソッドによって用いることができる。

E.21

例外

SQL の 例 外 条 件 は , SQL/JRT 手 続 に 対 し て 定 義 さ れ る 。 例 え ば , SQLJ.INSTALL_JAR 又 は

SQLJ.REPLACE_JAR

(など)の呼出し中に指定される URL 引数が正しくないならば,指定された

SQLSTATE で SQL の例外条件(java.sql.SQLException)が引き起こされる。これらの例外条件は,

手続の定義中で指定され,

15.2  SQLSTATE”で列挙されている。SQL 中の Java メソッドの実行の間に投

げられる Java 例外は,Java 内で受け取ることができ,これがなされるならば,それらの例外は,SQL 処理

に影響を与えない。

SQL から呼び出された Java メソッドが完了するとき,受け取られていないどの Java 例外も,SQL の例

外条件として SQL に返される。

例えば,

E.3 Java メソッド region 及び correctStates の例”では,Java メソッド Routines1.region を

定 義 した 。 そ し て ,“ E.5  region 及 び correctStates に 対 す る SQL 名 の 定 義 ” で は , Java メソ ッ ド

Routines1.region

に対する SQL 関数名 region_of を定義した。

引数値が指定された値の範囲にないならば,Java メソッド Routines1.region は,例外を投げる。

public class routines1 {

  public static int region(String s) throws SQLException {

    if (s.equals ("MN") || s.equals ("VT") || s.equals ("NH")) return 1;

    else if (s.equals ("FL") || s.equals ("GA") || s.equals ("AL")) return 2;

    else if (s.equals ("CA") || s.equals ("AZ") || s.equals ("NV")) return 3;

    else throw new SQLException("Invalid state code", "38001");

 }

}

STATE 列の値が 'TX' である行を EMPS 表が含むと仮定する。したがって,次の SELECT が EMPS のそ


114

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

の行に出会うとき,それは,例外条件を引き起こす。

SELECT name, region_of(state)

FROM emps

WHERE region_of(state) = 1;

正しくないパラメタ( 'TX' )をもつ region_of 関数の呼出しは,'38001'の SQLSTATE で SQL の例外

条件を引き起こす。その例外に関連付けられた SQL のメッセージテキストは,次の文字列である。

'Invalid state code'

メッセージテキスト及び SQLSTATE は,

Java の throw 文中で指定される Java 例外中で指定してもよい。

その例外が SQLSTATE を指定するならば,

その SQLSTATE の最初の 2 文字は,

“38”

でなければならない。

(この要件に違反するならば,その効果は,処理系定義である。

)その例外が SQLSTATE を指定しないな

らば,受け取られていない Java 例外に対する既定の SQL 例外条件が引き起こされる。

15.1  受け取られて

いない Java 例外に対するクラス及びサブクラスの値”を参照。

Java メソッドが SQL 文を実行するとき,SQL 文で引き起こされたどの例外条件も,Java 例外として Java

メソッド中で引き起こされ,その Java 例外は,具体的には,Java の Exception クラスの SQLException

サブクラスである。Java メソッドを呼び出した外側の SQL 文でのそのような SQL 例外条件の効果は,処

理系定義である。可搬性のために,SQL から呼出され,それ自身が SQL 文を実行し,その内側の SQL 文

から SQLException を受け取る Java メソッドは,その SQLException を再び投げなければならない。

E.22

配置記述子

一組の Java クラスを含む JAR を SQL に組み込むとき,SQL 手続及び関数として,それらのクラスの静

的メソッドを呼び出す前に,一つ以上の CREATE PROCEDURE/FUNCTION 文を実行しなければならない。

そして,それらの CREATE PROCEDURE/FUNCTION 文によって作成される SQL 名に対して,様々な

GRANT 文も実行したいかもしれない。JAR を後で除去するとき,対応する DROP PROCEDURE/FUNCTION

文及び REVOKE 文を実行したくなる。

幾つかの SQL システム中に JAR を組み込むことを計画するならば,個々の CREATE,GRANT,DROP

及び REVOKE 文は,そのような各 SQL システムに対してしばしば同じになる。組込み動作及び除去動作

を容易にできる一つの方法は,次のとおりになる。

−  “組込みスクリプト”及び“除去スクリプト”として実行され,そのような動作を次のように実行

する“afterInstall”及び“beforeRemove”と呼ばれるメソッドを提供する。

・  afterInstall メソッド:JAR が組み込まれるときに実行したい CREATE 及び GRANT 文。

・  beforeRemove メ ソ ッ ド :JAR が 除 去 さ れ る と き に 実 行 し た い DROP 及 び REVOKE 文

(afterInstall メソッドの動作の逆)

すなわち,afterInstall 及び beforeRemove メソッドは,要求される CREATE,GRANT,

DROP 及び REVOKE 文に対して SQL を呼び出すために,SQL/OLB 又は JDBC を用いることになる。

−  deploy クラスと呼んでもよいクラス中に afterInstall 及び beforeRemove メソッドを含め,

配布を計画している JAR 中にその deploy クラスを含める。


115

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

− JAR を組み込むために次のことを行うように JAR の受領者に指示する。

・ JAR に対して SQLJ.INSTALL_JAR 手続を呼び出す。

・  after_install のような SQL 名を与えて,afterInstall メソッドに対する CREATE 手続文

を実行する。この“ブートストラップ”動作は,afterInstall メソッド自体の中に含めること

ができないことに注意を要する。

・  after_install 手続を呼び出す。注記:before_remove のような SQL 名を beforeRemove

メソッドに与えるための CREATE PROCEDURE 文を after_install 手続が含むと仮定するこ

とができる。

− JAR を除去するために次のとおりに続けるように JAR の受領者に指示する。

・  before_remove 手続を呼び出す。

・  after_install 及び before_remove 手続を削除する。この動作は,beforeRemove 手続自

体の中に含めることができないことに注意を要する。

・  SQLJ.REMOVE_JAR 手続を呼び出す。

組込み動作及び除去動作のこの容易化は,

幾つかの手動手順をまだ必要としていることに注意を要する。

したがって,SQL/JRT が

配置記述子

  (deployment descriptor) 

と呼ばれる機構を提供し,それを用いて,

SQLJ.INSTALL_JAR

及び SQLJ.REMOVE_JAR 手続によって暗に実行したい SQL 文を指定することがで

きる。

JAR を 組 み 込 む と き , 及 び 除 去 す る と き に , JAR 中 の 配 置 記 述 子 を 解 釈 さ せ た い な ら ば ,

SQLJ.INSTALL_JAR

手続の deploy パラメタに対して 0 でない値を指定し,同様に SQLJ.REMOVE_JAR

手 続 の undeploy パ ラ メ タ に 対 し て も 同 様 に 指 定 す る 。 JAR が 配 置 記 述 子 を 含 む な ら ば ,

SQLJ.INSTALL_JAR

手続は,JAR のクラスを組み込んだ後に,実行する CREATE 及び GRANT 文を決定

するためにその配置記述子を用いる。対応する SQLJ.REMOVE_JAR 手続は,JAR 及びそれのクラスを除

去する前に,実行する DROP 及び REVOKE 文を決定するために配置記述子を用いる。

配置記述子は,JAR が組み込まれるときに実行する SQL の CREATE 及び GRANT 文のリスト,並びに

JAR が取り除かれるときに実行する SQL の DROP 及び REVOKE 文のリストを含むテキストファイルであ

る。

例えば,上記のクラス Routines1,Routines2 及び Routines3 を単一の JAR 中に一体化させたと仮

定する。次は,その JAR 中に含めたいかもしれない配置記述子の候補である。

注記:

−  配置記述子ファイル内で,CREATE 文の EXTERNAL NAME でプレースホルダの JAR 名として JAR

名“thisjar”を用いる。

−  この例中の様々な利用者名は,もちろん仮定である。

SQLActions[ ] = {

 "BEGIN

INSTALL

    CREATE PROCEDURE correct_states (old CHARACTER(20), new CHARACTER(20))

   MODIFIES

SQL

DATA

      LANGUAGE JAVA PARAMETER STYLE JAVA

   EXTERNAL

NAME

'thisjar:Routines1.correctStates';

    GRANT EXECUTE ON correct_states TO Baker;


116

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

    CREATE FUNCTION region_of(state CHARACTER(20)) RETURNS INTEGER

   NO

SQL

      LANGUAGE JAVA PARAMETER STYLE JAVA

   EXTERNAL

NAME

'thisjar:Routines1.region';

    GRANT EXECUTE ON region_of TO PUBLIC;

    CREATE PROCEDURE best2 (OUT n1 CHARACTER VARYING(50), OUT id1 CHARACTER(5),

          OUT region1 INTEGER, OUT s1 DECIMAL(6,2),

          OUT n2 CHARACTER VARYING(50), OUT id2 CHARACTER(5),

          OUT region2 INTEGER, OUT s2 DECIMAL(6,2),

     region

INTEGER)

   READS

SQL

DATA

      LANGUAGE JAVA PARAMETER STYLE JAVA

   EXTERNAL

NAME

'thisjar:Routines2.bestTwoEmps';

    GRANT EXECUTE ON best2 TO Baker, Cook, Farmer;

    CREATE PROCEDURE ordered_emps (region INTEGER)

   READS

SQL

DATA

   DYNAMIC

RESULT

SETS 1

      LANGUAGE JAVA PARAMETER STYLE JAVA

   EXTERNAL

NAME

'thisjar:Routines3.rankedEmps';

    GRANT EXECUTE ON ordered_emps TO PUBLIC;

 END

INSTALL",

 "BEGIN

REMOVE

    REVOKE EXECUTE ON correct_states FROM Baker RESTRICT;

    DROP PROCEDURE correct_states RESTRICT;

    REVOKE EXECUTE ON region_of FROM PUBLIC RESTRICT;

    DROP FUNCTION region_of RESTRICT;

    REVOKE EXECUTE ON best2 FROM Baker, Cook, Farmer RESTRICT;

    DROP PROCEDURE best2 RESTRICT;

    REVOKE EXECUTE ON ordered_emps FROM PUBLIC RESTRICT;

    DROP PROCEDURE ordered_emps RESTRICT;

 END

REMOVE"

}

deploy_routines.txt

が上記の配置記述子を含んでいるテキストファイルの名前であると仮定する。

次のものを含んでいる JAR を組み立てることになる。

−  テキストファイル deploy_routines.txt

−  Routines1,Routines2 及び Routines3 のためのクラスファイル

−  次のマニフェスト項目を含むマニフェストファイル

   Name:

deploy_routines.txt


117

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

   SQLJDeploymentDescriptor:

TRUE

SQLJ.INSTALL_JAR

及び SQLJ.REMOVE_JAR 手続を解釈するために,このマニフェスト項目は,JAR

中の配置記述子としてファイル deploy_routines.txt を識別する。

配置記述子ファイルは,構文誤りを含んでもよい。一般に,CREATE 又は GRANT 文中で起こり得るい

ずれの誤りも,配置記述子ファイル中で発生してもよい。

配置動作を実行しないで,配置ファイルを含む JAR を組み込みたいかもしれない。例えば,それらの動

作は,構文誤りを含むかもしれないし,ある SQL システムに対しては全く不適当であるかもしれない。

SQL.INSTALL_JAR

手続の deploy パラメタ,及び SQLJ.REMOVE_JAR 手続の undeploy パラメタに対

して,0 の値を指定することによって,これを行うことができる。

E.23

パス

前の箇条では,JAR 及びそれらの Java クラスの例は,パッケージ java.lang 及び java.sql 中の他の

Java クラスを参照した。組み込む JAR 及びそれらの Java クラスは,組み込んだ又は組み込むであろう他

の JAR 中の Java クラスも参照することができる。例えば,運営,プロジェクト管理及び資産管理に関す

る Java クラスを含む三つ JAR をもつと仮定する。

SQLJ.INSTALL_JAR ('file:~/classes/admin.jar', 'admin_jar', 0);

この時点で,admin_jar 中のクラスのメソッドを参照する CREATE PROCEDURE/FUNCTION 文を実行

することができる。そして,それらの手続及び関数を呼び出すことができる。実行時に,admin_jar の

Java メソッドが admin_jar 中に含まれるシステムクラス又は他の Java クラスを参照するならば,それら

の参照は,暗に解決される。admin_jar メソッドが(下記で組み込む)property_jar 中に含まれる Java

クラスを参照するならば,解決されていないクラス参照に対する例外条件が引き起こされることになる。

SQLJ.INSTALL_JAR ('file:~/classes/property.jar', 'property_jar', 0);

SQLJ.INSTALL_JAR ('file:~/classes/project.jar', 'project_jar', 0);

SQLJ.INSTALL_JAR

のこれらの呼出しは,property_jar 及び project_jar を組み込む。しかし,

admin_jar

中のクラスによる property_jar クラスの参照は,まだ解決されていない。同様に,

property_jar

内からの project_jar 中のクラスの参照も,解決されておらず,逆もまた同様である。

要約すると,次のとおりである。

− JAR を組み込むとき,その JAR のクラス内からのシステムクラスの参照,又は同じ JAR 中に含ま

れるクラスの参照は,暗に解決される。

−  他のどのクラスの参照も,組み込まれたかどうかにかかわらず,解決されない。

−  解決されていないクラス参照をもつ JAR を組み込むことができ,それらのクラスのメソッドに対す

る SQL ルーチンを定義するために,CREATE PROCEDURE/FUNCTION 文を用いることができる。

− Java メソッドに対して定義された SQL ルーチンを呼び出すとき,解決されていないクラス参照に対

する例外は,[Java]によって許されるどの時点で引き起こされてもよい。

解決されていない参照を含むクラスを呼び出すことは,次の点で有用である。

−  部分的に書かれたアプリケーションを用いるため,又は試験するため。


118

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

− SQL 環境中で用いるためには適切でない幾つかのメソッドを含むクラスを用いるため。例えば,他

の Java 動作可能環境中で用いるが,SQL システム内では用いない表示指向又は対話的メソッドをも

つクラス。

他の JAR 中のクラスへの参照を解決するために,SQLJ.ALTER_JAVA_PATH 手続を用いる。

SQLJ.ALTER_JAVA_PATH ('admin_jar', '(property.*,property_jar)

     (project.*,

project_jar)');

SQLJ.ALTER_JAVA_PATH ('property_jar', '(project.*,project_jar)');

SQLJ.ALTER_JAVA_PATH ('project_jar', '(*, property_jar) (*, admin_jar)');

SQLJ.ALTER_JAVA_PATH

手 続 は , 二 つ の 引 数 を も ち , そ れ ら の 両 方 が 文 字 列 で あ る 。 呼 出 し

SQLJ.ALTER_JAVA_PATH(JX, PX)

では,次のとおりである。

− JX は,パスを指定したい JAR の名前である。これは,INSTALL_JAR 手続中で指定した JAR 名で

ある。

− PX は,JX 中に含まれるクラスによって参照される解決されていないクラス名で,解決したいクラ

ス名を含む JAR のパスである。パスの引数は,パス要素の(コンマで区切られてない)リストを含

んでいる文字列である。各パス要素は,括弧で囲まれ(,コンマで区切られ)た組で,その中の最

初の項目は,パターンであり,2 番目の項目は,JAR 名である。

実行時に,JAR JX 中に含まれるクラス C のメソッドが評価されていると仮定する。そして,クラス C

の実行の中で,XC と名付けられた他のクラスの参照に出会い,そのような XC と名付けられたクラスが

JAR JX 中に定義されていないと仮定する。SQLJ.ALTER_JAVA_PATH の呼出しで JAR JX に対して指定し

たパス PX(があるならば,それ)がクラス名 XC の解決を,次のとおり決定する。

−  各パス要素“(PATi, Ji)”が検査される。

− PATi が XC と等価な完全修飾付きクラス名ならば,XC は,JAR Ji 中で定義されていなければなら

ない。そうでないならば,XC の参照は,解決されない。

− PATi が“*”が続くパッケージ名で,かつ,XC がそのパッケージ中のクラスの名前ならば,XC は,

JAR Ji 中で定義されていなければならない。そうでないならば,XC の参照は,解決されない。

− PATi が単一の“*”ならば,XC が JAR Ji 中で定義されているならば,その解決を用いる。そうでな

ければ,後続するパス要素が試験される。

したがって,admin_jar,property_jar 及び project_jar に対して上記で指定したパスは,次の

効果をもつ。

−  admin_jar 内で実行するとき,

property

又は project パッケージ中にあるクラスは,

それぞれ,

property_jar

及び project_jar 中で解決される。

−  property_jar 内で実行するとき,project パッケージ中にあるクラスは,project_jar 中で

解決される。

−  project_jar 内で実行するとき,すべてのクラスは,最初に property_jar 中で,その後

admin_jar

中で解決される。

property_jar

中に含まれるクラス C が admin_jar 中に含まれるクラス AC の参照を直接含むならば,

property_jar

に対するパス中に admin_jar が指定されていないので,その AC の参照が解決されない

ということに注意を要する。しかし,project_jar 中に含まれるクラスのメソッド project.C2.M を


119

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

そ の ク ラ ス C が 呼 び 出 し て , project.C2.M が ク ラ ス AC を 参 照 す る な ら ば , admin_jar が

property_jar

に対するパス中で指定されているので,

その AC の参照は,admin_jar 中で解決される。

すなわち,クラス C を実行している間は,property_jar に対して指定したパスが用いられ,クラス C2

を実行している間は,project_jar に対して指定したパスが用いられる。このように,異なる JAR 中に

含まれるクラスへの実行の移動に従って,そのような各 JAR に対して指定されるパスに現行のパスが変わ

る。言い換えると,JAR J1 に対して指定されたパスは,J1 のクラス内で直接起こるクラス参照にだけ適用

され,J1 のクラスから呼び出される別の JAR 中に含まれるクラス中で起こるクラス参照には適用されない。

SQLJ.ALTER_JAVA_PATH

手続の呼出し中で指定するパスは,指定された JAR の特性になる。与えら

れた JAR は,高々一つのパスをもつ。JAR に対するパス(があるならば,それ)は,JAR 中のクラス及び

メソッドのすべての利用者に適用される。

SQLJ.ALTER_JAVA_PATH

手続を呼び出すとき,指定するパスは,指定された JAR に対する現行パス

(があるならば,その現行パス)を置き換える。現在実行しているクラス及びメソッドに関するこの置換

えの効果は,処理系定義である。

SQLJ.ALTER_JAVA_PATH

手続を実行するとき,実行者は,最初の引数として指定する JAR の所有者

でなければならず,パス引数中で指定する各 JAR に対する USAGE 権限をもっていなければならない。

パス機能は,選択機能である。

E.24

権限

SQL 権限システムは,SQL/JRT のために拡張された。

第 1 に,SQLJ 組込み手続は,SQL スキーマ文とみなされ,呼び出すために処理系定義の権限が必要で

ある。

第 2 に,USAGE 権限が JAR に対して定義される。JAR に対する USAGE 権限は,次のために必要であ

る。

− CREATE

PROCEDURE/FUNCTION/TYPE 文中で参照する。

−  SQLJ.ALTER_JAVA_PATH 手続の呼出しでの SQL-Java パス中でリストする。

JAR を組み込んだ利用者がその JAR の所有者であり,その JAR に対する USAGE を暗にもち,USAGE

権限を他の利用者及び役割に付与することができる。所有者だけが JAR の置換え,除去又は変更が可能で

ある。

JAR に対する USAGE 権限は,選択機能である。

E.25

情報スキーマ

外部 Java ルーチン及び外部 Java データ型を記述するために,情報スキーマに対して追加のビュー及び

列が定義される。

− JARS は,データベース中に組み込まれた JAR を列挙する。

− METHOD_SPECIFICATIONS は,静的フィールドメソッドに関する情報を含むために補われる。

− ROUTINES は,外部 Java ルーチンに関する情報を含む。

− USAGE_PRIVILEGES は,JAR に対して付与された USAGE 権限に関する情報を含む。

− USER_DEFINED_TYPES は,外部 Java データ型に関する情報を含むために補われる。

さらに,ルーチン,型及び他の JAR による JAR の使用は,次の新しい USAGE ビューの集まりで示され

る。


120

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

− JAR_JAR_USAGE は,与えられた JAR の SQL-Java パスで用いる JAR を列挙する。

− ROUTINE_JAR_USAGE は,外部 Java ルーチンで用いる JAR の名前を示す。

− TYPE_JAR_USAGE は,外部 Java データ型で用いる JAR の名前を示す。

これらの情報スキーマビューは,選択機能である。


121

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

附属書 F

参考)

型入門

F.1

概要

この入門の箇条では,Java クラス及びそれらのメソッドの一連の例を示し,SQL システムにどのように

それらを組み込んで,SQL でのデータ型として用いることができるのかを示す。

F.2

Java

クラスの例

この細分箇条では,Java クラス Address 及び Address2Line の例を示す。

−  Address クラスは,USA の街路の住所を表現し,街路の名前及び建物の番地を含む Street フィ

ールド,並びに郵便番号を含む zip フィールドをもつ。

−  Address2Line クラスは,Address クラスのサブクラスであり,アパート番号のようなデータを

含む line2 と名付けられた一つの追加フィールドを加えたものである。

−  Address 及び Address2Line クラスは,両方とも次のメソッドをもつ。

・  既定の零項構成子。

・  パラメタをもつ構成子。

・  住所の文字列表現を戻す toString メソッド。

−  Address 及び Address2Line クラスは,

両方とも Java インタフェース java.io.Serializable

及び java.sql.SQLData を実装するために指定される。

SQL でのデータ型として用いる Java クラスは,Java インタフェース java.io.Serializable 若しく

は Java インタフェース java.sql.SQLData のいずれか,又はその両方を実装しなければならない。これ

は,JVM 間,及び Java と SQL との間でクラスインスタンスを移動させるために必要である。

インポート文 import java.sql.*;及び java.math.*;がすべてのクラスに含まれていたと仮定する。

次は,Address クラスのテキストである。:

public class Address implements java.io.Serializable, java.sql.SQLData {

  public String street;

  public String zip;

  public static int recommendedWidth = 25;

  private String sql_type; // java.sql.SQLData

インタフェースに対して

 //

既定の構成子。

  public Address ( ) {

    street = "Unknown";

    zip = "None";

 }

 //

パラメタをもつ構成子。

  public Address (String S, String Z) {

    street = S;


122

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

    zip = Z;

 }

 //

完全な住所の文字列表現を戻すためのメソッド。

  public String toString( ) {

  return "Street=" + street + " ZIP=" + zip;

 }

 //

先行する空白を取り除くための void メソッド。

 //

これは,静的メソッド Misc.stripLeadingBlanks を用いる。

  public void removeLeadingBlanks( ) {

    street = Misc.stripLeadingBlanks(street);

    zip = Misc.stripLeadingBlanks(zip);

 }

 //

二つの住所が算術的に隣接する地域にあるかどうかを

 //

決定するための静的メソッド。

  public static String contiguous(Address a1, Address a2) {

    if (Integer.parseInt(a1.zip) == Integer.parseInt(a2.zip)+1 ||

    Integer.parseInt(a1.zip)

==

Integer.parseInt(a2.zip)

-1)

   return("yes");

  else

   return("no");

 }

 //

java.sql.SQLData

の実装:

  public void readSQL (SQLInput in, String type)

   throws

SQLException {

    sql_type = type;

    street = in.readString();

    zip = in.readString();

 }

  public void writeSQL (SQLOutput out)

   throws

SQLException {

  out.writeString(street);

  out.writeString(zip);

 }

  public String getSQLTypeName () {

  return

sql_type;

 }

}

次は,Address クラスのサブクラスである Address2Line クラスのテキストである。


123

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

public class Address2Line extends Address

      implements java.io.Serializable, java.sql.SQLData {

  public String line2;

 //

既定の構成子。

  public Address2Line () {

  super()

;

    line2 = " ";

 }

 //

  パラメタをもつ構成子。

  public Address2Line (String S, String L2, String Z) {

    street = S;

    line2 = L2;

    zip = Z;

 }

 //

完全な住所の文字列表現を戻すためのメソッド。

  public String toString() {

    return "Street=" + street +" Line2=" + line2 + " ZIP=" + zip;

 }

  //  先行する空白を取り除くための void メソッド。

 //

  これがインスタンスを修正する重要なメソッドであることに注意を要する。

 //

  これは,次に定義する静的メソッド Misc.stripLeadingBlanks を用いる。

  public void removeLeadingBlanks( ) {

    line2 = Misc.stripLeadingBlanks(line2);

  super.removeLeadingBlanks()

;

 }

 //

java.sql.SQLData

の実装:

  public void readSQL (SQLInput in, String type)

   throws

SQLException {

  super.readSQL(in,type);

    line2 = in.readString();

 }

  public void writeSQL (SQLOutput out)

   throws

SQLException {

  super.writeSQL(out);

  out.writeString(line2);

 }

}

 //

次のクラス及びメソッドは,上記の Java メソッド中で内部的にだけ用いる。

 //

このメソッドに対する SQL 関数を定義しない。

public class Misc {


124

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

 //

String

から先行する空白を取り除く。

  public static String stripLeadingBlanks(String s) {

  int

scan;

    for (scan=0; scan < s.length() ; scan++)

      if ( !java.lang.Character.isSpace(s.charAt(scan)) )

    break;

    if (scan == s.length() ) return"";

    else return s.substring(scan);

 }

}

F.3

SQL

システムへの Address 及び Address2Line の組込み

SQL システム中に Address 及び Address2Line のようなクラスを組み込むためには,“附属書 E  ルー

チン入門”のように進める。クラスのためのソースコードは,ファイル拡張子 java をもつファイル中に

あり,ファイル拡張子 class をもつオブジェクトコードファイルを作成するために,javac コマンドで

それをコンパイルする。その次に,それらの class ファイルをアセンブルしてファイル拡張子 jar をも

つ Java の JAR にし,その JAR をディレクトリ中に格納する。このディレクトリのための URL は,指定す

ることができる。

file:~/classes/AddrJar.jar

がそのような URL であると仮定する。これで,

附属書 E  ルーチン

入門”で述べた SQLJ.INSTALL_JAR 手続を呼び出すことによって,SQL システムにクラスを組み込むこ

とができる。

SQLJ.INSTALL_JAR ('file:~/classes/AddrJar.jar', 'address_classes_jar', 0);

F.4

Address

及び Address2Line に対する CREATE TYPE

Java クラスを SQL データ型として用いる前に,SQL データ型並びにそのフィールド及びメソッドに対

して SQL 名を定義しなければならない。SQL の CREATE TYPE 文の拡張形式でこれを行う。

この規格の処理系は,独立した SQL 文として,又は配置記述子ファイル中で,陽に CREATE TYPE 文の

これらの拡張形式を提供するかもしれないし,CREATE TYPE 文と同じ効果をもたらす処理系定義の機構

を提供するかもしれない。配置記述子ファイルは,JAR 中に含まれ,

(0 でない 3 番目のパラメタで)配置

動作を指定する組込み SQL/JRT 手続 SQLJ.INSTALL_JAR の呼出しの間に暗に実行される。これは,

E.22

配置記述子”で記述している。この附属書では,独立した SQL 文としての CREATE TYPE 文を示す。

次の SQL の CREATE TYPE 文は,上記の Java の Address 及び Address2Line クラスを参照する。

CREATE TYPE addr EXTERNAL NAME 'address_classes_jar:Address'

  LANGUAGE

JAVA

  AS

(

  street_attr CHARACTER VARYING(50) EXTERNAL NAME 'street',

  zip_attr CHARACTER(10) EXTERNAL NAME 'zip' )

  STATIC METHOD rec_width ()


125

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  RETURNS

INTEGER

    EXTERNAL VARIABLE NAME 'recommendedWidth',

  CONSTRUCTOR METHOD addr ()

    RETURNS addr SELF AS RESULT

    EXTERNAL NAME 'Address',

  CONSTRUCTOR METHOD addr (s_parm CHARACTER VARYING(50),

      z_parm

CHARACTER(10))

    RETURNS addr SELF AS RESULT

    EXTERNAL NAME 'Address',

  METHOD to_string ()

    RETURNS CHARACTER VARYING(255)

    EXTERNAL NAME 'toString',

  METHOD remove_leading_blanks ()

    RETURNS addr SELF AS RESULT

    EXTERNAL NAME 'removeLeadingBlanks',

  STATIC METHOD contiguous (A1 addr, A2 addr)

  RETURNS

CHARACTER(3)

    EXTERNAL NAME 'contiguous';

CREATE TYPE addr_2_line

  UNDER

addr

    EXTERNAL NAME 'address_classes_jar:Address2Line'

  LANGUAGE

JAVA

  AS

(

  line2_attr CHARACTER VARYING (100) EXTERNAL NAME 'line2' )

  CONSTRUCTOR METHOD addr_2_line ()

    RETURNS addr_2_line SELF AS RESULT

    EXTERNAL NAME 'Address2Line',

  CONSTRUCTOR METHOD addr_2_line (s_parm CHARACTER VARYING(50),

      s2_parm

CHARACTER(100),

      z_parm

CHARACTER(10))

    RETURNS addr_2_line SELF AS RESULT

    EXTERNAL NAME 'Address2Line',

  METHOD strip ()

    RETURNS addr_2_line SELF AS RESULT

    EXTERNAL NAME 'removeLeadingBlanks';

これらの CREATE TYPE 文は,SQL の CREATE TYPE 文の拡張である。上記の拡張は,SQL の CREATE

PROCEDURE/FUNCTION 文の EXTERNAL の後に続くパターンをもつ部分,及び METHODS の後に続く

パターンをもつ部分を追加している。

この附属書では,これらの CREATE TYPE 文の基本的な要素を述べて,次のあまり直観的でない記述項


126

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

目については,後の箇条で議論する。

−  Address クラスの Java 静的フィールド recommendedWidth は,SQL の CREATE TYPE 中で,

rec_width

と名付けられた,引数をもたない静的メソッドによって表現されている。これは,

F.15

静的フィールド”で記述している。

−  Address クラスの Java  void メソッド removeLeadingBlanks は,addr 型のための SQL の

CREATE TYPE 中で,RETURNS SELF AS RESULT を指定するメソッド remove_leading_blanks

によって表現されている。Address2Line クラスの removeLeadingBlanks 及び strip メソッ

ドも同様に扱われている。これは,

F.16  インスタンス更新メソッド”で記述している。strip メ

ソッドは,複数の SQL メソッドが単一の Java メソッドを参照できることを説明するために含めて

いる。

− CREATE

TYPE 文の他の部分は,Java クラスの署名の直接の書換えである。

CREATE TYPE に続く EXTERNAL は,組み込まれた JAR 中で識別される Java クラスを参照しなければ

ならない。これは,

当該

Java

クラス

  (subject Java class)  として参照され,SQL データ型は,

当該

SQL

ータ型

  (subject SQL data type)  である。

METHOD に続く EXTERNAL の部分が Java 構成メソッド(すなわち,名前がクラス名と同じで,陽に

指定された戻り型がないメソッド)を参照するならば,SQL メソッド名は,SQL データ型名と同じでなけ

ればならない。すなわち,構成関数の呼出しのための同じ規約が Java 中と同じように SQL 中でも用いら

れる。

Java クラスに対して定義された addr 及び addr_2_line のような SQL データ型は,

外部

Java

データ

  (external Java data type)  として参照される。

F.5

単一の Java クラスに対する複数の SQL 

与えられた Java クラスに対して,二つ以上の SQL データ型を定義することができる。例えば,次のと

おりである。

CREATE TYPE another_addr

    EXTERNAL NAME 'address_classes_jar:Address'

  LANGUAGE

JAVA

  AS

(

  zip_part CHARACTER(10) EXTERNAL NAME 'zip',

  street_part CHARACTER VARYING(50) EXTERNAL NAME 'street')

  STATIC METHOD rec_width_part () RETURNS INTEGER

    EXTERNAL VARIABLE NAME 'recommendedWidth',

  CONSTRUCTOR METHOD another_addr ()

    RETURNS another_addr SELF AS RESULT

    EXTERNAL NAME 'Address',

  CONSTRUCTOR METHOD another_addr (s_parm CHARACTER VARYING(50),

      z_parm

CHARACTER(10))

    RETURNS another_addr SELF AS RESULT

    EXTERNAL NAME 'Address',


127

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  METHOD string_rep ()

    RETURNS CHARACTER VARYING(255)

    EXTERNAL NAME 'toString',

  STATIC METHOD contig (A1 another_addr,

      A2

another_addr)

  RETURNS

CHARACTER(3)

    EXTERNAL NAME 'contiguous';

SQL データ型 another_addr は,addr データ型とは異なるデータ型である。二つのデータ型は,比較

可能,代入可能又は和集合互換ではない。another_addr 型の下位型である“2 line”データのための SQL

データ型を含めることもできるし,省くことができる。another_2_line のような名前をもつそのよう

な下位型を定義するならば,

another_2_line

のインスタンスは,

another_addr

の特殊化であり,

addr

の特殊化ではない。

F.6

サブクラスの欠落

Address

及び Address2Line のような Java のクラス及びサブクラスが与えられると,そのような各ク

ラス又はこれらのクラスの部分集合のいずれに対しても,SQL データ型を定義することができる。

SQL では,Java クラス Address2Line だけを用いたいと仮定する。Address クラスに対応する SQL

データ型なしで,そのクラスに対する SQL データ型を定義することができる。例えば,次のとおりである。

CREATE TYPE complete_addr

    EXTERNAL NAME 'address_classes_jar:Address2Line'

  LANGUAGE

JAVA

  AS

(

  zip_attr CHARACTER(10) EXTERNAL NAME 'zip',

  street_attr CHARACTER VARYING(50) EXTERNAL NAME 'street',

  line2_attr CHARACTER VARYING(100) EXTERNAL NAME 'line2' )

  STATIC METHOD rec_width ()

  RETURNS

INTEGER

    EXTERNAL VARIABLE NAME 'recommendedWidth',

  CONSTRUCTOR METHOD complete_addr ()

    RETURNS complete_addr SELF AS RESULT

    EXTERNAL NAME 'Address2Line',

  CONSTRUCTOR METHOD complete_addr (s_parm CHARACTER VARYING(50),

      s2_parm

CHARACTER(100),

      z_parm

CHARACTER(10))

    RETURNS complete_addr SELF AS RESULT

    EXTERNAL NAME 'Address2Line',

  STATIC METHOD contiguous (A1 complete_addr,

      A2

complete_addr)


128

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  RETURNS

CHARACTER(3)

    EXTERNAL NAME 'contiguous',

  METHOD to_string ()

    RETURNS CHARACTER VARYING(255)

    EXTERNAL NAME 'toString',

  METHOD strip ()

    RETURNS complete_addr SELF AS RESULT

    EXTERNAL NAME 'removeLeadingBlanks';

この CREATE TYPE がスーパクラス Addr の属性及びメソッドに対する属性定義及びメソッド定義を含

んでいることに注意を要する。CREATE TYPE に UNDER を指定しないときに限り,CREATE TYPE 中にこ

のようなスーパクラスの属性及びメソッドを含めることができる。すなわち,CREATE TYPE で UNDER

とともに上位型を指定するならば,CREATE TYPE は,それが直に含む当該 Java クラスの属性及びメソッ

ドだけを含めることができる。

CREATE TYPE 文で指定することができるクラスの部分集合は,制限される。例えば,階層をもつクラ

ス Person,Employee,Manager 及び  Director を組み込むと仮定する。ここで,各クラスは,先行

するクラスのサブクラスとする。次に示すクラスの部分集合に対して SQL データ型を定義することができ

る。

−  Person,Employee,Manager 及び Director:これは,完全部分集合である。各 SQL データ型

は,それの当該 Java クラスの要素だけを含むことができる。

−  Person,Employee,Manager 又は Director のいずれか一つ:この型は,それのスーパクラス

のいずれからの要素も含むことができる。

−  Manager 及び Director:Manager に対する SQL データ型は,Person 及び Employee からの要

素を含むことができる。Director に対する SQL データ型は,Director の要素だけを含むことが

できる。

−  Employee,Manager 及び Director:Employee に対する SQL データ型は,Person からの要

素を含むことができる。Manager 及び Director に対する SQL データ型は,それらのクラスの要

素だけを含むことができる。

−  Employee 及び Manager:Employee に対する SQL データ型は,Person からの要素を含むこと

ができる。Manager に対する SQL データ型は,そのクラスの要素だけを含むことができる。

−  Person,Employee 及び Manager,又は Person 及び Employee:各クラスは,それの当該 Java

クラスの要素だけを含むことができる。

許されない部分集合は,サブクラスの中間レベルを省くものである。すなわち,クラスの次に示す部分

集合(だけ)に対する SQL データ型を定義することができない。

−  Person 及び Manager,又は Person,Manager 及び Director

−  Person 及び Director

−  Person,Employee 及び Director,又は Employee 及び Director

規則は,説明よりも簡単である。すなわち,次のとおりである。

 SQL 型 S2 に対する CREATE TYPE 文が“UNDER S1”を指定するならば,S1 の当該 Java クラスは,

S2 の当該 Java クラスの直接のスーパクラスでなければならない。


129

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

F.5  単一の Java クラスに対する複数の SQL 型”では,単一の Java クラスに対して複数の SQL データ

型をどのように定義することができるかを記述している。これは,下位型階層に対しても適用することが

できる。例えば,Person,Employee,Manager 及び Director に対して定義された SQL データ型を

Pi

EiMi 及び Di とする。与えられた数 に対して,各型は,先行する 型の下位型として定義される。

次のような SQL データ型を定義することができる。

−  E1 及び M1,並びに P2 及び E2。すなわち,M1 は,E1 の下位型として定義され,E2 は,P2 の下

位型として定義される。この場合,E1 と E2 とは,異なる型である。E1 のインスタンスは,P2 

特殊化ではない。

−  P1E1 及び M1,並びに M2 及び D2。すなわち,E1 は,P1 の下位型として定義され,M1 は,E1

の下位型として定義され,D2 は,M2 の下位型として定義される。この場合,M1 と M2 とは,異

なる型である。M2 のインスタンスは,P1 又は E1 のいずれの特殊化でもなく,D2 のインスタンス

は,P1 又は E1 のいずれの特殊化でもない。

F.7

データ型に対する GRANT 及び REVOKE 

前の箇条で示した CREATETYPE 文を実行した後に,新しいデータ型に対する SQL の USAGE 権限を付

与するために,通常の SQL の GRANT 文を実行することができる。

GRANT USAGE ON TYPE addr TO PUBLIC;

GRANT USAGE ON TYPE addr2line TO admin;

利用者定義型に対する USAGE 権限の GRANT 及び REVOKE の構文及び意味は,ISO/IEC 9075-2 で規定

しているとおりであり,この規格では,それ以上記述していない。

F.8

クラスのための配置記述子

Java クラスの与えられた JAR を組み込むどの SQL システムでも,同じ組の SQL の CREATE 文及び

GRANT 文を実行し,その JAR を除去するときに対応する SQL の DROP 文及び REVOKE 文を実行したい

かもしれない。JAR 中の

配置記述子

  (deployment descriptor)  ファイル中にそれらの SQL 文を指定すること

によって,この処理を自動化することができる。配置記述子ファイルは,JAR が組み込まれるときに実行

するための CREATE 及び GRANT 文のリスト,及び JAR が除去されるときに実行するための REVOKE 及

び DROP 文のリストを含む。

次は,上記の Java クラスのための配置記述子ファイル並びに SQL の CREATE 及び GRANT 文の例であ

る。

SQLActions[ ] = {

 "BEGIN

INSTALL

    CREATE TYPE addr

    EXTERNAL

NAME

'address_classes_jar:Address'

    LANGUAGE

JAVA

    AS

(

      zip_attr CHARACTER(10) EXTERNAL NAME 'zip',


130

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

      street_attr CHARACTER VARYING(50) EXTERNAL NAME 'street')

   STATIC

METHOD

rec_width()

    RETURNS

INTEGER

    EXTERNAL

VARIABLE

NAME

'recommendedWidth',

      CONSTRUCTOR METHOD addr ()

        RETURNS addr SELF AS RESULT

    EXTERNAL

NAME

'Address',

      CONSTRUCTOR METHOD addr (s_parm CHARACTER VARYING(50),

      z_parm

CHARACTER(10))

        RETURNS addr SELF AS RESULT

    EXTERNAL

NAME

'Address',

   METHOD

to_string

()

    RETURNS

CHARACTER

VARYING(255)

    EXTERNAL

NAME

'toString',

   METHOD

remove_leading_blanks

()

        RETURNS addr SELF AS RESULT

    EXTERNAL

NAME

'removeLeadingBlanks',

   METHOD

strip

()

        RETURNS addr SELF AS RESULT

    EXTERNAL

NAME

'removeLeadingBlanks',

      STATIC METHOD contiguous (a1 addr, a2 addr)

    RETURNS

CHARACTER(3)

    EXTERNAL

NAME

'contiguous';

    GRANT USAGE ON TYPE addr TO PUBLIC;

    CREATE TYPE addr_2_line UNDER addr

    EXTERNAL

NAME

'address_classes_jar:Address2Line'

    LANGUAGE

JAVA

    AS

(

      line2_attr CHARACTER VARYING(100) EXTERNAL NAME 'line2' )

      CONSTRUCTOR METHOD addr_2_line ()

    RETURNS

addr_2_line SELF

AS

RESULT

    EXTERNAL

NAME

'Address2Line',

      CONSTRUCTOR METHOD addr_2_line (s_parm CHARACTER VARYING(50),

      s2_parm

CHARACTER(100),

      z_parm

CHARACTER(10)

)

    RETURNS

addr_2_line SELF

AS

RESULT

    EXTERNAL

NAME

'Address2Line',

   METHOD

strip

()

    RETURNS

addr_2_line SELF

AS

RESULT

    EXTERNAL

NAME

'removeLeadingBlanks';


131

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

    GRANT USAGE ON TYPE addr_2_lineTO admin;

 END

INSTALL",

 "BEGIN

REMOVE

    REVOKE USAGE ON TYPE addr_2_line FROM admin RESTRICT;

    DROP TYPE addr_2_line RESTRICT;

    REVOKE USAGE ON TYPE addr FROM PUBLIC RESTRICT;

    DROP TYPE addr RESTRICT;

 END

REMOVE"

}

F.9

データ型としての Java クラスの使用

SQLJ.INSTALL_JAR

手続で 1 組の Java クラスを組み込み,Java クラスに対して定義される SQL 型を

指定するための適当な SQL の CREATE 文を実行した後に,それらの外部 Java データ型を SQL の列のデー

タ型として指定することができる。例えば,次のとおりである。

CREATE TABLE emps (

     name  CHARACTER  VARYING(30),

     home_addr  addr,

     mailing_addr  addr_2_line

)

この表では,name 列が普通の SQL 文字列であり,home_addr 列及び mailing_addr 列が外部 Java

データ型のインスタンスである。

データ型が外部 Java データ型である SQL の列は,SQL/JRT

  (SQL/JRT column)  として参照される。

代替として,この規格の処理系が ISO/IEC 9075-2 で規定している型付き表を提供するならば,型付き表

を作成するために SQL 型を用いることができる。そして,型付き表中のオブジェクトを他の表で参照する

ことができる。この表現は,型付き表のオブジェクトを共有する(すなわち,複数のオブジェクトから参

照する)ことを許す。

例えば,次に示すように,型付き表 addresses に型 addr のオブジェクトを格納し,他の一つ以上の

表からそれらを参照することができる。

CREATE TABLE addresses OF addr (

     REF IS id SYSTEM GENERATED ) ;

CREATE TABLE companies (

     name  CHARACTER  VARYING(100),

     address  REF(addr)  SCOPE  addresses

) ;

CREATE TABLE emps2 (

     name  CHARACTER  VARYING(30),

     home_addr  REF(addr)  SCOPE  addresses,


132

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

     mailing_addr  addr_2_line

) ;

addresses

のような型付き表では,型の各属性は,型付き表中で同じ名前の独立した列になる。さら

に,型付き表は,表中の行(すなわち,オブジェクト)を識別する暗に想定される識別子列をもつ。上記

の例では,この列の名前は,id で,列の値は,データベースシステムによって自動的に生成される。ISO/IEC 

9075-2

は,CREATE TYPE 文の拡張構文(詳細は,

9.4 <利用者定義型定義>”及び ISO/IEC 9075-2 参照)

によって定義することができるオブジェクト識別子のための追加の生成機構を提供する。

型 REF(addr)の列中に addresses 表のオブジェクトへの参照を格納することができる。これらの列

の定義も,参照列の有効範囲として addresses 表を識別する。

F.10  SELECT

INSERT

及び UPDATE

emps.home_addr

及び emps.mailing_addr のような SQL/JRT 列を指定した後に,それらの列に代

入する値は,Java インスタンスでなければならない。このようなインスタンスは,Java 中と同じように

NEW 演算子を用いた構成メソッドの呼出しによって最初に生成される。例えば,次のとおりである。

INSERT INTO emps VALUES ( 'John Doe', NEW addr(), NEW addr_2_line() )

INSERT INTO emps VALUES ( 'Bob Smith', NEW addr('432 Elm Street', '95123'),

NEW addr_2_line('PO Box 99', 'attn: Bob Smith', '99678') )

SQL/JRT 列に対して指定する初期値は,構成メソッドの呼出しの結果である。この規格の機能で役割が

Java 中と同じ NEW キーワードを利用していることに注意を要する。

このような列の値は,一つの表から別の表に写すこともできる。例えば,次の追加の表を仮定する。

CREATE TABLE trainees (

 name

CHARACTER(30),

 home_addr

addr,

 mailing_addr

addr_2_line

);

INSERT INTO emps

    ( SELECT * FROM trainees

      WHERE name IN ('Bill Baker', 'Chuck Morgan', 'Frank Jones') ) ;

型付き表へのオブジェクトの挿入には,通常の実表と同じ構文を用いる。例えば,次のとおりである。

INSERT INTO addresses

  VALUES ('1357 Ocean Blvd.', '99111')

参照値は,

(識別子列を用いて)被参照表から直接取得することも,他の参照列から取得こともできる。

例えば,次の文は,companies 表に格納されている参照値を取得して,emp2 表に挿入する。この結果,


133

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

addr

オブジェクトが複数の参照しているものによって“共有”される状態になり,これによって,同じ

addr

オブジェクトの複数の冗長な写しをもつのを避けることになる。

INSERT INTO emps2

  VALUES ( 'Rob White , NEW addr( '165 Oak Street', '95234' ),

          ( SELECT address FROM companies

            WHERE name = 'eBiz Unlimited' ) )

F.11  SQL

での Java フィールド及びメソッドの参照

SQL のフィールド修飾を用いて emps.home_addr 及び emps.mailing_addr  のような SQL/JRT 列の

メソッドを呼び出したり,参照したり,更新したりすることができる。

SELECT home_addr.to_string() , mailing_addr.to_string()

FROM emps

WHERE name = 'Bob Smith';

SELECT name, home_addr.zip_attr

FROM emps

WHERE home_addr.street_attr= '456 Shoreline Drive';

UPDATE emps

  SET home_addr.street_attr = '457 Shoreline Drive',

   home_addr.zip_attr

=

'99323'

WHERE home_addr.to_string() LIKE '%456%Shore%';

内参照演算子(

“->”

)を用いた参照によって,型付き表中のオブジェクトの列をアクセスしたり,型付

き表中のオブジェクトに関するメソッドを呼び出したりすることもできる。

SELECT name, mailing_addr->to_string()

FROM emps2

WHERE name = 'Bob Smith';

SELECT name, mailing_addr->street_attr

FROM emps2

WHERE mailing_addr->zip_attr = '99111';

F.12

拡張可視性規則

Java クラス Address 及び Address2Line に対して SQL データ型を定義し,それらのクラスを SQL の

列のデータ型としてどのように用いることができるかを示した。

Java クラスに対してそれらの SQL データ型を定義することは,一つの付加的な効果を伴う。それらの

SQL データ型及びそれらが定義された Java クラスが,対応する Java 及び SQL のデータ型のリストに追加

されるので,データ型がそれらの Java クラスである Java メソッドを用いることができる。例えば,次の

とおりである。


134

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

public class Utility {

 //

Address

の removeLeadingBlanks メソッドの関数版。

  public static Address stripLeadingBlanks(Address a) {

    return a.removeLeadingBlanks() ;

 }

 //

Addr2Line

の removeLeadingBlanks メソッドの関数版。

  public static Addr2Line stripLeadingBlanks(Addr2Line a) {

    return a.removeLeadingBlanks() ;

 }

}

CREATE FUNCTION strip(a addr) RETURNS addr

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'address_classes_jar:Utility.stripLeadingBlanks';

CREATE FUNCTION strip(a addr_2_line) RETURNS addr_2_line

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'address_classes_jar:Utility.stripLeadingBlanks';

CREATE FUNCTION 文は,被参照メソッドが SELF AS RESULT を指定することを示す構文をもたない

ことに注意を要する。被参照メソッドがその指定をもつので,二つの strip 関数は,両方ともそれらの入

力パラメタの写しを戻している。

F.13  SQL

での JAVA インスタンスの論理表現

F.10  SELECT,INSERT 及び UPDATE”では,SQL/JRT 列に代入される値が,他の SQL/JRT 列から,

又は Java 構成子若しくは他のメソッドの呼出しの結果から代入されるのを見た。したがって,SQL/JRT 列

に代入される値は,結局,JVM 中で Java メソッドによって構成される値から導出される。そのような値

は,Java インタフェース java.io.Serializable 又は Java インタフェース java.sql.SQLData のい

ずれかから得られる値によって SQL/JRT 列中で表現される。それらのインタフェースの一方又は両方が

SQL 中でデータ型として用いられる Java クラスによって実装されなければならない。そのインタフェース

から得られる値は,実効的に Java インスタンスの写しである。

例えば,次のとおりである。

INSERT INTO emps

  VALUES ( 'Don Green', NEW addr('234 Stone Road', '99777'),

      NEW

addr_2_line()

);

NEW 演算子をもつ addr 構成メソッドは,addr インスタンスを構成し,それへの参照を戻す。しかし,

相 手 が SQL/JRT 列 な の で , SQL シ ス テ ム は , イ ン タ フ ェ ー ス java.io.Serializable 又 は

java.sql.SQLData

を用いて,実効的に新しい Java 値の写しであるデータを取得して,emps 表の新し

い行にその値を写す。

addr_2_line

構成メソッドは,指定されたパラメタ値をもつインスタンスではなく,既定のインスタ


135

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

ンスを戻すことを除いて,addr メソッドと同じ方法で処理する。しかし,とられる動作は,addr インス

タンスに対するものと同じである。

SQL/JRT 列に格納される値は,Java インスタンスの写しであって,参照ではないことに注意を要する。

例えば,次のとおりである。

INSERT INTO emps (name, home_addr)

  VALUES ('Sally Green',

      SELECT

home_addr

      FROM

emps

e2

      WHERE

e2.name='Don

Green');

この INSERT 文は,'Don Green'  の行から,新しい ' Sally Green' の行に home_addr 列を写す。Java イン

スタンスの写しを含む列値自体が写されることに注意を要する。したがって,'Sally Green'  の行及び 'Don

Green'  の行の home_addr 列は,別個の写しであり,共有される写しの参照ではない。特に,次の文は,

'Sally Green'  の home_addr に影響を与えない。

UPDATE emps

  SET home_addr.zip_attr = '94608'

WHERE name = 'Don Green';

SQL/JRT 列中に格納される値は,Java メソッドに対して定義された関数へのパラメタとして列が渡され

るときに,

“再構築される”

。例えば,次のとおりである。

UPDATE emps

  SET home_addr = strip(home_addr)

WHERE SUBSTRING(home_addr.street_attr, 1, 1) = ' ';

strip

関数は,Java 静的メソッド Utility.stripLeadingBlanks に対して定義された SQL 関数で

ある。関数のパラメタのデータ型は,addr データ型である。引数として home_addr 列を渡すとき,現

在 行 中 の 値 は , JVM 中 で 再 構 築 さ れ , 再 構 築 さ れ た 値 の 参 照 が , メ ソ ッ ド

Utility.stripLeadiangBlanks

に渡される。その関数の結果は,SQL データ型 addr に対応するデー

タ 型 Address か ら の 値 で あ る 。 Java イ ン タ フ ェ ー ス   java.io.Serializable 又 は

java.sql.SQLData

がこの戻される値に適用され,結果が列中に写し戻される。

最後に,SQL のナルの役割を考える。例えば,次のとおりである。

INSERT INTO emps (name)

  VALUES ('Mike Green');

この INSERT 文では,home_addr 又は mailing_addr 列に対して値を指定していないので,それらの

列には,

INSERT で値を指定しない他のすべての SQL 列と同じ方法でナル値が設定される。このナル値は,


136

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

完全に SQL 中で生成され,mailing_addr 列の初期化には,JVM が全く関与しない。

F.14

静的メソッド

Java クラスのメソッドは,STATIC か又は STATIC でないかのいずれかとして指定することできる。例え

ば,Address クラスでは,toString メソッドは,STATIC ではなく,contiguous メソッドは,STATIC

である。

SQL の CREATE TYPE 文の METHOD の指定箇所でも,メソッドが STATIC か又は STATIC でないかを

指定することができる。例えば,SQL 型 addr に対する CREATE TYPE は,to_string が STATIC でな

いメソッドであることを指定し,contiguous が STATIC メソッドであることを指定している。

Java 及び SQL では,STATIC でないメソッドは,クラス/型のインスタンスの修飾によって参照される。

例えば,JAI 及び SAI が,それぞれ,型/クラス Address 又は addr の Java 変数及び SQL 変数であると仮

定する。これらのインスタンスの toString 又は to_string メソッドを,式 JAI.toString()又は

SAI.to_string()

によって参照することになる。

Java では,STATIC メソッドは,クラス又はクラスのインスタンスの

いずれか

  の修飾によって参照する

ことができる。例えば,Address.contiguous(...)又は JAI.contiguous(...)のいずれかで,

contiguous

メソッドを参照することができる。

SQL では,STATIC メソッドは,インスタンスではなく型の修飾によって参照される。例えば,

addr::contiguous(...)

の よ う に , contiguous メ ソ ッ ド を 参 照 す る 。( 例 え ば ,)

SAI.contiguous(...)

のように,

SQL の contiguous メソッドを参照することはできない。SQL では,

型名の静的メソッド修飾には,修飾の区切りとして単一の<ピリオド>ではなく,<2 重コロン>を指定する

ことに注意を要する。これによって,SQL の他の構成体とのあいまい(曖昧)性が排除される。

注記 74  このようなフィールド修飾による静的メソッドの参照に加えて,この規格の SQL ルーチン機

能を用いて独立手続又は関数を指定することによって,静的メソッドを参照することもでき

る。例えば,次のとおりである。

CREATE FUNCTION contig_function (A1 addr, A2 addr)

  RETURNS

CHARACTER(3)

  LANGUAGE JAVA PARAMETER STYLE JAVA

  EXTERNAL NAME 'address_classes_jar:Address.contiguous';

F.15

静的フィールド

Java クラスのフィールドは,STATIC か又は STATIC でないかのいずれかとして指定することができる。

Address

クラスの例では,street 及び zip フィールドは,STATIC でなく,recommendedWidth フィ

ールドは,STATIC である。

Java クラスの静的フィールドには,それらを読込み専用にする FINAL を指定することができる。FINAL

でないフィールドは,更新することができる。利用者は,読込み専用静的フィールドに対して,必ずしも

FINAL 句を指定するとは限らない。

SQL の CREATE TYPE には,属性が STATIC であることを指定するための機能を含まない。これは,デ

ータベース環境中での静的フィールドの有効範囲,永続性及びトランザクション特性が何であるかを規定

することが困難であることによる。


137

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

しかし,SQL の CREATE TYPE では,Java 静的フィールドの値に対する読込み専用アクセスのための簡

便な機構を提供する。これについては,recommendedWidth フィールドに対して STATIC METHOD を指

定する addr のための CREATE TYPE で説明する。

CREATE TYPE addr EXTERNAL NAME 'address_classes_jar:Address'

  LANGUAGE

JAVA

  USING

SERIALIZABLE

  AS

(

  zip_attr CHARACTER(10) EXTERNAL NAME 'zip',

  street_attr CHARACTER VARYING(50) EXTERNAL NAME 'street' )

  STATIC METHOD rec_width () RETURNS INTEGER

    EXTERNAL VARIABLE NAME 'recommendedWidth',

 ...

;

rec_width

に対する STATIC METHOD の指定箇所では,それがパラメタなしの整数値として評価され

るメソッドであることを指定する。静的メソッドに対する EXTERNAL の指定箇所では,通常 Java クラス

の静的メソッドの名前を指定する。しかし,この場合には,EXTERNAL に続けてキーワード VARIABLE

を指定し,Java クラスの静的フィールドの名前を与えている。STATIC METHOD の指定箇所で EXTERNAL

VARIABLE を指定するとき,メソッドは,パラメタをもってはならず,指定する Java の名前は,静的フィ

ールドの名前でなければならない。そのような静的メソッドは,通常の方法で呼び出され,指定された Java

静的フィールドの値を戻す。

そのような宣言が与えられたと,次に示すとおり,他の静的メソッドと同じ方法で rec_width メソッ

ドを参照し,recommendedWidth フィールドをアクセスすることができる。

SELECT *

FROM emps

WHERE LENGTH(home_addr.street_attr) > addr::rec_width();

SQL では,Java 静的フィールドの値を更新するための方法を提供しない。

F.16

インスタンス更新メソッド

静的でない Java クラスメソッドは,クラスのインスタンスでの修飾によって呼び出される。例えば,JAI

が Java の Address ク ラ ス の イ ン ス タ ン ス で あ る と 仮 定 す る と , JAI.toString() 又 は

JAI.removeLeadingBlanks()

で toString 又は removeLeadingBlanks メソッドを参照することに

なる。

そのような静的でないメソッドは,メソッド参照を修飾するインスタンス,例えば,インスタンス JAI

のフィールドを一般的に参照する。toString メソッドは,読込み専用の方法でインスタンス JAI を参照

し,そのインスタンスの文字列表現を戻す。しかし,removeLeadingBlanks メソッドは,インスタン

スの値を更新する方法で修飾しているインスタンスを参照する。その更新は,メソッド呼出しの副作用と

なる。


138

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

toString

のような読込み専用メソッドは,SQL に自然に適合する。例えば,上記の emps 表が与えら

れると,次のとおりである。

SELECT name, home_addr.to_string()

FROM emps

WHERE home_addr.to_string() <> x;

F.13 SQL での JAVA インスタンスの論理表現”で説明したように,SQL の列及び変数中に格納された

Java インスタンスは,Java 値の写しであって,そのような値の参照ではない。したがって,修飾している

インスタンスに副作用がある removeLeadingBlanks のようなメソッドは,SQL に対して,自然には適

合しない。この理由のため,Java クラスに対する SQL の CREATE TYPE では,副作用をもつ Java メソッ

ドの参照のための特別な機構を提供する。これは,次に示すように,remove_leading_blanks に対す

る METHOD の指定によって説明する。

CREATE TYPE addr EXTERNAL NAME 'address_classes_jar:Address'

 LANGUAGE

JAVA

 USING

SERIALIZABLE

 AS

...

  METHOD remove_leading_blanks () RETURNS addr SELF AS RESULT

    EXTERNAL NAME 'removeLeadingBlanks';

Java の Address クラスの removeLeadingBlanks メソッドが void メソッドであることを思い出す。

その結果,SQL の remove_leading_blanks を,void メソッド,すなわち,

“手続メソッド”として指

定することを期待するかもしれない。しかし,SQL の CREATE TYPE では,void メソッド又は手続メソ

ッドを指定するための方法を提供していない。これは,このようなメソッドが修飾しているインスタンス

にほとんど常に副作用を起こし,値指向の SQL 文脈に適合しないからである。

SQL の remove_leading_blanks メソッドでは,RETURNS SELF AS RESULT を指定している。これ

は,次の重要性をもつ。

−  メソッドの戻り型は,そのメソッドが含んでいる SQL データ型として定義される。すなわち,SQL

の remove_leading_blanks メソッドは,addr 値として評価されるメソッドである。これは,

基となる Java メソッドの戻り型と無関係な場合である。典型的な場合には,もととなる Java メソ

ッドは,void メソッドになるが,後で議論するとおり,これは,要件ではない。

−  実行時,指定された Java メソッドは,通常の方法で呼び出され,修飾しているインスタンスの写し

のフィールドを更新する。呼出しが完了するとき,SQL システムでは,修飾しているインスタンス

の更新された値の写しを作成し,メソッドの結果としてその写しを戻す。

remove_leading_blanks

の呼出しの例は,次のとおりである。

UPDATE emps

  SET home_addr = home_addr.remove_leading_blanks()

WHERE ... ;


139

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

このような UPDATE 文は,通常の方法で,emps 表の各行を処理し,WHERE 句が真である各行に対し

て SET 動作を実行する。そのような行に対して,home_addr 列の値が Java 仮想機械に渡され,Address

クラスのそのインスタンスに対して removeLeadingBlanks メソッドが評価される。そのメソッドは,

現在の home_addr 列の写しのフィールドで副作用を起こして戻る。SQL システムでは,Address インス

タンスの更新された値の写しを作成し,remove_leading_blanks の呼出しの結果としてその写しを戻

す。その写しが現在行の home_addr 列に逆に代入される。

次に示すとおり,Remove_leading_blanks の若干異なる呼出しを考える。

SELECT name, home_addr.remove_leading_blanks().street_attr

FROM emps

WHERE ... ;

この SELECT 文は,emps 行を処理し,選択された行に対して選択リストを評価する。その選択リスト

の 2 番目の要素が home_addr 列の remove_leading_blanks メソッドを呼び出す。上記のとおり,こ

の呼出しが JVM に home_addr 値の写しを渡し,その JVM で,removeLeadingBlanks メソッドがそ

の写しを更新する。その後,SQL システムは,更新された写しの写しを戻し,street_attr 属性を抽出

する。その street_attr 属性には,既に処理された先行する空白の除去が反映されている。しかし,こ

れらの動作は,emps 表中の home_addr 列の値には影響を与えない。

この SELF AS RESULT の機構は,SQL に任意の Java メソッドの副作用を適用させるための一般的な方

法を提供する。

修飾しているインスタンスを更新する Java メソッドは,通常,void メソッドとして書かれる。しかし,

幾つかの場合には,そのようなメソッドでも,

(例えば,

“OK”の指示のような,ある種の状態フィード

バック情報を知らせる整数値を戻すように書かれる。この理由によって,メソッドの戻り型に関係なく,

任意の Java メソッドに対して RETURNS SELF AS RESULT を指定することができる。しかし,メソッド呼

出しが陽に提供するこの戻り値は,SQL システムによって単純に破棄され,陽に戻される値は,修飾して

いるインスタンスの暗に想定される写しで置き換えられることに注意を要する。

F.17  SQL/JRT

データの下位型

Java クラス Address 及び Address2Line,並びに対応する SQL データ型 addr 及び addr_2_line

の例を思い出す。Address2Line クラスは,Address クラスのサブクラスなので,Java の代替可能性及

びメソッドオーバロード特性を利用することができる。

例えば,addr_2_line の値を addr 列に代入することが可能である。home_addr 列が addr であり,

mailing_addr

列が addr_2_line である emps 表でこれを説明することができる。

UPDATE emps

SET home_addr = mailing_addr

WHERE home_addr IS NULL;

上記の SET 句が実行される行に対して,home_addr の宣言型が addr であっても,home_addr 列は,

addr_2_line

を含む。


140

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

このような代入は,実際のインスタンス値又はその実行時データ型を修正しない。したがって,

addr_2_line

の値を mailing_addr 列から home_address 列に格納したとき,それらの値は,

addr_2_line

の実行時の型をもたなければならない。これの効果は,次の例で見ることができる。

addr

型及び addr_2_line 下位型は,両方とも toString と名付けられたメソッドをもち,完全な

address

データの String 形式を戻すことを思い出す。

to_string

メソッドの次の呼出しを考える。

SELECT name, home_addr.to_string()

FROM emps

WHERE home_addr.to_string() NOT LIKE '%Line2=%';

emps

の各行に対して,home_addr 列の宣言型は,addr であるが,home_addr  値の実行時の型は,addr

又は addr_2_line のいずれかであり,前述の UPDATE 文の効果に依存する。home_addr 列の実行時の

値が addr である行に対して,addr クラスの to_string メソッドが呼び出され,home_addr 列の実行

時の値が addr_2_line である行に対して,addr_2_line サブクラスの to_string メソッドが呼び出

される。

to_string

メソッドのこの実行時選択の方法は,次のとおりに行われる。

−  コンパイル時に,SQL システムが,home_addr.to_string()の呼出しが構文的に正しく,結果

型が(例えば,LIKE 述語に対して)適切であることを決定する。

−  実行時に,SQL システムが,次の段階を踏んで,emps の各行に対する home_addr.to_sting()

の呼出しを処理する。

当該行の home_addr 列の値が JVM 中に再構築され,その再構築された値に対する参照 が得

られる。

R

.toString()

の呼出しが,評価のために JVM へ渡される。JVM は,適切な toString メソッ

ドの実行時選択を実施して,結果を戻す。

F.18

ナルインスタンスのフィールド及びメソッドの参照

次の行を emps 表に挿入すると仮定する。

INSERT INTO emps (name)

VALUES ('Charles Green')

home_address

及び mailing_address 列に対して値が指定されていないので,両方ともナルである

ことに注意を要する。

次の SELECT 文を考える。

SELECT name, home_addr.zip_attr

FROM emps

WHERE home_addr.zip_attr IN ('95123', '95125', '95128');


141

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

この SELECT の意図は,home_addr の zip フィールドが,指定された値のいずれかをもつ emps 行の

与えられた値を検索することである。これは,home_addr がナルである emps の行を含まないことにな

る。

この SELECT 文を実行するとき,WHERE 句は,emps の各行に対して評価され,emps は,home_addr

列がナルである行を含んでいる。Java 及び他のプログラム言語では,ナルインスタンスのフィールドを参

照しようとするならば,例外条件が引き起こされる。SQL でその規則を用いると,emps のいずれかの行

の home_addr 列がナルであったならば,上記の SELECT は,例外を引き起こすことになる。これは,特

定の行に対する例外ではなく,SELECT 文全体に対する例外であることに注意を要する。望まれる効果を

得るためには,次のような SELECT を書かなければならないことになる。

SELECT name, home_addr.zip_attr

FROM emps

WHERE CASE

          WHEN home_addr IS NOT NULL

      THEN

home_addr.zip_attr

     ELSE

NULL

        END IN ('95123', '95125', '95128');

実際,例外を引き起こすナルインスタンスのフィールド参照を指定するならば,実質的に,フィールド

を参照するすべての WHERE 句でそのような CASE 式を書かなければならないことになる。これは,極め

て冗長なので,ナルインスタンスのフィールド参照に対する SQL/JRT の規則は,次のとおり,Java とは異

なる。

フィールド参照で指定されたインスタンスの値がナルならば,フィールド参照は,ナルとする。

この規則は,上記の CASE 式が暗に想定されることを規定していることと等価である。

したがって,この規則によって,最初の形式で SELECT を書くことが許される。home_addr 列がナル

である行に対して,フィールド参照 home_addr.zip_attr は,ナルになる。

ナルインスタンスをもつフィールド参照に対するこの規則は,

“値”又は“右側”文脈でのフィールド参

照にだけ適用され,代入又は SET 句の相手であるフィールド参照には適用されない。

例えば,次のとおりである。

UPDATE emps

  SET home_addr.zip_attr = '99123'

WHERE name = 'Charles Green';

この WHERE 句は,'Charles Green'  の行に対して明らかに真になるので,UPDATE 文は,与えられた SET

句を実行しようとする。ナルインスタンスのフィールドに値を代入することができないので,これは,例

外を引き起こす。これは,値を代入できるフィールドをナルインスタンスがもたないからである。

すなわち,ナルインスタンスのフィールドに対するフィールド参照は,正しくて,右側文脈ではナル値


142

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

を戻し,左側文脈では例外を引き起こす。

ナルインスタンスのメソッド呼出しにも,まさに同じ考慮が適用され,同じ規則が適用される。

例えば,次のように,前記の例を修正し,home_addr 列の to_string メソッドを呼び出すことを仮

定する。

SELECT name, home_addr.to_string()

FROM emps

WHERE home_addr.to_string() = 'Street=234 Stone Road ZIP=99777'

厳密な Java の規則を適用するならば,home_addr 列がナルである行に対する to_string メソッドの

呼出しは,例外を引き起こす。したがって,上記のとおり,次のように SELECT をコーディングする必要

がある。

SELECT name, home_addr.to_string()

FROM emps

WHERE CASE

          WHEN home_addr IS NOT NULL

      THEN

home_addr.to_string()

     ELSE

NULL

        END = 'Street=234 Stone Road ZIP=99777';

したがって,フィールド参照に対する Java の規則を拡張したのと同じ方法で,メソッド呼出しに対する

Java の規則を拡張する。

インスタンスメソッド呼出しで指定されたインスタンスの値がナルならば,呼出しの結果は,ナルとす

る。

F.19  SQL/JRT

データの順序付け

以前の箇条で,データ型がそれぞれ Java クラス Address 及び Address2Line として宣言される列

home_addr

及び mailing_addr をもつ emps 表を作成した。ここで,次のような文中でそれらの列を参

照すると仮定する。

SELECT DISTINCT *

FROM emps E1, emps E2

WHERE E1.home_addr = E2.home_addr

  AND E1.mailing_addr > E2.mailing_addr

UNION

SELECT DISTINCT *

FROM emps E1, emps E2

WHERE E1.mailing_addr = E2.mailing_addr


143

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

  AND E1.home_addr > E2.home_addr

GROUP BY home_addr

ORDER BY home_addr, mailing_addr;

この文は,home_addr 及び mailing_addr の多くの参照を含み,それらの参照は,次に示す順序付け

関係を暗に想定する。

1) DISTINCT

キーワードは,対応する列の対の比較として指定する行の等値性に関して定義されてい

る。すなわち,emps の二つの行が DISTINCT かどうかを決定するためには,それらのそれぞれの

home_addr

及び mailing_addr 列を比較しなければならない。

2)

“=”及び“>”などを用いる直接比較は,すべて順序付け特性を必要とする。

3) UNION

演算子は,UNION ALL を指定しないので,重複を排除する。これは,DISTINCT と同じ種

類の比較を必要とする。

4) GROUP

BY は,グループ化列の等しい値で行を集合に分割することを必要とする。

5) ORDER

BY では,順序列の順序付け特性の決定を必要とする。

CREATE TYPE…EXTERNAL LANGUAGE JAVA 文で外部 Java データ型を作成するとき,新しい外部 Java

データ型には,順序付けの能力がない。すなわち,それの“順序付け形式”は,

“なし”である。順序付け

形式がなしである外部 Java データ型のインスタンスは,上記の順序付け関係のいずれにも用いることはで

きない。

外部 Java データ型に対して順序付けを定義するためには,次に示す CREATE ORDERING 文を用いる。

<

利用者定義順序付け定義> ::=

  CREATE ORDERING FOR <

利用者定義型名>

  <

順序付け形式>

<

順序付け形式> ::=

    EQUALS ONLY BY <

順序付けカテゴリ>

  | ORDER FULL BY <

順序付けカテゴリ>

<

順序付けカテゴリ> ::=

    MAP WITH <

順序付けルーチン>

  | RELATIVE WITH <

順序付けルーチン>

  | RELATIVE WITH COMPARABLE INTERFACE

 |

STATE

EQUALS ONLY 及び FULL 代替手段の意味は,次のとおりである。

− EQUALS

ONLY は,関連付けられるクラスのインスタンスを,等号(=)及び不等号(<>)演算子,

SELECT DISTINCT,重複排除を伴う UNION,並びに GROUP BY で参照できるが,他の順序付け文

脈では参照できないことを指定する。

− FULL は,関連付けられるクラスのインスタンスをどの順序付け文脈でも参照できることを指定す

る。

STATE は,インスタンスがその型の属性の値で順序付けられることを指定する。

MAP では,関連付けられるクラスのインスタンスを組込み SQL データ型の値に対応付けるメソッド又


144

X 3005-13

:2007 (ISO/IEC 9075-13:2003)

は関数の名前を指定し,その順序付けは,関連付けられるクラスの順序付けを定義する。対応付けるルー

チンは,1 対 1 対応を定義する必要はない。それは,異なるインスタンスの値を同じ結果に対応付けるこ

とができる。これは,有理数を実装するクラスに対して,6/8 と 3/4 とを等しいとみなすために行われる。

それは,大文字小文字を区別しない比較,及び異なるインスタンスを等しいとみなすことを必要とする他

の場合にも行うことができる。

RELATIVE WITH <順序付けルーチン>では,関連付けられるクラスのインスタンスを比較し,整数の結

果を戻すメソッド又は関数の名前を指定する。

二つのインスタンス X 及び Y に対する実行時の結果の値は,

-1,0 又は+1 であり,それぞれ,X が Y

より小さい

  (less than)

等しい

  (equal to)

,又は

より大きい

  (greater 

than)

ことを示す。

RELATIVE WITH COMPARABLE INTERFACE は,当該 Java クラスが java.lang.Comparable を実装

する SQL データ型に対する順序付けでだけ用いてもよい。当該 Java クラスの int compareTo メソッド

では,二つのインスタンス X 及び Y に対する相対的な順序付けを決定して,X が Y

より小さい

か,

等し

か又は

より大きい

かを示すために,それぞれ,負の整数,0 又は正の整数を戻す。