ノンストップデータベース　HiRDB Version 9 SQLリファレンス

文法書

3020-6-457-80

前書き

対象製品

●適用OS：HP-UX 11i V3(IPF)

P-1J62-3591 HiRDB Server Version 9 09-66

P-1J62-1D91 HiRDB/Run Time Version 9(64) 09-66

P-1J62-1E91 HiRDB/Developer's Kit Version 9(64) 09-66

P-F1J62-11913 HiRDB Staticizer Option Version 9 09-00

P-F1J62-11915 HiRDB Non Recover Front End Server Version 9 09-00

P-F1J62-11916 HiRDB Advanced High Availability Version 9 09-00

P-F1J62-11918 HiRDB Disaster Recovery Light Edition Version 9 09-00

P-F1J62-1181A HiRDB Accelerator Version 8 08-03

●適用OS：AIX V7.1，AIX V7.2

P-1M62-3591 HiRDB Server Version 9 09-66

P-1M62-1B91 HiRDB/Run Time Version 9 09-66

P-1M62-1C91 HiRDB/Developer's Kit Version 9 09-66

P-1M62-1D91 HiRDB/Run Time Version 9(64) 09-66

P-1M62-1E91 HiRDB/Developer's Kit Version 9(64) 09-66

P-F1M62-11913 HiRDB Staticizer Option Version 9 09-00

P-F1M62-11915 HiRDB Non Recover Front End Server Version 9 09-00

P-F1M62-11916 HiRDB Advanced High Availability Version 9 09-00

P-F1M62-11918 HiRDB Disaster Recovery Light Edition Version 9 09-00

P-F1M62-1181A HiRDB Accelerator Version 8 08-03

●適用OS：Red Hat Enterprise Linux 6 (64-bit x86_64)，Red Hat Enterprise Linux 7 (64-bit x86_64)

P-9W62-4591 HiRDB Server Version 9 09-66

P-9W62-2D91 HiRDB/Run Time Version 9(64) 09-66

P-9W62-2E91 HiRDB/Developer's Kit Version 9(64) 09-66

P-F9W62-11913 HiRDB Staticizer Option Version 9 09-00

P-F9W62-11915 HiRDB Non Recover Front End Server Version 9 09-00

P-F9W62-11916 HiRDB Advanced High Availability Version 9 09-00

P-F9W62-11918 HiRDB Disaster Recovery Light Edition Version 9 09-00

P-F9S62-1181A HiRDB Accelerator Version 8 08-03

●適用OS：Red Hat Enterprise Linux 6 (32-bit x86)，Red Hat Enterprise Linux 6 (64-bit x86_64)，Red Hat Enterprise Linux 7 (64-bit x86_64)

P-9S62-2B91 HiRDB/Run Time Version 9 09-66

P-9S62-2C91 HiRDB/Developer's Kit Version 9 09-66

P-9S62-4C91 HiRDB Developer's Suite Version 9 09-66

●適用OS：Windows Server 2008 R2，Windows Server 2008 (x64)，Windows Server 2012，Windows Server 2016，Windows 7 Professional (x64)，Windows 7 Enterprise (x64)，Windows 7 Ultimate (x64)，Windows 8 Pro (x64)，Windows 8 Enterprise (x64)，Windows 8.1 Pro (x64)，Windows 8.1 Enterprise (x64)，Windows 10 Pro (x64)，Windows 10 Enterprise (x64)

P-2962-9194 HiRDB Server Version 9 09-66

P-2462-7P84 HiRDB Accelerator Version 8 08-03

●適用OS：Windows Server 2008，Windows Server 2012，Windows Server 2016，Windows 7 Professional，Windows 7 Enterprise，Windows 7 Ultimate，Windows 7 Professional (x64)，Windows 7 Enterprise (x64)，Windows 7 Ultimate (x64)，Windows 8 Pro，Windows 8 Enterprise，Windows 8 Pro (x64)，Windows 8 Enterprise (x64)，Windows 8.1 Pro，Windows 8.1 Enterprise，Windows 8.1 Pro (x64)，Windows 8.1 Enterprise (x64)，Windows 10 Pro，Windows 10 Enterprise，Windows 10 Pro (x64)，Windows 10 Enterprise (x64)

P-2462-9194 HiRDB Server Version 9(32) 09-66

P-2962-7H94 HiRDB Non Recover Front End Server Version 9 09-02

P-2962-7J94 HiRDB Advanced High Availability Version 9 09-02

●適用OS：Windows Server 2008，Windows Server 2012，Windows Server 2016，Windows 7，Windows 8，Windows 8.1，Windows 10

P-2662-1194 HiRDB/Run Time Version 9 09-66

P-2662-1294 HiRDB/Developer's Kit Version 9 09-66

P-2662-3294 HiRDB Developer's Suite Version 9 09-66

●適用OS：Windows Server 2008 R2，Windows Server 2008 (x64)，Windows Server 2012，Windows Server 2016，Windows 7 (x64)，Windows 8 (Core Edition) (x64)，Windows 8 Pro (x64)，Windows 8 Enterprise (x64)，Windows 8.1 (Core Edition) (x64)，Windows 8.1 Pro (x64)，Windows 8.1 Enterprise (x64)，Windows 10 Home (x64)，Windows 10 Pro (x64)，Windows 10 Enterprise (x64)

P-2962-1194 HiRDB/Run Time Version 9(64) 09-66

P-2962-1294 HiRDB/Developer's Kit Version 9(64) 09-66

これらのプログラムプロダクトのほかにもこのマニュアルをご利用になれる場合があります。詳細は「リリースノート」でご確認ください。

輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。

なお、不明な場合は、弊社担当営業にお問い合わせください。

商標類

HITACHI，HiRDB，Cosminexus，HAモニタ，JP1，OpenTP1，TPBroker，uCosminexus，VOS3/LS，VOS3/US，XDMは，株式会社 日立製作所の商標または登録商標です。

ActiveXは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

AMDは，Advanced Micro Devices, Inc.の商標です。

IBM，AIXは，世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

IBM，DataStage, MetaBroker, MetaStageおよびQualityStageは，世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

IBM，PowerHAは，世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

Itaniumは，アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。

JBossは，米国およびその他の国でRed Hat, Inc. の登録商標もしくは商標です。

Linuxは，Linus Torvalds氏の日本およびその他の国における登録商標または商標です。

MicrosoftおよびVisual Studioは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Microsoft .NET は，お客様，情報，システムおよびデバイスを繋ぐソフトウェアです。

Microsoft Accessは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Microsoft OfficeおよびExcelは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Motifは，Open Software Foundation, Inc.の商標です。

MS-DOSは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

ODBCは，米国Microsoft Corporationが提唱するデータベースアクセス機構です。

OLEは，米国Microsoft Corporationが開発したソフトウェア名称です。

OracleとJavaは，Oracle Corporation 及びその子会社，関連会社の米国及びその他の国における登録商標です。

PowerBuilderは，Sybase,Inc.の登録商標です。

Red Hatは，米国およびその他の国でRed Hat, Inc. の登録商標もしくは商標です。

UNIXは，The Open Groupの米国ならびに他の国における登録商標です。

Veritas、Veritasロゴは、米国およびその他の国におけるVeritas Technologies LLCまたはその関連会社の商標または登録商標です。

Visual Basicは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Visual C++は，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Windowsは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Windows Serverは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。

発行

2018年4月　3020-6-457-80

著作権

All Rights Reserved. Copyright (C) 2010, 2018, Hitachi, Ltd.

変更内容

変更内容(3020-6-457-80)　HiRDB Version 9 09-66

追加・変更内容

関連するSQL

変更個所

HiRDBサーバとHiRDBクライアントで文字コードが異なる場合のSQL文や検索データなどの文字コード変換を，ユーザが作成したUOCで実施する機能をサポートしました。

FETCH文

SELECT文

EXECUTE文

EXECUTE IMMEDIATE文

表1-17，1.6.7(1)，1.6.7(2)

1SQL文中に指定できる表数の最大値を128まで拡大しました。

LOCK文

2.5.1(5)，5.6.1(4)(a)，5.6.1(5)

簡易認証ユーザに対してDBA権限を付与できるようにしました。また，簡易認証ユーザがユティリティを実行できるようにしました。

CREATE SCHEMA（スキーマ定義）

GRANT　形式1（権限定義）

3.15.1(2)，3.15.1(4)(a)，3.32.1(3)，3.32.1(4)(a)，3.32.1(6)，3.34.1(5)

マニュアルの体裁を変更しました。

−

−

単なる誤字・脱字などはお断りなく訂正しました。

変更内容(3020-6-457-70)　HiRDB Version 9 09-65

追加・変更内容

関連するSQL

システム単位でデータ保証レベルを指定する機能を追加しました。これに伴い，右記のSQLにシステム定義との関係の説明を追加しました。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

CREATE PROCEDURE（手続き定義）

CREATE TRIGGER（トリガ定義）

DECLARE CURSOR　形式1（カーソル宣言）

1行SELECT文（1行検索）

定義系SQL実行時のPCTFREE及びBLOB列RECOVERYの指定値を，システム定義のオペランドで一括設定できるようにしました。

ALTER TABLE（表定義変更）

CREATE TABLE(表定義)

CREATE INDEX　形式1（インデクス定義）

WITHOUT ROLLBACKオプションを指定した表に対してインデクスの定義がある場合にも，INSERT文 および DELETE文において排他を解除する機能を追加しました。これに伴い，CREATE TABLE文のWITHOUT ROLLBACKオプションの説明を変更しました。

CREATE TABLE(表定義)

表データを複数のRDエリアに分割して格納する場合に，小数秒精度が0より大きいTIMESTAMP型の列を分割キーとして指定できるようにしました。

CREATE TABLE(表定義)

WITHOUT ROLLBACKオプションを指定した表に対して，HiRDBのユニットがダウンしても更新内容を保証する機能を追加しました。これに伴い，右記のSQLにオペランドを追加しました。

DELETE文　形式1（行削除）

DELETE文　形式2（配列を使用した行削除）

準備可能動的DELETE文：位置付け（前処理可能なカーソルを使用した行削除）

INSERT文　形式1（行挿入）

INSERT文　形式2（行挿入）

INSERT文　形式3，形式4（配列を使用した行挿入）

UPDATE文　形式1（データ更新）

UPDATE文　形式2（データ更新）

UPDATE文　形式3，形式4（配列を使用した行更新）

準備可能動的UPDATE文：位置付け 形式1（前処理可能なカーソルを使用したデータ更新）

準備可能動的UPDATE文：位置付け 形式2（前処理可能なカーソルを使用したデータ更新）

HiRDBのサポートプラットフォームに次のOSを追加しました。

AIX V7.2

Windows Server 2016

−

変更内容(3020-6-457-60)　HiRDB Version 9 09-60

追加・変更内容

関連するSQL

データベースへ接続するクライアントを，IPアドレスによって許可又は拒否する機能を追加しました。これに伴い，右記SQLに説明を追加しました（IPアドレスによる接続制限）。

CREATE CONNECTION SECURITY（CONNECT関連セキュリティ機能の定義）

DROP CONNECTION SECURITY （CONNECT関連セキュリティ機能の削除）

DISCONNECT文を実行しないでUAPを終了させた場合の説明を変更しました。

DISCONNECT文（HiRDBとの切り離し）

HiRDBのサポートプラットフォームに次のOSを追加しました。

Linux 7

Windows 10

−

HiRDB Version 9 09-50

追加・変更内容

関連するSQL

ASSIGN LIST文　形式1で，インデクスを使用しない探索条件も指定できるように変更しました。これに伴い，WHERE探索条件の規則を変更しました。

ASSIGN LIST文　形式1（リスト作成）

リスト名変更時にリストの行数を返却できるようにしました。これに伴い，リストの名前を変更する場合の規則を追加しました。

ASSIGN LIST文　形式2（リスト作成）

変更内容(3020-6-457-50)　HiRDB Version 9 09-50

追加・変更内容

関連するSQL

次の設定項目で，推奨値を省略値に変更しました。

システム定義

クライアント環境定義

コマンド・ユティリティのコマンド引数，およびオプション

プリプロセスのコマンド引数

SQL

HiRDB内部で固定値で扱っている値

OS設定（HiRDBによる自動設定）

これに伴い，各機能の説明を変更しました。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

ALTER TABLE（表定義変更）

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

CREATE PROCEDURE（手続き定義）

CREATE TABLE（表定義）

CREATE TRIGGER（トリガ定義）

DECLARE CURSOR　形式1（カーソル宣言）

1行SELECT文（1行検索）

文字コードとして，Unicode（IVS対応UTF-8）を使用できるようにしました。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

CREATE FUNCTION（関数定義）

CREATE PROCEDURE（手続き定義）

CREATE TRIGGER（トリガ定義）

認可識別子長を最大8バイトから最大30バイトに拡張しました。

DESCRIBE文　形式1（検索情報，入出力情報の受け取り）

DESCRIBE TYPE文（ユーザ定義型の定義情報の受け取り）

PREPARE文（SQLの前処理）

CONNECT文（HiRDBとの接続）

SET SESSION AUTHORIZATION文（実行ユーザの変更）

次のオペランドに関する記述を削除しました。

pd_watch_time

pd_ipc_tcp_nodelayack

CREATE INDEX　形式1（インデクス定義）

CREATE INDEX　形式2（インデクス定義）

構成列数が64個までのインデクスを定義できるようにしました。

CREATE INDEX　形式1（インデクス定義）

CREATE TABLE（表定義）

FROM句に行の選択，列の射影だけを行うような単純な導出表を指定したSQLを，作業表を作成しないで実行できるようにしました（FROM句の導出表のマージ適用）。

-

列に対する条件値に列指定を含まないスカラ演算を指定した探索条件に対して，インデクスを使用できるようにしました（スカラ演算を含む条件に対するサーチ条件適用）。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

CREATE PROCEDURE（手続き定義）

CREATE TRIGGER（トリガ定義）

内結合を指定しても等価な結果が得られる問合せに対して，外結合を指定している場合に外結合を内結合に変換できるようにしました（外結合内結合変換機能）。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

CREATE PROCEDURE（手続き定義）

CREATE TRIGGER（トリガ定義）

OSが認証したユーザ名とパスワードで，自動的にHiRDBの認証を行う機能をサポートしました（OSログインユーザの簡易認証）。

CREATE SCHEMA（スキーマ定義）

GRANT DBA（DBA権限定義），GRANT SCHEMA（スキーマ定義権限定義），GRANT CONNECT（CONNECT権限定義），GRANT RDAREA（RDエリア利用権限定義）

はじめに

このマニュアルは，プログラムプロダクト　ノンストップデータベース　HiRDB Version 9のデータベース操作に使用する，SQLの文法について説明したものです。なお，ここに記載されていない前提情報については，マニュアル「HiRDB Version 9 解説」（3020-6-450）を参照してください。

対象読者

HiRDB Version 9（以降，HiRDBと表記します）で表を設計，作成する方，およびUAPを作成，実行する方を対象にしています。

このマニュアルは次に示す知識があることを前提に説明しています。

Windowsのシステム管理の基礎的な知識（Windows版の場合）

UNIXまたはLinuxのシステム管理の基礎的な知識（UNIX版の場合）

SQLの基礎的な知識

C言語のプログラミング，COBOL言語のプログラミング，またはJavaのプログラミングの知識

なお，このマニュアルは次に示すマニュアルを前提としていますので，あらかじめお読みいただくことをお勧めします。

「HiRDB Version 9 システム導入・設計ガイド」

「HiRDB Version 9 UAP開発ガイド」

パス名の表記

パス名の区切りは「¥」で表記しています。UNIX版HiRDBを使用している場合はマニュアル中の「¥」を「/」に置き換えてください。ただし，Windows版とUNIX版でパス名が異なる場合は，それぞれのパス名を表記しています。

HiRDB運用ディレクトリのパスを%PDDIR%と表記します。ただし，Windows版とUNIX版でパス名が異なるため，それぞれを表記する場合，UNIX版は$PDDIRと表記します。例を次に示します。

　　　Windows版：%PDDIR%¥CLIENT¥UTL¥

　　　UNIX版：$PDDIR/client/lib/

Windowsのインストールディレクトリのパスを%windir%と表記します。

図中で使用している記号

このマニュアルの図中で使用している記号を，次のように定義します。

このマニュアルで使用している記号

形式および説明で使用している記号を次に示します。ここで説明する文法記述記号は，説明のための記号なので実際には記述しないでください。

記　号

意　味

例

｛　｝

この記号で囲まれた複数の項目のうちから一つを選択することを示します。

｛：埋込み変数｜？パラメタ｝

埋込み変数，または？パラメタのどちらかを選択して記述します。

〔　〕

この記号で囲まれた項目は省略できることを意味します。

複数の項目が並べて記述されている場合は，すべてを省略するか，記号｛　｝と同じくどれか一つを選択します。

〔｛ALL｜DISTINCT｝〕

すべてを省略するか，ALL，またはDISTINCTのどちらかを選択して指定します。すべてを省略した場合は，ALLを指定したときと同じ処置をします。

　（下線）

記号〔　〕で囲まれた複数項目のうち1項目に対して使用し，括弧内のすべての項目を省略したときシステムがとる標準値を示します。

…

この記号の直前に示された項目を繰り返し複数個指定できることを示します。

（列名〔，列名〕…）

列名を繰り返し複数個指定できます。そのとき，列名の前と後ろを記号（　）で囲みます。

（　）

記号（　）で囲まれた項目は，（　）を省略しないでそのまま記述することを示します。

△

一つの空白を示します。

＊DC△

▲

一つ以上の区切り文字を示します。

WHERE▲GNO＝1

::=

::=の左にあるものを右にあるもので定義することを示します。

表名::=〔認可識別子.〕表識別子

HiRDBのデータベース言語の出典

このマニュアルで記述するHiRDBのデータベース言語仕様は，次に示す規格を基に日立製作所独自の解釈と仕様を追加したものです。原開発者に謝意を表するとともに，仕様の出典を示します。

JIS X 3005規格群　データベース言語SQL

ISO/IEC 9075　Information technology − Database languages − SQL −

注

JIS：日本工業規格（Japanese Industrial Standard）

ISO：国際標準化機構（International Organization for Standardization）

IEC：国際電気標準会議（International Electrotechnical Commission）

1　基本項目

この章では，SQLを使用する場合の基本事項について説明します。

1.1　SQLの記述形式

1.1.1　オペランドの指定順序

オペランドは，各SQLの形式で記述している順序に従って指定します。

1.1.2　キーワードの指定

SQL文の名称（SELECT，UPDATEなど）のように，機能を使用するために指定する語をキーワードといいます。ほとんどのキーワードは，システムの予約語として登録されていますので，ユーザは決められた位置以外に指定できません。

ただし，予約語として登録されていないキーワードは，名前として使用できます。

キーワードの例を次に示します。予約語については，「予約語一覧」を参照してください。

1.1.3　数値の指定

SQL中に記述する数定数以外の数値は，符号なし整数の表記法，及び制限に従って指定します。指定方法については，「定数の表記法」又は「数定数の使用上の制限」を参照してください。

数定数以外の数値には，次に示す数値があります。

ソート項目指定番号（ORDER BY句のソート項目指定番号）

長さ及び最大長（文字データの長さ，及び最大長）

最大リソース数（プログラムで使用する表，及びインデクスの数の合計）

未使用領域の比率（表，及びインデクス定義の未使用領域の比率）

精度（10進数データのけた数）

位取り（10進数データの小数点以下のけた数）

データ保証レベル（ALTER PROCEDURE，ALTER ROUTINE，ALTER TRIGGER，CREATE PROCEDURE，CREATE TRIGGER，及びCREATE TYPE）

添字（繰返し列の添字）

最大要素数（繰返し列の最大要素数）

小数秒精度（時刻印データの小数点以下のけた数）

1.1.4　区切り文字の挿入

区切り文字には，次の文字を指定できます。

空白（X'20'）

TAB（X'09'）

NL（X'0a'）

CR（X'0d'）

全角空白

注釈（コメント）

(1)　区切り文字を挿入する位置

区切り文字を挿入する位置を次に示します。

キーワードとキーワードの間

キーワードと名前の間

名前と名前の間

キーワードと数値の間

名前と数値の間

区切り文字の挿入例を次の図に示します。

図1‒1　区切り文字の挿入例

(2)　区切り文字を挿入してはいけない位置

区切り文字を挿入してはいけない位置を次に示します。

キーワードの中

引用符（"）で囲まれていない名前の中

名前を囲む初めの引用符（"）の後ろ

名前を囲む終わりの引用符（"）の前

数定数の中

演算子の中

各国文字列定数を表す「N'…'」の「N」と初めの「'」の間

混在文字列定数を表す「M'…'」の「M」と初めの「'」の間

16進文字列定数を表す「X'…'」の「X」と初めの「'」の間

コンポネント指定で「..」と書く場合，ピリオドの間

区切り文字を挿入してはいけない位置の例を次の図に示します。

図1‒2　区切り文字を挿入してはいけない位置の例

(3)　区切り文字を挿入してもよい位置

区切り文字を挿入してもよい位置を次に示します。

次に示す特殊記号の前後で，かつ（2）で挿入を禁止されていない位置

「，」「．」「−」「＋」「＊」「’」「"」「（」「）」「＜」「＞」「＝」「＾」「！」「／」「？」「：」「；」「｜」「［」「］」「TAB」「NL」「CR」「空白」「全角空白」

区切り文字を挿入してもよい位置の例を次の図に示します。

図1‒3　区切り文字を挿入してもよい位置の例

(4)　注釈（コメント）

注釈には，囲み注釈と単純注釈があります。それぞれの注釈について説明します。

囲み注釈

SQL文中の「/*」から，それ以降に現れる最初の「*/」までのすべての文字を注釈とみなします。

単純注釈

システム共通定義pd_sql_simple_comment_useオペランドがYの場合に使用できます。SQL文中の「--」から，それ以降に現れる最初の改行コード（0x0a）までのすべての文字を注釈とみなします。

注釈を挿入する場合の注意事項を次に示します。

引用符（"）やアポストロフィ（'）で囲まれた「/*〜*/」，及び「--〜改行コード」は注釈とみなされません。

注釈だけのSQL文を実行すると，エラーになります。

注釈は入れ子にできません。

「/*>>〜<<*/」の形式の場合，SQL最適化指定とみなされます。SQL最適化指定については，「SQL最適化指定」を参照してください。

注釈の指定例を次に示します。

（正しい例）

CREATE TABLE T1(C1 INT) /* COMMENT */

CREATE /* COMMENT */ TABLE T1(C1 INT)

（誤った例）

SELECT * FROM T1 /* COMMENT
…終了記号（*/）がないため，エラーとなります。

CREATE TABLE T1 /* COMMENT1 /* COMMENT2 */ COMMENT3 */(C1 INT)
…注釈の入れ子はできないため，エラーとなります。

1.1.5　SQLで使用できる文字

SQLで使用できる文字を次の表に示します。

表1‒1　SQLで使用できる文字

種　別

SQLで使用できる文字

文字列定数

半角文字コード（X'00'を除く）

各国文字列定数

全角文字コードのすべての文字

混在文字列定数

半角文字コード（X'00'を除く），及び全角文字コードのすべての文字

上記以外

次に示す半角文字コードの文字

英大文字（A〜Z，¥，@，#）

英小文字（a〜z）

数字（0〜9）

空白

下線文字（＿）

片仮名文字

全角文字コードのすべての文字

次に示す特殊記号（半角文字コード）

コンマ（，）

ピリオド（．）

ハイフン又は負符号（−）

正符号（＋）

アスタリスク（＊）

アポストロフィ（'）

引用符（"）

左括弧（（ ）

右括弧（ ））

小なり演算子（＜）

大なり演算子（＞）

等号演算子（＝）

サーカムフレックス（^）

感嘆符（！）

斜線（／）

疑問符（？）

コロン（：）

セミコロン（；）

パーセント（%）

垂直棒（｜）

左角括弧（［）

右角括弧（］）

TAB（X'09'）

NL（X'0a'）

CR（X'0d'）

SQLで使用できる文字は，pdsetupコマンドで指定した文字コード種別によって異なります。pdsetupコマンドについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

使用できる文字には，半角文字と全角文字があって，それぞれ使用できるコードが異なります（UNIX版の場合，単一バイト文字コードには全角文字はありません）。指定した文字コード種別と使用する文字の関係は，次のとおりです。

指定した文字コード

半角文字

全角文字

備　考

複数バイト

文字コード

sjis※3

（シフトjis漢字）

JISX0201

JISX0208

全角文字に外字を含みます。

ujis※2

（EUC日本語漢字）

JISX0201

JISX0208

全角文字に外字を含みません。※1

chinese

（EUC中国語漢字）

ISO-8859-1

（80〜FFを除きます）

GB2312-80

全角文字に外字は含みません。※1

utf-8※3※4※6

（Unicode(UTF-8)）

JISX0221

JISX0221

全角文字に外字を含みます。ASCIIコードの範囲では，ほかの文字コードと差異はありませんが，1文字が6バイト※5となることがあります。

MS-Unicode

MS-Unicode

utf-8_ivs※3※4※6

（Unicode（IVS対応UTF-8））

JISX0221

JISX0221

全角文字に外字を含みます。ASCIIコードの範囲では，ほかの文字コードと差異はありませんが，1文字が10バイト※5となることがあります。

MS-Unicode

MS-Unicode

（異体字を含む）

chinese-gb18030

（中国語漢字GB18030）

ISO-8859-1

（80〜FFを除きます）

GB18030-2000

全角文字に外字を含みます。ASCIIコードの範囲では，ほかの文字コードと差異はありませんが，1文字が4バイトになることがあります。

単一バイト

文字コード

lang-c※2

（8ビットコード）

各コードに従います。

−

US ASCII，及び8ビットコードの場合に使用できます。

（凡例）

−：該当する内容はありません。

注※1

EUCコードセット3（（8F）₁₆（xxxx）₁₆の3バイトで表現される文字コード）に割り当てられた外字コードは使用できません。

注※2

Windows版の場合は使用できません。

注※3

JavaのUAPとHiRDB，又はHiRDBとJavaルーチンの間で，日本語データをStringクラス及びそれを継承したクラスを介して受け渡す場合，Javaの文字コードのマッピング規則（該当する文字コードとUnicode）に従います。このとき，外字コードが正しく変換されないことがあるため，注意してください。

注※4

HiRDBでは，UTF-8のエンコードルールだけを意識し，コードと文字のマッピングについては意識していません。このため，UTF-8のエンコードルールに従った文字を使用できます。ただし，文字コード変換では文字セットとエンコードルールの関係を意識する必要があるため，HiRDBクライアントの文字コードがSJISでHiRDBサーバの文字コードがUTF-8の場合，クライアント環境定義のPDCLTCNVMODEを指定するときは，JISX0221，又はMS-Unicodeのどちらを使用しているか意識する必要があります。PDCLTCNVMODEについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注※5

4バイト以上の文字を使用する場合は，システム定義のpd_substr_lengthオペランド及びクライアント環境定義PDSUBSTRLENの設定が必要な場合があります。pd_substr_lengthオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

なお，ISO/IEC 10646では，文字が割り当てられているのは1文字1〜4バイト（utf-8_ivsの場合は，1〜4，7及び8バイト）の範囲です。5及び6バイト（utf-8_ivsの場合は，5，6，9及び10バイト）の範囲は将来の規格のために予約されており，文字が割り当てられていません。したがって，文字が割り当てられていない1文字5，6バイト（utf-8_ivsの場合は，5，6，9及び10バイト）の範囲を使用した場合は，将来発生するかもしれない問題について保証できません。

注※6

utf-8とutf-8_ivsでは，字形の種類を表すコード（VS（Variation Selector）：字形選択子）の扱いが異なります。utf-8の場合，基底文字とVSはそれぞれ別の一つの文字として扱い，utf-8_ivsの場合，基底文字とVSを合わせて1文字として扱います。そのため，utf-8の場合は1文字の長さが1〜6バイトになりますが，utf-8_ivsの場合は1文字の長さが1〜10バイトになります。

1.1.6　SQLの最大長

一つのSQL文は，2,000,000バイトまで記述できます。

1.1.7　名前の指定

名前の指定には，引用符（"）で囲んで指定する方法と，引用符（"）で囲まないで指定する方法があります。

参考

名前を指定する場合，引用符（"）で囲んで指定することを推奨します。なお，名前を引用符（"）で囲んだ場合，半角英小文字，及び半角英大文字は区別して扱います。

理由

名前には，予約語と同じ名前を指定できませんが，引用符（"）で囲んだ場合は，予約語と同じ名前を指定できます。SQLの拡張に伴って，システムに登録する予約語を追加する場合がありますので，名前はあらかじめ引用符（"）で囲んで指定しておくと，追加した予約語と重複する問題が発生しません。

ただし，手続き中又は関数中に指定するカーソル名以外で，次に示す名前をUAPで使用する場合は，引用符（"）で囲まないで指定してください。

カーソル名

SQL文識別子

埋込み変数名，標識変数名，ホスト識別子

(1)　共通規則

名前に使用できる文字と長さ（バイト数）の制限については，表「名前に使用できる文字と制限」を参照してください。

名前に使用する文字は，半角と全角を混在させて使用できます。

引用符（"）で囲まないで指定した場合，半角英小文字は，半角英大文字として扱います。

引用符（"）で囲んで指定した場合，半角英小文字，及び半角英大文字を区別して扱います。

名前の先頭の文字は，半角英大文字，半角英小文字，又は半角片仮名大文字（ア〜ン，ヲ），又は全角文字で始めてください。

全角空白を含むことはできません。

以下の文字を含む場合は，引用符（"）で囲んで指定してください。

半角空白

半角ハイフン

ただし，半角ハイフンを含むカーソル名は，手続き又は関数の中に指定する場合だけ引用符（"）で囲んでください。

表1‒2　名前に使用できる文字と制限

名前の種類

制限バイト数，又は制限文字数

半角文字の使用可否

全角文字の使用可否

英大文字数字

英小文字

片仮名文字

下線（＿）

空白

ハイフン（−）

インデクス型識別子

30バイト

○

○

○※2

○

○

○

○※2

インデクス識別子

○

○

○※2

○

○

○

○※2

埋込み変数名

21文字，22文字，30文字，31文字，63文字※1

○※4

○

○※4

○

×

○※4

○※4

カーソル名

30バイト

○

○

○※2

○

×

○

○※2

外部ルーチン名

255バイト

○

○

○※2

○

×

○

○※2

条件名

30バイト

○

○

○※2

○

○

○

○※2

相関名

○

○

○※2

○

○

○

○※2

属性名

○

○

○※2

○

○

○

○※2

データ型識別子

○

○

○※2

○

○

○

○※2

問合せ名

○

○

○※2

○

○

○

○※2

トリガ識別子

○

○

○※2

○

○

○

○※2

認可識別子

30バイト※5

○

○

×

×

×

×

×

パスワード※3

30バイト

○

○

×

×

×

×

×

表識別子

○

○

○※2

○

○

○

○※2

標識変数名

30文字，31文字，63文字※1

○※4

○

○※4

○

×

○※4

○※4

文ラベル

30バイト

○

○

○※2

○

○

○

○※2

ループ変数名

○

○

○※2

○

○

○

○※2

ホスト識別子

30文字，31文字，63文字※1

○※4

○

○※4

○

×

○※4

○※4

リスト名

30バイト

○

○

○※2

○

○

○

○※2

ルーチン識別子

○

○

○※2

○

○

○

○※2

列名

○

○

○※2

○

○

○

○※2

RDエリア名

○

○

×

○

○

○

×

SQLパラメタ名

○

○

○※2

○

○

○

○※2

SQL文識別子

○

○

○※2

○

×

○

○※2

SQL変数名

○

○

○※2

○

○

○

○※2

制約名

○

○

○※2

○

○

○

○※2

XQuery変数識別子

○

○

○※2

○

○

○

○※2

順序数生成子識別子

○

○

○※2

○

○

○

○※2

接続制約名

○

○

○※2

○

○

○

○※2

（凡例）

○：使用できます。

×：使用できません。

注※1

埋込み変数名，標識変数名，及びホスト識別子の長さは次のとおりです。

名前の種類

ホスト言語

COBOL85

COBOL2002

C言語

埋込み変数名

BLOB型

21文字まで

22文字まで

63文字まで

BLOB型以外

30文字まで

31文字まで

標識変数名，及びホスト識別子

COBOL85及びCOBOL2002の場合，全角文字は１文字としてカウントします。C言語の場合，ユニバーサル文字名は１文字としてカウントします。

注※2

使用する文字コードによって制限されます。pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs，又はchinese-gb18030を指定した場合は使用しないでください。

注※3

パスワードについての規則を次に示します。

先頭は英字にしてください。

数字だけのパスワードは指定できません。

「単一文字種の指定禁止」を使用した場合，英大文字だけのパスワードは指定できません。また，英小文字だけのパスワードも指定できません。

注※4

COBOL85及びCOBOL2002の場合

埋込み変数名，標識変数名，及びホスト識別子には，a〜z，A〜Z，0〜9，下線(_)，ハイフン(−)，半角片仮名，及び全角文字が使用できます。

全角文字と半角文字を混在させて使用できます。

C言語の場合

埋込み変数名，標識変数名，及びホスト識別子には，a〜z，A〜Z，0〜9，及び下線（_）が使用できます。

コンパイラがユニバーサル文字名（¥uxxxx及び¥Uxxxxxxxx）をサポートしていれば，ユニバーサル文字名を使用できます。

マルチバイト文字は使用できません。

注※5

認可識別子の制限バイト数30バイトはHiRDBの仕様です。HiRDBと連携する関連製品では認可識別子の制限バイト数が異なりますので，ご使用の際は各製品の仕様を確認してください。

(2)　SQLの予約語と重複したときの対応

名前がSQLの予約語と重複したときの対応方法を次に示します。(a)の方法を推奨します。(b)の方法は，アプリケーションの修正ができない場合など，SQLが修正できないときに使用してください。

(a)　SQLを修正する

予約語と重複する名前を引用符（"）で囲むようにSQLを修正してください。なお，名前を引用符（"）で囲んだ場合，半角英小文字と半角英大文字は区別して扱われるので注意してください。

(b)　SQL予約語削除機能を使用する

SQL予約語削除機能とは，SQLの予約語として登録してあるキーワードを予約語から削除する機能です。名前と重複した予約語がSQL予約語削除機能で削除できる予約語の場合，予約語から削除することで，名前を引用符（"）で囲まなくても使用できるようになります。SQL予約語削除機能で削除できる予約語については，「SQL予約語削除機能で削除できる予約語」を参照してください。SQL予約語削除機能で削除できない予約語の場合は，(a)の方法でSQLを修正してください。

削除した予約語は，名前として使用できるようになりますが，同時にキーワードではなくなるため，削除した予約語を使うSQLの機能が使用できなくなる場合があります。使用できなくなるSQLの機能については，「SQL予約語削除機能で削除できる予約語」を参照してください。

使用方法

SQL予約語削除機能で削除する予約語を記述したSQL予約語削除ファイルは，システム共通定義pd_delete_reserved_word_fileオペランドであらかじめ指定する必要があります。システム共通定義pd_delete_reserved_word_fileオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

また，SQL予約語削除機能を使用する場合は，クライアント環境変数PDDELRSVWDFILEによって，使用するSQL予約語削除ファイルを指定する必要があります。クライアント環境変数PDDELRSVWDFILEについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注意事項

SQLオブジェクトを再作成するSQLを実行する場合，クライアント環境変数PDDELRSVWDFILEには，定義時に指定した予約語削除ファイルを指定してください。

ディクショナリ搬出入ユティリティ（pdexp）で表の搬出入を行う場合，クライアント環境変数PDDELRSVWDFILEには，定義時に指定した予約語削除ファイルを指定してください。また，搬出元と搬入先で以下の内容を合わせておいてください。

・%PDDIR%¥conf¥pdrsvwd下の全ファイル

・システム共通定義pd_delete_reserved_word_fileオペランドの指定値

1.1.8　名前の修飾

名前の修飾は，ピリオド（．）によって，認可識別子，表識別子などを連結して，認可識別子を明示したり，名前を一意にしたりするときに使用します。

(1)　表名，インデクス名，インデクス型名，ユーザ定義型名，ルーチン名，トリガ名，及び順序数生成子名

それぞれの名前の内容と形式を次に示します。

表名：

表識別子を認可識別子で修飾したもの

インデクス名：

インデクス識別子を認可識別子で修飾したもの

インデクス型名：

インデクス型識別子を認可識別子で修飾したもの

ユーザ定義型名：

データ型識別子を認可識別子で修飾したもの

ルーチン名：

ルーチン識別子を認可識別子で修飾したもの

トリガ名：

トリガ識別子を認可識別子で修飾したもの

順序数生成子名：

順序数生成子識別子を認可識別子で修飾したもの

表名：：＝〔認可識別子.〕表識別子

インデクス名：：＝〔認可識別子.〕インデクス識別子

インデクス型名：：＝〔認可識別子.〕インデクス型識別子

ユーザ定義型名：：＝〔認可識別子.〕データ型識別子

ルーチン名：：＝〔認可識別子.〕ルーチン識別子

トリガ名：：＝〔認可識別子.〕トリガ識別子

順序数生成子名：：＝〔認可識別子.〕順序数生成子識別子

指定項目

指定内容

規　則

認可識別子

指定する表識別子，インデクス識別子，インデクス型識別子，データ型識別子，ルーチン識別子，及びトリガ識別子が自分のものであれば，自分の認可識別子を指定します。他ユーザが所有するものであれば，そのユーザの認可識別子を指定します。ただし，表識別子にパブリックビュー，ルーチン識別子にパブリック手続き，パブリック関数の名前を指定する場合は，PUBLICを指定します。

なお，PUBLICの指定は，引用符で囲んだ指定，及び引用符で囲まない指定のどちらでも指定できます。

認可識別子を省略すると，次のとおりに仮定されます。

ユティリティの実行時

ユティリティを起動するユーザの認可識別子

UAPの実行時※1

UAPで認可識別子を省略すると，次の順で仮定されます。

プリプロセスで指定した認可識別子

CONNECT文のオペランドで指定した認可識別子

CONNECT文のオペランドで指定がなかった場合は，クライアント環境定義PDUSERで指定した認可識別子

PUBLIC（表識別子，ルーチン識別子※2を指定した場合）

表識別子

実表又はビュー表の名前を指定します。

インデクス識別子

インデクスの名前を指定します。

インデクス型識別子

インデクス型の名前を指定します。

データ型識別子

ユーザ定義型の名前を指定します。

ルーチン識別子

手続き又は関数の名前を指定します。

トリガ識別子

トリガの名前を指定します。

順序数生成子識別子

順序数生成子の名前を指定します。

注※1

定義系SQL，PREPARE文，又はEXECUTE IMMEDIATE文で指定したSQLの文字列中で認可識別子を省略した場合，次に示す順位で認可識別子が仮定されます。

CONNECT時の認可識別子

クライアントの環境変数に設定された認可識別子

UAP実行ユーザ

PUBLIC（定義系SQL以外で表識別子，ルーチン識別子を指定した場合）

注※2

ルーチン識別子の場合の認可識別子MASTERに関しては，「スキーマパス」を参照してください。

(2)　表指定

表指定は，一つのSQL文中に二つ以上の表を指定する場合に，指定する列，＊，又はROWがどの表に対応するかを一意にするための修飾子で，表名，又は相関名を指定します。

相関名とは，同じ表同士の結合をしたい場合，及び同じ表を副問合せ中で指定し，その問合せ中で外側の問合せの表の列も参照する場合に，指定するそれらの表の別名として使用します。相関名を指定すると，一つの表を二つの異なる表として使用できます。

表指定：：＝｛〔認可識別子.〕表識別子｜相関名｜問合せ名｝

WITH句を用いた問合せ式の問合せ式本体中の一つのFROM句に，WITH句に指定した問合せ名と，その問合せ名と同じ表識別子を指定する場合は，表識別子を認可識別子で明示的に修飾し，更にその問合せ名，及び表識別子に相関名を指定して名前を区別する必要があります。

WITH句を用いた問合せ式の問合せ本体中の表指定では，名前を認可識別子で修飾した場合，その名前を表識別子として扱い，名前を認可識別子で修飾しない場合，その名前を問合せ名，又は表識別子として扱います。ただし，名前を認可識別子で修飾しない場合の名前の優先順位は，問合せ名，表識別子の順になります。

表指定での修飾例を次に示します。

（例1）

複数の表（ZAIKO，JUTYU）にある同じ名前の列（SCODE）を参照するために，表名（ZAIKO）で修飾する場合

  SELECT ZAIKO.SCODE,SNAME,TCODE
      FROM ZAIKO,JUTYU
      WHERE ZAIKO.SCODE = JUTYU.SCODE

（例2）

同じ表（ZAIKO）同士の結合で，相関名（X，Y）を使用して修飾する場合

（商品コード101Mと同じ色の商品を検索します）

  SELECT X.* FROM ZAIKO X,ZAIKO Y
      WHERE X.COL = Y.COL AND Y.SCODE = '101M'

（例3）

相関名を使用して，長い名称の表名に対する記述を簡略化する場合

（ディクショナリ表から，自分の所有する表（ZAIKO）が格納されているRDエリアの名称を検索します）

  SELECT X.RDAREA_NAME
      FROM MASTER.SQL_RDAREAS X,
      MASTER.SQL_TABLES Y
      WHERE Y.TABLE_SCHEMA = 'U'
      AND Y.TABLE_NAME = 'ZAIKO'
      AND X.RDAREA_NAME = Y.RDAREA_NAME

（例４）

WITH句を用いた問合せ式で，問合せ式本体中の一つのFROM句にWITH句中の問合せ名（ZAIKO）と，その問合せ名と同じ名称の表識別子（ZAIKO）を指定する場合

  WITH ZAIKO(QC1,QC2) AS (SELECT SCODE,TANKA*ZSURYO FROM ZAIKO)
      SELECT * FROM ZAIKO X,USER1.ZAIKO Y

(3)　列指定

次の場合，列名又は繰返し列名を表指定で修飾する必要があります。この修飾された列名又は繰返し列名を列指定といいます。

一つのFROM句に複数の表を指定した検索（二つ以上の表の結合）のときに，検索対象の複数の表に同じ列名がある場合（修飾しないと，指定した列がどの表の列なのか分かりません）

WITH句を用いた問合せ式の問合せ式本体中の一つのFROM句に，複数の問合せ名や表名を指定（二つ以上の表の結合）したときに，検索対象の複数の表，又はWITH句中の導出問合せ式によって導出された表に同じ列名がある場合（修飾しないと，指定した列がどの表の列なのか分かりません）

（誤った例）

選択式に指定したCLM1は，問合せ名QRY1の列名なのか，問合せ名QRY2の列名なのかが分からないため，列名を修飾してください。

      WITH QRY1(CLM1) AS (SELECT SNAME FROM ZAIKO),
           QRY2(CLM1) AS (SELECT SCODE FROM ZAIKO)
           SELECT CLM1 FROM QRY1,QRY2

（正しい例）

指定した列は，修飾した列名にする必要があります。

      WITH QRY1(CLM1) AS (SELECT SNAME FROM ZAIKO),
           QRY2(CLM1) AS (SELECT SCODE FROM ZAIKO)
           SELECT QRY1.CLM1,QRY2.CLM1 FROM QRY1,QRY2

副問合せを指定した場合，副問合せ中のWHERE句，又はHAVING句中で，その副問合せの外側のFROM句で指定した表，又は更新する表の列を参照するとき（修飾しないと，外側の表の列を参照できません）

ただし，列名は構文上，修飾できる場合とできない場合があります。各形式中の「列指定」と記述している箇所は，列名に修飾できます。「列名」と記述している箇所は，修飾できません。

列指定：：＝〔表指定.〕｛列名｜繰返し列名〔［添字］〕｝

添字：：＝｛整数｜ANY｝

列名を表指定で修飾する場合，次に示す規則があります。

列名は，指定する相関名，又は表名の有効範囲内でだけ，その相関名，又は表名を修飾できます。相関名及び表名の有効範囲については，「表参照」，「DELETE文　形式1（行削除）」，及び「UPDATE文　形式1（データ更新）」を参照してください。

副問合せ中に，同じ名前の有効な表指定（相関名，又は表名）を複数指定した場合，その表指定（相関名，又は表名）を参照すると，最も内側にある問合せで指定している表指定（相関名，又は表名）が指定されます。

同じ名前の有効な表名が複数ある例を次に示します。

（例）

副問合せ中では，T1¹とT1²の両方の指定が有効です。T1を参照すると，最も内側にある問合せのT1²が適用されます。

      SELECT * FROM T1¹
          WHERE T1¹.C2 >=
            ( SELECT AVG(C2) FROM T1²
              WHERE T1².C1 = 1       )

　　　T1¹の有効範囲：SELECT ＊ FROM T1¹以降

　　　T1²の有効範囲：（SELECT AVG（C2） FROM T1²以降

なお，最も局所的な有効範囲を持つ表が複数ある（一つのFROM句に同一の表名が複数ある）場合，相関名で修飾する必要があります。

FROM句に同一の表名が複数ある例を次に示します。

（誤った例）

副問合せの範囲は最も局所的な有効範囲を持つ表T1¹とT1²がある場合，この指定では誤りになるため，相関名を指定してください。

      SELECT * FROM T2
          WHERE C3 IN
            ( SELECT T1¹.C3 FROM T1¹,T1²
              WHERE T1¹.C1 = T1².C3     )

　　　最も局所的な有効範囲：(SELECT T1¹.C3 FROM T1¹,T1²以降

（正しい例）

指定した列は，修飾子で指定した表になければなりません。

      SELECT * FROM T2
          WHERE C3 IN
            ( SELECT X.C3 FROM T1¹ X,T1² Y
              WHERE X.C1 = Y.C2           )

列名を表指定で修飾できますが，修飾しない場合，最も局所的な有効範囲を持つ中に，指定した列を含む表を示すものが一つだけ必要です。

1.1.9　スキーマパス

スキーマパスとは，認可識別子で明示的に修飾していないルーチン名，インデクス型名，ユーザ定義型名のスキーマの探索順序を決定するものです。

インデクス型名，ユーザ定義型名の場合は，対象となるスキーマにインデクス型名，ユーザ定義型名がないときに，次のスキーマを探索します。

関数名の場合は，呼び出す関数の決定規則に従って候補となる関数がないときに，次のスキーマを探索します。呼び出す関数の決定規則については，「関数呼出し」を参照してください。

(1)　探索順序

探索するスキーマは，次の順序で仮定されます。

省略時に仮定する認可識別子のユーザのスキーマ

省略時に仮定する認可識別子については，「名前の修飾」を参照してください。

MASTERのスキーマ

(2)　スキーマパスの適用範囲

認可識別子で修飾しない指定で，定義済みのルーチン名，インデクス型名，ユーザ定義型名の参照時に適用します。

1.2　データ型

1.2.1　データ型

データ型は次の二つに分けられます。

既定義型

ユーザ定義型

形式

データ型：：＝｛既定義型｜ユーザ定義型｝

説明

既定義型

HiRDBが提供するデータ型を指定します。

ユーザ定義型

ユーザ定義型は次の形式で指定します。

〔認可識別子.〕データ型識別子

認可識別子

ユーザ定義型の認可識別子を指定します。

データ型識別子

ユーザ定義型のデータ型識別子を指定します。

(1)　既定義型

既定義型を次の表に示します。

表1‒3　既定義型

分　類

データ型※１

データ形式

説　明

数データ

INT〔EGER〕

整数

（4バイトの2進形式）

値の範囲が−2147483648〜2147483647の整数です。

SMALLINT

整数

（2バイトの2進形式）

値の範囲が−32768〜32767の整数です。

〔LARGE〕

DEC〔IMAL〕

〔（m〔，n〕）〕

又は

NUMERIC

〔（m〔，n〕）〕

固定小数点数

（↑（m＋1）/2↑バイトのパック10進形式）※８

精度（全体のけた数）がmけたで，位取り（小数点以下のけた数）がnけたの固定小数点数です。

m，nは正整数で，1≦m≦38，0≦n≦38，n≦mです。

mを省略すると，15が仮定されます。

nを省略すると，0が仮定されます。

FLOAT又は

DOUBLE PRECISION

倍精度浮動小数点数

（8バイト）

値の範囲が約±4.9×10⁻³²⁴〜±1.7×10³⁰⁸の倍精度浮動小数点数です。※４

SMALLFLT又は

REAL

単精度浮動小数点数

（4バイト）

値の範囲が約±1.4×10⁻⁴⁵〜±3.4×10³⁸の単精度浮動小数点数です。※４

文字データ※10

CHAR〔ACTER〕

〔(n)〕 〔CHARACTER SET 文字集合指定〕

固定長文字列

（長さnバイト）

長さがnバイトの固定長文字列です。

文字集合指定なしの場合

1バイト文字から成る固定長文字列です。

文字集合指定ありの場合

文字集合の任意の文字から成る固定長文字列です。

nは正整数で1≦n≦30,000です。nを省略すると，1が仮定されます。

文字集合指定は文字データに対する属性を指定します。詳細は「文字集合」を参照してください。

〔LONG〕

VARCHAR(n)〔CHARACTER SET 文字集合指定〕又は

CHAR〔ACTER〕VARYING(n)〔CHARACTER SET 文字集合指定〕

可変長文字列

（最大長nバイト）

最大長がnバイトの可変長文字列です。

文字集合指定なしの場合

1バイト文字から成る可変長文字列です。

文字集合指定ありの場合

文字集合の任意の文字から成る可変長文字列です。

nは正整数で1≦n≦32,000です。実長は0以上です。

文字集合指定は文字データに対する属性を指定します。詳細は「文字集合」を参照してください。

各国文字データ※６※９

NCHAR〔(n)〕又は

NATIONAL CHAR〔ACTER〕〔(n)〕

固定長各国文字列

（長さn文字）

長さn文字（2nバイト）の2バイト文字から成る固定長各国文字列です。

nは正整数で1≦n≦15,000です。nを省略すると，1が仮定されます。

〔LONG〕

NVARCHAR(n)又は

NATIONAL CHAR〔ACTER〕VARYING(n)又は

NCHAR VARYING(n)

可変長各国文字列

（最大長n文字）

最大長がn文字（2nバイト）の2バイト文字から成る可変長各国文字列です。

nは正整数で1≦n≦16,000です。実長は0以上です。

混在文字データ※６

MCHAR〔(n)〕

固定長混在文字列

（長さnバイト）

長さnバイトの半角文字と全角文字の混在する固定長混在文字列です。

nは正整数で1≦n≦30,000です。nを省略すると，1が仮定されます。

〔LONG〕

MVARCHAR(n)

可変長混在文字列

（最大長nバイト）

最大長nバイトの半角文字と全角文字の混在する可変長混在文字列です。

nは正整数で1≦n≦32,000です。実長は0以上です。

日付データ

DATE

日付

（4バイト符号なしパック形式YYYYMMDD）

YYYY：0001〜9999（年）

MM：01〜12（月）

DD：01〜該当年月の最終日（日）

年，月，日の三つの領域を持つ日付のデータ型です。

時刻データ

TIME

時刻

（3バイト符号なしパック形式hhmmss）

hh：00〜23（時）

mm：00〜59（分）

ss：00〜61（秒）※11

時，分，秒の三つの領域を持つ時刻のデータ型です。

時刻印データ

TIMESTAMP〔(p)〕

時刻印

（7〜10バイトの符号なしパック形式YYYYMMDDhhmmss〔nn…n〕）

YYYY：0001〜9999（年）

MM：01〜12（月）

DD：01〜該当年月の最終日（日）

hh：00〜23（時）

mm：00〜59（分）

ss：00〜61（秒）※11

nn…n：pけたの小数秒（n：0〜9）

年，月，日，時，分，秒の六つの領域を持つ時刻印のデータ型です。

pは整数で，p=0，2，4，又は6です。省略した場合は，p=0が仮定されます。

日間隔データ

INTERVAL YEAR TO DAY

日間隔

（5バイトパック形式 0YYYYMMDDs）

YYYY：0000〜9999（か年）

MM：00〜99※２（か月）

DD：00〜99（か日）

s：符号（正：C，F　負：D）※８

日付データ型が，ある一時点を表すのに対して，日間隔データ型は，日付と日付の間隔を表すデータ型です。

日間隔の範囲は，−9999か年11か月99か日間〜9999か年11か月99か日間です。

時間隔データ

INTERVAL HOUR TO SECOND

時間隔

（4バイトパック形式 0hhmmsst）

hh：00〜99（時間）

mm：00〜99※３（分）

ss：00〜99※３（秒）

t：符号（正：C，F　負：D）※８

時刻データ型が，ある一時点を表すのに対して，時間隔データ型は，時刻と時刻の間隔を表すデータ型です。

時間隔の範囲は−99時間59分59秒〜99時間59分59秒です。

長大データ

BLOB〔（n〔｛K｜M｜G｝〕）〕

又は

BINARY LARGE OBJECT〔（n〔｛K｜M｜G｝〕）〕

バイナリデータ列

（最大長nバイト）

K：キロバイト単位

M：メガバイト単位

G：ギガバイト単位

最大長nバイトのバイナリデータ列です。

nを省略すると，2,147,483,647バイトが仮定されます。実長は0以上です。単位としてK，M，及びGが指定できます。※５

単位（K，M，又はG）を省略すると，バイト単位となります。

バイナリデータ

BINARY(n)

バイナリデータ列

（最大長nバイト）

最大長nバイトのバイナリデータ列です。

nは省略できません。実長は0以上です。nは正整数で，1≦n≦2,147,483,647バイトです。

論理データ

BOOLEAN※７

論理値（4バイト）

論理値として真（TRUE），偽（FALSE），否定（UNKNOWN）をとります。

注1

文字データ，及び混在文字データの比較，及びデータ変換時，埋字の空白として使用する半角文字を次に示します。

データ型

文字集合指定

空白文字コード

文字データ

省略

X'20'

EBCDIK

X'40'

UTF16

X'0020'※

混在文字データ

X'20'

各国文字データ

使用している文字コードに依存

注※

？パラメタを介して文字コードがUTF-16のデータを操作する場合，文字集合名記述領域に文字集合名を指定してください。

また，プリプロセスオプション，及び埋込み変数の定義に，文字コードがUTF-16のデータを操作できるように指定することで，埋込み変数を介して文字コードがUTF-16のデータを操作できるようになります。

文字集合名に指定できる値を示します。

UTF16

UTF-16BE

UTF-16LE

文字集合名を指定した場合の空白文字コードを次に示します。

UTF16，及びUTF-16BEの場合

X'0020'

UTF-16LEの場合

X'2000'

UTF-16LE及びUTF-16BE（文字集合名記述領域のSQLCSNに設定できる文字集合情報）については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注2

使用できる半角文字，及び全角文字の文字コードについては，表「SQLで使用できる文字」の注を参照してください。

注※1

各データ型はこれ以降，それぞれ代表的なデータ型を使用して示します。

注※2

12以上を指定した場合，年に繰り上げます。

注※3

mm，ssに60以上を指定した場合，それぞれ時，分に繰り上げます。

注※4

浮動小数点数の値の範囲は，ハードウェア表現に従います。

注※5

最大長を単位指定する場合の，指定範囲と実際の最大長を次に示します。

単　位

nの指定範囲

実際の最大長（バイト）

K

1≦n≦2097152

n×1024

M

1≦n≦2048

n×1048576

G

1≦n≦2

n×1073741824

ただし，実際の最大長の計算結果が2147483648の場合は，2147483647になります。

注※6

pdsetupコマンドで文字コード種別にlang-cを指定した場合，各国文字データ，及び混在文字データは定義できません（UNIX版限定）。

注※7

BOOLEANは，関数の戻り値のデータ型としてだけ使用できます。列，SQL変数，又はSQLパラメタのデータ型としては使用できません。

注※8

DECIMAL型，日間隔型，及び時間隔型の符号部については，「DECIMAL型使用上の注意事項」を参照してください。

注※9

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs，又はchinese-gb18030を指定した場合，各国文字データは定義できません。

注※10

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にsjis以外を指定した場合，文字集合指定にEBCDIKを指定した文字データは使用できません。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs以外を指定した場合，文字集合指定にUTF16を指定した文字データは使用できません。

文字集合指定にUTF16を指定した場合，nは2の倍数にしてください。

注※11

pd_leap_secondがNの場合，ssの範囲は00〜59（秒）となります。pd_leap_secondオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

(2)　ユーザ定義型

ユーザ定義型を次の表に示します。

表1‒4　ユーザ定義型

データ型

データ形式

説明

抽象データ型

−

CREATE TYPEで定義するデータ型を示します。データ型中に属性定義，ルーチンなどを定義できます。

（凡例）−：該当しません。

1.2.2　変換（代入，比較）できるデータ型

変換（代入，比較）できるデータ型を次の表に示します。ただし，CAST指定，及びスカラ関数を使用して変換できるデータ型については，それぞれ「スカラ関数」，「CAST指定」を参照してください。

表1‒5　変換（代入，比較）できるデータ型（1/2）

変換前データ型

変換後データ型

数データ

文字データ

各国文字データ

混在文字データ

日付データ

時刻データ

時刻印データ

INTEGER

CHARACTER

NCHAR

MCHAR

DATE

TIME

TIMESTAMP

SMALLINT

DECIMAL

VARCHAR

NVARCHAR

MVARCHAR

FLOAT

SMALLFLT

DF

EK

U16

数データ

INTEGER

SMALLINT

DECIMAL

FLOAT

SMALLFLT

○,○

○,×※１

×,×

○,×※１

×,×

×,×

×,×

文字データ

CHARACTER

VARCHAR

DF

△,△※２※３

○,○

△,△

※14

△,△

※17

△,△※７

○,○

△,△※４

△,△※５

△,△※６

EK

△,×

※15

○,○

×,×

×,×

×,×

U16

△,△※16

×,×

○,○

×,×

△,△

※16

各国文字データ

NCHAR

NVARCHAR

×,×

×,×

○,○

×,×

×,×

×,×

×,×

混在文字データ

MCHAR

MVARCHAR

△,△※２※３

○,○

×,×

△,△

※17

×,×

○,○

×,×

×,×

×,×

日付データ

DATE

×,×

×,△※８

×,×

×,×

○,○

×,×

×,×

時刻データ

TIME

×,×

×,△※９

×,×

×,×

×,×

○,○

×,×

時刻印データ

TIMESTAMP

×,×

×,△※10

×,×

×,×

×,×

×,×

○,○※11

日間隔データ

INTERVAL YEAR TO DAY

×,△※12

×,×

×,×

×,×

×,×

×,×

×,×

時間隔データ

INTERVAL HOUR TO SECOND

×,△※13

×,×

×,×

×,×

×,×

×,×

×,×

長大データ

BLOB

×,×

×,×

×,×

×,×

×,×

×,×

×,×

バイナリデータ

BINARY(n)

1≦n≦32,000

×,×

×,×

×,×

×,×

×,×

×,×

×,×

バイナリデータ

BINARY(n)

n＞32,000

×,×

×,×

×,×

×,×

×,×

×,×

×,×

論理データ

BOOLEAN

×,×

×,×

×,×

×,×

×,×

×,×

×,×

抽象データ型

×,×

×,×

×,×

×,×

×,×

×,×

×,×

（凡例）

○：変換できます。

△：制限付きで変換できます。

×：変換できません。

DF：既定文字集合

EK：EBCDIK

U16：UTF16，UTF-16LE又はUTF-16BE

文字集合名UTF-16LE，UTF-16BEは，次の場合に指定してください。

?パラメタを介して文字コードがUTF-16のデータを操作する場合

プリプロセスオプション，及び埋込み変数の定義に，文字コードがUTF-16のデータを操作できるように指定し，埋込み変数を介して文字コードがUTF-16のデータを操作する場合

文字集合UTF-16LE及びUTF-16BE（文字集合名記述領域のSQLCSNに設定できる文字集合情報）については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注

表中の変換可否は，「代入可否，比較可否」となっています。例えば，「○，○」の場合は代入及び比較ができて，「○，×」の場合は代入はできるが比較はできないということになります。

注※1

数データを文字データに変換する場合の対応関係を次に示します。なお，変換後のデータ型が混在文字データの場合は，VARCHARをMVARCHARに，CHARをMCHARに読み替えてください。

INTEGER型の数データは，VARCHAR(11)の文字データに変換されます。

SMALLINT型の数データは，VARCHAR(6)の文字データに変換されます。

DECIMAL(p,0)型の数データは，VARCHAR(p＋1)の文字データに変換されます。

DECIMAL(p,s)型の数データは，VARCHAR(p＋2)の文字データに変換されます。

FLOAT型又はSMALLFLT型の数データは，CHAR(23)の文字データに変換されます。

INTEGER型，SMALLINT型，及びDECIMAL型での数データが正の場合，変換された文字データには正の符号は含みません。また，FLOAT型及びSMALLFLT型の数データを文字データに変換する場合，指数部と仮数部に必ず符号を付加します。

注※2

文字データと数データを比較する場合，文字データを数データに変換して比較をします。文字データと数データを比較できるのは，比較述語，限定述語，IN述語，及びBETWEEN述語です。各述語ごとの比較可能な条件を次に示します。

述語

比較可能な条件

比較述語

左右のどちらかが数データの場合に比較できます。

IN述語，限定述語

左側が数データの場合に比較できます。

BETWEEN述語

行値構成子1の行値構成子要素が数データの場合に比較できます。

文字データと数データを比較できるのは，以下に示す指定をした場合です。

＜文字データ＞

定数（副問合せの選択式に指定した場合を含む）

?パラメタ

埋込み変数

SQL変数

SQLパラメタ

ただし，文字データ又は数データを，以下に示す位置に指定した場合は，SQL変数，SQLパラメタで指定した文字データを，数データに変換できません。

行値構成子要素数が2以上である行値構成子中の行値構成子要素

行副問合せ，又は表副問合せの選択式

比較述語の右側，IN述語の右側，限定述語の右側以外に指定したスカラ副問合せの選択式

＜数データ＞

列指定（副問合せの選択式に指定した場合を含む）

注※3

文字データを数データに代入，比較する場合の対応関係を次に示します。

整数の文字列表現は，INTEGER型に変換されます。

10進数の文字列表現は，DECIMAL型に変換されます。

浮動小数点数の文字列表現は，FLOAT型に変換されます。

数の文字列表現の前後に空白がある場合，空白を無視して変換をします。

注※4

次に示すものは，日付データへの代入，及び日付データとの比較ができます。

日付を既定の文字列で表現した定数

CHAR（10）に対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合はCHAR(20)に対応する埋込み変数）

注※5

次に示すものは，時刻データへの代入，及び時刻データとの比較ができます。

時刻を既定の文字列で表現した定数

CHAR（8）に対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，UTF-16BEの場合はCHAR(16)に対応する埋込み変数）

注※6

次に示すものは，時刻印データとの比較，及び時刻印データへの変換ができます。

時刻印を既定の文字列表現で指定した定数

長さが19〜26バイトのCHARに対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，UTF-16BEの場合は長さが38〜52バイトのCHARで，長さが2の倍数に対応する埋込み変数）

注※7

定義系SQLを除く，次に示す項目で文字列定数を記述した場合，各国文字列定数とみなし，文字データの長さだけをチェックし，文字コードはチェックしません。

INSERT文

UPDATE文

探索条件

INSERT文，及びUPDATE文については，「操作系SQL」を，探索条件については，「探索条件」を参照してください。

注※8

次に示すものは，日付データと比較できます。

日付を既定の文字列で表現した定数

CHAR（10）に対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合はCHAR(20)に対応する埋込み変数）

また，次の場合は，文字データに変換できます。

日付データを，長さが10バイト以上のCHAR，又はVARCHARの埋込み変数に代入した場合（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合は，長さが20バイト以上で長さが2の倍数のCHAR，又はVARCHARの埋込み変数に代入した場合）

注※9

次に示すものは，時刻データと比較できます。

時刻を既定の文字列で表現した定数

CHAR（8）に対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合はCHAR(16)に対応する埋込み変数）

また，次の場合は，文字データに変換できます。

時刻データを，長さが8バイト以上のCHAR，又はVARCHARの埋込み変数に代入した場合（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合は，長さが16バイト以上で長さが2の倍数のCHAR，又はVARCHARの埋込み変数に代入した場合）

注※10

次に示すものは，時刻印データと比較できます。

時刻印を既定の文字列表現で指定した定数

長さが19〜26バイトのCHARに対応する埋込み変数（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合は長さが38〜52バイトで長さが2の倍数のCHARに対応する埋込み変数）

また，次の場合は文字データに代入できます。

変換前の時刻印データの小数秒精度をpとした場合，p=0の場合は19バイト以上，p>0の場合は20+pバイト以上の，CHAR又はVARCHARの埋込み変数への代入（ただし，埋込み変数の文字集合がUTF16，UTF-16LE，又はUTF-16BEの場合は，変換前の時刻印データの小数秒精度をpとした場合，p=0の場合は38バイト以上，p>0の場合は40+2pバイト以上で長さが2の倍数の，CHAR又はVARCHARの埋込み変数への代入）

注※11

代入元の小数秒精度が代入先の小数秒精度より高い場合，代入先の精度に合わせて小数行部分を切り捨てます。代入元の小数秒精度が代入先の代入先の小数秒精度より低い場合，代入先の精度に合わせて拡張した小数秒部分に0を補って格納します。

注※12

次に示すものは，日間隔データと比較できます。

日間隔を10進数で表現した定数

DECIMAL（8，0）に対応する埋込み変数

また，次の場合は，10進数データに変換できます。

日間隔データを，DECIMAL（8，0）の埋込み変数に代入した場合

注※13

次に示すものは，時間隔データと比較できます。

時間隔を10進数で表現した定数

DECIMAL（6，0）に対応する埋込み変数

また，次の場合は，10進数データに代入できます。

時間隔データを，DECIMAL（6，0）の埋込み変数に代入した場合

注※14

変換前の項目として次に示すものは，代入対象，比較対象の文字集合に変換するため，代入，比較できます。

文字列定数

埋込み変数（既定文字集合）

注※15

変換後の項目として次に示すものは，代入対象の文字集合に変換するため，代入できます。

埋込み変数（既定文字集合）

注※16

変換後の項目として次に示すものは，代入対象，比較対象の文字集合に変換するため，代入，比較できます。

埋込み変数（既定文字集合）

変換前の項目として次に示すものは，代入対象，比較対象の既定文字集合に変換するため，代入，比較できます。

埋込み変数（UTF16，UTF-16LE，又はUTF-16BE）

注※17

変換前の項目として次に示すものは，代入対象，比較対象の文字集合に変換するため，代入，比較できます。

文字列定数

埋込み変数（既定文字集合）

変換後の項目として次に示すものは，代入対象の文字集合に変換するため，代入できます。

埋込み変数（UTF16，UTF-16LE，又はUTF-16BE）

表1‒6　変換（代入，比較）できるデータ型（2/2）

変換前データ型

変換後データ型

日間隔データ

時間隔データ

長大データ

バイナリデータ

論理データ

抽象データ型

INTERVAL YEAR TO DAY

INTERVAL HOUR TO SECOND

BLOB

BINARY(n)

1≦n≦32,000

BINARY(n)

n＞32,000

BOOLEAN

数データ

INTEGER

SMALLINT

DECIMAL

FLOAT

SMALLFLT

△,△※１

△,△※２

×,×

×,×

×,×

×,×

×,×

文字データ

CHARACTER

VARCHAR

DF

×,×

×,×

×,×

△,△※３

×,×

×,×

×,×

EK

×,×

U16

各国文字データ

NCHAR

NVARCHAR

×,×

×,×

×,×

×,×

×,×

×,×

×,×

混在文字データ

MCHAR

MVARCHAR

×,×

×,×

×,×

×,×

×,×

×,×

×,×

日付データ

DATE

×,×

×,×

×,×

×,×

×,×

×,×

×,×

時刻データ

TIME

×,×

×,×

×,×

×,×

×,×

×,×

×,×

時刻印データ

TIMESTAMP

×,×

×,×

×,×

×,×

×,×

×,×

×,×

日間隔データ

INTERVAL YEAR TO DAY

○,○※４

×,×

×,×

×,×

×,×

×,×

×,×

時間隔データ

INTERVAL HOUR TO SECOND

×,×

○,○※５

×,×

×,×

×,×

×,×

×,×

長大データ

BLOB

×,×

×,×

○,×

○,×

○,×

×,×

×,×

バイナリデータ

BINARY(n)

1≦n≦32,000

×,×

×,×

○,×

○,○

○,×

×,×

×,×

バイナリデータ

BINARY(n)

n＞32,000

×,×

×,×

○,×

○,×

○,×

×,×

×,×

論理データ

BOOLEAN

×,×

×,×

×,×

×,×

×,×

×,×

×,×

抽象データ型

×,×

×,×

×,×

×,×

×,×

×,×

△,×※６

（凡例）

○：変換できます。

△：制限付きで変換できます。

×：変換できません。

DF：既定文字集合

EK：EBCDIK

U16：UTF16，UTF-16LE又はUTF-16BE

注

表中の変換可否は，「代入可否，比較可否」となっています。例えば，「○，○」の場合は代入及び比較ができて，「○，×」の場合は代入はできるが比較はできないということになります。

注※1

次に示すものは，日間隔データへの代入，及び日間隔データとの比較ができます。

日間隔を10進数で表現した定数

DECIMAL（8，0）に対応する埋込み変数

注※2

次に示すものは，時間隔データへの代入，及び時間隔データとの比較ができます。

時間隔を10進数で表現した定数

DECIMAL（6，0）に対応する埋込み変数

注※3

次に示すものは，BINARY型への代入，及びBINARY型との比較ができます。

16進文字列定数

注※4

日間隔データ同士の比較は，年，月，日の順で比較します。

注※5

時間隔データ同士の比較は，時，分，秒の順で比較します。

注※6

抽象データ型ADT2で定義された列，変数に対して，抽象データ型ADT1がADT2の値又はADT2のサブタイプの値の場合に，代入できます。

1.2.3　文字データ，各国文字データ，及び混在文字データ使用上の注意事項

文字データ，各国文字データ，及び混在文字データを使用する場合の注意事項を次の表に示します。

表1‒7　文字データ，各国文字データ，及び混在文字データ使用上の注意事項

項 目

CHAR，NCHAR，又はMCHAR

VARCHAR，NVARCHAR，

又はMVARCHAR

定義長

1〜255

（1〜127）

定義長

256〜30,000

（128〜15,000）

定義長

1〜255

（1〜127）

定義長

256〜32,000

（128〜16,000）

インデクスの定義

○

△

○

△

ソート

○

○

○

○

グループ分け

○

○

○

○

集合関数

○

○

○

○

探索条件

○

○

○

○

データの挿入・更新

○

○

○

○

重複排除

○

○

○

○

集合演算

○

○

○

○

（凡例）

○：使用できます。

△：使用できます。

インデクスを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計≦MIN（インデクス格納用RDエリアのページサイズ÷2−1242，4036）

（ ）：定義長の括弧内の値は，各国文字データの場合を表しています。

1.2.4　DECIMAL型使用上の注意事項

DECIMAL型，日間隔型，及び時間隔型で使用できる符号の種類を次に示します。

符号部の値

符号との関係

X'A'

符号としてみなされません（エラー）。※

X'B'

符号としてみなされません（エラー）。※

X'C'

正の符号としてみなされます。

X'D'

負の符号としてみなされます。

X'E'

符号としてみなされません（エラー）。※

X'F'

正の符号としてみなされます。

注※

システム定義のpd_dec_sign_normalizeオペランドがYの場合，符号としてみなされます。

pd_dec_sign_normalizeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

システム定義のpd_dec_sign_normalizeオペランドがＮ，又は省略している場合，格納データの符号部は正規化されないので，格納データの符号部は同じ正の符号を意味するX'C'，及びX'F'が混在する可能性があります。また，SQL実行中の型変換，演算などで符号が変換される場合があります。

既に符号が混在しているデータベースの符号を統一する場合には，表のデータをデータロードし直す必要があります。

DECIMAL型の符号正規化機能については，マニュアル「HiRDB Version 9 システム運用ガイド」のDECIMAL型の符号正規化機能を参照してください。

DECIMAL型の列の格納データが正の場合，データの符号部がX'C'に統一されていないときは，その列を検索すると格納データの符号部と検索結果の符号部が異なることがあります。符号部を意識してUAPを作成する場合は，次の点を考慮してください。

(1)　インデクスを定義したDECIMAL型の列を検索した場合の，検索結果の符号部の扱い

インデクスを定義したDECIMAL型の列を検索した場合，次に示す検索結果の符号部の扱いとなります。

格納データの符号部がすべてX'C'のとき

検索結果の符号部は，必ずX'C'になります。

格納データの符号部がすべてX'F'のとき

DECIMAL型の列に定義したインデクスが単一列インデクスの場合，検索結果の符号部は必ずX'F'になります。

DECIMAL型の列を含む複数列インデクスの場合，検索結果の符号部がX'C'になることがあります。

格納データの符号部にX'C'とX'F'とが混在するとき

格納データの符号部と検索結果の符号部は，一致しないことがあります。

(2)　GROUP BY句を指定した検索で，DECIMAL型のグループ化列を選択式に指定して検索した場合の，検索結果の符号部の扱い

GROUP BY句を指定した検索で，DECIMAL型のグループ化列を選択式に指定して検索した場合，次に示す検索結果の符号部の扱いになります。

選択式中の格納データの符号部がすべてX'C'のとき

検索結果の符号部は，必ずX'C'になります。

選択式中の格納データの符号部がすべてX'F'のとき

システム共通定義のpd_optimize_levelオペランドでグループ分け高速化処理を選択した場合，検索結果の符号部がX'C'になることがあります。

グループ分け高速化処理を選択しない場合，検索結果の符号部は必ずX'F'になります。

選択式中の格納データの符号部にX'C'とX'F'とが混在するとき

検索結果の符号部は，X'C'又はX'F'のどちらかになります。

(3)　SQL拡張最適化オプションを指定した場合の検索結果の符号部の扱い

SQL拡張最適化オプションで「ハッシュジョイン，副問合せのハッシュ実行」を適用した場合，複数の表を＝で結合した問合せ指定又は副問合せを指定した検索では，次に示す検索結果の符号部の扱いとなります。

選択式中の格納データの符号部がすべてX'C'のとき

検索結果の符号部は，必ずX'C'になります。

選択式中の格納データの符号部がすべてX'F'のとき

検索結果の符号部は，X'C'なることがあります。

選択式中の格納データの符号部にX'C'とX'F'とが混在するとき

格納データの符号部がX'F'でも，検索結果の符号部がX'C'になることがあります。

1.2.5　長大データ使用上の注意事項

長大データを使用する場合の注意事項を次に示します。

(1)　長大データを使用できない項目

長大データは，次に示す項目では使用できません。

インデクスの定義

ソート

グループ分け

集合演算，四則演算

集合関数

重複排除

CASE式

CAST指定（ただし，CAST(NULL AS BLOB型)は指定できます）

ユーザ定義関数の引数中の外への参照列

ただし，抽象データ型の属性として定義で指定した長大データの場合，プラグイン機能を使用するとインデクスの定義に指定できます。また，長大データの連結演算は，UPDATE文のSET句の更新値以外では使用できません。

(2)　スカラ関数

長大データが指定できるスカラ関数は，LENGTH関数，SUBSTR関数，及びPOSITION関数だけです。これ以外のスカラ関数では，長大データは使用できません。

(3)　データの挿入，更新

長大データは，INSERT文，又はUPDATE文で定数を指定して，データを挿入，又は更新できません。

長大データを挿入する場合は，埋込み変数，？パラメタ，SQL変数，SQLパラメタ，スカラ関数SUBSTR，関数呼出し，及びNULLを使用します。更新する場合は，列指定，コンポネント指定，埋込み変数，？パラメタ，SQL変数，SQLパラメタ，連結演算，スカラ関数SUBSTR，関数呼出し，副問合せ，及びNULLを使用します。

(4)　位置付け子の利用

UAPで長大データを扱う場合には，位置付け子を用いることで，クライアント上にデータの実体を保持しないで，長大データを扱うSQLの処理ができます。位置付け子については「位置付け子（locator）」を参照してください。

1.2.6　BINARY型使用上の注意事項

(1)　BINARY型を使用できない項目

BINARY型は，次に示す項目では使用できません。

インデクスの定義

外への参照列

また，BINARY型の定義長で指定可否が変わる項目を次の表に示します。

表1‒8　BINARY型の定義長で指定可否が変わる項目

項目

定義長

1〜255

256〜32,000

32,001〜2,147,483,647

ソート

○

○

×

グループ分け

○

○

×

集合関数

○

○

×

探索条件

○

○

×

データの挿入，更新※１

○

○

○

重複排除

○

○

×

集合演算

○

○

×

連結演算

○

○

○※２

スカラ関数

○

○

○※３

CASE式

○

○

×

CAST指定

○

○

×

（凡例）

○：使用できます。

×：使用できません。

注※1

BINARY型の列への更新値，挿入値に定数を指定する場合は，16進文字列定数だけ指定できます。

注※2

最大長が32,001バイト以上のBINARY型の連結演算は，UPDATE文のSET句の更新値以外では使用できません。

注※3

定義長が32,001バイト以上のBINARY型を指定できるスカラ関数は，LENGTH関数，SUBSTR関数，及びPOSITION関数だけです。これ以外のスカラ関数では，定義長が32,001バイト以上のBINARY型は使用できません。

(2)　位置付け子の利用

UAPでBINARY型を扱う場合には，位置付け子を用いることで，クライアント上にデータの実体を保持しないで， BINARY型データを扱うSQLの処理ができます。位置付け子については「位置付け子（locator）」を参照してください。

1.2.7　論理データ使用上の注意事項

論理データは，関数の戻り値にだけ指定できます。

1.2.8　抽象データ型使用上の注意事項

抽象データ型は，次に示す項目では使用できません。

インデクスの定義

ソート

グループ分け

集合演算，四則演算，連結演算

集合関数

重複排除

CASE式

CAST指定

外への参照列

ただし，プラグインを使用する場合は，インデクスの定義ができます。

1.3　文字集合

1.3.1　文字集合の形式と規則

(1)　説明

文字集合は文字データに対する属性であり，次の三つの属性を持ちます。

使用形式

文字を表現する規約のことです。

文字レパートリ

表現できる文字の集合のことです。

既定の照合順

二つの文字列データを表現する規約のことです。どの文字集合にも，既定の照合順があります。

(2)　形式

文字集合指定：：＝ ［MASTER.］文字集合名

文字集合名　：：＝　｛EBCDIK｜UTF16｝

(3)　規則

使用できる文字集合について次の表に示します。

表1‒9　HiRDBで使用できる文字集合

文字集合名

使用形式

文字レパートリ

既定の照合順

EBCDIK

EBCDIKコード。

文字は8ビットの単一バイト文字コードで表現されます。

EBCDIKコードのすべての文字

ビット組み合わせによるコード順

UTF16

JIS X 0221(ISO/IEC 10646)で規定され，各文字が2又は4バイトで符号化される文字符号化形式で表現されます。バイト順序はビッグエンディアンです。

Unicodeのすべての文字

ビット組み合わせによるコード順

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にsjis以外を指定した場合，文字集合指定にEBCDIKを指定できません。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs以外を指定した場合，文字集合指定にUTF16を指定できません。

文字集合指定は，文字データ型が指定できる箇所に指定できます。混在文字データ型，各国文字データ型に対しては指定できません。

文字集合指定を省略した場合は，pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で指定した文字コード種別の文字コードを文字集合として仮定します。文字集合指定を省略して仮定された文字集合を，既定文字集合といいます。pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で指定した文字コード種別と文字集合との対応を，次の表に示します。

表1‒10　 pdntenv（pdsetup）コマンドで指定した文字コードと仮定する既定文字集合

コマンドで指定した文字コード種別

既定文字集合

sjis

シフトJIS漢字コード

chinese

EUC中国語漢字コード

ujis

EUC日本語漢字コード

utf-8

Unicode（UTF-8）

utf-8_ivs

Unicode（IVS対応UTF-8）

lang-c

単一バイト文字コード

chinese-gb18030

中国語漢字コード（GB18030）

(4)　留意事項

？パラメタを介して，文字コードがUTF-16のデータを操作する場合，文字集合名記述領域に文字集合名を指定します。また，プリプロセスオプション，及び埋込み変数の定義に，文字コードがUTF-16のデータを操作できる指定をすることで，埋込み変数を介して文字コードがUTF-16のデータを操作できるようになります。このとき，SQLプリプロセサは，指定されたプリプロセスオプション，及び埋込み変数に基づいて文字集合名を仮定します。

文字集合名にはUTF16に加え，UTF-16LE，及びUTF-16BEが指定できます。

以降の説明では，文字集合名UTF16には，UTF-16LE，UTF-16BEが含まれているものとします。

なお，プリプロセスオプション，埋込み変数の定義，及び文字集合名記述領域に指定する文字集合の詳細については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

1.4　定数

定数は，プログラム中で値を変更できないデータです。定数には，数値を表す数定数と文字列を表す文字列定数，各国文字列定数，及び混在文字列定数があります。

SQLで指定できる定数を次の図に示します。

図1‒4　SQLで指定できる定数

定数の表記法を次の表に示します。

表1‒11　定数の表記法

定　数

表　記　法

HiRDBで解釈するデータ型

整数定数※１

〔符号〕符号なし整数

（例）　−123

　　　　　 45

　　　　 6789

符号なし整数は，数字の並びで表します。

符号は，＋，又は−で表します。

INTEGER

10進数定数

〔符号〕整数部.小数部

（例）　　 12.3

　　　　−456.

　　　　　　 .789

整数部と小数部は符号なし整数で表します。整数と小数のどちらかを指定する必要があります。小数点は必ず付けてください。

DECIMAL（m〔，n〕）

m，nは表記したけた数

浮動小数点数定数

仮数E指数

（例）　1.0E2

　　　　 .5E＋67

仮数は整数定数，又は10進数定数で表します。指数は1〜3けたの整数定数で表します。指数は10のべき乗を表します。文字「E」は必ず付けてください。

FLOAT

文字列定数※３

'文字列'

（例）'HITACHI'

　　　'88'

　　　'''95.7.30'

文字列は半角文字の列で表します。文字列にアポストロフィを書く場合，1個のアポストロフィを表すのに，2個続けて書いてください。文字列の長さは32,000バイト以内です。

VARCHAR(n)

nは表記した文字列長※２

16進文字列定数※６

X'16進文字列'

（例）X'82A0'

　　　X'82a0'

16進文字列は，0〜9，及びA〜F（又はa〜f）で表します。16進文字列の長さは64,000文字以内で，2の倍数にしてください。16進文字2文字で1バイトとなります。

VARCHAR(n)

nは表記した文字列長÷2※２

各国文字列定数※３※４※５

N'各国文字列'

（例）N'SQL文法'

文字列は全角文字の列で表します。文字列の長さは16,000文字以内です。

NVARCHAR(n)

nは表記した文字列長※２

混在文字列定数※３※４

M'文字列'

（例）M'1996年'

文字列は半角文字と全角文字の列で表します。文字列の長さは32,000バイト以内です。

MVARCHAR(n)

nは表記した文字列長※２

注

日付や時刻は，既定の文字列表現の定数として指定できます。また，日間隔や時間隔は10進数表現の定数（10進数定数）としてSQL中に指定できます。

注※1

整数定数の値の範囲を超える定数を整数定数の表記法で指定すると，HiRDBは，定数の右側に小数点を仮定し，10進数定数が指定されたものと解釈します。

注※2

長さ0の文字列定数（' '，X' '，N' '，M' '）の場合，nは1です。

注※3

COMMENT文，EXECUTE IMMEDIATE文，及びPREPARE文に指定する文字列については，各SQL文の文法詳細を参照してください。

注※4

pdsetupコマンドで文字コード種別にlang-cを指定した場合，各国文字列定数，及び混在文字列定数は使用できません（UNIX版限定）。

注※5

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs，又はchinese-gb18030を指定した場合，各国文字列定数は使用できません。

注※6

16進文字列定数は，文字列定数と記述の形式が異なるだけです。マニュアル中の文字列定数に関する記述は，16進文字列定数にも適用されます。

数定数の使用上の制限を次の表に示します。

表1‒12　数定数の使用上の制限

数定数

範　囲

指定できるけた数の最大値

（上位の無効数字0のけた数を含む）

整数定数

−2147483648〜2147483647

10けた

10進数定数

−（10³⁸−1）〜−10⁻³⁷，0，

10⁻³⁷〜10³⁸−1

38けた

浮動小数点数定数※

約−1.7×10³⁰⁸〜−4.9×10⁻³²⁴，0，

約4.9×10⁻³²⁴〜1.7×10³⁰⁸

仮数部：17けた

指数部：3けた

注※

値の範囲は，ハードウェア表現に依存します。

1.4.1　日付データの既定の文字列表現

（形式）'YYYY-MM-DD'

日付を既定の文字列表現の定数にする場合，年（YYYY），月（MM），日（DD）をハイフンで結んで'YYYY-MM-DD'として表現します。そのときに，年（YYYY），月（MM），日（DD）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。

また，既定の文字列表現で指定した日付の定数は，スカラ関数DATEの引数や，日付データが要求される場所で指定すると，日付データ型に変換されます。

日付を既定の文字列表現の定数にする例を次に示します。

（例）

日付：1995年7月30日

日付の既定の文字列表現：'1995-07-30'

1.4.2　時刻データの既定の文字列表現

（形式）'hh:mm:ss'

時刻を既定の文字列表現の定数にする場合，時（hh），分（mm），秒（ss）をコロン（：）で結んで'hh:mm:ss'として表現します。そのときに，時（hh），分（mm），秒（ss）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。

また，既定の文字列表現で指定した時刻の定数は，スカラ関数TIMEの引数や，時刻データが要求される場所で指定すると，時刻データ型に変換されます。

時刻を既定の文字列表現の定数にする例を次に示します。

（例）

時刻：11時3分58秒

時刻の既定の文字列表現：'11:03:58'

1.4.3　時刻印データの既定の文字列表現

（形式）'YYYY-MM-DD hh:mm:ss'

時刻印を既定の文字列表現の定数にする場合，年（YYYY），月（MM），日（DD）をハイフンで結び，空白を含めてから，更に時（hh），分（mm），秒（ss）をコロン（：）で結んで'YYYY-MM-DD hh:mm:ss〔nn…n〕'として表現します。そのときに，年（YYYY），月（MM），日（DD）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。同様に，時（hh），分（mm），秒（ss）のけた数に満たない場合は，足りないけた数分だけ左側に0を補ってください。

小数秒精度を表現する場合，秒（ss）と小数秒（nn…n）の間を，ピリオドで結んでください。小数秒精度を省略し，ピリオドだけを指定すると，小数秒精度が0のデータとして扱われます。小数秒精度が7以上の場合はエラーとなります。

また，既定の文字列表現で指定した時刻印の定数は，スカラ関数TIMESTAMPの引数や，時刻印データが要求される場所で指定できます。

時刻印を既定の文字列表現の定数にする例を次に示します。

（例）

時刻印：1995年7月30日11時3分58秒

時刻印の既定の文字列表現：'1995-07-30 11:03:58'

1.4.4　日間隔データの10進数表現

（形式）±YYYYMMDD.

日間隔を10進数表現の定数にする場合，年（YYYY），月（MM），日（DD），符号（s）を，精度8，位取り0の固定小数点数で±YYYYMMDD.として表現します。

10進数表現した日間隔の定数は，日間隔データが要求される場所で指定すると，日間隔データ型に変換されます。

日間隔を10進数表現の定数にする例を次に示します。

（例）

1か年1か月1日間を10進数で表現する場合：00010101.

1.4.5　時間隔データの10進数表現

（形式）±hhmmss.

時間隔を10進数表現の定数にする場合，時（hh），分（mm），秒（ss），符号（t）を，精度6，位取り0の固定小数点数で±hhmmss.として表現します。

10進数表現した時間隔の定数は，時間隔データが要求される場所で指定すると，時間隔データ型に変換されます。

時間隔を10進数表現の定数にする例を次に示します。

（例）

1時間1分1秒を10進数表現する場合：010101.

1.4.6　日時間隔データの10進数表現

（形式）±YYYYMMDDhhmmss.

日時間隔を10進数表現の定数にする場合，年（YYYY），月（MM），日（DD），

時（hh），分（mm），秒（ss），符号（t）を，精度14，位取り0の固定小数点数で±YYYYMMDDhhmmss.として表現します。

日時間隔を10進数表現の定数にする例を次に示します。

（例）

1か年2か月3日間4時間5分6秒を10進数で表現する場合：00010203040506.

1.5　USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，及びCURRENT_TIMESTAMP値関数

USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，及びCURRENT_TIMESTAMP値関数は，SQL中で値指定として使用できます。

1.5.1　USER値関数

(1)　機能

実行ユーザの認可識別子を表します。

(2)　形式

USER値関数：：＝｛USER｜CURRENT_USER｝

(3)　規則

USER値関数を指定した場合，HiRDBは既定文字集合のVARCHAR(30)が指定されたものとして解釈します。

表名及びインデクス名の認可識別子としては使用できません。

1.5.2　CURRENT_DATE値関数

(1)　機能

現在の日付を表します。

(2)　形式

CURRENT_DATE値関数：：＝｛CURRENT_DATE｜CURRENT DATE｝

(3)　規則

CURRENT_DATE値関数を指定した場合，HiRDBは日付データ型（DATE）が指定されたものとして解釈します。

CURRENT_DATEは，現在の日付を表します。CURRENT_DATEを指定できる項目を次に示します。

選択式及び条件式中

日付データ型への更新値，挿入値

CHAR(10)（文字集合指定にUTF16を指定している場合はCHAR(20)）の列への更新値，挿入値

CHAR(10)（文字集合指定にUTF16を指定している場合はCHAR(20)）の列への更新値，挿入値として指定すると，現在の日付が，日付の既定の文字列表現に変換された後，更新又は挿入をします。

一つのSQL文中でCURRENT_DATEを複数回指定すると，それらはすべて同じ値になります。また，CURRENT_DATE，CURRENT_TIME，及びCURRENT_TIMESTAMPを一つのSQL文中で組み合わせて指定すると，日付と時刻は同時点の値になります。

1.5.3　CURRENT_TIME値関数

(1)　機能

OSのlocaltime関数で変換した現在の時刻を表します。タイムゾーンはシステム共通定義のTZオペランドに従います。

(2)　形式

CURRENT_TIME値関数：：＝｛CURRENT_TIME｜CURRENT TIME｝

(3)　規則

CURRENT_TIME値関数を指定した場合，HiRDBは時刻データ型（TIME）が指定されたものとして解釈します。

CURRENT_TIMEは，現在の時刻を表します。CURRENT_TIMEを指定できる項目を次に示します。

選択式及び条件式中

時刻データ型への更新値，挿入値

CHAR(8)（文字集合指定にUTF16を指定している場合はCHAR(16)）の列への更新値，挿入値

CHAR(8)（文字集合指定にUTF16を指定している場合はCHAR(16)）の列への更新値，挿入値として指定すると，現在の時刻が，時刻の既定の文字列表現に変換された後，更新又は挿入をします。

一つのSQL文中でCURRENT_TIMEを複数回指定すると，それらはすべて同じ値になります。また，CURRENT_DATE，CURRENT_TIME，及びCURRENT_TIMESTAMPを一つのSQL文中で組み合わせて指定すると，日付と時刻は同時点の値になります。

1.5.4　CURRENT_TIMESTAMP値関数

(1)　機能

現在の時刻印を表します。

(2)　形式

CURRENT_TIMESTAMP値関数：：＝｛CURRENT_TIMESTAMP〔（小数秒精度）〕
　　　　　　　　　　　　　　　 ｜CURRENT TIMESTAMP〔（小数秒精度）〕｝

(3)　規則

CURRENT_TIMESTAMP値関数を指定した場合，HiRDBは時刻印データ型（TIMESTAMP）が指定されたものとして解釈します。

CURRENT_TIMESTAMPは，現在の時刻印を表します。CURRENT_TIMESTAMPを指定できる項目を次に示します。

選択式及び条件式中

時刻印データ型の列への更新値，挿入値

長さが19，22，24，26バイトのCHAR（文字集合指定にUTF16を指定している場合は，長さが38，44，48，52バイトのCHAR）の列への更新値，挿入値

小数秒精度p（p=0，2，4，又は6）を指定した場合，小数点以下pけたまで有効な小数秒を含む時刻印を返します。小数秒精度pを指定しない場合，p=0が仮定されます。

データ型がCHARの列に，更新値，挿入値として指定する場合，現在の時刻印が，時刻印の既定の文字列表現に変換された後，更新又は挿入をします。

更新値又は挿入値として指定する場合，指定可能なCHAR列の定義長を次の表に示します。

表1‒13　更新値又は挿入値として指定する場合の値関数小数秒精度とCHAR列の定義長の対応

小数秒精度pの値

CHARの定義長

既定文字集合又は文字集合(UTF16以外)

文字集合(UTF16)

0

19

38

2，4，又は6

20＋p

40＋p×2

一つのSQL文中でCURRENT_TIMESTAMPを複数回指定すると，それらはすべて同じ値になります。また，CURRENT_DATE，CURRENT_TIME，及びCURRENT_TIMESTAMPを一つのSQL文中で組み合わせて指定すると，日付と時刻は同時点の値になります。

1.6　埋込み変数，標識変数，?パラメタ，SQLパラメタ，及びSQL変数

この節では，UAP中，SQL中，外部ルーチン中，及びSQLルーチン中で値の受け渡しをする変数，パラメタについて説明します。

埋込み変数，標識変数，？パラメタ

UAP又は外部ルーチンのSQL中に指定できます。指定すると，そのSQLとUAPとの間で値の受け渡しができます。

SQL変数

SQLルーチンのSQL中に指定できます。指定すると，そのSQLルーチンとの間で値の受け渡しができます。なお，外部ルーチン中にはSQL変数は指定できません。

SQLパラメタ

呼び出されるルーチンのルーチン定義時に指定できます。指定すると，SQLのCALL文や関数呼出しをするUAP又はルーチンと，呼び出されるルーチンとの間で値の受け渡しができます。

SQLルーチン中では，SQLパラメタを直接指定します。外部ルーチン中では，SQLパラメタに対応した外部ルーチン本体のパラメタ変数で指定します。

1.6.1　埋込み変数，標識変数

(1)　形式

：埋込み変数〔：標識変数〕

(2)　機能と用途，及び指定箇所

埋込み変数，及び標識変数の機能とその用途，及び指定箇所を次の表に示します。

表1‒14　埋込み変数，及び標識変数の機能とその用途，及び指定箇所

機　能

用　途

指定箇所

埋込み変数

標識変数

検索結果の列の値の受け取り

ナル値以外の値を受け取ります。※1

ナル値も含む列の値を受け取るために，埋込み変数とともに使用して，埋込み変数に読み込んだ値がナル値かどうかを知ることができます。

また，受け取ったデータが文字データ，各国文字データ，混在文字データ，又は長大データの場合に，埋込み変数に正しく受け取れたかどうかを知ることができます。

SELECT文，FETCH文，EXECUTE文，EXECUTE IMMEDIATE文のINTO句

定数値の変更

ナル値以外の値を指定します。※1

ナル値を指定するために，埋込み変数とともに使用して，SQLに渡す埋込み変数の値がナル値かどうかを指示します。

SQL中に指定する定数の値を変えて実行する場合に，定数の代わりに指定します。

?パラメタに対する値の指定

ナル値以外の値を指定します。※1

ナル値を指定するために，埋込み変数とともに使用して，SQLに渡す埋込み変数の値がナル値かどうかを指示します。

PREPARE文で前処理するSQL中，又はEXECUTE IMMEDIATE文で前処理・実行するSQL中で指定した?パラメタに対する値を指定するために，EXECUTE文，OPEN文，EXECUTE IMMEDIATE文のUSING句に指定します。※2

埋込み変数の変更

（埋込み変数）

カーソル宣言中で指定したSELECT文中の埋込み変数の代わりに，ほかの埋込み変数を指定します。

−

OPEN文のUSING句

SQL文字列の指定

UAPの実行時に生成したSQLを前処理して実行するために，SQL文字列を指定します。

−

PREPARE文，EXECUTE IMMEDIATE文

認可識別子，及びパスワードの指定

UAPの実行ユーザをHiRDBに連絡します。

−

CONNECT文の認可識別子，及びパスワード

（凡例）−：該当しません。

注※1

ナル値も扱う場合は，標識変数を指定する必要があります。標識変数の値については，「標識変数の値の設定」を参照してください。

注※2

OPEN文のUSING句には，標識変数は指定できません。

(3)　埋込み変数及び標識変数のデータ型と各言語のデータ記述の関係

埋込み変数及び標識変数をUAP中に記述するとき，データ変換を起こさないでSQLとUAPとの間でデータの受け渡しをするためのデータ型とデータ記述の関係については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(4)　埋込み変数及び標識変数の修飾指定

(a)　COBOL言語の場合

埋込み変数，及び標識変数を集団項目で修飾できます。

集団項目で修飾する場合の形式：

：〔変数名1.〕変数名2

修飾した結果，埋込み変数，又は標識変数は一意に定まるように指定してください。修飾する必要のない名前を修飾してもかまいません。また，一意に修飾する組み合わせが幾つかある場合，どれを使用してもかまいません。

変数名1は，変数名2が従属する集団項目です。

(b)　C言語の場合

構造体のメンバを，構造体又は構造体のポインタで修飾できます。

構造体で修飾する場合の形式：

：構造体名.メンバ名

ポインタで修飾する場合の形式：

：ポインタ名->メンバ名

(5)　埋込み変数とSQLのデータ型の関係

UAP中の埋込み変数のデータ型とSQLのデータ型の代入の関係を次の表に示します。

表1‒15　UAPの埋込み変数とSQLのデータ型の代入の関係

埋込み変数のデータ型

SQLのデータ型

文字データ型

各国文字データ型

混在文字データ型

文字データ型

○

△

○

各国文字データ型

△

○

△

混在文字データ型

○

△

○

（凡例）

○：代入できます。

△：代入できるがデータ型に関係なく代入するため，注意が必要です（注2，注3）。

注1

文字データ型，各国文字データ型，混在文字データ型は固定長，又は可変長を含みます。

注2

データが短くデータの右側に空白を埋める場合は，次のようにします。

UAPの埋込み変数をSQLのデータ型に代入する場合

SQLのデータ型の空白を埋めます。文字集合の指定がある場合は，その文字集合の空白です。各国文字データ型の場合は全角空白です。

SQLのデータ型をUAPの埋込み変数に代入する場合

UAPの埋込み変数の，データ型の空白を埋めます。文字集合の指定がある場合は，その文字集合の空白です。各国文字データ型の場合は全角空白です。

ただし，各国文字データ型への代入の場合，クライアント環境定義のPDSPACELVL，又はシステム共通定義のpd_space_levelオペランドで空白変換レベルが設定されているとき，埋めた各国文字の空白も変換対象となります。そのため，各国文字の空白が2バイトの空白に変換される場合があります。

注3

各国文字の空白と1バイトの空白が混在するような使い方をすると，空白を含む比較などが意図したように実行できなくなるので注意してください。

注4

各国文字データ型の列に1バイト文字を代入しないでください。代入した場合，結果は保証できません。

注5

LIKE述語を使用した場合，パターン文字の特殊文字はSQLのデータ型の仕様に合わせてください。

注6

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs，又はchinese-gb18030を指定した場合，SQLの文字データ型又は混在文字データ型から，埋込み変数の各国文字データ型への代入はできません。また，埋込み変数の各国文字データ型から，SQLの文字データ型又は混在文字データ型への代入もできません。

1.6.2　?パラメタ

(1)　機能

UAP実行時に，プログラム中でSQLの文字列を組み立て，そのSQL文字列をPREPARE文で前処理してEXECUTE文，OPEN文，FETCH文，又はCLOSE文で実行したり，EXECUTE IMMEDIATE文で前処理して実行したりする機能があります。この機能で実行するSQLに対しても，UAPから値を渡すことができます。この場合に，PREPARE文で前処理するSQL，又はEXECUTE IMMEDIATE文で前処理して実行するSQLの文字列の中で，UAPから値を渡される箇所に「?」を指定します。この「?」を?パラメタといいます。

(2)　?パラメタに渡す値の指定

?パラメタに渡す値は，PREPARE文に対応するEXECUTE文，OPEN文，FETCH文，CLOSE文，又はEXECUTE IMMEDIATE文のUSING句の埋込み変数で指定します。標識変数はEXECUTE文及びEXECUTE IMMEDIATE文でだけ指定できます。

SQL記述領域を使用しない?パラメタの例を次に示します。

（例）?パラメタの使用例（SQL記述領域を使用しない場合）

（C言語の場合）

      :
EXEC SQL BEGIN DECLARE SECTION;
struct{
long xcmnd_len;
char xcmnd_txt[58];
}xcmnd;
char  XSCODE[5];
char  XSNAME[17];
char  XCOL[3];
long  XTANKA;
long  XZSURYO;
EXEC SQL END DECLARE SECTION;
      :
strcpy(xcmnd.xcmnd_txt,"INSERT INTO ZAIKO VALUES(?,?,?,?,?)");
xcmnd.xcmnd_len = strlen(xcmnd.xcmnd_txt);
EXEC SQL PREPARE ST1 FROM :xcmnd;

strcpy(XSCODE,"595M");
strcpy(XSNAME,"ソックス");
strcpy(XCOL,"赤");
XTANKA = 300;
XZSURYO = 200;
EXEC SQL
EXECUTE ST1 USING :XSCODE,:XSNAME,:XCOL,:XTANKA,:XZSURYO;
      :

（COBOL言語の場合）

      :
DATA DIVISION.

WORKING-STORAGE SECTION.
EXEC SQL
BEGIN DECLARE SECTION
END-EXEC.
01 XCMND.
  02 XCMND-LEN PIC S9(9) COMP VALUE 58.
  02 XCMND-TXT PIC X(58)   VALUE SPACE.
 77 XSCODE   PIC X(4).
 77 XSNAME   PIC N(8).
 77 XCOL    PIC N(1).
 77 XTANKA   PIC S9(9) COMP.
 77 XZSURYO   PIC S9(9) COMP.

   EXEC SQL
    END DECLARE SECTION
   END-EXEC.
      :
 PROCEDURE DIVISION.
      :
   MOVE 'INSERT INTO ZAIKO VALUES(?,?,?,?,?)' TO XCMND-TXT.
   EXEC SQL
    PREPARE ST1 FROM :XCMND
   END-EXEC.

   MOVE '123S'   TO XSCODE.
   MOVE N'Tシャツ' TO XSNAME.
   MOVE N'赤'    TO XCOL.
   MOVE 200     TO XTANKA.
   MOVE 300     TO XZSURYO.

   EXEC SQL
    EXECUTE ST1 USING :XSCODE,:XSNAME,:XCOL,:XTANKA,:XZSURYO
   END-EXEC.
      :

1.6.3　SQLパラメタ，SQL変数

(1)　形式

SQLパラメタ

〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名

SQL変数

〔文ラベル.〕SQL変数名

(2)　機能

(a)　SQLパラメタ

SQLパラメタは，手続き定義時や関数定義時に宣言したルーチンのパラメタです。

SQLパラメタは，CALL文や関数呼出しでルーチンが呼び出されたときに，CALL文や関数呼出しを記述したUAP又はルーチンと，呼び出されるルーチンとの間で値の受け渡しをするための変数です。

ルーチン宣言時に指定するパラメタモードによって，SQLパラメタでは次のことができます。

パラメタモードがIN又はINOUTの場合

ルーチン中でSQLパラメタの値を参照できます。値を参照することで，ルーチンを呼び出したUAP又はルーチンから値を取得できます。

パラメタモードがOUT又はINOUTの場合

ルーチン中でSQLパラメタの値を設定できます。値を設定することで，ルーチンを呼び出したUAP又はルーチンに値を返せます。

SQLパラメタの指定方法は，SQLで記述したルーチンに指定するか，又はSQL以外で記述した外部ルーチンに指定するかで，次のように異なります。

SQLで記述したルーチン中に指定する場合

"〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名"で指定します。

ただし，パブリック手続き定義時，又はパブリック関数定義時に認可識別子を指定するときは，PUBLICを指定してください。

SQL以外で記述した外部ルーチン中に指定する場合

SQLパラメタに対応する外部ルーチン本体のパラメタ名で指定します。この場合，外部ルーチンは，指定したパラメタをSQLパラメタとしてではなく，外部ルーチンの実装に用いた言語のパラメタとして参照，更新します。

なお，UAPとルーチンとの間で値の受け渡しをするとき，UAP側のCALL文中又は関数呼出し中には，埋込み変数，標識変数，又は?パラメタを指定します。

(b)　SQL変数

SQL変数は，SQLルーチン中のSQL間の値の受け渡しや，表とSQLルーチンとの間の値の受け渡しに使用できます。SQL変数は，SQLルーチン中の複合文で宣言し，宣言した複合文中で参照できます。

SQLパラメタ，及びSQL変数は，埋込み変数と異なり，ナル値が格納できます。このため，標識変数を使用したり，変数名の前に「：」を付けたりする必要はありません。

(3)　データ型

SQLパラメタ，及びSQL変数のデータ型は，SQLのデータ型を指定します。SQLのデータ型については，「データ型」を参照してください。

1.6.4　指定できる箇所

埋込み変数，標識変数，?パラメタ，SQL変数，及びSQLパラメタを指定できる箇所を次の表に示します。

表1‒16　変数及びパラメタを指定できる箇所

SQL文

指定できる箇所

埋込み変数

標識変数

?パラメタ

SQL変数又はSQLパラメタ

WRITE指定

第1引数

×

×

×

×

第2引数，第3引数

○

○

○

×

GET_JAVA_STORED_ROUTINE_SOURCE指定

第1引数，第2引数

○

○

○

○

第3引数

×

×

×

×

DECLARE CURSOR

探索条件中で定数が指定できる箇所※1

○

○

×

○

ALLOCATE CURSOR 形式1

拡張カーソル名

○

×

×

×

拡張文名

○

×

×

×

ALLOCATE CURSOR 形式2

拡張カーソル名

○

×

×

×

SELECT

探索条件中で定数が指定できる箇所

○

○

○

○

INTO句

○

○

×

○

INSERT

VALUES句で定数が指定できる箇所

○

○

○

○

探索条件中で定数が指定できる箇所

○

○

○

○

UPDATE

SET句で定数が指定できる箇所

○

○

○

○

探索条件中で定数が指定できる箇所

○

○

○

○

準備可能動的UPDATE文：位置付け

SET句で定数が指定できる箇所

×

×

○

×

DELETE

探索条件中で定数が指定できる箇所

○

○

○

○

OPEN

USING句

○

×

×

×

FETCH

INTO句

○

○

×

○

PREPARE

SQL文字列の箇所

○

×

×

×

拡張文名

○

×

×

×

DEALLOCATE PREPARE

拡張文名

○

×

×

×

DESCRIBE

拡張文名

○

×

×

×

DESCRIBE CURSOR

拡張カーソル名

○

×

×

×

DESCRIBE TYPE

拡張文名

○

×

×

×

EXECUTE

INTO句

○

○

×

×

USING句

○

○

×

×

拡張文名

○

×

×

×

EXECUTE IMMEDIATE

SQL文字列の箇所

○

×

×

×

INTO句

○

○

×

×

USING句

○

○

×

×

CALL

引数

○

○

○

○

代入文

代入先及び代入値

○※2

○

○※2

○

FREE LOCATOR

位置付け子参照

○

×

×

×

CONNECT

認可識別子，及びパスワード

○

×

×

×

SET SESSION AUTHORIZATION文

認可識別子，及びパスワード

○

×

×

×

ALLOCATE CONNECTION HANDLE

:PDCNCTHDL型変数，

:リターンコード受け取り変数，;接続PDHOST変数，及び接続PDNAMEPORT変数

○

×

×

×

FREE CONNECTION HANDLE

:PDCNCTHDL型変数，及び:リターンコード受け取り変数

○

×

×

×

DECLARE CONNECTION HANDLE SET

:PDCNCTHDL型変数

○

×

×

×

GET DIAGNOSTICS

文情報項目名，及び条件情報項目名

○

×

×

×

WRITE LINE文

値式

×

×

×

○

（凡例）

○：指定できます。

×：指定できません。

注1

埋込み変数，及び標識変数は，UAP中で指定します。？パラメタは，PREPARE文で前処理するSQL文字列中に指定します。

外部ルーチン中のSQLパラメタは，SQLパラメタに対応した外部ルーチン本体のパラメタ変数指定で指定します。外部ルーチン本体のパラメタをSQLやルーチンに渡す場合，SQLパラメタとしてではなく，埋込み変数又は？パラメタとして指定します。外部ルーチン中にSQL変数は指定できません。

注2

選択式中には，埋込み変数，標識変数，及び?パラメタは指定できません。

ただし，次のような場合には，埋込み変数，標識変数，及び？パラメタを指定できます。

関数呼出しの引数に指定した場合

スカラ関数SUBSTRの引数に指定した場合

指定方法については，「問合せ指定」を参照してください。

注3

埋込み変数，標識変数，及び?パラメタ間の四則演算及び比較演算は指定できません。

注4

集合関数の引数中に埋込み変数，標識変数，及び?パラメタは指定できません。

注5

スカラ関数HEXの引数中には，埋込み変数，標識変数，及び?パラメタは指定できません。

注6

VALUE，BIT_AND_TEST，SUBSTRの第2，第3引数，及びPOSITIONの第3引数を除くスカラ関数の引数には，埋込み変数，標識変数，及び?パラメタを単独（単項演算式に指定した場合も含む）で指定できません。ただし，SUBSTRの第1引数，LENGTHの引数，POSITIONの第1，第2引数にはAS データ型を記述すればBLOB型，又はBINARY型の場合だけ指定できます。

注7

日付演算，時刻演算，及び連結演算中には，埋込み変数，標識変数，及び?パラメタは指定できません。

注8

スカラ関数VALUEの最初の値式に，埋込み変数，標識変数，及び?パラメタを単独（単項演算式に指定した場合も含む）で指定できません。

注9

単純CASE式，又は探索CASE式のCASE，THEN，及びELSEの値式に，埋込み変数，標識変数，及び?パラメタを単独（単項演算式に指定した場合も含む）で指定できません。

注10

単純CASE指定中の最初のWHENの値式，COALESCEの最初の値式，又はNULLIFの両方の値式に，埋込み変数，標識変数，及び?パラメタを単独（単項演算式に指定した場合も含む）で指定できません。

注11

スカラ関数BIT_AND_TESTの両方の値式には，単独（単項演算式に指定した場合も含む）で埋込み変数，標識変数，及び?パラメタは指定できません。

注※1

選択式中のCASE式の探索条件を除きます。

ただし，関数呼出しの引数に指定した場合，その関数呼出しを選択式中のCASE式の探索条件に指定できます。

注※2

代入文（SET）の代入値に単独で埋込み変数，標識変数，及び？パラメタを指定する場合は必ずAS データ型を指定してください。

1.6.5　標識変数の値の設定

(1)　データを受け取る場合（FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文のINTO句）

FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文を実行すると，そのINTO句に指定した標識変数には，次の表に示す値が設定されます。埋込み変数にナル値が返された場合，埋込み変数の値は保証しません。この場合，標識変数の指定がなければ，エラーになります。

表1‒17　FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文で返される標識変数の値（繰返し列以外の場合，及び繰返し列の各要素値の場合）

標識変数の値

対応する埋込み変数が受け取った値

負

ナル値です。

ただし，標識変数の値が−2の場合は，繰返し列の添字で指定した要素がないときに設定されたナル値です。また，標識変数の値が-4の場合は，SQL実行時に四則演算，集合関数演算，ウィンドウ関数演算，及びオーバフローエラー抑止の対象となるスカラ関数で，オーバフローエラー抑止オプションによって設定されたナル値です。このナル値を受け取った埋込み変数と演算は対応しているので，オーバフローが発生した演算を判別できます。オーバフローエラー抑止の対象となるスカラ関数については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

0

ナル値ではない値です。

正

ナル値ではない値です。

ただし，受け取ったデータは文字データ，又は長大データで，埋込み変数の長さが不足していたため，右側が切り捨てられた値であることを示します。このときの標識変数には，切り捨てられる前の長さが設定されます。

ただし，クライアント環境定義PDCLTCNVMODEにUOCを指定して文字コード変換機能を使用している場合は，標識変数には切り捨て後の長さを設定します。

表1‒18　FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文で返される標識変数の値（繰返し列全体の情報の場合）

標識変数の値

対応する埋込み変数が受け取った値

負

ナル値です（要素数が0）。

0

ナル値ではない値です（要素数が1以上）。

正

ナル値ではない値です（要素数が1以上）。

ただし，埋込み変数の領域の要素数が不足していたため，後の要素が切り捨てられたことを示します。このときの標識変数には，切り捨てられる前の要素数が設定されます。

繰返し列のデータを受け取る場合の標識変数，埋込み変数の構造とその例を次の図に示します。

図1‒5　繰返し列のデータを受け取る場合の標識変数，埋込み変数の構造

図1‒6　繰返し列のデータを受け取る例（その1）

図1‒7　繰返し列のデータを受け取る例（その2）

(2)　データを渡す場合（FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文のINTO句以外）

FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文以外のSQLを実行する場合，そのSQLの実行前の標識変数には，次の表に示す値をUAPで設定してください。標識変数の値によって，SQLの実行時に対応する埋込み変数の値を使用してください。

表1‒19　SQL実行前に設定する標識変数の値（繰返し列以外の場合，及び繰返し列の各要素値の場合）

標識変数の値

対応する埋込み変数がSQLに渡す値

負

ナル値です。

埋込み変数が持っている値は無視されます。

０又は正

ナル値ではない値です。

埋込み変数が持っている値です。

表1‒20　SQL実行前に設定する標識変数の値（繰返し列全体の情報の場合）

標識変数の値

対応する埋込み変数がSQLに渡す値

負

ナル値です（要素数が0）。

埋込み変数の要素の値は無視されます。

０又は正

要素数が示す要素の値です。

ただし，要素数に0は指定できません。

繰返し列のデータを渡す場合の標識変数，埋込み変数の構造とその例を次の図に示します。

図1‒8　繰返し列のデータを渡す場合の標識変数，埋込み変数の構造

図1‒9　繰返し列のデータを渡す例（その1）

図1‒10　繰返し列のデータを渡す例（その2）

1.6.6　埋込み変数へのナル値の既定値設定

FETCH文，SELECT文，EXECUTE文，及びEXECUTE IMMEDIATE文で埋込み変数にデータを取り出す場合，取り出した値がナル値のとき，標識変数には負の値が設定されます。このときの埋込み変数の値は保証しません。ただし，埋込み変数へのナル値の既定値設定機能を使用すると，埋込み変数に既定値が設定されます。また，ナル値のデータに対しても標識変数を指定する必要はありません。ただし，この機能はデータを取り出す場合にだけ適用されます。

既定値設定機能を使用するには，UAPの実行時に，クライアント環境定義でPDDFLNVALを設定しておく必要があります。

クライアント環境定義については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

埋込み変数に設定されるナル値の既定値を次の表に示します。

表1‒21　埋込み変数に設定されるナル値の既定値

分　類

データ型

既定値

数データ

INTEGER

0

SMALLINT

DECIMAL

LARGE DECIMAL

FLOAT

SMALLFLT

文字データ

CHARACTER(n)

既定文字集合又は

文字集合（UTF16以外）

nバイトの空白

文字集合（UTF16）

n/2文字の空白

VARCHAR(n)

既定文字集合又は

文字集合（UTF16以外）

1バイトの空白※１

文字集合（UTF16）

１文字の空白

各国文字データ

NCHAR(n)

n文字の空白※２

NVARCHAR(n)

1文字の空白※２

混在文字データ

MCHAR(n)

nバイトの空白

MVARCHAR(n)

1バイトの空白

日付データ

DATE

1年1月1日

時刻データ

TIME

0時0分0秒

時刻印データ

TIMESTAMP

1年1月1日0時0分0秒※３

日間隔データ

INTERVAL YEAR TO DAY

0か年0か月0か日間

時間隔データ

INTERVAL HOUR TO SECOND

0時間0分0秒間

長大データ※4

BLOB(n)

長さ0バイトのデータ

バイナリデータ※4

BINARY(n)

長さ0バイトのデータ

注

単純構造，繰返し構造のデータの各要素についてもこの表に従います。繰返し構造のデータ全体がナル値の場合，現在の要素数として0が設定されます。

注※1

WRITE指定の結果の場合は，IPアドレスとなります。

注※2

HiRDBで扱う文字コードに依存します。

（例）

シフトJISの場合：X'8140'

また，クライアント環境定義のPDSPACELVL，又はシステム共通定義のpd_space_levelオペランドで空白変換レベルを設定している場合，埋込み変数に設定した空白も変換対象となります。そのため，NCHARの空白がn×2バイト，又はNVARCHARの空白が2バイトに変換される場合があります。

注※3

小数秒精度を指定した場合は，指定したけた数分0が設定されます。

注※4

位置付け子を用いた場合，位置付け子の埋込み変数には，サーバ上の長さ0バイトのデータを識別する値が設定されます。

1.6.7　代入規則

代入の種類を次の表に示します。

表1‒22　代入の種類

代入の種類

内　容

代入元

代入先

取り出し代入

列の値の受け取り

列

埋込み変数，SQL変数，又はSQLパラメタ

手続きの出力パラメタ値の，CALL文の引数への受け取り

SQLパラメタ

埋込み変数，SQL変数，又はSQLパラメタ

関数のRETURN文に指定した値式から，戻り値への受け取り

値式

関数の戻り値

格納代入

列への値の代入

埋込み変数，SQL変数，又はSQLパラメタ

列

CALL文の引数から手続きの入力パラメタへの代入

値式

SQLパラメタ

関数呼出しの引数から関数のパラメタへの代入

値式

SQLパラメタ

代入文（SET）による値の代入

SQL変数， SQLパラメタ，又は埋込み変数

SQL変数， SQLパラメタ，又は埋込み変数

(1)　代入先が固定長データの場合

代入先が固定長の文字列データ，混在文字列データ，又は各国文字列データの場合，代入元のデータの長さによって代入規則が異なります。代入先が固定長データの場合の代入規則を次の表に示します。

表1‒23　代入先が固定長データの場合の代入規則

代入の種類

データ長

代入元※1＞代入先

代入元※1＝代入先

代入元※1＜代入先

取り出し代入

△※2

○

△※3

格納代入

×

○

△※3

（凡例）

○：そのまま代入されます。

△：代入先のデータ長に合わせて，左寄せで代入されます。

×：エラーになります。

注※1

代入元が可変長のデータの場合，代入元のデータ長は実長となります。

注※2

データがあふれた右側部分は切り捨てられます。このとき，SQL連絡領域のSQLWARN1に警告情報が設定されます。また，標識変数の指定があると，切り捨てられる前のデータの長さが設定されます。

ただし，クライアント環境定義PDCLTCNVMODEにUOCを指定して文字コード変換機能を使用している場合は，標識変数には切り捨て後の長さを設定します。

注※3

データが格納されていない右側部分に空白が埋められます。

(2)　代入先が可変長データ，長大データ，BINARYの場合

代入先が可変長の文字列データ，混在文字列データ，各国文字列データ，長大データ，又はBINARYの場合，代入元のデータの長さによって代入規則が異なります。代入先が可変長データの場合の代入規則を次の表に示します。

表1‒24　代入先が可変長データの場合の代入規則

代入の種類

データ長

代入元※1＞代入先※2

代入元※1＜代入先※2

取り出し代入

△※3

△※4

格納代入

×

△※4

（凡例）

△：代入先のデータ長※2に合わせて，左寄せで代入されます。

×：エラーになります。

注※1

代入元が可変長のデータの場合，代入元のデータ長は実長となります。

代入元が位置付け子の埋込み変数の場合は，代入元のデータ長は位置付け子に割り当てられたデータの実長となります。

注※2

代入先のデータ長は，可変長データの最大長です。

代入先が位置付け子の埋込み変数の場合は，代入先のデータ長は次に示す長さとなります。

BLOB位置付け子　 ： 2147483647

BINARY位置付け子 ： 2147483647

注※3

データがあふれた右側部分は切り捨てられ，実長は代入先の最大長となります。このとき，SQL連絡領域のSQLWARN1に警告情報が設定されます。また，標識変数の指定があると，切り捨てられる前のデータの長さが設定されます。

ただし，クライアント環境定義PDCLTCNVMODEにUOCを指定して文字コード変換機能を使用している場合は，標識変数には切り捨て後の長さを設定します。

注※4

代入元が固定長のデータの場合，そのデータ長が実長となります。

(3)　異なる文字集合間の代入規則

代入元と代入先の文字集合が異なる場合の代入はできません。ただし，次の表に示す場合は代入できます。

表1‒25　異なる文字集合間の代入ができる場合

代入元の文字集合

代入先の文字集合

既定文字集合

EBCDIK

UTF16

既定文字集合

○

○※1

○※2

EBCDIK

○※3

○

×

UTF16

○※4

×

○

（凡例）

○：代入できます。

×：代入できません。

注※1

代入元の文字集合が既定文字集合（SJIS）で代入先の文字集合がEBCDIKの場合に代入できる組み合わせは次のとおりです。

代入元の値式

代入先の値式

文字列定数又は埋込み変数

任意の項目

注※2

代入元の文字集合が既定文字集合（UTF-8）で代入先の文字集合がUTF16の場合に代入できる組み合わせは次のとおりです。

代入元の値式

代入先の値式

文字列定数又は埋込み変数

任意の項目

上記以外の値式

埋込み変数

注※3

代入元の文字集合がEBCDIKで代入先の文字集合が既定文字集合（SJIS）の場合に代入できる組み合わせは次のとおりです。

代入元の値式

代入先の値式

値式

埋込み変数

注※4

代入元の文字集合がUTF16で代入先の文字集合が既定文字集合（UTF-8）の場合に代入できる組み合わせは次のとおりです。

代入元の値式

代入先の値式

埋込み変数

任意の項目

値式

埋込み変数

代入元と代入先の文字集合が異なる場合の代入は次のようになります。

取り出し代入の場合

代入先の文字集合に変換してから代入します。このとき，変換後の文字データ長が代入先のデータ長よりも長い場合は，データのあふれた右側部分は切り捨てられ，SQL連絡領域のSQLWARN1に警告情報が設定されます。また，標識変数の指定があると，切り捨てられる前のデータの長さ（バイト数）が設定されます。

代入先が固定長文字データで，代入する文字データ長が代入先のデータ長より短い場合は，代入先の文字集合で使用する空白を補って代入します。

格納代入の場合

代入先の文字集合に変換してから代入します。このとき，変換後の文字データ長が代入先のデータ長よりも長い場合はエラーになります。

代入先が固定長文字データで，代入する文字データ長が代入先のデータ長より短い場合は，代入先の文字集合で使用する空白を補って代入します。

(4)　代入先，代入元の構造規則

代入先の構造と代入元の構造が異なると，代入できない場合があります。代入先，代入元の構造規則を次の表に示します。

表1‒26　代入先，代入元の構造規則

代入元の構造

代入先の構造

単純構造

繰返し構造

単純構造

○

×

繰返し構造

×

○

（凡例）

○：代入できます。

×：エラーになります。

注

添字付き繰返し列は，単純構造として扱います。

1.7　ナル値

ナル値とは，値がないこと，又は値が設定されていないことを示すために使用する特殊な値です。領域に値がないか，又は設定されていなければ，ナル値が設定されます。また，抽象データ型の値がナル値かどうかは，コンストラクタ関数によって値が生成されているかどうかを示すために使用します。

1.7.1　ナル値の扱い

ナル値の扱いについて次に示します。

(1)　検索結果の列の値の受け取り

標識変数の値でナル値を受け取ったかどうかが分かります。埋込み変数でナル値を受け取ることはできません。詳細は，「標識変数の値の設定」を参照してください。

(2)　表への値の格納

標識変数の値でナル値を格納したかどうかが分かります。埋込み変数ではナル値を表へ格納できません。詳細は，「標識変数の値の設定」を参照してください。

(3)　比較

NULL述語以外の述語で，指定した値式，列，埋込み変数の値がナル値である行に対して，その述語は不定になります。ただし，埋込み変数でナル値を指定するには，標識変数が必要です。

(4)　結合

結合列にナル値を持つ行は，どのような行に対しても結合条件を満たしません。

(5)　ソート

昇順の場合は最後に出力します。降順の場合は，最初に出力します。

(6)　グループ分け

グループ分けの条件となる列にナル値を持つ行がある場合は，ナル値同士を同じ値として扱い，グループ分けします。

(7)　重複排除

ナル値同士は，重複するものとして扱います。

(8)　集合関数

集合関数では，基本的にナル値を無視します。ただし，COUNT（＊）の場合は，ナル値に関係なく条件を満たすすべての行を計算します。

(9)　ウィンドウ関数

COUNT（＊） OVER（）の場合は，ナル値に関係なく条件を満たすすべての行を計算します。

(10)　インデクス

ナル値を含む列に対してもインデクスを定義できます。

(11)　四則演算，日付演算，時刻演算，連結演算

データがナル値の場合，四則演算，日付演算，時刻演算，及び連結演算の結果もナル値になります。

(12)　スカラ関数

VALUE又はSTRTONUM以外のスカラ関数では，引数の値式のどちらかがナル値の場合，結果もナル値になります。スカラ関数VALUEでは，引数の値式がすべてナル値であれば，結果もナル値になります。スカラ関数STRTONUMでは，引数1の値式がナル値であれば，結果もナル値になります。

(13)　CASE式

CASE略式のCOALESCEの場合，引数の値式がすべてナル値であれば，結果もナル値になります。

(14)　抽象データ型

抽象データ型のナル値の扱いについて，抽象データ型にコンストラクタ関数を指定して値を生成している場合とそうでない場合に分けて，説明します。

コンストラクタ関数を指定して値を生成していない場合

抽象データ型全体の値はナル値になります。

コンストラクタ関数を指定して値を生成している場合

抽象データ型を構成する各属性の値に関係なく，抽象データ型全体としてはナル値でない値になります。抽象データ型を構成する各属性の値がナル値であっても，抽象データ型全体としての値はナル値にはなりません。

(15)　論理述語

論理値が不定であることと，論理値がナル値であることは等価です。

(16)　繰返し列

要素にはナル値を持つ場合もあります。また，列の要素が0の場合，列全体をナル値とします。

(17)　WRITE指定

WRITE指定の場合，引数のどれかがナル値のときは，結果もナル値になります。

(18)　GET_JAVA_STORED_ROUTINE_SOURCE指定

次のどれかの条件を満たす場合，GET_JAVA_STORED_ROUTINE_SOURCE指定の結果はナル値になります。

引数のうちで，どれかがナル値の場合

指定したJARファイルがインストールされていない場合

JARファイル中に指定したクラスに対応するソースファイルがない場合

(19)　CAST指定

値式にNULLを指定するか，又は値式の結果がナル値の場合は，結果の値はナル値になります。

(20)　参照制約

外部キー構成列中にナル値が含まれる場合，その列は参照制約動作の対象になりません。

1.8　コンポネント指定

抽象データ型で定義された，抽象データ型の構成要素である属性をSQL文中で指定します。

コンポネント指定：：＝項目指定..属性名〔..属性名〕…

コンポネント指定をする場合，次の規則があります。

属性に値を代入する場合，その属性を含む抽象データ型の値がコンストラクタ関数で生成されていなければなりません（その抽象データ型の値がナル値であってはなりません）。

コンポネント指定によって属性を参照する場合，その属性を含む抽象データ型がナル値のときは（コンストラクタ関数でその値が生成されていないときは），参照値もナル値となります。

項目指定には，添字付きの列指定は指定できません。

1.9　ルーチン

ルーチンは，実装に使用する言語ごとに次の種別に分けられます。

SQLルーチン

SQLによって実装したルーチン

外部ルーチン

SQL以外の言語によって実装したルーチン

また，ルーチンは定義SQLごとに次の二つに分けられます。

手続き

関数

1.9.1　手続き

CREATE PROCEDURE，又はCREATE TYPEの手続き本体で定義した手続きを示します。

ルーチンの実装に使用する言語ごとに次の種別に分けられます。

SQL手続き

SQLで実装した手続き

外部手続き

SQL以外の言語で実装した手続き

なお，トリガ定義で作成されるトリガ動作手続きもSQL手続きの一つですが，ルーチンとは別のスキーマ要素（トリガ）としてCREATE TRIGGERで定義します。また，トリガ動作手続きは，指定したトリガ契機で自動的に実行され，CALL文での呼び出しや，SQLパラメタでの値の受け渡しはできません。

1.9.2　関数

(1)　ユーザ定義関数

CREATE FUNCTION，又はCREATE TYPEの関数本体で定義した関数，及びプラグインが提供する関数を示します。プラグインが提供する関数をプラグイン関数といいます。

関数には次の二つがあります。

SQL関数

SQLで実装した関数

外部関数

SQL以外の言語で実装した関数

(2)　システム定義関数

CREATE TYPEでシステムが生成するコンストラクタ関数を示します。

1.9.3　結果集合返却機能

結果集合返却機能を用いた場合，手続き中でカーソルを使用して検索した結果を，コール元で参照できます。

ここでは，手続きで結果集合を返却する方法，及びUAPで手続きが返却した結果集合を受け取る方法について説明します。

(1)　SQL手続き定義の場合

CREATE PROCEDUREのDYNAMIC RESULT SETS句に，結果集合の最大数（コール元に返すカーソルの最大数）を指定します。また，手続きから結果集合として返却するカーソルのカーソル宣言では，WITH RETURNを指定します。

WITH RETURNを指定して宣言したカーソルを開いた状態のまま手続きを終了すると，カーソルの結果集合をコール元に返却できます。返却する結果集合が二つ以上ある場合は，カーソルを開いた順番で返却します。

SQL手続きの定義例を次に示します。

CREATE PROCEDURE ORDERED_EMPS(IN REGION INTEGER)
    DYNAMIC RESULT SETS 2
    BEGIN
        DECLARE CUR1 CURSOR WITH RETURN
            FOR SELECT id_no, name FROM emps_1
                WHERE id_no < REGION ORDER BY id_no;
        DECLARE CUR2 CURSOR WITH RETURN
            FOR SELECT id_no, name FROM emps_2
                WHERE id_no < REGION ORDER BY id_no;
        OPEN CUR1;
        OPEN CUR2;
    END;

(2)　外部Java手続き定義の場合

CREATE PROCEDUREのDYNAMIC RESULT SETS句に，結果集合の最大数（コール元に返すカーソルの最大数）を指定します。

外部Java手続きの定義例を次に示します。

CREATE PROCEDURE ORDERD_EMPS(IN REGION INTEGER)
    DYNAMIC RESULT SETS 2 LANGUAGE JAVA
    EXTERNAL NAME
      'jfile.jar:Routines3.orderedEmps
       (int,java.sql.ResultSet[],java.sql.ResultSet[])
       returns void'
    PARAMETER STYLE JAVA;

(3)　外部Java手続きの実体であるJavaメソッドの作成の場合

外部Java手続きの実体であるJavaメソッドの最後の引数に，java.sql.ResultSet[]型のパラメタを指定します。また，JavaメソッドはSQLを実行して結果集合を受け取り，java.sql.ResultSet[]型のパラメタである変数を設定します。

Javaメソッドの作成例を次に示します。

import java.sql.*;

public class Routines3 {
    public static void orderedEmps(int region,
        java.sql.ResultSet[] rs1, java.sql.ResultSet[] rs2)
    throws SQLException {
        java.sql.Connection conn=DriverManager.getConnection(
            "jdbc:hitachi:PrdbDrive","USER1","USER1");
        java.sql.PreparedStatement stmt1=
          conn.prepareStatement(
              "SELECT id_no,name FROM emps_1 WHERE id_no < ? ORDER BY id_no");
        stmt1.setInt(1, region);
        rs1[0]=stmt1.executeQuery();
        java.sql.PreparedStatement stmt2=
          conn.prepareStatement(
              "SELECT id_no,name FROM emps_2 WHERE id_no < ? ORDER BY id_no");
        stmt2.setInt(1, region);
        rs2[0]=stmt2.executeQuery();
        return;
    }
}

(4)　埋込み型UAPの作成の場合

埋込み型UAPから手続きを実行し，ALLOCATE CURSOR文によって手続きから返却された結果集合の組がカーソルに割り当てられます。カーソルはその先頭の結果集合と関連づけられ，FETCH文によって結果集合からデータを取り出すことができます。

二つ目以降の結果集合は結果集合の組に割り当てられます。前の結果集合と関連づけられているカーソルに対してCLOSE文を実行すると，カーソルと関連づけられ，FETCH文によって結果集合からデータを取り出すことができます。

C言語による埋込み型UAPの作成例を次に示します。

EXEC SQL WHENEVER SQLERROR GOTO error_end;
EXEC SQL CALL ORDERED_EMP(1000);
if (SQLCODE==120) {                   /* 結果集合の組が返却された */
    EXEC SQL ALLOCATE GLOBAL :cur1 FOR PROCEDURE ORDERED_EMP;
                                      /* カーソルを割り当てる */
                                      /* cur1にはカーソル名を指定する */
    while (1) {
        while (1) {
            EXEC SQL WHENEVER NOT FOUND DO break;
            EXEC SQL FETCH GLOBAL :cur1 INTO :emp_id, :emp_name;
            printf("ID No.=%s¥n", emp_id);
            printf("Name=%s¥n", emp_name);
        }
        EXEC SQL WHENEVER NOT FOUND DO break;
        EXEC SQL CLOSE GLOBAL :cur1;
    }
}
error_end:

(5)　Javaを用いたUAPの作成の場合

Java言語で記述したUAPから手続きを実行し，手続きから送られてくる結果集合を受け取ります。

java.sql.PreparedStatement.execute()を使用して結果集合を受け取る場合の，Javaを用いたUAPの作成例を次に示します。

java.sql.CallableStatement stmt=conn.prepareCall(
    "{call ordered_emps(?)}");
stmt.setInt(1,3);
stmt.execute();                             //結果集合を
java.sql.ResultSet rs=stmt.getResultSet();  //受け取る
while(rs.next()) {
    int id_no=rs.getInt(1);
    java.lang.String name=rs.getString(2);
    System.out.println("ID No.="+id_no);
    System.out.println("Name="+name);
    System.out.println();
}
rs.close();
while (stmt.getMoreResults()){
    rs = stmt.getResultSet();
    while(rs.next()) {
        int id_no=rs.getInt(1);
        java.lang.String name=rs.getString(2);
        System.out.println("ID No.="+id_no);
        System.out.println("Name="+name);
        System.out.println();
    }
    rs.close();
}

(6)　留意事項

外部Java手続き中で取得したDatabaseMetaDataクラスの，メソッドが返却する結果集合（ResultSet）は，動的結果集合として返却できません。外部Java手続きのコール元のコネクションのメタデータを使用して，情報を取得してください。

1.10　外部ルーチン

この節では，外部ルーチンについて説明します。外部ルーチンは，SQL以外の言語で記述したルーチンです。HiRDBでは，次の外部ルーチンを使用できます。

外部Javaルーチン

Java言語で記述した外部ルーチンです。外部Javaルーチンは，次のように分類することができます。

外部Java手続き

Java言語で実装した手続きです。

外部Java関数

Java言語で実装した関数です。

外部Cストアドルーチン

C言語で記述した外部ルーチンです。外部Cストアドルーチンは，次のように分類することができます。

外部C手続き

C言語で実装した手続きです。

外部C関数

C言語で実装した関数です。

1.10.1　外部Javaルーチン

この項では，外部Javaルーチンに関連する次の項目について説明します。

外部Javaルーチン名

型マッピング

結果集合返却機能

なお，HP-UX，及びAIXの場合は，POSIXライブラリ版のHiRDBをセットアップ（pdsetupコマンドを実行）していないとき，又はPOSIXライブラリ版のHiRDBから非POSIXライブラリ版のHiRDBに再セットアップしたときは，外部Javaルーチンを使用できません。pdsetupコマンドについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

(1)　外部Javaルーチン名

外部Javaルーチン名は，CREATE PROCEDURE及びCREATE FUNCTIONで指定できます。外部Java手続き及び外部Java関数を，外部ルーチンとして定義するためです。

(a)　形式

　外部Javaルーチン名：：＝'JARファイル名:Javaメソッド名〔Javaシグネチャ〕'

　Javaメソッド名：：＝Javaクラス名.メソッド識別子
　Javaクラス名：：＝〔パッケージ名.〕クラス識別子
　Javaシグネチャ：：＝（〔Javaパラメタ〕）〔returns 型名〕
　Javaパラメタ：：＝型名〔，型名〕…

(b)　説明

JARファイル名

Javaで定義したクラス又はパッケージの集合である，アーカイブファイルの名称を指定します。

JARファイル名は，パス名で指定しないでください。JARファイル名は，最大255バイトで指定できます。

メソッド識別子

実際に処理が記述されているJavaメソッドの識別子を指定します。

メソッド識別子は，最大255バイトで指定できます。

パッケージ名

Javaで定義したクラスの集合である，パッケージの名称を指定します。

クラス識別子

Javaメソッドが定義されているクラスの識別子を指定します。

パッケージ名と合わせて，最大255バイトで指定できます。

returns 型名

Javaメソッドの引数及び戻り値に対応するJavaの型名を指定します。

外部Java手続きを定義する場合は，戻り値の型名をvoid（戻り値なし）にするか，"returns 型名"を省略してください。

外部Java関数を定義する場合は，"returns 型名"を必ず指定してください。ただし，Javaシグネチャを省略する場合は"returns 型名"を指定する必要はありません。なお，外部Java関数では戻り値の型名にvoid（戻り値なし）は指定できません。

型名〔，型名〕…

Javaメソッドの引数及び戻り値に対応するJavaの型名を指定します。

規則を次に示します。

Javaパラメタで記述するJavaメソッドのパラメタの型名は，CREATE PROCEDURE及びCREATE FUNCTIONで指定したSQLパラメタ名の順番に記述してください。

SQLパラメタ名に対応するJavaメソッドのパラメタの型名をすべて記述してください。

CREATE PROCEDUREのDYNAMIC RESULT SETS句で結果集合の最大数を1以上にした場合，指定した結果集合の最大個数以下の型名"java.sql.ResultSet[]"を，Javaパラメタの最後に指定してください。

CREATE FUNCTIONで関数を定義する場合は，HiRDBのデータ型とマッピングできるJavaデータ型を指定します。

CREATE PROCEDUREで定義する手続きでSQLパラメタの入出力モードがINの場合は，HiRDBのデータ型とマッピングできるJavaデータ型を指定します。

CREATE PROCEDUREで定義する手続きでSQLパラメタの入出力モードがOUT又はINOUTの場合は，HiRDBのデータ型とマッピングできるJavaデータ型の一次元の配列型を指定します。

例えば，INTEGERやBLOBの出力パラメタに対しては，java.lang.Integer[]やbyte[] []で指定します。なお，HiRDBのデータ型とマッピングできるJavaデータ型については，「型マッピング」を参照してください。

(c)　規則

Javaシグネチャを省略すると，外部Java手続き又は外部Java関数定義で指定しているHiRDBのデータ型と，SQLパラメタの入出力モードを基に，次に示す規則でJavaデータ型が決定されます。

CREATE FUNCTIONで関数を定義する場合，Javaメソッドのデータ型はマッピング規則に従って決定されます。

CREATE PROCEDUREで定義する手続きのSQLパラメタの入出力モードがINの場合，Javaメソッドのデータ型はマッピング規則に従って決定されます。

CREATE PROCEDUREで定義する手続きのSQLパラメタの入出力モードがOUT又はINOUTの場合，Javaメソッドのデータ型はマッピング規則の一次元の配列型で決定されます。

CREATE PROCEDUREのDYNAMIC RESULT SETS句で結果集合の最大数を1以上指定してJavaシグネチャを省略した場合は，マッピング規則で決定したデータ型から更に，java.sql.ResultSet[]型のパラメタが，Javaメソッドのパラメタとして結果集合の最大個数分追加されます。

例えば，INTEGERやBLOBの出力パラメタに対しては，java.lang.Integer[]やbyte[] []が決定されます。なお，マッピング規則については，「型マッピング」を参照してください。

外部ルーチン名は，必ずアポストロフィ（’）で囲んでください。

外部ルーチン名で指定できるJavaメソッドは，クラス定義のstaticで宣言したクラスメソッドだけです。

各項目に指定できる文字を次に示します。

JARファイル名

アルファベットの大文字と小文字，数字，'_'（アンダースコア），'$'，'.'，'-'

クラス識別子，メソッド識別子，型名

アルファベットの大文字と小文字，数字，'_'（アンダースコア），'$'

パッケージ名

アルファベットの大文字と小文字，数字，'_'（アンダースコア），'$'，'.'

パッケージ名，クラス識別子，メソッド識別子，及び型名の先頭一文字には数字を指定できません。

パッケージ名を省略した型名を記述する場合，HiRDBは次のようにパッケージ名を含む型名として解釈します。

省略した場合の記述形式

HiRDBが解釈するパッケージ名を含む型名

Integer

java.lang.Integer

Short

java.lang.Short

BigDecimal

java.math.BigDecimal

Double

java.lang.Double

Float

java.lang.Float

String

java.lang.String

Date

java.sql.Date

Time

java.sql.Time

Timestamp

java.sql.Timestamp

ResultSet

java.sql.ResultSet

(2)　型マッピング

ここでは，Java言語で扱われるデータ型と，HiRDBで扱うデータ型のマッピングについて説明します。

外部ルーチン指定のJavaシグネチャを省略した場合の暗黙的マッピングを次の表に示します。

表1‒27　外部ルーチン指定のJavaシグネチャを省略した場合の暗黙的マッピング

HiRDBのデータ型

Javaデータ型（NULL値可）

INT〔EGER〕

java.lang.Integer

SMALLINT

java.lang.Short

〔LARGE〕 DEC〔IMAL〕

java.math.BigDecimal

FLOAT，

DOUBLE PRECISION

java.lang.Double

SMALLFLT，

REAL

java.lang.Float

CHAR〔ACTER〕

java.lang.String

VARCHAR(n)，

CHAR〔ACTER〕 VARYING

NCHAR，

NATIONAL CHAR〔ACTER〕

NVARCHAR，

NATIONAL CHAR〔ACTER〕，

NCHAR VARYING

MCHAR

MVARCHAR

DATE

java.sql.Date

TIME

java.sql.Time

TIMESTAMP

java.sql.Timestamp

INTERVAL YEAR TO DAY

java.math.BigDecimal

INTERVAL HOUR TO SECOND

BLOB，

BINARY LARGE OBJECT

byte[]

BINARY

外部ルーチン指定のJavaシグネチャで指定できるJavaデータ型とHiRDBのデータ型のマッピングを次の表に示します。

表1‒28　外部ルーチン指定のJavaシグネチャで指定できるJavaデータ型とHiRDBのデータ型のマッピング

HiRDBのデータ型

Javaデータ型

（NULL値可）

Javaデータ型

（NULL値不可）※１

INT〔EGER〕

java.lang.Integer

int

SMALLINT

java.lang.Short

short

〔LARGE〕 DEC〔IMAL〕

java.math.BigDecimal

−

FLOAT，又は

DOUBLE PRECISION

java.lang.Double

double

SMALLFLT，又は

REAL

java.lang.Float

float

CHAR〔ACTER〕

java.lang.String，又は

byte[]※２

−※３

VARCHAR(n)，又は

CHAR〔ACTER〕 VARYING

NCHAR，又は

NATIONAL CHAR〔ACTER〕

NVARCHAR，

NATIONAL CHAR〔ACTER〕，又は

NCHAR VARYING

MCHAR

MVARCHAR

DATE

java.sql.Date

−

TIME

java.sql.Time

TIMESTAMP

java.sql.Timestamp

INTERVAL YEAR TO DAY

java.math.BigDecimal

INTERVAL HOUR TO SECOND

BLOB，又は

BINARY LARGE OBJECT

byte[]

BINARY

抽象データ型

−

（凡例）

−：Java言語に対応するデータ型がないことを示します。

注※1

NULL値を設定すると，実行時にエラーになります。

注※2

HiRDBの文字列データ型に対応するJavaデータ型として，java.lang.String又はbyte[]のどちらかを指定できます。byte[]を指定した場合，文字コード変換はされません。

注※3

HiRDBと外部Javaルーチンの間で，日本語データをStringクラス及びそれを継承したクラスを介して受け渡す場合，Javaの文字コードのマッピング規則（該当する文字コードとUnicode）によって，外字コードは正しく変換されないので注意してください。

(3)　非POSIXライブラリ版のHiRDBでのSQL実行可否（UNIX版限定）

非POSIXライブラリ版のHiRDBでのSQL実行可否を次の表に示します。非POSIXライブラリ版のHiRDBとは，HP-UX版，及びAIX版の場合に，pdsetupコマンドでPOSIXライブラリ版のロードモジュールをセットアップしていないHiRDBのことをいいます。

表1‒29　非POSIXライブラリ版のHiRDBでのSQL実行可否

分類

SQL文

実行可否

実行できない条件

定義系SQL

ALTER PROCEDURE

△

外部Java手続きの指定

ALTER ROUTINE

△

外部Java手続き及び外部Java関数の指定

CREATE FUNCTION

△

外部Javaルーチンの使用

CREATE PROCEDURE

△

外部Javaルーチンの使用

CREATE TYPE

△

外部Javaルーチンの使用

CREATE VIEW

△

外部Java関数の指定

DROP FUNCTION

○

−

DROP PROCEDURE

○

−

DROP SCHEMA

○

−

操作系SQL

ASSIGN LIST文

○

−

CALL文

△

外部Java手続き

外部Javaルーチンを使う手続き

DELETE文

○

−

DROP LIST文

○

−

FREE LOCATOR文

○

−

INSERT文

△

外部Java関数の使用

PURGE TABLE文

○

−

1行SELECT文

△

外部Java関数の使用

動的SELECT文

△

外部Java関数の使用

UPDATE文

△

外部Java関数の使用

代入文

△

外部Java関数の使用

制御系SQL

LOCK文

○

−

埋込みSQL言語

INSTALL JAR

×

−

REPLACE JAR

×

−

REMOVE JAR

○

−

INSTALL CLIB

○

−

REPLACE CLIB

○

−

REMOVE CLIB

○

−

その他

関数呼出し

△

外部Java関数の呼び出し

外部Java関数を使う関数

（凡例）

○：実行できます。

△：条件によってはエラーとなります。

×：実行できません。

−：該当しません。

1.10.2　外部Cストアドルーチン

この項では，外部Cストアドルーチン名について説明します。なお，SQLを発行する外部Cストアドルーチンは実行できません。

(1)　外部Cストアドルーチン名

外部Cストアドルーチン名は，CREATE PROCEDURE及びCREATE FUNCTIONで指定できます。外部C手続き及び外部C関数を，外部ルーチンとして定義するために指定します。

(a)　形式

　外部Cストアドルーチン名：：＝'Cライブラリファイル名!外部関数識別子'

(b)　説明

Cライブラリファイル名

C言語で実装した関数を含む，ライブラリファイルの名称を指定します。

Cライブラリファイル名は，パス名で指定しないで，ファイル名だけを指定してください。

外部関数識別子

外部Cストアドルーチンの処理が記述されているC関数の識別子を指定します。

(c)　規則

各項目に指定できる文字を次に示します。

Cライブラリファイル名

次に示す半角文字が使用できます。

アルファベットの大文字と小文字，数字，'_'（アンダースコア），'$'，'.'，'-'

外部関数識別子

次に示す半角文字が使用できます。

アルファベットの大文字と小文字，数字，'_'（アンダースコア）

外部関数識別子の先頭一文字には数字を指定できません。

Cライブラリファイル名の長さと，外部関数識別子の長さの合計は，最大で254バイトです。

1.11　日時書式の指定

1.11.1　日時書式の概要と規則

(1)　概要

次の場合に日時書式を指定します。

スカラ関数VARCHAR_FORMATで，日付データ，時刻データ，又は時刻印データを，既定以外の文字列表現に変換する場合

スカラ関数DATE，TIME，及びTIMESTAMP_FORMATで，日付，時刻，又は時刻印の既定以外の文字列表現を，日付データ，時刻データ，又は時刻印データに変換する場合

(2)　日時書式の規則

日時書式として指定できるものを次に示します。

文字列定数，及び混在文字列定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数（MAX，及びMIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

日時書式のデータ型は，文字データ型（CHAR，VARCHAR），又は混在文字データ型（MCHAR，MVARCHAR）にしてください。

日時書式の長さは，最大240バイトにしてください。ただし，変換対象の値式の文字集合がUTF16の場合は，最大480バイトにしてください。

(3)　日時書式の要素

日時書式で指定できる日時書式の要素とその意味を次の表に示します。

表1‒30　日時書式の要素とその意味

日時項目

日時書式の要素※１

意味

年

YYYY

4けたで表した年（0001〜9999）

YY

2けたで表した年（00〜99）※４

月

MM

月（01〜12）

MON

月の省略名※２※３

MONTH

月の名前※２※３

日

DD

日（01〜該当する月の最終日）

時

HH

時（00〜23）

分

MI

分（00〜59）

秒

SS

秒（00〜61）※８

小数秒

FF

小数秒※４※５

NN…N

pけたの小数秒（p=Nの数(1〜6)）※６

その他

空白（ ）

区切り文字として使用できる要素

ハイフン（-）

斜線（/）

コンマ（,）

ピリオド（.）

セミコロン（;）

コロン（:）

"文字列"

文字列自身を表す引用符で囲まれた文字列※７

注※1

日時書式の要素は，引用符（"）で囲まれた文字列以外は半角文字で指定してください。また，MONとMONTHの1，2文字目，及び引用符で囲まれた文字列中の文字以外の文字は，大文字，小文字の区別はされません。

注※2

MON，MONTHでは，月の省略名，及び月の名前の大文字，小文字の指定ができます。大文字と小文字は，指定した日時書式の要素の1，2文字目に従います。

(例)
MONTH→JUNE
Month→June
month→june

日時書式の要素MON，MONTHの1，2文字目と，月の名前，省略名の形式の関係を次の表に示します。

表1‒31　日時書式の要素MON，MONTHの1，2文字目と，月の名前，省略名の形式の関係

2文字目

1文字目

大文字

小文字

大文字

すべて大文字

すべて小文字

小文字

1文字目だけ大文字

すべて小文字

注※3

日時書式の要素をMON，MONTHで指定した場合の，各月の省略名及び名前を次の表に示します。

表1‒32　各月の省略名及び名前（日時書式の要素をMON，MONTHで指定した場合）

月

省略名

名前

1

JAN

JANUARY

2

FEB

FEBRUARY

3

MAR

MARCH

4

APR

APRIL

5

MAY

MAY

6

JUN

JUNE

7

JUL

JULY

8

AUG

AUGUST

9

SEP

SEPTEMBER

10

OCT

OCTOBER

11

NOV

NOVEMBER

12

DEC

DECEMBER

注※4

YY，FFは，スカラ関数VARCHAR_FORMATでだけ有効で，ほかのスカラ関数で指定した場合はエラーとなります。

注※5

FFでは，結果の文字列表現の小数秒部分のけた数は，スカラ関数VARCHAR_FORMATの引数で指定した時刻印データの型に従います。小数秒精度が0の場合は，長さ0の文字列になります。

注※6

NN…Nは，次の形式で変換されます。

日時を文字列表現に変換する場合

時刻印データの小数秒精度よりpが小さければ切り捨て，大きければ拡張した小数秒部分を0で補います。

文字列表現を日時に変換する場合

日時の文字列表現の小数秒部分のけた数は，pと一致している必要があります。

注※7

引用符で囲まれた文字列中に更に引用符を指定する場合，連続する二つの引用符（""）で表します。

注※8

システム共通定義のpd_leap_secondがNの場合，秒の範囲は次のようになります。システム共通定義pd_leap_secondオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

日時項目

日時書式の要素

意味

秒

SS

秒（00〜59）

(4)　日時書式の要素についての規則

日時書式の文字列中には，区切り文字，引用符で囲まれた文字列以外は同じ日時項目の日時書式の要素を2回以上指定できません。

日時を文字列表現に変換する場合に，変換対象の日時のデータと関係のない日時書式の要素が日時書式にあるとき，その部分は次に示す表にある文字列が補われます。

(例)
VARCHAR_FORMAT(DATE('2002-01-01'),'YYYY-MM-DD HH:MI')
→'2002-01-01 00:00'

日時書式の要素に補う文字列を次の表に示します。

表1‒33　日時書式の要素に補う文字列

日時書式の要素

補う文字列

YYYY

現在の年（例：'2002'）

YY

現在の年の下2けた（例：'02'）

MM

現在の月（例：'08'）

MON

現在の月の省略名（例：'AUG'）

MONTH

現在の月の名前（例：'AUGUST'）

DD

現在の日（例：'05'）

HH

'00'

MI

'00'

SS

'00'

FF

'00'

NN…N

'00…0'（pけたの0，p=Nの数）

文字列表現を日時に変換するスカラ関数で必要となる日時項目を次の表に示します。必要な日時項目がない場合はエラーとなります。

表1‒34　文字列表現を日時に変換するスカラ関数で必要となる日時項目

スカラ関数

必要な日時項目

DATE

年，月，日

TIME

時，分，秒

TIMESTAMP_FORMAT

年，月，日，時，分，秒

文字列表現を日時に変換する場合，変換後のデータに関係ない日時書式の要素は，結果には反映されません。

文字列表現を日時に変換する場合，文字列中の書式要素間に，指定した日時書式にはない余分な空白が含まれているときは，その空白は無視されます。

日時書式を指定できるスカラ関数と日時書式の要素の関係を次の表に示します。

表1‒35　日時書式を指定できるスカラ関数と日時書式の要素の関係

日時書式の要素

VARCHAR_FORMAT

DATE

TIME

TIMESTAMP_FORMAT

DATE型※１

TIME型※１

TIMESTAMP型※１

YYYY

○※２

○※２

(現在の年)

○※２

◎

○※５

◎

YY

○※２

○※２

(現在の年の下2けた)

○※２

×

×

×

MM

○※３

○※３

(現在の月)

○※３

◎※３

○※３※５

◎※３

MON

○※３

○※３

(現在の月の省略名)

○※３

◎※３

○※３※５

◎※３

MONTH

○※３

○※３

(現在の月の名前)

○※３

◎※３

○※３※５

◎※３

DD

○

○

(現在の日)

○

◎

○※５

◎

HH

○

('00')

○

○

○※５

◎

◎

MI

○

('00')

○

○

○※５

◎

◎

SS

○

('00')

○

○

○※５

◎

◎

FF

○※４

('00')

○※４

('00')

○※４

×

×

×

NN…N

○※４

('00…0')

○※４

('00…0')

○※４

○※５

○※５

○

（凡例）

◎：必ず指定する必要があり，1回だけ指定できます。指定しないとエラーとなります。

○：1回だけ指定できます。

×：指定できません。指定するとエラーとなります。

(　)：括弧内は，変換される文字列を表します。

注※1

スカラ関数VARCHAR_FORMATで指定した型のデータを，文字列表現に変換する場合について表します。

注※2

YYYY，及びYYは，どちらか一つを1回だけ指定できます。

注※3

MM，MON，及びMONTHは，どれか一つを1回だけ指定できます。

注※4

FF，及びNN…Nは，どちらか一つを1回だけ指定できます。

注※5

結果のデータ型と関係ないため，結果には反映されません。

1.12　インナレプリカ機能使用時の制限

HiRDB Staticizer Optionを組み込んでインナレプリカ機能を使用している場合，及び更新可能なオンライン再編成を使用している場合は，次の制限があります。

インナレプリカ機能使用時

インナレプリカ機能を使用しているRDエリアに対して，実行できるSQLに制限があります。

更新可能なオンライン再編成使用時

オンライン再編成閉塞のRDエリアに対して，実行できるSQLに制限があります。

インナレプリカ機能使用時のSQLの実行可否を次の表に示します。

表1‒36　インナレプリカ機能使用時のSQLの実行可否

SQL

RDエリアの状態

オンライン再編成閉塞以外

オンライン再編成閉塞

定義系SQL

ALTER TABLE

△※１

×

CREATE INDEX

△※１

×

CREATE TABLE

△※１※２

×

DROP INDEX

△※１

×

DROP SCHEMA

△※１

×

DROP TABLE

△※１

×

GRANT

△※１

△※１

操作系SQL

ASSIGN LIST文

○

△※１

CALL文

○

△※１

DELETE文

○

△※１

FETCH文

○

△※１

INSERT文

○

△※１

PURGE TABLE文

○

×

1行SELECT文

○

△※１

動的SELECT文

○

△※１

UPDATE文

○

△※１

代入文

○

△※１

制御系SQL

LOCK文

○

△※１

（凡例）

○：実行できます。

△：条件によってエラーになることがあります。

×：実行できません。

注※1

条件の詳細については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

注※2

インナレプリカ機能を使用しているRDエリアには，改竄防止表は作成できません。

1.13　位置付け子（locator）

1.13.1　位置付け子（locator）の概要と規則

(1)　概要

位置付け子はサーバ上にある特定のデータ値を識別する4バイトの値を持つデータです。位置付け子を用いることで，クライアント上にデータの実体を保持しないで，そのデータを扱うSQLの処理ができます。

(2)　規則

位置付け子の種類を次の表に示します。

表1‒37　位置付け子の種類

種類

内容

BLOB位置付け子

サーバ上のBLOB型データ値を識別する値を持つ

BINARY位置付け子

サーバ上のBINARY型データ値を識別する値を持つ

位置付け子の指定方法と指定できる箇所を次の表に示します。

表1‒38　位置付け子の指定方法と指定できる箇所

種類

指定方法

指定できる箇所

BLOB位置付け子

埋込み変数

BLOB型の埋込み変数が指定できる箇所

BINARY位置付け子

埋込み変数

BINARY型の埋込み変数が指定できる箇所

ただし，割り当てられたサーバ上のデータのデータ型が，最大長が32,001バイト以上のBINARY型である位置付け子の埋込み変数の場合は，最大長が32,001バイト以上のBINARY型の埋込み変数を指定できる箇所だけとなります。

サーバ上のデータ値を割り当てられていない位置付け子は無効です。

位置付け子を次に示す箇所に指定することで，データ値が割り当てられ，その位置付け子は有効となります。有効な位置付け子は同じトランザクション中で，対応するデータ型のデータと同様にSQL文中に指定できます。

1行SELECT文のINTO句

FETCH文のINTO句

代入文の代入先

手続きのOUTパラメタ及びINOUTパラメタに対するCALL文の引数

EXECUTE文のINTO句

位置付け子は次の場合に無効となります。

FREE LOCATOR文に指定

COMMIT文の実行

ROLLBACK文の実行

DISCONNECT文の実行

PURGE TABLE文の実行時の自動的なCOMMIT

クライアント環境変数のPDCMMTBFDDLにYESを設定している場合の定義系SQL実行時の自動的なCOMMIT

暗黙的ロールバックによるトランザクションの終了

無効な位置付け子を，割り当てられたデータを扱うSQL文中，又はFREE LOCATOR文に指定した場合はエラーとなります。

代入文形式2の代入先，及び代入値に位置付け子の埋込み変数を指定することで，サーバ上の同じデータを識別する位置付け子を複数作成した場合は，どれかを無効にしても，ほかの位置付け子は有効のままとなります。

既にデータを割り当てられている有効な位置付け子に対して，再びほかのデータを割り当てた場合でも，元の位置付け子の値は有効のままとなります。

位置付け子の値をUAPの記述言語によって書き換えた場合は，位置付け子が無効となります。又は書き換える前のデータと異なるデータを識別する場合があります。

無効な位置付け子に対して，UAPの記述言語によって有効な位置付け子の値を代入した場合，その位置付け子は有効となり，代入元の位置付け子と同じデータを識別します。また，この場合にどれかを無効にすると，どちらの位置付け子も無効となります。

1.14　XML型

XML型はXML文書を格納するための抽象データ型で，HiRDB XML Extensionと連携することで使用できます。

XML型の値はXQueryシーケンスとなります。XQueryシーケンスについては「XQuery」を参照してください。

XML型に対しては，XML型の値を処理するSQL（SQL/XML）を使用して，特定の条件に合致するXML文書の絞込みや，XML文書中の，特定の部分構造の値の取り出しなどの操作ができます。

1.14.1　XML型の記述形式

(1)　形式

XML型はデータ型を指定する箇所に，次に示す形式で指定します。

　XML

(2)　データ形式

XML型はXML変換コマンド（phdxmlcnv）又はXML変換ライブラリを使用して，XML文書を解析した形式で処理します。この形式をESIS-B形式と呼びます。

(3)　最大長

XML型の値は，ESIS-B形式で2,147,483,647バイト以下である必要があります。ESIS-B形式の長さは，XML文書の長さだけではなく，XML要素数などの構造にも依存します。

(4)　値の生成

XML型の値はXMLコンストラクタ関数又はXMLPARSE関数で生成できます。

XMLコンストラクタ関数については，「XMLコンストラクタ関数」を参照してください。XMLPARSE関数については，「XMLPARSE」を参照してください。

(5)　値の取り出し

UAPでXML型の値を直接取り出すことはできません。XML型の値は，次の方法でVARCHAR型又はBINARY型の値として取り出すことができます。

XMLSERIALIZE関数で，VARCHAR型又はBINARY型の値に変換する。

(6)　値式の指定

XML型の値式として指定できるものを次に示します。

列指定

XMLコンストラクタ関数

XMLQUERY関数

XMLAGG集合関数

XMLPARSE関数

(7)　変換（代入，比較）できるデータ型

XML型の値は，XML型で定義された列，SQL変数，SQLパラメタにだけ代入できます。ほかのデータ型の値はXML型に代入できません。また，ほかのデータ型及びXML型との比較はできません。

(8)　ナル値

XMLコンストラクタ関数を指定して値を生成していない場合，及びXMLコンストラクタ関数の引数にナル値を指定した場合は，XML型の値はナル値になります。また，XMLPARSE関数の引数にナル値を指定した場合，XML型の値はナル値になります。

(9)　使用上の注意事項

XML型及び次の機能を使用するには，所有者をMASTERとしてHiRDB XML Extensionと連携する必要があります。

XMLコンストラクタ関数

XMLQUERY関数

XMLSERIALIZE関数

XMLEXISTS述語

XMLAGG集合関数

XMLPARSE関数

CREATE INDEX 形式3 （部分構造インデクス定義）

XML型は，次に示す機能では使用できません。

CREATE INDEX 形式1によるインデクス定義

ソート

グループ分け

集合演算，四則演算，連結演算

XMLAGGを除く集合関数

重複排除

CASE式

CAST指定

外への参照列

INSERT文及びUPDATE文で列に格納できるXML型の値は，XMLコンストラクタ関数で生成した値を，挿入値又は更新値として指定した場合だけです。

1.14.2　XMLコンストラクタ関数

(1)　機能

XML型の値を生成します。

(2)　形式

　XML ( 値式 〔 AS データ型 〕 )

(3)　規則

値式に指定できるものを次に示します。

SQL変数又はSQLパラメタ

埋込み変数又は？パラメタ

値式にはXML文書に対してXML変換コマンド又はXML変換ライブラリを使用し，出力されたESIS-B形式の値をBINARY型で指定してください。

値式に埋込み変数又は？パラメタを指定する場合は，必ず値式のデータ型をAS データ型で指定してください。指定できるデータ型はBINARY型だけです。AS データ型を指定した場合，埋込み変数及び？パラメタ以外は指定できません。

結果のデータ型はXML型になります。

値式がナル値の場合は，結果もナル値になります。

XMLコンストラクタ関数は，次の箇所に単独で指定できます。

INSERT文の挿入値

UPDATE文の更新値

(4)　使用例

書籍管理表に，埋込み変数（bookinfo）に格納されたXML文書を挿入します。

  INSERT INTO 書籍管理表
       VALUES (310494321, XML(:bookinfo AS BINARY(102400)))

1.14.3　SQL/XML スカラ関数

(1)　XMLQUERY

(a)　機能

XQueryを評価し，その結果のXML型の値を生成します。

(b)　形式

  XMLQUERY ( XQuery問合せ
             PASSING BY VALUE XML問合せ引数 〔，XML問合せ引数 〕…
             〔 RETURNING SEQUENCE 〔 BY VALUE 〕〕
             EMPTY ON EMPTY )

  XQuery問合せ ：：= 文字列定数
  XML問合せ引数 ：：= ｛XML問合せ文脈項目 ｜ XML問合せ変数｝
  XML問合せ文脈項目 ：：= 値式 〔 BY VALUE 〕
  XML問合せ変数 ：：= 値式 AS XQuery変数識別子 〔 BY VALUE 〕

(c)　オペランド

XQuery問合せ ：：= 文字列定数

評価するXQueryを文字列定数で指定します。XQueryの指定方法については，「XQuery」を参照してください。

XML問合せ引数 ：：= ｛ XML問合せ文脈項目 ｜ XML問合せ変数 ｝

XQueryに渡す引数を指定します。

XML問合せ引数としてXQueryに渡す，XQueryシーケンスに含まれるXQuery項目の親プロパティは空になります。また，異なるXML問合せ引数に指定したXQueryシーケンスに，同じXML型の値の同じ部分を表すノードが含まれていた場合でも，XQueryの評価ではそれらを異なるノードとして扱います。

XML問合せ文脈項目 ：：= 値式 〔 BY VALUE 〕

XQueryの評価対象である文脈項目を指定します。

指定しない場合は，XQueryの評価対象の文脈項目は設定しないで，XQuery問合せに指定したXQueryを一度評価します。

なお，この項目はPASSING句中に一つしか指定できません。

値式

結果がXML型の値となる値式を指定します。

この値式の結果である，XML型の値のXQueryシーケンスを構成する各XQuery項目が，XQueryの評価対象の文脈項目となります。

値式の結果がナル値の場合は，XMLQUERY関数の結果はナル値になります。

指定できるものを次に示します。

列指定

列指定によって導出した名前付き導出表の列

BY VALUE

指定の有無によって，XML問合せ文脈項目に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。

XML問合せ変数：：= 値式 AS XQuery変数識別子〔 BY VALUE 〕

XQuery問合せに指定された，XQuery中のXQuery変数に値を渡す場合に指定します。

値式

XQuery問合せに指定された，XQuery中のXQuery変数に渡す値式を指定します。

値式の結果がXML型でない場合は，XML型の値であるXQueryシーケンスに変換して渡します。

指定できるデータ型と，変換後の形式を次の表に示します。

表1‒39　 XQuery変数に渡す値のデータ型と，変換後のXML型の値の形式

データ型

変換後の形式

INTEGER

xs:int型の値※

SMALLINT

xs:int型の値※

DECIMAL

xs:decimal型の値※

FLOAT

xs:double型の値※

SMALLFLT

xs:double型の値※

CHAR

xs:string型の値※

VARCHAR

xs:string型の値※

MCHAR

xs:string型の値※

MVARCHAR

xs:string型の値※

DATE

xs:date型の値※

TIME

xs:time型の値※

TIMESTAMP

xs:dateTime型の値※

XML

変換しません

（値式に指定したXML型の値と同じ形式になります）

注※

一つの基本単位値から構成されるXQueryシーケンスになります。

XQueryシーケンスに変換できない場合は，エラーとなります。

また，値式の結果がナル値の場合は，空のXQueryシーケンスである値をXQuery変数に渡します。

値式に指定できるものを次に示します。

定数

USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，CURRENT_TIMESTAMP値関数

列指定

SQL変数又はSQLパラメタ

四則演算，日付演算，時刻演算又は連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

上記のどれかの値式によって導出した名前付き導出表の列

AS XQuery変数識別子

値を渡すXQuery変数の識別子を指定します。

XQuery変数識別子には，XQuery問合せ中に指定したXQuery変数名を指定します。指定方法については，「名前の指定」を参照してください。

ここで指定したXQuery変数識別子のXML名前空間は，XQuery問合せでの既定のXML名前空間となります。

ここで指定したXQuery変数識別子に対応するXQuery変数は，XQuery問合せで指定したXQuery全体が有効範囲になります。

同じPASSING句中のほかのXML問合せ変数で指定したXQuery変数識別子は指定できません。

BY VALUE

指定の有無によって，XML問合せ変数に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。

値式の結果がXML型となる場合だけ指定してください。値式の結果がXML型でない場合に指定すると，エラーとなります。

RETURNING SEQUENCE 〔 BY VALUE 〕

指定の有無によって，XQueryの評価結果の値の形式及び返却方法は変わりません。ISO規格との互換のためにサポートしています。

(d)　規則

結果はXML型の値でXQueryシーケンスとなります。また，結果の値であるXQueryシーケンスを構成するXQuery項目の親プロパティは，空となります。

この関数は，関数呼出しが指定できる箇所にだけ指定できます。

INSERT文で，この関数の結果又は結果を基にしたXML型の値を，列に格納することはできません。

UPDATE文で，この関数の結果を列に格納する場合，次の条件をすべて満たす必要があります。

XML問合せ文脈項目を指定している。

XQuery問合せ中のXQuery式がXQuery変換式である。

(e)　使用例

書籍管理表の書籍情報列から，埋込み変数（category）で指定されたカテゴリの書籍のタイトルを取得します。

  SELECT XMLSERIALIZE(
           XMLQUERY('/書籍情報[カテゴリ=$CATEGORY]/タイトル'
                    PASSING BY VALUE 書籍情報,
                    :category AS CATEGORY
                    RETURNING SEQUENCE BY VALUE
                    EMPTY ON EMPTY)
           AS VARCHAR(32000))
         FROM 書籍管理表

(2)　XMLSERIALIZE

(a)　機能

XML型の値を直列化（文字列に変換）した，VARCHAR型又はBINARY型の値を生成します。

(b)　形式

  XMLSERIALIZE ( 〔 CONTENT 〕
                  値式 AS データ型
                  〔 VERSION '1.0' 〕
                  〔｛ INCLUDING XMLDECLARATION
                      ｜EXCLUDING XMLDECLARATION ｝〕)

(c)　オペランド

CONTENT

指定の有無によって，結果の形式は変わりません。ISO規格との互換のためにサポートしています。

結果の形式は，整形式XML文書の形式である必要はありません。

値式

VARCHAR型又はBINARY型の値を生成するXML型の値を指定します。

指定できるものを次に示します。

列指定

XMLQUERY関数

XMLAGG集合関数

列指定によって導出した名前付き導出表の列

AS データ型

結果のデータ型を指定します。

指定できるデータ型を次に示します。

VARCHAR型（文字集合指定は指定できません）

BINARY型

結果が指定したデータ型の最大長に格納できない場合は，エラーとなります。

〔 VERSION '1.0' 〕

結果のXMLのバージョンを指定します。省略した場合は，'1.0'を仮定します。

〔｛ INCLUDING XMLDECLARATION ｜ EXCLUDING XMLDECLARATION ｝〕

結果のXMLにXML宣言（例：'<?xml version="1.0" encoding="UTF-8"?>'）を含めるかどうかを指定します。省略した場合は， EXCLUDING XMLDECLARATIONを仮定します。

INCLUDING XMLDECLARATION

結果のXMLにXML宣言を含める場合に指定します。

EXCLUDING XMLDECLARATION

結果のXMLにXML宣言を含めない場合に指定します。

(d)　規則

値式がナル値の場合は，結果もナル値になります。

結果の文字コードは，pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で指定した文字コードになります。

直列化した結果は，値式が示すXQueryシーケンス中の各XQuery項目を，次に示す規則に従って変換した結果を連結した文字列になります。ただし，隣接する基本単位値は，空白1文字を入れて連結します。

文書ノードを直列化した結果は，その子ノードを直列化した結果を連結した文字列になります。

要素ノードを直列化した結果は，次に示す要素ノードの文字列表現になります。子ノードを持つ要素ノードの場合は，開始タグから始まる文字列が直列化した結果になります。子ノードを持たない要素ノードの場合は，空要素タグが直列化した結果になります。

要素ノードの文字列表現 ：：= ｛ 開始タグ  子ノードの文字列表現  終了タグ ｜ 空要素タグ ｝
子ノードの文字列表現 ：：= ｛ 要素ノードの文字列表現 ｜ 処理命令ノードの文字列表現 ｜
                           コメントノードの文字列表現 ｜ テキストノードの文字列表現 ｝

開始タグ ：：=  < 修飾名 〔 空白 XML名前空間の文字列表現 〕…
                  〔 空白 属性ノードの文字列表現 〕… >
終了タグ ：：=  </ 修飾名 >
空要素タグ ：：= < 修飾名 〔 空白 XML名前空間の文字列表現 〕…
                    〔 空白 属性ノードの文字列表現 〕… />

XML名前空間の文字列表現

要素ノード以下で有効なXML名前空間のうち，祖先の要素ノードで指定されていないXML名前空間を表すXML属性を，属性ノードの文字列表現で表した文字列になります。

属性ノードを直列化した結果は，次に示す属性ノードの文字列表現になります。

属性ノードの文字列表現 ：：= 修飾名 等号演算子 "属性値"

属性値

属性ノードの文字列値に対して，次の文字を対応する文字列に置き換えた文字列になります。

置き換える文字

対応する文字列

&（アンパーサンド）

&amp;

< （小なり演算子）

&lt;

> （大なり演算子）

&gt;

"（引用符）

&quot;

' （アポストロフィ）

&apos;

処理命令ノードを直列化した結果は，次に示す処理命令ノードの文字列表現になります。

処理命令ノードの文字列表現：：=  <? 処理命令ターゲット 空白 〔 処理命令ノードの内容 〕?>

コメントノードを直列化した結果は，次に示すコメントノードの文字列表現になります。

コメントノードの文字列表現：：=  <!-- コメントノードの内容 -->

テキストノードを直列化した結果は，次に示すテキストノードの文字列表現になります。

テキストノードの文字列表現：：= テキスト値

テキスト値

テキストノードの内容に対して，次の文字を対応する文字列に置き換えた文字列になります。

置き換える文字

対応する文字列

&（アンパーサンド）

&amp;

< （小なり演算子）

&lt;

> （大なり演算子）

&gt;

基本単位値を直列化した結果は，xs:string型の基本単位値に変換した文字列に対して，次の文字を対応する文字列に置き換えた文字列になります。

置き換える文字

対応する文字列

& （アンパーサンド）

&amp;

< （小なり演算子）

&lt;

> （大なり演算子）

&gt;

この関数は，関数呼出しが指定可能な箇所にだけ指定できます。

(e)　使用例

書籍管理表の書籍情報列の値を，VARCHAR型の値として取得します。

  SELECT XMLSERIALIZE(書籍情報 AS VARCHAR(32000)
                      INCLUDING XMLDECLARATION) FROM 書籍管理表

(3)　XMLPARSE

(a)　機能

XML文書からXML型の値を生成します。

(b)　形式

  XMLPARSE(  DOCUMENT 値式
　　　　　　　〔 AS データ型 〕
　　　　　　　〔 WHITESPACE指定 〕 )

  WHITESPACE指定 ：：＝ ｛ PRESERVE ｜ STRIP ｝WHITESPACE

(c)　オペランド

DOCUMENT

値式に指定したXML文書が，整形式XML文書であることを表します。このオペランドを省略することはできません。

値式

XML型の値を生成する整形式XML文書を指定します。指定できるデータ型を次に示します。

CHAR型（文字集合指定は指定できません）

VARCHAR型（文字集合指定は指定できません）

MCHAR型

MVARCHAR型

BINARY型

AS データ型

値式のデータ型を指定します。値式に埋込み変数又は？パラメタを指定する場合は，ASデータ型を必ず指定してください。ASデータ型を指定した場合は，値式に埋込み変数及び？パラメタ以外を指定できません。

WHITESPACE指定 ：：＝ ｛ PRESERVE ｜ STRIP ｝WHITESPACE

XML文書に含まれる空白類の取り扱い方を指定します。空白類は，空白(X'20')，水平タブ(X'09')，改行(X'0A')，及び復帰(X'0D')です。省略時は，STRIP WHITESPACEを仮定します。

なお，WHITESPACE指定に関係なく，復帰(X’0D’)及び復帰改行(X’0D0A’)は，改行(X’0A’)に置き換えます。続いて，WHITESPACE指定に従った処理を行います。

PRESERVE WHITESPACE

すべての空白類を保持します。

STRIP WHITESPACE

テキストノードに含まれる空白類に対して，次の正規化処理を行います。ただし，xml:space="preserve"属性を持つ要素の子孫のテキストノードは除きます。

先頭及び末尾の空白類を除去

連続する空白類を一つの空白(X'20')に置き換え

(d)　規則

値式がナル値の場合は，結果もナル値になります。

この関数は，関数呼出しが指定できる箇所にだけ指定できます。

DTD，XMLスキーマ，コメント，及び処理命令が記述されていても無視し，記述されていないものとして処理します。値式に指定したXML文書の妥当性は，検証しません。

使用できる実体は，定義済み実体（&lt; &gt; &amp; &apos; &quat;）だけです。これ以外の内部実体及び外部実体は使用できません。使用した場合は文字として扱います。

XML宣言のencoding属性に指定できる文字コード種別を，次の表に示します。省略時は，UTF-8が仮定されます。

XML文書のencoding属性

HiRDBの文字コード

sjis

（シフトjis漢字）

ujis

（EUC日本語漢字）

utf-8

（Unicode（UTF-8））

Shift_JIS

○

×

×

EUC-JP

×

○

×

UTF-8

×

×

○

US-ASCII

○

○

○

上記以外

×

×

×

（凡例）

○：指定できます。

×：指定できません。

値式には5メガバイト以内のXML文書を指定してください。

要素名及び属性名は，4,096バイト以内で記述してください。

要素のネスト数は，100以内で記述してください。

接頭辞が記述されている場合，HiRDB XML Extensionのバージョンによって規則が異なります。

HiRDB XML Extensionのバージョンが08-05より前の場合

接頭辞が記述されていても，接頭辞が指定されていないものとして処理し，すべての要素及び属性は既定のXML名前空間として扱います。

HiRDB XML Extensionのバージョンが08-05以降の場合

XML ExtensionのXMLデータ型プラグインの環境設定（XMLPARSE名前空間処理指定）に従います。XMLデータ型プラグインの環境設定については，マニュアル「HiRDB XML拡張機能 HiRDB XML Extension Version 9」を参照してください。

(e)　使用例

書籍管理表にBINARY型の埋込み変数（bookxml）に格納されたXML文書を挿入します。

  INSERT INTO 書籍管理表
    VALUES(310494321, XMLPARSE(DOCUMENT :bookxml AS BINARY(32000)))

(f)　留意事項

この関数を使用するには，バージョンが08-04以降のHiRDB XML Extensionが必要です。

HiRDBサーバとHiRDBクライアントで文字コードが異なる場合は，値式のデータ型をBINARY型にしてください。

1.14.4　SQL/XML 述語

(1)　XMLEXISTS述語

(a)　機能

XQueryを評価した結果のXML型の値が，一つ以上のXQuery項目から構成されるXQueryシーケンスであるかどうかを判別します。

(b)　形式

  XMLEXISTS ( XQuery問合せ
               PASSING BY VALUE XML問合せ引数 〔，XML問合せ引数 〕… )

  XQuery問合せ ：：= 文字列定数
  XML問合せ引数 ：：= ｛XML問合せ文脈項目 ｜ XML問合せ変数｝
  XML問合せ文脈項目 ：：= 値式 〔 BY VALUE 〕
  XML問合せ変数 ：：= 値式 AS XQuery変数識別子 〔 BY VALUE 〕

(c)　オペランド

XQuery問合せ ：：= 文字列定数

評価するXQueryを文字列定数で指定します。XQueryの指定方法については，「XQuery」を参照してください。

XML問合せ引数 ：：= ｛ XML問合せ文脈項目 ｜ XML問合せ変数 ｝

XQueryに渡す引数を指定します。

XML問合せ引数としてXQueryに渡す，XQueryシーケンスに含まれるXQuery項目の親プロパティは空になります。また，異なるXML問合せ引数に指定したXQueryシーケンスに，同じXML型の値の同じ部分を表すノードが含まれていた場合でも，XQueryの評価ではそれらを異なるノードとして扱います。

XML問合せ文脈項目 ：：= 値式 〔 BY VALUE 〕

XQueryの評価対象である文脈項目を指定します。

指定しない場合は，XQueryの評価対象の文脈項目は設定しないで，XQuery問合せに指定したXQueryを一度評価します。

なお，この項目はPASSING句中に一つしか指定できません。

値式

結果がXML型の値となる値式を指定します。

この値式の結果である，XML型の値のXQueryシーケンスを構成する各XQuery項目が，XQueryの評価対象の文脈項目となります。

値式の結果がナル値の場合は，XMLEXISTS述語は不定となります。

指定できるものを次に示します。

列指定

列指定によって導出した名前付き導出表の列

BY VALUE

指定の有無によって，XML問合せ文脈項目に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。

XML問合せ変数 ：：= 値式 AS XQuery変数識別子 〔 BY VALUE 〕

XQuery問合せに指定された，XQuery中のXQuery変数に値を渡す場合に指定します。

値式

XQuery問合せに指定された，XQuery中のXQuery変数に渡す値式を指定します。

値式の結果がXML型でない場合は，XML型の値であるXQueryシーケンスに変換して渡します。

指定できるデータ型と，変換後の形式を次の表に示します。

表1‒40　 XQuery変数に渡す値のデータ型と変換後のXML型の値の形式

データ型

変換後の形式

INTEGER

xs:int型の値※

SMALLINT

xs:int型の値※

DECIMAL

xs:decimal型の値※

FLOAT

xs:double型の値※

SMALLFLT

xs:double型の値※

CHAR

xs:string型の値※

VARCHAR

xs:string型の値※

MCHAR

xs:string型の値※

MVARCHAR

xs:string型の値※

DATE

xs:date型の値※

TIME

xs:time型の値※

TIMESTAMP

xs:dateTime型の値※

XML

変換しません

（値式に指定したXML型の値と同じ形式になります）

注※

一つの基本単位値から構成されるXQueryシーケンスになります。

XQueryシーケンスに変換できない場合は，エラーとなります。

また，値式の結果がナル値の場合は，空のXQueryシーケンスである値をXQuery変数に渡します。

値式に指定できるものを次に示します。

定数

USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，CURRENT_TIMESTAMP値関数

列指定

SQL変数又はSQLパラメタ

四則演算，日付演算，時刻演算，又は連結演算

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

上記のどれかの値式から導出した名前付き導出表の列

AS XQuery変数識別子

値を渡すXQuery変数の識別子を指定します。

XQuery変数識別子にはXQuery問合せ中に指定したXQuery変数名を指定します。指定方法については，「名前の指定」を参照してください。

ここで指定したXQuery変数識別子のXML名前空間はXQuery問合せでの既定のXML名前空間となります。

ここで指定したXQuery変数識別子に対応するXQuery変数は，XQuery問合せで指定したXQuery全体が有効範囲になります。

同じPASSING句中のほかのXML問合せ変数で指定したXQuery変数識別子は指定できません。

BY VALUE

指定の有無によって，XML問合せ変数に指定した値式の結果の値の渡し方は変わりません。ISO規格との互換のためにサポートしています。

値式の結果が，XML型となる場合だけ指定してください。値式の結果が，XML型でない場合に指定すると，エラーとなります。

(d)　述語が真となる場合

XQueryを評価した結果のXML型の値が一つ以上のXQuery項目から構成されるXQueryシーケンスである場合に，XMLEXISTS述語は真になります。

(e)　規則

この述語は，WHERE句にだけ指定できます。

副問合せ中には指定できません。

(f)　使用例

書籍情報列に，書籍管理表から埋込み変数（price）で指定された値以上の価格である書籍情報が格納された行の書籍ID列の値を取得します。

  SELECT 書籍ID FROM 書籍管理表
    WHERE XMLEXISTS('/書籍情報[価格>=$PRICE]'
                    PASSING BY VALUE 書籍情報,
                    :price AS PRICE)

1.14.5　SQL/XML 集合関数

(1)　XMLAGG

(a)　機能

引数に指定したXML型の各行の値を連結したXML型の値を，行の集まりから生成します。

(b)　形式

  XMLAGG ( 値式
           〔 RETURNING SEQUENCE 〕)

(c)　オペランド

値式

連結するXML型の値式を指定します。

指定できるものを次に示します。

列指定

XMLQUERY関数

列指定によって導出した名前付き導出表の列

RETURNING SEQUENCE

指定の有無によって，連結した結果の値の形式は変わりません。ISO規格との互換のためにサポートしています。

(d)　規則

結果はXML型の値でXQueryシーケンスとなります。

連結する順序は保証しません。

値式の結果がナル値の行は無視します。

適用対象が0件，又はナル値だけの場合は，結果はナル値となります。

INSERT文及びUPDATE文で，この関数の結果又は結果を基にしたXML型の値を，列に格納することはできません。

その他の規則については，「集合関数」の規則に従います。

(e)　使用例

書籍管理表のすべての行の書籍情報列から，タイトルが"SQL徹底解説"の書籍情報と同じカテゴリの書籍情報を取得します。

  SELECT XMLSERIALIZE(
    XMLQUERY(
      '$BOOKS/書籍情報[カテゴリ=$BOOKS/書籍情報[タイトル="SQL徹底解説"]/カテゴリ]'
      PASSING BY VALUE XMLAGG(書籍情報 ) AS BOOKS
      RETURNING SEQUENCE BY VALUE EMPTY ON EMPTY)
  AS VARCHAR(32000))
    FROM 書籍管理表

1.14.6　XML型用定義系SQL

(1)　CREATE INDEX 形式3 （部分構造インデクス定義）

(a)　機能

XML型列の，値の特定の部分構造をキーとするインデクスを定義します。

(b)　使用権限

表の所有者

公用RDエリアに，自分が所有する表のインデクスを定義できます。

私用RDエリアの利用権限を持つ表の所有者

利用権限を持つ私用RDエリアに，自分が所有する表のインデクスを定義できます。

(c)　形式＜部分構造インデクスの定義＞

　CREATE 〔UNIQUE〕 INDEX 〔認可識別子.〕インデクス識別子
　　　　ON 〔認可識別子.〕表識別子（列名〔｛ASC｜DESC｝〕）
　　　　〔IN｛RDエリア名
　　　　　　　｜（RDエリア名）
　　　　　　　｜（（RDエリア名）〔，（RDエリア名）〕…）
　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　KEY 〔 USING UNIQUE TAG 〕FROM 部分構造指定 AS データ型
　　　　〔インデクスオプション〕…

　マトリクス分割インデクス格納用RDエリア指定 ：：＝ 2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝
　　　　　　　（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト ：：＝ （RDエリア名〔，RDエリア名〕…）
　部分構造指定 ：：＝ 文字列定数
　インデクスオプション ：：＝｛PCTFREE=未使用領域の比率
　　　　　　　　　　　　　　　｜UNBALANCED SPLIT
　　　　　　　　　　　　　　　｜EMPTY｝

(d)　オペランド

KEY句以外のオペランド及びオペランド規則については「CREATE INDEX　形式1（インデクス定義）」を参照してください。

KEY 〔USING UNIQUE TAG〕 FROM 部分構造指定 AS データ型

USING UNIQUE TAG

一つのXML型列の値の中で，部分構造指定に該当する部分構造が一意に決まる場合に指定します。ただし，部分構造指定に該当する部分構造がXML属性の場合は，そのXML属性を持つXML要素が一意に決まる必要があります。

CREATEの直後のUNIQUEオペランドを指定した場合は，この指定が仮定されます。

部分構造指定 ：：＝ 文字列定数

キーとする部分構造を表す文字列定数を，部分構造パスの形式の値で指定します。

部分構造パスの形式を次に示します。なお部分構造パス中のキーワードは，すべて小文字で指定します。

  部分構造パス ：：＝ 〔XML名前空間宣言〕… 部分構造パス式
  XML名前空間宣言 ：：＝ ｛ declare namespace 接頭辞 = XML名前空間URI;
                          ｜ declare default element namespace XML名前空間URI;｝

  部分構造パス式 ：：＝ /ステップ式〔/ステップ式〕…
  ステップ式 ：：＝ 〔 @ 〕 修飾名
  修飾名 ：：＝ 〔接頭辞:〕局所名

declare namespace 接頭辞 = XML名前空間URI;

部分構造パス式中に接頭辞付きの修飾名を含む場合，その修飾名の接頭辞のXML名前空間を宣言します。同じ接頭辞のXML名前空間は複数宣言できません。

接頭辞

部分構造パス式中の修飾名の接頭辞を指定します。

大文字小文字を区別します。

XML名前空間URI

接頭辞に関連付けるXML名前空間のURIを引用符（"）又はアポストロフィ（'）で囲んで指定します。

大文字小文字を区別します。

declare default element namespace XML名前空間URI;

部分構造パス式の既定のXML名前空間を宣言します。部分構造パス式中の接頭辞のない修飾名のXML名前空間は，ここで宣言したXML名前空間となります。

部分構造パス中には，既定のXML名前空間を複数宣言できません。

この指定を省略した場合，既定のXML名前空間のXML名前空間URIは，' http://www.w3.org/XML/1998/namespace'を仮定します。

XML名前空間URI

接頭辞を省略した修飾名に対するXML名前空間のURIを引用符（"）又はアポストロフィ（'）で囲んで指定します。

大文字小文字を区別します。

部分構造パス式

キーとする部分構造を表すパスを指定します。

各指定項目の意味を次の表に示します。

指定項目

意味

先頭の斜線(/)

斜線の後のステップ式が示す要素が，XML型の値の中の最上位のXML要素であることを意味します。

途中の斜線(/)

斜線の後のステップ式が示すXML要素又はXML属性が，斜線の前のステップ式が示すXML要素の，子のXML要素又はXML属性であることを意味します。

ステップ式

XML要素又はXML属性を意味します。

ただし，XML属性を意味するステップ式は最後にだけ指定できます。

@

＠の後の修飾名がXML属性の名前であることを意味します。

＠がない場合は，修飾名はXML要素の名前となります。

修飾名

XML要素又はXML属性の名前を意味します。

接頭辞:

後に続く局所名が，接頭辞が示すXML名前空間中の局所名であることを意味します。XML名前空間宣言でXML名前空間に対して割り当てた接頭辞を指定します。

「接頭辞:」を省略した場合は，局所名は既定のXML名前空間中の名前となります。

局所名

XML名前空間中でのXML要素又はXML属性の名前を意味します。

部分構造指定の指定例を次の表に示します。

項番

指定例

意味

1

'/書籍情報/カテゴリ'

最上位のXML要素である「書籍情報」の子のXML要素「カテゴリ」をキーとします。

2

'/書籍情報/@書籍ID'

最上位のXML要素である「書籍情報」の属性「書籍ID」をキーとします。

3

'declare namespace

b="http://www.foo.co.jp/bookinfo";

/b:書籍情報/b:カテゴリ'

最上位のXML要素である「書籍情報」の子のXML要素「カテゴリ」をキーとします。ただし，「書籍情報」及び「カテゴリ」のXML要素の名前はのXML名前空間URIが"http://www.foo.co.jp/bookinfo"であるXML名前空間中の名前となります。

4

'declare default element namespace "http://www.foo.co.jp/bookinfo";

/書籍情報/カテゴリ'

項番3と同じ意味となります。

データ型

キー値のデータ型を指定します。

指定できるデータ型を次に示します。

・INTEGER

・DECIMAL

・FLOAT

・VARCHAR（文字集合指定は指定できません）

キー値は，キーとする部分構造に対応するXQueryデータモデルでのノードの型付き値プロパティの値を，ここで指定したSQLのデータ型に変換した値になります。

インデクス定義時に，既に列に格納されている値のキーとする部分構造の値が指定したSQLのデータ型に変換できない場合は，インデクスは定義できません。また，インデクスを定義した列に対する値の挿入又は値の更新時に，その挿入値又は更新値のキーとする部分構造の値が指定したSQLのデータ型に変換できない場合は，挿入又は更新ができません。

各ノードが持つ型付き値プロパティの値については，「XQueryデータモデル」を参照してください。型付き値プロパティの値のXQueryデータ型とSQLのデータ型の対応関係を，次の表に示します。

表1‒41　 XQueryデータ型とSQLのデータ型の対応関係

部分構造に対応するXQueryデータモデルのノードの型付き値プロパティのXQueryデータ型

SQLのデータ型

INTEGER

DECIMAL

FLOAT

VARCHAR

xs:untypedAtomic

△

△

△

△

xs:int

○

×

×

×

xs:decimal

×

○

×

×

xs:double

×

×

○

×

xs:string

×

×

×

○

その他

×

×

×

×

（凡例）

○：等価であるため，そのままキー値になります。

△：型付き値プロパティの値を文字列として見た場合に，SQLのデータ型に対応した文字列表現であれば，変換されキー値になります。この場合，インデクスが定義されていない場合と結果が異なるおそれがあります。それ以外は変換できません。

×：変換できません。

(e)　共通規則

インデクスは，一つの表に最大255個定義できます。

インデクスは，ナル値を含む列，指定した部分構造がないXML型の値を含む列，又は行のない列に対しても定義できます。

部分構造インデクスはXML型の列に対してだけ指定できます。

キー値の長さは，以下の計算式を満たすようにしてください。

　キー値の長さ≦

　　　MIN((インデクス格納用RDエリアのページサイズ÷2)−1242，4036)

各キー値の長さを次の表に示します。

表1‒42　 キー値の長さ

データ型

キー値の長さ

INTEGER

4

DECIMAL〔（m〔，n〕）〕

↓m÷2↓+ 1

FLOAT

8

VARCHAR

実際のデータ長が255バイト以下

n1+1

実際のデータ長が256バイト以上

n1+2

（凡例）

m，n：正の整数

n1：実際のデータ長

同じ列の同じ部分構造をキーとするインデクスは，一つだけ定義できます。

インデクスを定義した部分構造をXQuery中で評価する場合は，「AS データ型」で指定したSQLのデータ型に対応するXQueryデータ型の値として評価します。各SQLのデータ型に対応するXQueryデータ型を次の表に示します。

表1‒43　 XQueryを評価する時のXQueryデータ型

SQLのデータ型

XQueryデータ型

INTEGER

xs:int

DECIMAL

xs:decimal

FLOAT

xs:double

VARCHAR

xs:string

インデクスを定義した部分構造に対応する，XQueryデータモデルのノードの型付き値プロパティのXQueryデータ型がxs:untypedAtomic型であった場合，その部分構造に対してインデクスを定義した場合と，定義していない場合とで，XQuery中で評価するXQueryデータ型が異なります。このため，インデクスを削除すると，結果が異なる場合があります。

インデクスを定義しようとしている表に対して手続き及びトリガが定義されている場合，そのSQLオブジェクト中のインデクス情報は無効になります。この場合，トリガは実行できなくなります。また，手続きからこの手続き又はトリガは実行できなくなるため，SQLオブジェクトを再作成する必要があります。

同一のインデクスオプションは，繰り返して指定できません。

実行中のSQLオブジェクト中のインデクス情報が無効になる場合，Java手続き中からCREATE INDEXは実行できません。

インデクスを格納するRDエリアに，インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合，RDエリア名にはオリジナルRDエリア名を指定します。

インナレプリカ機能を使用している場合のCREATE INDEXの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

一つのRDエリアに格納できるインデクスは，最大500個です。

インデクスを格納するRDエリアに一時表用RDエリアは指定できません。

(f)　留意事項

インデクスが付いている列の値をユーザが更新すると，インデクスも更新されます。

CREATE INDEXは，OLTP下のX/Openに従ったUAPからは指定できません。

EMPTYを指定してインデクスを定義した場合，データベース再編成ユティリティでインデクスを再作成する必要があります。インデクスの再作成については，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

大量のデータが登録されている表に対してCREATE INDEX文でインデクスを作成する場合，処理時間が長くなるおそれがあります。CREATE INDEX文を実行する前に，タイマ監視に関する指定を次のように設定してください。

クライアント環境定義PDCWAITTIME

実績やデータ量からCREATE INDEXの実行時間を推測できる場合は，0以外の余裕を持たせた値を指定してください。

実行時間を推測できない場合は，0又は指定を省略してください。

HiRDB/パラレルサーバでサーバ間横分割した表にインデクスを定義する場合で，表格納用RDエリア，又は指定したインデクス格納用RDエリアが閉塞状態のときは，RDエリアの排他待ちとなります。このとき，排他待ちの時間がシステム定義pd_lck_wait_timeoutオペランドの指定値に達してタイムアウトしても，すぐにエラーリターンされないことがあります。これを避けるため，CREATE INDEX文を実行する前に，表格納用RDエリア，又は指定したインデクス格納用RDエリアの閉塞状態を解除してください。

(g)　使用例

書籍管理表の書籍情報列に対して，「書籍情報」XML要素の子の「カテゴリ」XML要素の値をVARCHAR型に変換した値をキー値とするインデクス（INDX1）を定義します。

  CREATE INDEX INDX1 ON 書籍管理表(書籍情報)
    KEY FROM '/書籍情報/カテゴリ' AS VARCHAR（100）

書籍管理表の書籍情報列に対して，「書籍情報」XML要素の子の「価格」XML要素の値をINTEGER型に変換した値をキー値とするインデクス（INDX2）を定義します。ただし，各行の値に「書籍情報」XML要素の子の「価格」XML要素が一意に決まる必要があります。

  CREATE INDEX INDX2 ON 書籍管理表(書籍情報)
    KEY USING UNIQUE TAG FROM '/書籍情報/価格' AS INTEGER

書籍管理表の書籍情報列に対して，「書籍情報」XML要素の「書籍ID」XML属性の値をINTEGER型に変換した値をキー値とするインデクス（INDX3）を定義します。ただし，「書籍情報」XML要素は，各行の値中でに一意に決まり，かつキー値はすべての行で異なっている必要があります。

  CREATE UNIQUE INDEX INDX3 ON 書籍管理表(書籍情報)
    KEY FROM '/書籍情報/@書籍ID' AS INTEGER

1.15　XQuery

XQueryは，XQueryデータモデルの値として表現したXML文書の内容に対して，問合せを実行する言語です。HiRDBでは，XML文書の内容を保持したXML型の値に対して，XML文書中の特定の部分構造を抽出するために，XMLQUERY関数やXMLEXISTS述語中でXQueryを指定します。

XQueryデータモデルは，XML文書の情報を木構造として表現するデータモデルです。XQueryデータモデルは，6種類のノードを構成要素として持ちます。これらのノードは，XML要素やXML属性を識別するための名前（修飾名）や，XQueryデータ型によって型付けられた基本単位値を情報として保持します。このような情報を含んだノードや基本単位値で表現されるXQueryデータモデルの値に対して，XQueryによる問合せを実行します。

XQueryの概念図を，次の図に示します。XML文書（図中の(a)）は，XQueryデータモデルの木（図中の(b)）として表現されます。XQueryデータモデルの木に対して，入力されたXQuery（図中の(c)）が評価され，木から特定の部分構造（図中の(d)）が抽出されます。XQueryによって抽出された部分構造も，XQueryデータモデルで表現される値となります。抽出された部分構造は，XML文書の形式で文字列表現することができます（図中の(e)）。

図1‒11　XQueryの概念図

1.15.1　XQueryデータモデル

XQueryデータモデルは，XQueryが処理対象とするXML文書を表現するためのモデルです。XQueryデータモデルは，木構造であり，ノードを持ちます。

ノードには，次に示すものがあります。また，各ノードが持つ情報をプロパティといいます。

文書ノード

要素ノード

属性ノード

処理命令ノード

コメントノード

テキストノード

ノード又は基本単位値をXQuery項目といいます。0個以上のXQuery項目の順序付けられた集まりを，XQueryシーケンスといいます。XQueryデータモデルで表現される値は，XQueryシーケンスとなります。

例として，XML文書をXQueryデータモデルで表現した木を次の図に示します。例となるXML文書に対応するXQueryシーケンスには，図中の点線内に示す文書ノードだけが含まれます。文書ノードはXML文書の内容を保持する子孫ノードを指すため，文書ノードだけでXML文書全体を扱うことができます。

＜XML文書＞

<書籍情報 書籍ID="310494321">
  <カテゴリ> プログラミング</カテゴリ>
  <タイトル> XML入門教科書</タイトル>
  <著者>中村弘子</著者>
</書籍情報>

図1‒12　XQueryデータモデルの例

図「XQueryデータモデルの例」で示したXML文書に対する，’/書籍情報/child::element()’（「書籍情報」要素ノードの子である要素ノードを抽出します）というXQueryの問い合わせ結果は，次の図の点線内に示す，三つのノードから構成されるXQueryシーケンスとなります。

図1‒13　ノードから構成されるXQueryシーケンスの例

また，図「XQueryデータモデルの例」で示したXML文書に対する，'fn:data(/書籍情報/child::element()/text())'（「書籍情報」要素ノードの子である要素ノードが持つテキストノードの基本単位値を抽出します）というXQueryの問い合わせ結果は，次の図の点線内に示す，'プログラミング'，'XML入門教科書'，'中村弘子'という三つの基本単位値から構成されるXQueryシーケンスになります。

図1‒14　基本単位値から構成されるXQueryシーケンスの例

(1)　ノード間の順序

ノードには順番が与えられています。この順序を文書順序といいます。文書順序は，各ノードに対応するXML要素やXML属性がXML文書で出現した順序と考えられます。文書順序の規則を次に示します。

すべてのノードは，自身の子孫ノードよりも前に出現します。

属性ノードは，関連づけられた要素ノードの直後に出現します。

兄弟の順序は，親ノードの子プロパティで出現する順序になります。

子孫ノードは，兄弟ノードよりも前に出現します。

図「XQueryデータモデルの例」の木のノードに与えられた文書順序を，次の図に示します。

図1‒15　文書順序の例

(2)　プロパティの種類

ノードが持つプロパティには，次の表に示すものがあります。

表1‒44　プロパティの種類と内容

項番

プロパティ名

説明

1

ノード名

XML要素，XML属性の修飾名です。

2

名前空間

ノードが属するXML名前空間です。

3

親

親ノードです。

4

子

子ノードのXQueryシーケンスです。

5

属性

属性ノードのXQueryシーケンスです。

6

型名

XML要素やXML属性が持つXQueryデータ型の修飾名です。

7

文字列値

ノードの内容として指定されたテキストが示す文字列のxs:string型の値です。fn:string関数で参照できます。

8

型付き値

文字列値プロパティから得られるXQueryデータ型の値です。fn:data関数で参照できます。

9

nilled

XML要素の内容が空であるかどうかを示すプロパティです。内容が空であれば，子プロパティは，要素ノードもテキストノードも含みません。

10

処理命令ターゲット

XML処理命令の対象となるアプリケーションです。

11

内容

XMLコメントの内容，XML要素の内容，XML処理命令の内容です。

ノードが持つプロパティの種類は，ノードの種類によって異なります。各ノードが持つプロパティを次の表に示します。各ノードが持つプロパティの内容については，「ノードの詳細」を参照してください。

表1‒45　各ノードが持つプロパティ

項番

プロパティ名

文書ノード

要素ノード

属性ノード

処理命令ノード

コメントノード

テキストノード

1

ノード名

○

○

2

名前空間

○

3

親

○

○

○

○

○

4

子

○

○

5

属性

○

6

型名

○

○

7

文字列値

○

○

○

8

型付き値

○

○

○

9

nilled

○

10

処理命令ターゲット

○

11

内容

○

○

○

（凡例）

○：プロパティを持ちます。

空白：プロパティを持ちません。

(3)　ノードの詳細

XQueryデータモデルが持つ6種類のノードについて説明します。

(a)　文書ノード

文書ノードは，XML文書の情報を保持します。

プロパティ

文書ノードは，次のプロパティを持ちます。

プロパティ名

説明

子

文書ノードの子ノードのXQueryシーケンスです。

文字列値

子孫となるテキストノードの内容プロパティの値を文書順序順に連結した結果の値です。子孫となるテキストノードが存在しない場合は，長さ0の文字列となります。

型付き値

xs:untypedAtomic型で，値は文字列値プロパティの値となります。

制約

文書ノードは，次の制約に従います。

子ノードとなり得るノードは，要素ノード，処理命令ノード，コメントノード，テキストノードのどれかです。子ノードは，空となることがあります。属性ノード，文書ノードは，子ノードとなることができません。

ノードNが文書ノードDの子プロパティに含まれる場合，ノードNの親プロパティはノードDです。

ノードNが文書ノードDを親プロパティとして持つ場合，ノードNはノードDの子プロパティです。

(b)　要素ノード

要素ノードは，XML要素の情報を保持します。

プロパティ

要素ノードは，次のプロパティを持ちます。

プロパティ名

説明

ノード名

XML要素の修飾名を示します。

親

要素ノードの親ノードを示します。親ノードは，文書ノードか要素ノードのどちらかです。

型名

要素ノードのXQueryデータ型を示します。XMLスキーマによる検査が行われていない場合，又はXMLスキーマによる検査の結果，要素ノードの型名がHiRDBで提供しているXQueryデータ型に該当しない場合，型名プロパティの値は不定になります。

子

要素ノードの子ノードのXQueryシーケンスを示します。

属性

要素ノードが持つ属性ノードのXQueryシーケンスを示します。

名前空間

要素ノードが属するXML名前空間を示します。

nilled

要素ノードの内容が空であるかどうかを示します。内容が空であれば，子プロパティは，要素ノードもテキストノードも含みません。

文字列値

子孫であるテキストノードの内容プロパティの値を，文書順序順に連結した結果の値を示します。要素の内容が空の場合は，そのプロパティ値は長さ0の文字列となります。

型付き値

型名プロパティの値が不定の場合，xs:untypedAtomic型の実現値としての文字列値プロパティの値となります。XML要素が空の場合は，プロパティの値は空のXQueryシーケンスとなります。それ以外の場合は，型名プロパティの値のXQueryデータ型に従って，文字列値プロパティの値から得られる基本単位値のXQueryシーケンスとなります。

制約

要素ノードは，次の制約に従います。

子ノードとなり得るノードは，要素ノード，処理命令ノード，コメントノード，テキストノードのどれかです。子ノードは，空となることがあります。属性ノード，文書ノードは子ノードとなることができません。

同じ要素ノードを親プロパティに持つ属性ノードは，それぞれが異なるXML属性の修飾名を持たなければなりません。

ノードNが要素ノードEの子プロパティに含まれれば，ノードNの親プロパティはノードEです。

属性ノードでないノードNが要素ノードEを親プロパティとして持てば，ノードNはノードEの子プロパティに含まれます。

属性ノードAが要素ノードEの属性プロパティに含まれれば，ノードAの親プロパティはノードEです。

属性ノードAが要素ノードEを親プロパティとして持てば，ノードAはノードEの属性プロパティに含まれます。

要素ノードの型名プロパティが不定であれば，子孫である要素ノードの型名プロパティはすべて不定となり，属性ノードの型名プロパティはxs:untypedAtomic型となります。

要素ノードの型名プロパティが不定であれば，nilledプロパティは偽となります。

nilledプロパティが真であれば，子プロパティに，要素ノードとテキストノードを含みません。

要素ノードEのノード名プロパティが持つ修飾名に対して，ノードEが持つ属性ノードAのノード名プロパティは，ノードEのXML名前空間URIに関連づけられたXML名前空間接頭辞を持たなければなりません。

(c)　属性ノード

属性ノードは，XML属性の情報を保持します。

プロパティ

属性ノードは，次のプロパティを持ちます。

プロパティ名

説明

ノード名

XML属性の修飾名を示します。

親

属性ノードの親ノードを示します。親ノードは，XML属性が属する要素のノードです。

型名

属性ノードのXQueryデータ型名を示します。

文字列値

属性ノードが持つ値を示します。このプロパティが空となることはありません。

型付き値

型名がxs:untypedAtomicの場合，xs:untypedAtomic型の実現値としての文字列値プロパティの値となります。 それ以外の場合は，XMLスキーマで検査された結果として得られるXQueryデータ型に従って，文字列値プロパティから得られる基本単位値のXQueryシーケンスとなります。

制約

属性ノードは，次の制約に従います。

属性ノードAが要素ノードEの属性プロパティに含まれる場合，ノードAの親プロパティはノードEです。

属性ノードAが要素ノードEを親プロパティとして持つ場合，ノードAはノードEの属性プロパティに含まれます。

(d)　処理命令ノード

処理命令ノードは，XML処理命令の情報を保持します。

プロパティ

処理命令ノードは，次のプロパティを持ちます。

プロパティ名

説明

処理命令ターゲット

処理命令の対象となるアプリケーションを示します。

内容

処理命令の内容を示します。

親

処理命令ノードの親ノードを示します。

制約

処理命令ノードは，次の制約を満たします。

処理命令ターゲットは局所名です。

(e)　コメントノード

コメントノードは，XMLコメントの情報を保持します。

プロパティ

コメントノードは，次のプロパティを持ちます。

プロパティ名

説明

内容

XMLコメントの内容を示します。

親

コメントノードの親ノードを示します。

(f)　テキストノード

テキストノードは，XML要素の内容の情報を保持します。

プロパティ

テキストノードは，次のプロパティを持ちます。

プロパティ名

説明

内容

XML要素の内容の文字列を示します。

親

テキストノードの親ノードを示します。

制約

テキストノードは，次の制約に従います。

テキストノードが親ノードを持てば，内容プロパティの値が長さ0の文字列になることはありません。テキストノードが親ノードを持たない場合だけ，長さ0の文字列となることがあります。

(4)　ノード間の親子関係

各ノード種別に対して，親ノード，子ノードとなり得るノード種別を，次の表に示します。

表1‒46　各ノード種別に対して親ノードになり得るノード種別

自ノードの種別

親ノードの種別

文書ノード

要素ノード

属性ノード

処理命令ノード

コメントノード

テキストノード

文書ノード

×

×

×

×

×

×

要素ノード

○

○

×

×

×

×

属性ノード

×

○

×

×

×

×

処理命令ノード

○

○

×

×

×

×

コメントノード

○

○

×

×

×

×

テキストノード

○

○

×

×

×

×

（凡例）

○：親ノードとなることができます。

×：親ノードとなることができません。

表1‒47　各ノード種別に対して子ノードになりうるノード種別

自ノードの種別

子ノードの種別

文書ノード

要素ノード

属性ノード

処理命令ノード

コメントノード

テキストノード

文書ノード

×

○

×

○

○

○

要素ノード

×

○

×

○

○

○

属性ノード

×

×

×

×

×

×

処理命令ノード

×

×

×

×

×

×

コメントノード

×

×

×

×

×

×

テキストノード

×

×

×

×

×

×

（凡例）

○：子ノードとなることができます。

×：子ノードとなることができません。

1.15.2　基本項目

この節では，次の表に示すXQueryの基本項目について説明します。

表1‒48　XQueryの基本項目

項番

基本項目

概要

1

焦点

XQuery式を評価している，ある時点での評価対象であるXQuery項目の情報です。

2

修飾名

XML要素やXML属性，XQuery関数，XQuery変数を識別するために，XQueryで使用する名前です。

3

XQueryデータ型

XQueryデータモデルで，ノードや基本単位値を型付ける型です。

4

基本単位化

XQueryシーケンスを，基本単位値から構成されるXQueryシーケンスに変換する処理です。

5

ブーリアン値への暗黙的な型変換

ブーリアン値以外の値がXQuery式の評価対象である場合，暗黙的にブーリアン値に変換する処理です。

(1)　焦点

焦点は，XQuery式を評価しているある時点での評価対象であるXQuery項目の情報です。

焦点には，次の表に示す要素があります。

表1‒49　焦点

項番

情報

概要

1

文脈項目

評価対象であるXQuery項目

2

文脈位置

文脈項目の，文脈項目から構成されるXQueryシーケンス中での位置

3

文脈サイズ

文脈項目の数

次に，それぞれの要素を詳細に説明します。

(a)　文脈項目

XQuery式を評価しているある時点で，評価の対象となっているXQuery項目を持ちます。

(b)　文脈位置

XQuery式を評価しているある時点での，各文脈項目の文脈項目から構成されるXQueryシーケンス中での位置を持ちます。文脈位置は，1から始まる整数値をとります。

(c)　文脈サイズ

XQuery式を評価しているある時点での文脈項目の数を持ちます。

焦点は，XQuery式を順次評価していくことで移動します。これを次の例を用いて説明します。

（例）

＜評価対象のXML文書＞

<書籍情報 書籍ID=”452469630”>
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</書籍情報>

＜XQuery式＞

/書籍情報/著者/text()

この例のXQuery式は，「書籍情報」「著者」「text()」という順に評価されます。このときの焦点の移動の流れを，次の図に示します。

図1‒16　焦点の移動の流れ

〔説明〕

XQuery式の評価を開始する前に，文脈項目を文書ノードに初期化します。文書ノードの文脈位置は1，文脈サイズは1になります。

XQuery式の'書籍情報'部分を評価すると，文脈項目は，現在の文脈項目である文書ノードの子ノードの「書籍情報」要素ノードに移動します。文脈項目は一つであるため，「書籍情報」要素ノードの文脈位置は1，文脈サイズは1になります。

XQuery式の'著者'部分を評価すると，文脈項目は，現在の文脈項目である「書籍情報」要素ノードの子ノード中の「著者」要素ノードに移動します。「書籍情報」要素ノードの子ノードの「著者」要素ノードは二つあるため，文書順序に従って，一つ目の「著者」要素ノードの文脈位置は1，二つ目の「著者」要素ノードの文脈位置は2になり，文脈サイズは2になります。

XQuery式の’text()’部分を評価すると，文脈項目は，現在の文脈項目である「著者」要素ノードの子ノードのテキストノードに移動します。現在の文脈項目である「著者」要素ノードの子ノードのテキストノードは二つあるため，一つ目の「著者」要素ノードの子ノードのテキストノードの文脈位置は1，二つ目の「著者」要素ノードの子ノードのテキストノードの文脈位置は2になり，文脈サイズは2になります。

(2)　修飾名

XML要素やXML属性，XQuery関数，XQuery変数を識別するために，XQueryで使用する名前を修飾名といいます。修飾名は，接頭辞とコロン文字と局所名から構成されます。ユーザは，XML名前空間宣言（XML名前空間宣言については，「XQuery宣言部」を参照してください）を使って，接頭辞とXML名前空間URIを関連づけることができます。XML名前空間URIは，XML名前空間を識別するためのURIです。局所名は，個々のXML名前空間内で使用する名前です。

HiRDBでは，次の表に示す接頭辞があらかじめ定義されています。

表1‒50　HiRDBで定義されている接頭辞

項番

接頭辞

XML名前空間URI

1

xml

http://www.w3.org/XML/1998/namespace

2

xs

http://www.w3.org/2001/XMLSchema

3

xsi

http://www.w3.org/2001/XMLSchema-instance

4

fn

http://www.w3.org/2006/xpath-functions

5

err

http://www.w3.org/2005/xqt-errors

6

hi-fn

http://www.hitachi.co.jp/Prod/comp/soft1/hirdb/xquery-functions

接頭辞とコロン文字を省略し，局所名だけを指定して，修飾名として使用することもできます。接頭辞とコロン文字が省略された修飾名は，既定のXML名前空間に属することになります。既定のXML名前空間については，「XQuery宣言部」を参照してください。修飾名の例を，次の表に示します。

表1‒51　修飾名の例

項番

修飾名

接頭辞

局所名

1

xs:string

xs

string

2

fn:data

fn

data

3

element_name

（省略）

element_name

接頭辞に対応するXML名前空間URIと，局所名から構成される名前を展開後修飾名といいます。二つの修飾名は，それらの展開後修飾名のXML名前空間URIと局所名が共に等しい場合に，等価になります。この場合，二つの修飾名の接頭辞が異なっていても，二つの修飾名は等価とみなされます。例えば，次の表に示す二つの修飾名は，接頭辞が異なります。しかし，展開後修飾名のXML名前空間URIと局所名が共に等しいため，二つの修飾名は等価とみなされます。

表1‒52　接頭辞は異なっていても，等価とみなされる二つの修飾名

項番

修飾名

接頭辞

局所名

関連づけされたXML名前空間URI

1

xxx:element_name

xxx

element_name

http://www.hitachi.com

2

yyy:element_name

yyy

element_name

http://www.hitachi.com

接頭辞及び局所名に指定できる文字を次の表に示します。

表1‒53　接頭辞及び局所名に使用できる文字

項番

分類

接頭辞及び局所名に使用できる文字

先頭指定可否

1

半角文字コード文字

英小文字（A〜Z）

○

2

英小文字（a〜z）

○

3

数字（0-9）

×

4

片仮名文字

○

5

全角文字コード

全角文字コードの文字すべて

○

6

特殊記号（半角文字コード）

ピリオド（ . ）

×

7

ハイフン又は負符号（ - ）

×

8

下線文字（ _ ）

○

（凡例）

○：接頭辞及び局所名の先頭に指定できます。

×：接頭辞及び局所名の先頭に指定できません。

XQueryの接頭辞及び局所名として使用できる文字は，pdsetupコマンドで指定した文字コード種別によって異なります。pdsetupコマンドについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。指定した文字コード種別と使用できる文字の関係は，「SQLで使用できる文字」を参照してください。

(3)　XQueryデータ型

(a)　HiRDBが定義するXQueryデータ型

XQueryで扱うXQuery項目は，XQueryデータ型で型付けられています。HiRDBでは，次の表に示すXQueryデータ型を提供します。文字列データ型，数値データ型，時間データ型，その他のデータ型，xs:untypedAtomic型の単一の値を持つXQueryデータ型を基本単位型といいます。基本単位型の値を，基本単位値といいます。

表1‒54　HiRDBが定義するXQueryデータ型

項番

分類

XQueryデータ型

説明

1

文字列データ型

xs:string

文字列を表す型です。

2

数値データ型

xs:decimal

最大38けたの固定小数点数を表す型です。

3

xs:int

値の範囲が−2147483648〜2147483647の整数を表す型です。

4

xs:double

値の範囲が約±4.9×10⁻³²⁴〜±1.7×10³⁰⁸の倍精度浮動小数点数を表す型です。※

5

時間データ型

xs:dateTime

日付と時刻の組み合わせを値とし，ある日付のある時刻を表す型です。「YYYY-MM-DDThh:mm:ss[.nn…n]」の形式で表現します。YYYYは年，MMは月，DDは日，hhは時，mmは分，ssは秒，nn…nは小数秒（1〜6けた）を表します。Tは日付と時刻を分離するために表記します。形式の各要素が取り得る値の範囲は，YYYY：0001〜9999（年），MM：01〜12（月），DD：01〜該当月最終日（日），hh：00〜23（時），mm：00〜59（分），ss：00〜59（秒），nnnnnn：000000〜999999（小数秒）です。

6

xs:date

日付を表す値をとる型です。「YYYY-MM-DD」の形式で表現します。YYYYは年，MMは月，DDは日を表します。形式の各要素が取り得る値の範囲は，YYYY：0001〜9999（年），MM：01〜12（月），DD：01〜該当月最終日（日）です。

7

xs:time

時刻を表す値をとる型です。「hh:mm:ss」の形式で表現します。hhは時，mmは分，ssは秒を表します。形式の各要素が取り得る値の範囲は，hh：00〜23（時），mm：00〜59（分），ss：00〜59（秒）です。

8

その他のデータ型

xs:hexBinary

バイナリデータを16進数の文字の並び（「0〜9」「a〜f」「A〜F」の文字の並び）として表現する型です。

9

xs:boolean

論理値として真と偽をとる型です。

10

不定データ型

xs:untypedAtomic

型が不定である基本単位値の型を表します。

注※

浮動小数点数の値の範囲は，ハードウェア表現に従います。

(b)　コンストラクタ関数

(a)で示したそれぞれの基本単位型に対して，ある基本単位値から，基本単位値を生成するコンストラクタ関数が暗黙的に定義されます。コンストラクタ関数は，次の形式をとります。

形式

XQueryデータ型名 ( 引数 )

規則

XQueryデータ型名には，生成する基本単位値のXQueryデータ型の修飾名を指定します。

引数には，基本単位値又は空のXQueryシーケンスを指定します。空のXQueryシーケンスを指定した場合，空のXQueryシーケンスを返却します。

引数に指定された基本単位値が，生成する基本単位値のXQueryデータ型に変換できない場合エラーとなります。変換可能なXQueryデータ型の組み合わせは「(c)　変換可能なXQueryデータ型」を参照してください。

(c)　変換可能なXQueryデータ型

変換可能なXQueryデータ型を次の表に示します。

表1‒55　変換可能なXQueryデータ型

変換前の

XQuery

データ型

変換後のXQueryデータ型

数値データ型

文字列

データ型

時間データ型

その他のデータ型

xs:

double

xs:

decimal

xs:

int

xs:

string

xs:

dateTime

xs:

date

xs:

time

xs:

hexBinary

xs:

boolean

xs:

untyped

Atomic

xs:double

○

△

△

○

×

×

×

×

○

○

xs:decimal

○

○

△

○

×

×

×

×

○

○

xs:int

○

○

○

○

×

×

×

×

○

○

xs:string

△

△

△

○

△

△

△

△

△

○

xs:dateTime

×

×

×

○

○

○

○

×

×

○

xs:date

×

×

×

○

○

○

×

×

×

○

xs:time

×

×

×

○

×

×

○

×

×

○

xs:hexBinary

×

×

×

○

×

×

×

○

×

○

xs:boolean

○

○

○

○

×

×

×

×

○

○

xs:untyped

Atomic

△

△

△

○

△

△

△

△

△

○

（凡例）

○：変換できます。

△：値によっては変換できます。

×：変換できません。

xs:string型及びxs:untypedAtomic型への変換

次の表に示す規則に従って変換します。

表1‒56　xs:string型及びxs:untypedAtomic型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:string

xs:untypedAtomic

すべて

変換しません。

2

xs:int

すべて

XQuery整数定数の形式に変換します。

ただし，先頭の0は取り除きます。

また，値が0未満の場合は負符号（-）を付加します。

3

xs:decimal

小数部分が0

4

小数部分が0でない

XQuery10進数定数の形式に変換します。ただし，10の位以上の先頭の0及び末尾の0は取り除きます。また，値が0未満の場合は負符号（-）を付加します。

5

xs:double

絶対値が0.000001以上1000000未満

xs:decimal型の変換規則（項番3及び4）に従います。

6

正の0

"0"に変換します。

7

負の0

"-0"に変換します。

8

正の最大値

"INF"に変換します。

9

負の最大値

"-INF"に変換します。

10

NaN（非数）

"NaN"に変換します。

11

上記以外

仮数部をXQuery10進数定数の形式に変換した文字列，その後に"E"，その後に指数部をXQuery整数定数の形式に変換した文字列の形式に変換します。

ただし，先頭0は取り除きます。仮数部の整数部分は1けたであり，0にはなりません。

仮数部の小数第1位より下位の末尾の0は取り除きます。

また，値が0未満の場合は負符号（-）を付加します。

12

xs:boolean

真

"true"に変換します。

13

偽

"false"に変換します。

14

xs:dateTime

すべて

"YYYY-MM-DDThh:mm:ss.s…s"の形式に変換します。YYYYは年，MMは月，DDは日，hhは時，mmは分，ssは秒，s…sは小数秒を表します。

ただし，小数秒が0でない場合も小数秒の末尾の0は取り除きます。

さらに，小数秒が0の場合は，小数秒部分の直前の小数点は取り除きます。

15

xs:date

すべて

"YYYY-MM-DD"の形式に変換します。YYYYは年，MMは月，DDは日を表します。

16

xs:time

すべて

"hh:mm:ss"の形式に変換します。hhは時，mmは分，ssは秒を表します。

17

xs:hexBinary

すべて

16進数の文字の並びがそのまま結果になります。

ただし，A〜Fは大文字になります。

xs:double型への変換

次の表に示す規則に従って変換します。

表1‒57　 xs:double型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:double

すべて

変換しません。

2

xs:int

xs:decimal

すべて

対応するxs:double型の値に変換します。

3

xs:boolean

真

1.0E0に変換します。

4

偽

0.0E0に変換します。

5

xs:string

"INF"

正の無限大に変換します。

6

"-INF"

負の無限大に変換します。

7

"NaN"

NaN（非数）に変換します。

8

XQuery数値定数の形式の文字列※

対応する数値データ型に変換した後，xs:double型に変換します。

9

上記以外

変換できません。

10

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:double型に変換します。

注※

先頭及び末尾のホワイトスペース（半角空白(X'20')，タブ(X'09')，NL(X'0A')，又はCR(X'0D')）を取り除いた結果がXQuery数値定数の形式であれば，該当します。

xs:decimal型への変換

次の表に示す規則に従って変換します。

表1‒58　 xs:decimal型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:decimal

すべて

変換しません。

2

xs:double

正の0

0.に変換します。

3

負の0

0.に変換します。

4

正の無限大

変換できません。

負の無限大

NaN（非数）

5

整数部分が38けた以下である値

変換前の値に数値上最も近い，38けた以下のxs:decimal型の値に変換します。該当する値が二つ存在する場合は，0に近い方の値に変換します。

6

上記以外

変換できません。

7

xs:int

すべて

対応するxs: decimal型の値に変換します。

8

xs:boolean

真

1.に変換します。

9

偽

0.に変換します。

10

xs:string

XQuery数値定数の形式の文字列※

対応する数値データ型に変換した後，xs:decimal型に変換します。

11

上記以外

変換できません。

12

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:decimal型に変換します。

注※

先頭及び末尾のホワイトスペース（半角空白(X'20')，タブ(X'09')，NL(X'0A')，又はCR(X'0D')）を取り除いた結果がXQuery数値定数の形式であれば，該当します。

xs:int型への変換

次の表に示す規則に従って変換します。

表1‒59　 xs:int型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:int

すべて

変換しません。

2

xs:decimal

小数点以下を切り捨てた値がxs:int型の最小値以上かつ最大値以下

小数点以下のけたを切り捨てた値に変換します。

3

上記以外

変換できません。

4

xs:double

正の0

0に変換します。

5

負の0

0に変換します。

6

正の無限大

変換できません。

負の無限大

NaN（非数）

7

小数点以下のけたを切り捨てた値がxs:int型の最小値以上かつ最大値以下

小数点以下のけたを切り捨てた値に変換します。

8

上記以外

変換できません。

9

xs:boolean

真

1に変換します。

10

偽

0に変換します。

11

xs:string

XQuery数値定数の形式の文字列※

対応する数値データ型に変換した後，xs:int型に変換します。

12

上記以外

変換できません。

13

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:int型に変換します。

注※

先頭及び末尾のホワイトスペース（半角空白(X'20')，タブ(X'09')，NL(X'0A')，又はCR(X'0D')）を取り除いた結果がXQuery数値定数の形式であれば，該当します。

xs:dateTime型への変換

次の表に示す規則に従って変換します。

表1‒60　 xs:dateTime型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:dateTime

すべて

変換しません。

2

xs:date

すべて

日付部分が変換前の値と等しく，時刻部分が00:00:00である値に変換します。

3

xs:string

xs:dateTime型の文字列表現の形式の値

文字列表現に対応した値に変換します。

4

上記以外

変換できません。

5

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:dateTime型に変換します。

xs:date型への変換

次の表に示す規則に従って変換します。

表1‒61　 xs:date型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:date

すべて

変換しません。

2

xs:dateTime

すべて

変換前の値の日付部分と等しい値に変換します。

3

xs:string

xs:date型の文字列表現の形式の値

文字列表現に対応した値に変換します。

4

上記以外

変換できません。

5

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:date型に変換します。

xs:time型への変換

次の表に示す規則に従って変換します。

表1‒62　 xs:time型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:time

すべて

変換しません。

2

xs:dateTime

すべて

変換前の値の時刻部分（小数秒部分を除く）と等しい値に変換します。

3

xs:string

xs:time型の文字列表現の形式の値

文字列表現に対応した値に変換します。

4

上記以外

変換できません。

5

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:time型に変換します。

xs:boolean型への変換

次の表に示す規則に従って変換します。

表1‒63　 xs:boolean型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:boolean

すべて

変換しません。

2

数値データ型

0

偽に変換します。

正の0

負の0

0.0

0.0E0

NaN（非数）

3

上記以外

真に変換します。

4

xs:string

"true"※

真に変換します。

5

"false"※

偽に変換します。

6

上記以外

変換できません。

7

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:boolean型に変換します。

注※

先頭及び末尾のホワイトスペース（半角空白(X'20')，タブ(X'09')，NL(X'0A')，又はCR(X'0D')）を取り除いた結果が等しければ，該当します。また，大文字小文字を区別しません。

xs:hexBinary型への変換

次の表に示す規則に従って変換します。

表1‒64　 xs:hexBinary型への変換規則

項番

変換前

変換結果

XQueryデータ型

値の条件

1

xs:hexBinary

すべて

変換しません。

2

xs:string

16進数の文字の並び

対応したxs:hexBinary型の値に変換します。

3

上記以外

変換できません。

4

xs:untypedAtomic

すべて

xs:string型に変換した後，xs:hexBinary型に変換します。

(4)　基本単位化

基本単位化とは，XQueryシーケンスを，基本単位値だけから構成されるXQueryシーケンスに変換する処理です。XQuery中に基本単位値だけから構成されるXQueryシーケンスが必要となる，次に示す式の評価時に基本単位化を行います。

XQuery算術式

XQuery比較式

XQuery関数呼出しの引数と戻り値

XQuery挿入式

XQuery名前変更式

XQuery置換式

基本単位化の結果は，XQueryシーケンスに対して，XQuery関数のfn:data関数を呼び出した結果になります。fn:data関数の詳細については「XQuery関数」を参照してください。

(5)　ブーリアン値への暗黙的な型変換

XQuery中のブーリアン値（xs:boolean型の値）として評価する必要がある箇所で，ブーリアン値以外の値が評価対象である場合，暗黙的にブーリアン値に変換されます。ブーリアン値への変換結果はXQueryシーケンスに対して，XQuery関数のfn:boolean関数を呼び出した結果になります。fn:boolean関数の詳細については「XQuery関数」を参照してください。

1.15.3　XQueryの指定

(1)　機能

XML型の値への問合せを指定します。

次に示す箇所に文字列定数として指定できます。

XMLQUERY関数

XMLEXISTS述語

(2)　形式

XQuery：：= XQuery宣言部　XQuery問合せ本体

(3)　使用例

XQuery宣言部で既定のXML名前空間を宣言します。XQuery問合せ本体中で，XQuery問合せの結果を定義します。

declare default element namespace 'http://www.aaa.com' ;　　　…　XQuery宣言部

/書籍情報/書籍/価格/child::text()　　　　　　　　　　　　　　　…　XQuery問い合わせ本体

1.15.4　XQueryの記述形式

(1)　XQueryでのキーワードの指定

XQueryの機能を使用するために指定する語（forやifなど）をキーワードといいます。XQueryでのキーワードは，すべて小文字で指定します。XQueryは，大文字と小文字を区別します。

(2)　XQueryでの区切り

XQueryの区切りには，次の文字又は構成要素を指定できます。

空白（X'20'）

TAB（X'09'）

NL（X'0a'）

CR（X'0d'）

XQueryコメント

(a)　区切りを挿入する位置

区切りを挿入する位置を次に示します。

キーワードとキーワードの間

キーワードと修飾名の間

キーワードと数値定数の間

修飾名の後の減算演算子（ - ）の前

(b)　区切りを挿入してはいけない位置

区切りを挿入してはいけない位置を次に示します。

キーワードの中

修飾名の中

数値定数の中

文字列定数の中

演算子の中

XQueryパス式中で指定する'//'の中

XQueryパス式中で指定する'..'の中

XQueryパス式中で指定する'::'の中

XQuery変数参照中の'$'とXQuery変数名の間

XQueryコメントの'('と':'の間

XQueryコメントの':'と')'の間

FLWOR式中で指定する':='の中

XQuery変換式中で指定する':='の中

(c)　区切りを挿入してもよい位置

区切りを挿入してもよい位置を次に示します。

次に示す特殊記号の前後で，かつ「区切りを挿入してはいけない位置」で挿入を禁止されていない位置

「 , 」「 . 」「 - 」「 + 」「 * 」「 ‘ 」「 “ 」「 ( 」「 ) 」「 < 」「 > 」「 = 」「 ! 」「 / 」「 : 」「 ; 」「｜」「 [ 」「 ] 」「｛」「｝」「空白（X'20'）」「TAB（X'09'）」「NL（X'0a'）」「CR（X'0d'）」

1.15.5　XQuery宣言部

(1)　機能

XQuery問合せ中で使用する修飾名のXML名前空間を宣言します。

(2)　形式

XQuery宣言部：：=〔｛XML名前空間宣言｜既定のXML名前空間宣言｝; 〕…

XML名前空間宣言：：=　declare namespace 接頭辞 = XML名前空間URI
既定のXML名前空間宣言：：= declare default ｛element | function｝
                                                    namespace XML名前空間URI

(3)　オペランド

XML名前空間宣言：：=　declare namespace 接頭辞 = XML名前空間URI

XQuery問合せ本体中に，接頭辞付きの修飾名を含む場合，その修飾名の接頭辞のXML名前空間を宣言します。

同じ接頭辞のXML名前空間は複数宣言できません。

接頭辞

XQuery 問合せ本体中の修飾名の接頭辞を指定します。

XML名前空間URI

接頭辞に対応するXML名前空間のURIをXQuery文字列定数の形式で指定します。

長さ0の文字列を指定した場合，「HiRDBで定義されている接頭辞」で定義されている，XML名前空間の接頭辞とXML名前空間の対応付けを削除できます。

既定のXML名前空間宣言：：= declare default ｛element｜function｝namespace XML名前空間URI

XQuery問合せ本体中の既定のXML名前空間を宣言します。XQuery問合せ本体中の接頭辞のない修飾名のXML名前空間は，ここで宣言したXML名前空間となります。

XQuery中に，'element'を指定した既定のXML名前空間宣言，及び'function'を指定した既定のXML名前空間宣言は，それぞれ一つしか指定できません。

この指定を省略した場合，XML要素名及びXQueryデータ型名に対する既定のXML名前空間のXML名前空間URIは，'http://www.w3.org/XML/1998/namespaces'を，XQuery関数に対する既定のXML名前空間のXML名前空間URIは，'http://www.w3.org/2006/xpath-functions'を仮定します。

element

XML要素名とXQueryデータ型名に対する既定のXML名前空間を宣言する場合に指定します。

function

XQuery関数名に対する既定のXML名前空間を宣言する場合に指定します。

XML名前空間URI

接頭辞を省略した修飾名に対するXML名前空間URIをXQuery文字列定数の形式で指定します。

長さ0の文字列を指定した場合，接頭辞を省略した修飾名は，どのXML名前空間にも属さない名前となります。

1.15.6　XQuery問合せ本体

(1)　機能

XQuery問合せ本体には，XQuery問合せの結果を定義するXQuery式を指定します。

(2)　形式

XQuery問合せ本体：：= XQuery式

XQuery式 ：：= XQueryシーケンス連結式

(a)　XQuery式を構成する式

XQuery式は，次の表に示す式を組み合わせて指定します。

表1‒65　XQuery式を構成する式

項番

式

説明

1

XQueryシーケンス連結式

XQueryシーケンスを連結する式です。

2

FLWOR式

指定したXQueryシーケンスを構成するすべてのXQuery項目ごとに，XQuery式を評価し，その結果のXQueryシーケンスを返却します。

指定したXQueryシーケンスをXQuery変数に割り当て，そのXQuery変数を指定したXQuery式を評価し，その結果のXQueryシーケンスを返却します。

3

XQuery限定式

指定したXQueryシーケンスを構成するXQuery項目のどれか（some），又はすべて（every）が指定した条件を満たすかどうかを判定する式です。

4

XQuery条件式

指定した条件の判定結果に応じてXQuery式を選択し，選択したXQuery式を評価する式です。

5

XQuery論理式

論理演算（OR，AND）を行う式です。

6

XQuery比較式

比較を行う式です。比較には値比較，汎用比較，ノード比較があります。

7

XQuery範囲式

連続する整数（xs:int型）の基本単位値のXQueryシーケンスを生成する式です。

8

XQuery算術式

加算，減算，乗算，除算，剰余算を行う式です。

9

XQueryシーケンス集合演算式

ノードから構成されるXQueryシーケンスに対して，和，共通部分，差を求める式です。

10

XQuery単項式

単項演算を行う式です。

11

XQuery値式

値を指定する式です。

12

XQueryパス式

XQueryデータモデルの木をたどって，特定のノードを選択する式です。

13

XQuery基本式

XQueryパス式を構成する基本的な構成要素です。

次に示すものがあります。

XQuery定数

XQuery変数参照

括弧付きXQuery式

文脈項目式

XQuery関数呼出し

14

XQuery変換式

XQueryデータモデルの木に，ノードの挿入，削除，名前変更，又は置換をして，その結果のXQueryデータモデルの木を返却する式です。

15

XQuery挿入式

XQueryデータモデルの木の，指定した位置にノードを挿入する式です。

16

XQuery削除式

XQueryデータモデルの木の，指定した位置のノードを削除する式です。

17

XQuery名前変更式

XQueryデータモデルの木の，指定した位置のノードの修飾名又は処理命令ターゲットを変更する式です。

18

XQuery置換式

XQueryデータモデルの木の，指定した位置のノード又はノードの値を置換する式です。

(3)　XQueryシーケンス連結式

(a)　機能

XQueryシーケンスを連結します。

複数のXQueryシーケンスを連結すると，連結対象のXQueryシーケンスが左から順に評価され，そのXQueryシーケンスに含まれるXQuery項目が結果のXQueryシーケンスの末尾に追加されていきます。連結結果のXQueryシーケンスは，連結対象のXQueryシーケンスのすべてのXQuery項目を含みます。また，連結結果のXQueryシーケンスに含まれるXQuery項目の数は，連結対象のXQueryシーケンスに含まれるXQuery項目の数の合計となります。

(b)　形式

XQueryシーケンス連結式 ：：= XQuery式単独 〔, XQuery式単独 〕…

XQuery式単独 ：：= ｛ FLWOR式
                      ｜XQuery限定式
                      ｜XQuery条件式
                      ｜XQuery論理式
                      ｜XQuery変換式
                      ｝

(c)　使用例

XQueryシーケンス連結式の使用例を次に示します。

項番

例

結果

説明

1

1, 2, 3, 4, 5

(1, 2, 3, 4, 5)

1から5までのXQuery整数定数の評価結果であるxs:int型の基本単位値一つから構成される，XQueryシーケンス五つを連結したXQueryシーケンスを返します。

2

(1, 2, 3), (), (4, 5)

(1, 2, 3, 4, 5)

xs:int型の基本単位値1,2,3から構成されるXQueryシーケンス，空のXQueryシーケンス，及び xs:int型の基本単位値4,5から構成されるXQueryシーケンスを連結したXQueryシーケンスを返します。

「1, 2, 3, 4, 5」で表現されるXQuery式と同じ評価結果になります。

(4)　FLWOR式

(a)　機能

XQueryシーケンスをXQuery変数に割り当て，XQuery変数を含むXQuery式を評価し，その結果のXQueryシーケンスを返却します。

XQuery変数の割り当て方法及びXQuery式の評価方法を次に示します。

指定したXQueryシーケンスを構成するすべてのXQuery項目ごとに，単一XQueryシーケンスとしてXQuery変数に割り当て，それぞれのXQuery項目に対して，XQuery式を評価します（FOR句）。

指定したXQueryシーケンスをXQuery変数に割り当て，XQuery式を評価します（LET句）。

W3Cの規格ではFLWOR式は，FOR句，LET句，WHERE句，ORDER BY句，及びRETURN句から構成されますが，HiRDBでは，FOR句，LET句及びRETURN句だけサポートしています。

(b)　形式

　FLWOR式 ：：= ｛ FOR句 ｜ LET句 ｝〔 ｛ FOR句 ｜ LET句 ｝〕…
　　　　　　　　　RETURN句
　FOR句 ：：＝ for $ XQuery変数名 in  XQuery式単独
　　　　　　　　 〔, $ XQuery変数名 in XQuery式単独 〕…
　LET句 ：：＝ let $ XQuery変数名 : 等号演算子 XQuery式単独
　　　　　　　　 〔, $ XQuery変数名 : 等号演算子 XQuery式単独〕…
　RETURN句 ：：＝ return  XQuery式単独

(c)　オペランド

｛ FOR句 ｜ LET句 ｝〔 ｛ FOR句 ｜ LET句 ｝〕…

FOR句及びLET句を一つ以上の任意の組み合わせで指定することができます。

複数のFOR句やLET句を指定した場合，各句がネストして指定されたものとして扱います。

（例）

次に示すXQuery式1とXQuery式2の内容は同じです。

＜XQuery式1＞

  for $XQuery変数名1 in XQuery式単独1
  let $XQuery変数名2 := XQuery式単独2
  for $XQuery変数名3  in XQuery式単独3
  let $XQuery変数名4 := XQuery式単独4
  return XQuery式単独5

＜XQuery式2＞

  for $XQuery変数名1 in XQuery式単独1
  return
    let $XQuery変数名2 := XQuery式単独2
    return
      for $XQuery変数名3 in XQuery式単独3
      return
        let $XQuery変数名4 := XQuery式単独4
          return XQuery式単独5

FOR句 ：：＝ for $ XQuery変数名 in XQuery式単独

　　　　　　　 〔, $ XQuery変数名 in XQuery式単独〕…

次に示す方法でRETURN句の評価を繰り返します。

単一のXQuery変数を使用する場合は，XQuery式単独の評価結果であるXQueryシーケンスを構成するすべてのXQuery項目に対して，RETURN句の評価を繰り返します。

複数のXQuery変数を使用する場合は，FOR句がネストして指定されたものとして扱います。

（例）

次に示すXQuery式1とXQuery式2の内容は同じです。

　＜XQuery式1＞

  for $XQuery変数名1 in XQuery式単独1 ,
      $XQuery変数名2 in XQuery式単独2
  return XQuery式単独3

　＜XQuery式2＞

  for $XQuery変数名1 in XQuery式単独1
  return for $XQuery変数名2 in XQuery式単独2
          return XQuery式単独3

XQuery変数名

XQuery式単独を評価したXQueryシーケンス中の各XQuery項目に関連づけられるXQuery変数の名前を指定します。

ここで指定したXQuery変数は，該当するFLWOR式の中で，該当するXQuery変数名より後に指定したXQuery変数名の入力として指定したXQuery式単独内，このFOR句より後に指定したFOR句及びLET句中のXQuery式単独内，及びRETURN句に指定したXQuery式単独内で有効となります。

XQuery式単独

入力とするXQueryシーケンスを返すXQuery式単独を指定します。

LET句：：＝ let $ XQuery変数名 : 等号演算子 XQuery式単独

　　　　　　　〔, $ XQuery変数名 : 等号演算子 XQuery式単独〕…

XQuery式単独を評価した結果をXQuery変数に関連づけ，RETURN句を評価します。

XQuery変数名

XQuery式単独を評価したXQueryシーケンスに関連づけられるXQuery変数の名前を指定します。

ここで指定したXQuery変数は，該当するFLWOR式の中で，該当するXQuery変数名より後に指定したXQuery変数名の入力として指定したXQuery式単独内，このLET句より後に指定したFOR句及びLET句中のXQuery式単独内，及びRETURN句に指定したXQuery式単独内で有効となります。

XQuery式単独

入力とするXQueryシーケンスを返すXQuery式単独を指定します。

RETURN句 ：：＝ return XQuery式単独

XQuery式単独

返却するXQueryシーケンスを表すXQuery式単独を指定します。

FOR句で得られたXQuery項目の組み合わせ一つにつき，1回評価します。

FOR句を指定せずに，LET句を指定した場合は，1回だけ評価します。

FLWOR式の評価結果は，ここで指定したXQuery式単独を繰り返して評価した結果のXQueryシーケンスを連結したXQueryシーケンスとなります。

(d)　使用例

FLWOR式の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <カテゴリ>データベース </カテゴリ>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
　<価格>3000</価格>
</書籍情報>

＜FLWOR式の例と結果＞

項番

例

結果

説明

1

for $a in $book/著者

return fn:string($a)

("伊藤栄一", "木村幸一")

「書籍情報」要素ノードの子であるすべての「著者」要素ノードに対して，fn:string関数を適用し，文字列として表現した結果を返します。

2

for $i in (10, 20),

$j in (1,2)

return ($i + $j)

(11, 12, 21, 22)

for $i in (10, 20)

return

for $j in (1, 2)

return ( $i + $j )

と同じ結果を返します。

3

let $a := $book/著者

return $a/fn:string()

("伊藤栄一", "木村幸一")

「書籍情報」要素ノードの子であるすべての「著者」要素ノードに対して，fn:string関数を適用し，文字列として表現した結果を返します。

4

for $i in (1,2)

let $a := $book/著者[$i]

return fn:string($a)

("伊藤栄一", "木村幸一")

「書籍情報」要素ノードの子である「著者」要素ノードのうち，1番目の要素ノード及び2番目の要素ノードに対して，fn:string関数を適用し，文字列として表現した結果を返します。

5

let $a := $book/著者

for $i in (1,2)

return fn:string($a[$i])

("伊藤栄一", "木村幸一")

「書籍情報」要素ノードの子である「著者」要素ノードのうち，1番目の要素ノード及び2番目の要素ノードに対して，fn:string関数を適用し，文字列として表現した結果を返します。

6

for $a in $book/著者

return fn:count($a)

(1,1)

「書籍情報」要素ノードの子であるそれぞれの「著者」要素ノードに対して，fn:count関数を適用した結果1を連結したXQueryシーケンスを返します。

7

let $a := $book/著者

return fn:count($a)

(2)

「書籍情報」要素ノードの子である「著者」要素ノードから成るXQueryシーケンスに対して，fn:count関数を適用した結果である2を返します。

(5)　XQuery限定式

(a)　機能

指定したXQueryシーケンスを構成するXQuery項目のどれか（some），又はすべて（every）が指定した条件を満たすかどうかを判定し，その結果を返却します。

(b)　形式

  XQuery限定式：：= { some | every }  $ XQuery変数名  in  XQuery式単独
　　　　　　　　　[ , $ 変数名 in  XQuery式単独 ]… satisfies  XQuery式単独

(c)　オペランド

{ some｜every } $ XQuery変数名 in XQuery式単独

　　　　　　　　　[ , $ 変数名 in XQuery式単独 ]… satisfies XQuery式単独

some

'some'を指定すると，in句により生成されたXQueryシーケンスのXQuery項目に対して，satisfies句に指定した条件が一つでも真であれば，結果は真となります。そうでなければ，結果は偽となります。in句により生成されたXQueryシーケンスが空のXQueryシーケンスである場合，XQuery限定式の結果は偽となります。

every

'every'を指定すると，in句により生成されたXQueryシーケンスのXQuery項目に対して，satisfies句に指定した条件がすべて真であれば，結果は真となります。そうでなければ，結果は偽となります。in句で生成されたXQueryシーケンスが空のXQueryシーケンスである場合，XQuery限定式の結果は真となります。

XQuery変数名

XQuery式単独を評価したXQueryシーケンス中のXQuery項目に関連づけられるXQuery変数の名前を指定します。

ここで指定したXQuery変数は，該当するXQuery限定式の中で，該当するXQuery変数名より後に指定したXQuery変数名の入力として指定したXQuery式単独内，及びsatisfies句に指定したXQuery式単独内で有効となります。

in XQuery式単独

入力となるXQueryシーケンスを意味するXQuery式単独を指定します。

satisfies XQuery式単独

XQuery変数に対して，条件を評価するXQuery式単独を指定します。複数のin句を指定した場合，複数のXQuery変数の組み合わせに対して，XQuery式単独を評価します。

(d)　使用例

XQuery 限定式の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <カテゴリ>データベース </カテゴリ>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
　<価格>3000</価格>
</書籍情報>

＜XQuery限定式の例と結果＞

項番

例

結果

説明

1

some $text in $book /著者/text() satisfies ( $text eq "木村幸一" )

真

「書籍情報」要素ノードの子である「著者」要素ノードが持つテキストノードの内容の一つが"木村幸一"に等しいため，真となります。

2

some $i in (1, 2, 3), $j in (4, 5, 6) satisfies $i + $j >= 6

真

‘some’を指定した場合，$i+$j>=6となるXQuery項目の組み合わせ（例：$i=1，$j=5）を含むため，XQuery限定式の結果は真となります。

3

every $i in (1, 2, 3), $j in (4, 5, 6) satisfies $i + $j >= 6

偽

‘every’を指定した場合，すべてのXQuery項目の組み合わせが$i+$j>=6となるわけではないため（例：$i=1，$j=4），XQuery限定式の結果は偽となります。

(6)　XQuery条件式

(a)　機能

指定した条件の判定結果に応じてXQuery式を選択し，選択したXQuery式を評価した結果を返却します。

(b)　形式

  XQuery条件式　：：= if  ( XQuery式 )  then  XQuery式単独  else  XQuery式単独

(c)　オペランド

if ( XQuery式 )

XQuery式

条件として評価するXQuery式を指定します。ここで指定したXQuery式の評価結果が真ならばthen句の直後に指定したXQuery式単独を評価し，偽ならばelse句の直後に指定したXQuery式単独を評価します。ただし，ここで指定したXQuery式の評価結果がxs:boolean型の基本単位値の単一XQueryシーケンスでない場合は，xs:boolean型の基本単位値の単一XQueryシーケンスに変換して判定します。

then XQuery式単独

XQuery式単独

if句に指定した条件が真となった場合に評価するXQuery式単独を指定します。

else XQuery式単独

XQuery式単独

if句に指定した条件が偽となった場合に評価するXQuery式単独を指定します。

(d)　使用例

XQuery条件式の例を次に示します。

＜XQuery変数book1が表すXML要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <カテゴリ>データベース </カテゴリ>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
  <価格>3000</価格>
</書籍情報>

＜XQuery変数book2が表すXML要素＞

<書籍情報 書籍ID="452469631">
  <タイトル> XML入門教科書</タイトル>
  <著者>中村弘子</著者>
  <価格>2500</価格>
</書籍情報>

＜XQuery条件式の例と結果＞

項番

例

結果

説明

1

if ($book1/価格 > $book2/価格)

then $book1 else $book2

then句で指定された，XQuery変数book1が示す要素ノード

$book1が示す要素ノードの子である「価格」要素ノードの型付き値(=3000)は，$book2が示す要素ノードの子である「価格」要素ノードの型付き値(=2500)より大きいため，$book1が示す要素ノードが結果となります。

(7)　XQuery論理式

(a)　機能

XQuery比較式に対して論理演算（OR，AND）を行った結果を返却します。

又は，XQuery比較式の評価結果をそのまま返却します。

(b)　形式

XQuery論理式 ：：=  XQueryOR式
XQueryOR式 ：：=  XQueryAND式 〔or  XQueryAND式 〕…
XQueryAND式 ：：=  XQuery比較式〔and  XQuery比較式〕…

(c)　オペランド

XQueryOR式 ：：= XQueryAND式 〔or XQueryAND式 〕…

or演算子を指定した場合は，XQueryAND式の評価結果に対してOR論理演算をします。

XQueryAND式を単独で指定した場合は，そのXQueryAND式の評価結果をそのまま返します。

OR論理演算をする場合に，各XQueryAND式の評価結果がブーリアン値（xs:boolean型の基本単位値）の単一XQueryシーケンスでない場合は，暗黙的にブーリアン値（xs:boolean型の基本単位値）の単一XQueryシーケンスに変換してから演算します。

第1演算項及び第2演算項のブーリアン値によるOR論理演算の結果を，次の表に示します。

表1‒66　 XQuery論理式でのOR論理演算の結果

項番

第1演算項

第2演算項

真

偽

1

真

真

真

2

偽

真

偽

XQueryAND式 ：：= XQuery比較式〔and XQuery比較式〕…

and演算子を指定した場合は，XQuery比較式の評価結果に対してAND論理演算をします。

XQuery比較式を単独で指定した場合は，そのXQuery比較式の評価結果をそのまま返します。

AND論理演算をする場合に，各XQuery比較式の評価結果がブーリアン値（xs:boolean型の基本単位値）の単一XQueryシーケンスでない場合は，ブーリアン値（xs:boolean型の基本単位値）の単一XQueryシーケンスに変換してから演算します。

第1演算項及び第2演算項のブーリアン値によるAND論理演算の結果を，次の表に示します。

表1‒67　XQuery論理式でのAND論理演算の結果

項番

第1演算項

第2演算項

真

偽

1

真

真

偽

2

偽

偽

偽

(8)　XQuery比較式

(a)　機能

XQuery範囲式に対して比較を行った結果を返却します。

又は，XQuery範囲式の評価結果をそのまま返却します。

(b)　形式

XQuery比較式 ：：= XQuery範囲式 〔｛値比較｜汎用比較｜ノード比較｝ XQuery範囲式〕

値比較 ：：= ｛ eq｜ne｜lt｜le｜gt｜ge｝
汎用比較 ：：= ｛=｜!=｜<｜<=｜>｜>=｜<>｝
ノード比較 ：：= ｛is｜<<｜>>｝

(c)　オペランド

XQuery範囲式 〔｛値比較｜汎用比較｜ノード比較｝ XQuery範囲式〕

値比較，汎用比較，又はノード比較を指定した場合は，XQuery範囲式の評価結果を比較します。

XQuery範囲式を単独で指定した場合は，そのXQuery範囲式の評価結果をそのまま返却します。

値比較 ：：= ｛ eq｜ne｜lt｜le｜gt｜ge｝

単一の基本単位値同士を比較します。

各指定での比較方法を次の表に示します。

表1‒68　値比較の比較方法

項番

値比較演算子

真となる条件

1

eq

第１比較項と第2比較項の値が等しい

2

ne

第１比較項と第2比較項の値が等しくない

3

lt

第１比較項の値が第2比較項の値より小さい

4

le

第１比較項の値が第2比較項の値以下である

5

gt

第１比較項の値が第2比較項の値より大きい

6

ge

第１比較項の値が第2比較項の値以上である

次に示す手順で比較を行います。

各比較項に基本単位化を適用します。

比較項のどれかを基本単位化した結果が空のXQueryシーケンスであれば，比較の結果は空のXQueryシーケンスになります。

比較項のどれかを基本単位化した結果が二つ以上のXQuery項目を持つXQueryシーケンスであれば，エラーとなります。

基本単位化した結果がxs:untypedAtomic型であれば，xs:stirng型に変換し比較します。

xs:string型の値同士の比較で，比較するデータの長さが異なる場合は，短い方のデータの長さ分だけ左側から比較します。このとき，結果が等しければ更に文字列長を比較します。比較した結果，文字列長が大きい値を持つxs:string型の値が大きいと定まります。

数値データ同士の比較で，評価対象となるXQueryデータ型が異なる場合は，範囲の広い方のXQueryデータ型で比較します。範囲の広さを次に示します。

　xs:double > xs:decimal > xs:int

xs:hexBinary型同士の比較で，比較するデータの長さが異なる場合は，短い方のデータの長さ分だけを左側から比較します。このとき，結果が等しければ更にデータ長を比較します。比較した結果，データ長が大きい値を持つxs:hexBinary型の値が大きいと定まります。

比較項のXQueryデータ型が比較できない組み合わせの場合はエラーになります。比較できるXQueryデータ型の組み合わせを次の表に示します。

表1‒69　比較可能なXQueryデータ型の組み合わせ

第1演算項のXQueryデータ型

第2演算項のXQueryデータ型

xs:stirng

数値データ型

xs:dateTime

xs:date

xs:time

xs:hexBinary

s:boolean

xs:stirng

○

×

×

×

×

×

×

数値データ型

×

○

×

×

×

×

×

xs:dateTime

×

×

○

×

×

×

×

xs:date

×

×

×

○

×

×

×

xs:time

×

×

×

×

○

×

×

xs:hexBinary

×

×

×

×

×

○※

×

xs:boolean

×

×

×

×

×

×

○※

（凡例）

○：比較できます。

×：比較できません。

注※

比較演算子eq又はneを用いて比較できます。その他の比較演算子で比較することはできません。

xs:double型で比較する場合の比較結果を，演算子ごとに次の表に示します。

表1‒70　xs:double型で比較する場合の比較結果（eq演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

真

真

偽

偽

偽

偽

偽

2

-0

真

真

偽

偽

偽

偽

偽

3

+INF

偽

偽

真

偽

偽

偽

偽

4

-INF

偽

偽

偽

真

偽

偽

偽

5

NaN

偽

偽

偽

偽

偽

偽

偽

6

上記以外の負数

偽

偽

偽

偽

偽

比較結果

比較結果

7

上記以外

偽

偽

偽

偽

偽

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

表1‒71　xs:double型で比較する場合の比較結果（ne演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

偽

偽

真

真

真

真

真

2

-0

偽

偽

真

真

真

真

真

3

+INF

真

真

偽

真

真

真

真

4

-INF

真

真

真

偽

真

真

真

5

NaN

真

真

真

真

真

真

真

6

上記以外の負数

真

真

真

真

真

比較結果

比較結果

7

上記以外

真

真

真

真

真

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

表1‒72　xs:double型で比較する場合の比較結果（lt演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

偽

偽

真

偽

偽

偽

真

2

-0

偽

偽

真

偽

偽

偽

真

3

+INF

偽

偽

偽

偽

偽

偽

偽

4

-INF

真

真

真

偽

偽

真

真

5

NaN

偽

偽

偽

偽

偽

偽

偽

6

上記以外の負数

真

真

真

偽

偽

比較結果

比較結果

7

上記以外

偽

偽

真

偽

偽

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

表1‒73　xs:double型で比較する場合の比較結果（le演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

真

真

真

偽

偽

偽

真

2

-0

真

真

真

偽

偽

偽

真

3

+INF

偽

偽

真

偽

偽

偽

偽

4

-INF

真

真

真

真

偽

真

真

5

NaN

偽

偽

偽

偽

偽

偽

偽

6

上記以外の負数

真

真

真

偽

偽

比較結果

比較結果

7

上記以外

偽

偽

真

偽

偽

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

表1‒74　xs:double型で比較する場合の比較結果（gt演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

偽

偽

偽

真

偽

真

偽

2

-0

偽

偽

偽

真

偽

真

偽

3

+INF

真

真

偽

真

偽

真

真

4

-INF

偽

偽

偽

偽

偽

偽

偽

5

NaN

偽

偽

偽

偽

偽

偽

偽

6

上記以外の負数

偽

偽

偽

真

偽

比較結果

比較結果

7

上記以外

真

真

偽

真

偽

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

表1‒75　xs:double型で比較する場合の比較結果（ge演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

真

真

偽

真

偽

真

偽

2

-0

真

真

偽

真

偽

真

偽

3

+INF

真

真

真

真

偽

真

真

4

-INF

偽

偽

偽

真

偽

偽

偽

5

NaN

偽

偽

偽

偽

偽

偽

偽

6

上記以外の負数

偽

偽

偽

真

偽

比較結果

比較結果

7

上記以外

真

真

偽

真

偽

比較結果

比較結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

比較結果：表「値比較の比較方法」の比較方法に従った比較結果

汎用比較 ：：= ｛=｜!=｜<｜<=｜>｜>=｜<>｝

任意の長さのXQueryシーケンス同士を比較します。

次に示す手順で比較を行います。

各比較項に基本単位化を適用します。

基本単位化した各比較項のXQueryシーケンス間での基本単位値の組み合わせの中で，次に示す方法で値比較した結果が真となる基本単位値の組が一組でも存在すれば，結果は真となります。一組も存在しない場合は，結果が偽となります。

二つの基本単位値に対して，汎用比較の指定に対応する表「汎用比較と対応する値比較」に示す値比較を行います。ただし，xs:untypedAtomic型である基本単位値の場合は，他方の基本単位値のXQueryデータ型に従って表「xs:untypedAtomic型の基本単位値の型変換」に示す型変換を行ってから値比較を行います。

表1‒76　汎用比較と対応する値比較

項番

汎用比較演算子

対応する値比較

1

=

eq

2

!=，<>

ne

3

<

lt

4

<=

le

5

>

gt

6

>=

ge

表1‒77　 xs:untypedAtomic型の基本単位値の型変換

項番

他方の基本単位値XQueryデータ型

型変換後のXQueryデータ型

1

数値データ型

xs:double

2

xs:untypedAtomic

xs:string

3

xs:string

xs:string

4

上記以外

他方の基本単位値と同じXQueryデータ型

ノード比較 ：：= ｛is｜<<｜>>｝

ノードIDと，文書順序に基づいてノード同士を比較します。

ノードIDとは，XQueryデータモデルで表現した木の中のすべてのノードに割り当てられている，木で一意な識別子です。

各指定での比較方法を次の表に示します。

表1‒78　ノード比較の比較方法

項番

ノード比較演算子

真となる条件

1

is

比較する二つのノードのノードIDが等しい。

2

<<

第1比較項のノードが第2比較項のノードよりも文書順序で前に出現する。

3

>>

第1比較項のノードが第2比較項のノードよりも文書順序で後に出現する。

次に示す手順で比較を行います。

各比較項は，単一のノードのXQueryシーケンス，又は空のXQueryシーケンスでなければなりません。

どちらか一方でも空のXQueryシーケンスである場合，結果は空のXQueryシーケンスとなります。

どちらも単一ノードのXQueryシーケンスである場合，各比較項のXQueryシーケンスを構成するノードを比較します。

各比較項で指定されるノードが，XQueryデータモデルでの異なる木に属する場合は，第1比較項として指定されたノードの順序が前になります。

(d)　使用例

XQuery比較式の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <カテゴリ>データベース </カテゴリ>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
  <価格>3000</価格>
</書籍情報>

＜XQuery比較式の例と結果＞

項番

例

結果

説明

1

$book[ @書籍ID

eq "452469630" ]

「書籍情報」要素ノード

XQuery変数bookが表す「書籍情報」要素ノードに属する「書籍ID」属性ノードの型付き値が”452469630”と等しいため，結果は，XQuery変数bookが表す「書籍情報」要素ノードとなります。

2

(1, 2) = (2, 3)

真

第1比較項の2番目のXQuery項目と，第2比較項の1番目のXQuery項目の間でeqの関係が成り立つため，結果は真となります。

3

(1, 2) != (2, 3)

真

第1比較項の1番目のXQuery項目と，第2比較項の1番目のXQuery項目の間でneの関係が成り立つため，結果は真となります。

(9)　XQuery範囲式

(a)　機能

連続する整数値（xs:int型）の基本単位値から構成されるXQueryシーケンスを返却します。

又は，XQuery算術式の評価結果をそのまま返却します。

(b)　形式

XQuery範囲式 ：：= XQuery算術式 〔to  XQuery算術式〕

(c)　オペランド

XQuery算術式 〔to XQuery算術式〕

toを指定した場合は，XQuery算術式の評価結果を比較します。

XQuery算術式を単独で指定した場合は，そのXQuery算術式の評価結果をそのまま返却します。

toを指定した場合，次の規則に従って生成したXQueryシーケンスを返却します。

各XQuery算術式の評価結果に基本単位化を適用します。

基本単位化した結果は，空のXQueryシーケンス，又はxs:int型に変換可能な基本単位値一つから構成される単一XQueryシーケンスである必要があります。

XQuery算術式のどれかの評価結果が空のXQueryシーケンスである場合は，結果は空のXQueryシーケンスになります。

一つ目のXQuery算術式の評価結果である基本単位値をxs:int型に変換した整数値が，二つ目のXQuery算術式の評価結果である基本単位値をxs:int型に変換した整数値よりも大きい場合，結果は空のXQueryシーケンスになります。

上記2.又は3.に該当しない場合，結果は，XQuery算術式の評価結果である基本単位値をxs:int型に変換した二つの整数値の間（一つ目の整数値以上，二つ目の整数値以下）に含まれるすべての整数値から構成されるXQueryシーケンスになります。

(d)　使用例

XQuery範囲式の例を次に示します。

項番

例

結果

説明

1

( 1 to 10 )

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

1から10までの整数値から成るXQueryシーケンスを生成します。

(10)　XQuery算術式

(a)　機能

加算，減算，乗算，除算，剰余算を行った結果を返却します。

又は，XQueryシーケンス集合演算式の評価結果をそのまま返却します。

(b)　形式

XQuery算術式 ：：= XQuery加減算式
XQuery加減算式 ：：= XQuery乗除算式 〔｛+｜-｝ XQuery乗除算式〕…
XQuery乗除算式 ：：= XQueryシーケンス集合演算式
　　　　　　　　　〔｛*｜div｜idiv｜mod｝ XQueryシーケンス集合演算式〕…

(c)　オペランド

XQuery加減算式 ：：= XQuery乗除算式 〔｛+｜-｝ XQuery乗除算式〕…

演算子（＋，−）を指定した場合は，XQuery乗除算式の評価結果に対して，加算又は減算を行います。

XQuery乗除算式を単独で指定した場合は，そのXQuery乗除算式の評価結果をそのまま返却します。

各演算子の意味と機能を次の表に示します。

表1‒79　XQuery加減算式での演算子の機能

項番

演算子

意味

機能

1

+

加算

第1演算項に第2演算項を加えます。

2

-

減算

第1演算項から第2演算項を減らします。

XQuery乗除算式 ：：= XQueryシーケンス集合演算式

〔｛*｜div｜idiv｜mod｝ XQueryシーケンス集合演算式〕…

演算子（*，div，idiv，mod）を指定した場合は，XQueryシーケンス集合演算式の評価結果に対して，乗算，除算又は剰余算を行います。

XQueryシーケンス集合演算式を単独で指定した場合は，そのXQueryシーケンス集合演算式の評価結果をそのまま返却します。

各演算子の意味と機能を次の表に示します。

表1‒80　XQuery乗除算式での演算子の機能

項番

演算子

意味

機能

1

*

乗算

第1演算項に第2演算項を掛けます。

2

div

除算

第1演算項を第2演算項で割ります。

3

idiv

整数除算

第1演算項を第2演算項で割った商を切り捨てた整数値を求めます。

4

mod

剰余算

第1演算項（仮にaとします）を第2演算項（仮にbとします）で割ったときの剰余を求めます。演算結果は，a - (a idiv b) * bとなります。

(d)　XQuery算術式の評価

XQuery算術式では，次に示す手順で，加算，減算，乗算，除算，剰余算を行います。

各演算項に基本単位化を適用します。

基本単位化した演算項のどれかが空のXQueryシーケンスである場合は，結果は空のXQueryシーケンスになります。

基本単位化した演算項のどれかが二つ以上の基本単位値を持つXQueryシーケンスである場合は，エラーになります。

基本単位化した演算項のXQueryデータ型がxs:untypedAtomic型であった場合は，xs:double型に変換します。変換できない場合はエラーになります。

上記手順によって得られた二つのXQueryシーケンスに対して演算を行います。各演算子での，演算項のXQueryデータ型と，結果のXQueryデータ型を次の表に示します。

表1‒81　演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（+演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:int

xs:decimal

xs:double

2

xs:decimal

xs:decimal

xs:decimal

xs:double

3

xs:double

xs:double

xs:double

xs:double

表1‒82　 演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（-演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:int

xs:decimal

xs:double

2

xs:decimal

xs:decimal

xs:decimal

xs:double

3

xs:double

xs:double

xs:double

xs:double

表1‒83　 演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（*演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:int

xs:decimal

xs:double

2

xs:decimal

xs:decimal

xs:decimal

xs:double

3

xs:double

xs:double

xs:double

xs:double

表1‒84　演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（div演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:decimal

xs:decimal

xs:double

2

xs:decimal

xs:decimal

xs:decimal

xs:double

3

xs:double

xs:double

xs:double

xs:double

表1‒85　演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（idiv演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:int

xs:int

xs:int

2

xs:decimal

xs:int

xs:int

xs:int

3

xs:double

xs:int

xs:int

xs:int

表1‒86　演算項のXQueryデータ型と演算結果のXQueryデータ型の関係（mod演算子）

項番

第1演算項

第2演算項

xs:int

xs:decimal

xs:double

1

xs:int

xs:int

xs:decimal

xs:double

2

xs:decimal

xs:decimal

xs:decimal

xs:double

3

xs:double

xs:double

xs:double

xs:double

演算項が次のどちらかの条件を満たす場合，エラーとなります。

演算項がどちらもxs:double型ではなく，かつdiv演算又はmod演算の第2演算項に0を指定した場合

idiv演算の第2演算項に0を指定した場合

演算項の少なくとも一方がxs:double型である場合の演算結果を，演算子ごとに次の表に示します。

表1‒87　演算項の少なくとも一方がxs:double型である場合の演算結果（＋演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

+0

+0

+INF

-INF

NaN

加算結果

加算結果

2

-0

+0

-0

+INF

-INF

NaN

加算結果

加算結果

3

+INF

+INF

+INF

+INF

NaN

NaN

+INF

+INF

4

-INF

-INF

-INF

NaN

-INF

NaN

-INF

-INF

5

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6

上記以外の負数

加算結果

加算結果

+INF

-INF

NaN

加算結果

加算結果

7

上記以外

加算結果

加算結果

+INF

-INF

NaN

加算結果

加算結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

加算結果：表「XQuery加減算式での演算子の機能」に示す機能に従った演算結果

表1‒88　演算項の少なくとも一方がxs:double型である場合の演算結果（-演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

+0

+0

-INF

+INF

NaN

減算結果

減算結果

2

-0

-0

+0

-INF

+INF

NaN

減算結果

減算結果

3

+INF

+INF

+INF

NaN

+INF

NaN

+INF

+INF

4

-INF

-INF

-INF

-INF

NaN

NaN

-INF

-INF

5

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6

上記以外の負数

減算結果

減算結果

-INF

+INF

NaN

減算結果

減算結果

7

上記以外

減算結果

減算結果

-INF

+INF

NaN

減算結果

減算結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

減算結果：表「XQuery加減算式での演算子の機能」に示す機能に従った演算結果

表1‒89　演算項の少なくとも一方がxs:double型である場合の演算結果（*演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

+0

-0

NaN

NaN

NaN

乗算結果

乗算結果

2

-0

-0

+0

NaN

NaN

NaN

乗算結果

乗算結果

3

+INF

NaN

NaN

+INF

-INF

NaN

-INF

+INF

4

-INF

NaN

NaN

-INF

+INF

NaN

+INF

-INF

5

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6

上記以外の負数

乗算結果

乗算結果

-INF

+INF

NaN

乗算結果

乗算結果

7

上記以外

乗算結果

乗算結果

+INF

-INF

NaN

乗算結果

乗算結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

乗算結果：表「XQuery乗除算式での演算子の機能」に示す機能に従った演算結果

表1‒90　演算項の少なくとも一方がxs:double型である場合の演算結果（div演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

NaN

NaN

+0

-0

NaN

除算結果

除算結果

2

-0

NaN

NaN

-0

+0

NaN

除算結果

除算結果

3

+INF

+INF

-INF

NaN

NaN

NaN

-INF

+INF

4

-INF

-INF

+INF

NaN

NaN

NaN

+INF

-INF

5

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6

上記以外の負数

-INF

INF

-0

+0

NaN

除算結果

除算結果

7

上記以外

INF

-INF

+0

-0

NaN

除算結果

除算結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

除算結果：表「XQuery乗除算式での演算子の機能」に示す機能に従った演算結果

表1‒91　演算項の少なくとも一方がxs:double型である場合の演算結果（idiv演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

0除算エラー

0除算エラー

0

0

型変換エラー

整数除算結果

整数除算結果

2

-0

0除算エラー

0除算エラー

0

0

型変換エラー

整数除算結果

整数除算結果

3

+INF

0除算エラー

0除算エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

4

-INF

0除算エラー

0除算エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

5

NaN

0除算エラー

0除算エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

型変換エラー

6

上記以外の負数

0除算エラー

0除算エラー

0

0

型変換エラー

整数除算結果

整数除算結果

7

上記以外

0除算エラー

0除算エラー

0

0

型変換エラー

整数除算結果

整数除算結果

（凡例）

0：xs:int型の0

整数除算結果：表「XQuery乗除算式での演算子の機能」に示す機能に従った演算結果

0除算エラー：除数が0であるため，エラーとなります

変換エラー：div演算の結果をxs:int型で表現できないため，エラーとなります

表1‒92　演算項の少なくとも一方がxs:double型である場合の演算結果（mod演算子）

項番

第1演算項

（xs:double型に変換した値）

第2演算項（xs:double型に変換した値）

+0

-0

+INF

-INF

NaN

左記以外の負数

左記以外

1

+0

NaN

NaN

+0

+0

NaN

剰余算結果

剰余算結果

2

-0

NaN

NaN

-0

-0

NaN

剰余算結果

剰余算結果

3

+INF

NaN

NaN

NaN

NaN

NaN

NaN

NaN

4

-INF

NaN

NaN

NaN

NaN

NaN

NaN

NaN

5

NaN

NaN

NaN

NaN

NaN

NaN

NaN

NaN

6

上記以外の負数

NaN

NaN

第1演算項（xs:double型に変換した値）

第1演算項（xs:double型に変換した値）

NaN

剰余算結果

剰余算結果

7

上記以外

NaN

NaN

第1演算項（xs:double型に変換した値）

第1演算項（xs:double型に変換した値）

NaN

剰余算結果

剰余算結果

（凡例）

+0：正の0

-0：負の0

+INF：正の無限大

-INF：負の無限大

NaN：非数

第1演算項：第1演算項の値

剰余算結果：表「XQuery乗除算式での演算子の機能」に示す機能に従った演算結果

(e)　留意事項

減算演算子（-）の前には，空白（X'20'），TAB（X'09'），NL（X'0a'）又はCR（X'0d'）のどれかを指定してください。空白（X'20'），AB（X'09'），NL（X'0a'）又はCR（X'0d'）を指定しない場合，減算演算子の直前に指定した名前の一部と見なされます。例えば，'a-b'と指定した場合は名前として解釈しますが，'a - b'や'a -b'と指定した場合は，XQuery算術式として解釈します。

(f)　使用例

XQuery算術式の例を次に示します。

項番

例

結果（XQueryデータ型）

1

4 - 2

2 (xs:int)

2

5 div 2

2.5 (xs:decimal)

3

5 idiv 2

2 (xs:int)

4

5 mod 2

1 (xs:int)

(11)　XQueryシーケンス集合演算式

(a)　機能

ノードから構成されるXQueryシーケンスを順序付けられた集合として，和集合演算，共通集合演算又は差集合演算を行った結果のXQueryシーケンスを返却します。

又は，XQuery単項式の評価結果をそのまま返却します。

(b)　形式

XQueryシーケンス集合演算式 ：：= XQuery和集合式
XQuery和集合式 ：：= ｛XQuery共通集合式｜XQuery差集合式｝
                      〔｛union｜垂直棒｝ ｛XQuery共通集合式｜XQuery差集合式｝〕…
XQuery共通集合式 ：：= XQuery単項式 〔intersect XQuery単項式〕…
XQuery差集合式 ：：= XQuery単項式 〔except XQuery単項式〕…

(c)　オペランド

XQuery和集合式 ：：= ｛XQuery共通集合式｜XQuery差集合式｝

〔｛union｜垂直棒｝ ｛XQuery共通集合式｜XQuery差集合式｝〕…

union又は垂直棒（｜）を指定した場合は，XQuery共通集合式又はXQuery差集合式の評価結果である二つのXQueryシーケンス中に含まれる異なるすべてのノードから構成されるXQueryシーケンスを求めます。

XQuery共通集合式又はXQuery差集合式を単独で指定した場合は，そのXQuery共通集合式又はXQuery差集合式の評価結果をそのまま返却します。

XQuery共通集合式 ：：= XQuery単項式 〔intersect XQuery単項式〕…

intersectを指定した場合は，XQuery単項式の評価結果である二つのXQueryシーケンスの両方に含まれる異なるすべてのノードから構成されるXQueryシーケンスを求めます。

XQuery単項式を単独で指定した場合は，そのXQuery単項式の評価結果をそのまま返却します。

XQuery差集合式 ：：= XQuery単項式 〔except XQuery単項式〕…

exceptを指定した場合は，一つ目のXQuery単項式の評価結果であるXQueryシーケンスに含まれるが，二つ目のXQuery単項式の評価結果であるXQueryシーケンスに含まれない異なるすべてのノードから構成されるXQueryシーケンスを求めます。

XQuery単項式を単独で指定した場合は，そのXQuery単項式の評価結果をそのまま返却します。

(d)　規則

結果のXQueryシーケンスからは，重複したノードは除かれます。また，結果のXQueryシーケンス中のノードの順序は文書順序になります。

結果のXQueryシーケンス内に，異なる木に属するノードが混在する場合，次の規則に従って木の順序を定めます。順序が定まった木の中では，文書順序に従って結果のノードの順序を決定します。ここで，第1演算項のXQueryシーケンス内の各ノードが属する木を(T₁₋₁,T₁₋₂,…T1-n)，第2演算項のXQueryシーケンス内の各ノードが属する木を(T₂₋₁,T₂₋₂,…T2-m)とします。

T₁₋₁〜T1-nの木の間での順序は，木が第1演算項のXQueryシーケンス内で初めて出現した位置の順序になります。

T₂₋₁〜T2-mのうち，T₁₋₁〜T1-nのどの木とも異なる木の間での順序は，木が第2演算項のXQueryシーケンス内で初めて出現した位置の順序になります。また，T₁₋₁〜T1-nのどの木よりも後の順序になります。

(e)　留意事項

XQuery中のXQueryシーケンス集合演算式（union，intersect，及びexcept）とSQLの問合せ本体中の集合演算（UNION，及びEXCEPT）では，評価順序が異なりますので注意してください。

(f)　使用例

XQueryシーケンス集合演算式の例を次に示します。

＜XQueryシーケンス集合演算式の例と結果＞

項番

例

結果

1

(A,B) union (A,B)

(A, B)

2

(A,B) union (B,C)

(A, B, C)

3

(A,B) intersect (A,B)

(A, B)

4

(A,B) intersect (B,C)

(B)

5

(A,B) except (A,B)

()

6

(A,B) except (B,C)

(A)

注

A，B及びCは，同じXML文書内の要素ノードを表します。

文書順序はA，B，Cの順に割り当てられています。

(12)　XQuery単項式

(a)　機能

XQuery値式に対して，単項演算を行った結果を返却します。

又は，XQuery値式の評価結果をそのまま返却します。

(b)　形式

XQuery単項式 ：：= 〔｛-｜+｝〕… XQuery値式

(c)　オペランド

〔｛-｜+｝〕… XQuery値式

単項演算子（-, +）を指定した場合は，XQuery値式に対して，単項演算を行った結果を返却します。

XQuery値式を単独で指定した場合は，XQuery値式の評価結果をそのまま返却します。

各演算子の意味と機能を次の表に示します。

表1‒93　XQuery単項式での演算子の機能

項番

演算子

意味

機能

1

-

負符号

符号を反転します。

2

+

正符号

符号を反転しません。

(d)　XQuery単項式の評価

XQuery単項式では，次に示す手順で単項演算を行います。

演算項に基本単位化を適用します。

基本単位化した演算項が空のXQueryシーケンスである場合は，結果は空のXQueryシーケンスになります。

基本単位化した演算項が二つ以上の基本単位値を持つXQueryシーケンスである場合は，エラーになります。

基本単位化した演算項のXQueryデータ型がxs:untypedAtomic型であった場合は，xs:double型に変換します。変換できない場合はエラーになります。

上記手順によって得られたXQueryシーケンスに対して演算を行います。結果のXQueryデータ型は，手順4を終えた時点でのXQueryデータ型と同じになります。

(13)　XQuery値式

(a)　機能

XQueryパス式を評価した結果を返却します。

(b)　形式

XQuery値式 ：：= XQueryパス式

(c)　オペランド

XQueryパス式

評価する値をXQueryパス式で指定します。

(14)　XQueryパス式

(a)　機能

XQueryパス式は，XQueryデータモデルでのノードを特定し，その評価結果を返却します。

(b)　形式

  XQueryパス式 ：：= ｛/〔相対パス式〕 | //相対パス式 | 相対パス式｝
  相対パス式 ：：= ステップ式 〔｛/ | // ｝ステップ式 〕…
  ステップ式 ：：= ｛軸ステップ式　｜ フィルタ式｝
  軸ステップ式 ：：= 軸ステップ〔 XQuery述語 〕…
  軸ステップ ：：= ｛軸 ｛名前テスト ｜種別テスト｝｜ 省略軸ステップ｝
  名前テスト ：：= ｛修飾名 | * | 接頭辞:* | *:局所名｝
  省略軸ステップ ：：= ｛〔@〕｛名前テスト ｜ 種別テスト｝｜.. ｝
  フィルタ式 ：：= XQuery基本式〔 XQuery述語 〕…
  XQuery述語 ：：= 左角括弧 XQuery式 右角括弧

(c)　オペランド

XQueryパス式の先頭の斜線（/）

文脈項目のノードが属する木の根となるノードを特定します。

文脈項目がノードでない場合はエラーになります。

XQueryパス式の先頭の二つの斜線（//）

文脈項目のノードが属する木の根となるノード及びそのノードが持つすべての子孫ノードを特定します。

文脈項目がノードでない場合はエラーになります。

XQueryパス式の先頭以外の斜線（/）

XQueryパス式の先頭以外で指定する'/'は，ステップ式の区切りを意味します。ステップ式を評価して得られたXQueryシーケンスは，左側から右側に向かって評価されます。

例えば，'E1/E2'という相対パス式は，次のように評価します。

ステップ式E1を評価します。

ステップ式E1を評価して得られたXQueryシーケンスの各XQuery項目をステップ式E2の評価での文脈項目とし，その各文脈項目に対してステップ式E2を評価します。ステップ式E1を評価して得られたXQueryシーケンスが空の場合は，E2は評価しないで，'E1/E2'の評価結果は空のXQueryシーケンスになります。

2.で各文脈項目に対してステップ式E2を評価して得られたXQueryシーケンスを連結します。連結した結果のXQueryシーケンスが'E1/E2'を評価した結果となります。

斜線の左側のステップ式を評価した結果のXQueryシーケンスは，基本単位値を含むことはできません。

XQueryパス式の先頭以外の二つの斜線（//）

'/descendant-or-self::node()/'の省略記法です。

左側に指定したステップ式を評価結果した後の各文脈項目での，子孫ノード及び文脈項目自身から構成されるXQueryシーケンスに対して右側に指定したステップ式を評価します。

二つの斜線の左側のステップ式を評価した結果のXQueryシーケンスは，基本単位値を含むことはできません。

軸ステップ式 ：：= 軸ステップ〔 XQuery述語 〕…

軸ステップ式は，文脈項目を基点として，指定された木のたどり方で到達可能なノードに対して，指定された名前，ノードの種別及び条件に従って絞り込んだ結果のノードのXQueryシーケンスを返します。このXQueryシーケンス中のノードが次の文脈項目になります。

文脈項目がノードでない場合はエラーになります。

軸ステップ ：：= ｛軸 ｛名前テスト ｜種別テスト｝｜ 省略軸ステップ｝

軸ステップは，文脈項目を基点として，指定された軸を経由して到達可能なノード中の，名前テスト又は種別テストに合致するノードのXQueryシーケンスを返します。このXQueryシーケンス中のノードが次の文脈項目になります。

軸

文脈項目からの木のたどり方を指定します。

軸として指定できる項目，及び返却する文脈項目の文脈位置の割り当て方法を，次の表と図で示します。

表1‒94　軸の一覧

項番

軸

説明

文脈位置の割り当て

1

child::

子ノードを示します。

文書順

2

descendant::

子孫ノードを示します。

3

attribute::

文脈項目であるノードに属する属性ノードを示します。

4

self::

文脈項目であるノード自身を示します。

5

descendant-or-self

子孫ノード及び文脈項目であるノード自身を示します。

6

following-sibling::

文脈項目であるノードの兄弟となるノードの中で，後の文書順序にあるノードを示します。文脈項目であるノードが属性ノードである場合，結果は空のXQueryシーケンスです。

7

following::

文脈項目であるノードの子孫ではなく，後の文書順序にあるノードを示します。なお，属性ノードは選択されません。

8

parent::

親ノードを示します。文脈項目であるノードが親ノードを持たない場合，結果は空のXQueryシーケンスです。

9

ancestor::

祖先ノードを示します。

逆文書順

10

preceding-sibling::

文脈項目であるノードの兄弟となるノードで，前の文書順序にあるノードを示します。文脈項目であるノードが属性ノードの場合，結果は空のXQueryシーケンスです。

11

preceding::

文脈項目であるノードの祖先でなく，前の文書順序にあるノードを示します。なお，属性ノードは含まれません。

12

ancestor-or-self::

祖先ノードと，文脈項目であるノード自身を示します。

（凡例）

文書順：文書順序に沿った順序で，文脈位置が割り当てられます。

逆文書順：文書順序とは逆の順序で，文脈位置が割り当てられます。

図1‒17　軸

名前テスト ：：= ｛修飾名｜*｜接頭辞:*｜*:局所名｝

軸で指定されたたどり方で到達可能なノード中から，名前が合致するノードを絞り込む場合に指定します。

修飾名

指定した修飾名の展開後修飾名と，名前テストの対象であるノードの展開後修飾名が等価であるノードを絞り込みます。

*

名前テストの対象であるノードを絞り込まない場合に指定します。

接頭辞:*

名前テストの対象であるノードのうち，その展開後修飾名のXML名前空間URIがここで指定された接頭辞に対応するURIと等しいノードを絞り込みます。局所名には依存しません。

*:局所名

名前テストの対象であるノードのうち，局所名がここで指定された局所名に等しいノードを絞り込みます。XML名前空間URIには依存しません。

種別テスト

軸で指定されたたどり方でたどって得られたノード中から，種別が合致するノードを絞り込む場合に指定します。

種別テストには，次の表に示すものがあります。

表1‒95　種別テスト一覧

項番

種類

指定方法

説明

1

文書テスト

document-node()

文書ノードに合致します。

2

document-node(要素テスト)

要素ノードを子ノードとして必ず一つだけ持ち，その他の子ノードがコメントノード又は処理命令ノードだけである文書ノードのうち，子ノードの要素ノードが要素テストに合致する文書ノードに合致します。

3

要素テスト

element()

任意の要素ノードに合致します。

4

element(*)

5

element(修飾名)

XML要素のうち，指定した修飾名の展開後修飾名と等価な展開後修飾名を持つ要素ノードに合致します。

6

属性テスト

attribute()

任意の属性ノードに合致します。

7

attribute(*)

8

attribute(修飾名)

XML属性のうち，指定した修飾名の展開後修飾名と等価な展開後修飾名を持つ属性ノードに合致します。

9

処理命令テスト

processing-instruction()

任意の処理命令ノードに合致します。

10

processing-instruction(処理命令ターゲット)

処理命令ノードのうち，指定した処理命令ターゲットと一致する処理命令ターゲットプロパティの値を持つ処理命令ノードに合致します。

11

コメントテスト

comment()

任意のコメントノードに合致します。

12

テキストテスト

text()

任意のテキストノードに合致します。

13

任意種別テスト

node()

任意の種別のノードに合致します。

省略軸ステップ ：：= ｛〔@〕｛名前テスト ｜ 種別テスト｝｜.. ｝

軸ステップを簡略化して記述する場合に指定します。

〔@〕｛名前テスト ｜ 種別テスト｝

'@'は'，attribute::'に置き換わります。

'@'を省略した場合は，種別テストが属性テストの場合は'attribute::'が，それ以外の場合は'child::'が名前テストや種別テストの前に指定されたものと仮定します。

..

'..'は，'parent::node()'に置き換わります。

省略軸ステップの指定例を次の表に示します。

表1‒96　省略軸ステップの指定例

項番

省略軸ステップ

同じ意味を持つ省略しない記法

意味

1

/elem/ElemName

/elem/child::ElemName

「elem」評価後での文脈項目の子ノード中の，「ElemName」という名前の子ノードを意味します。

2

/elem/@AttrName

/elem/attribute::AttrName

「elem」評価後での文脈項目の属性ノード中の，「AttrName」という名前の属性ノードを意味します。

3

/elem/attribute()

/elem/attribute::attribute()

「elem」評価後での文脈項目のすべての属性ノードを意味します。

4

/elem/..

/elem/parent::node()

「elem」評価後での文脈項目の親ノードを意味します。

フィルタ式 ：：= XQuery基本式〔 XQuery述語 〕…

XQuery基本式を評価します。XQuery述語を指定した場合は，XQuery基本式の評価結果であるXQueryシーケンスのXQuery項目をXQuery述語で指定した条件で絞り込みます。

XQuery述語：：= 左角括弧 XQuery式 右角括弧

文脈項目を絞り込む条件をXQuery式で指定します。

各文脈項目に対してXQuery述語に指定したXQuery式を評価します。

XQuery述語の評価結果は，次のようになります。

XQuery述語に指定したXQuery式の結果が，数値データ型の基本単位値一つのXQueryシーケンスである場合，その値と等しい文脈位置である文脈項目がXQuery述語の評価結果となります。

XQuery述語に指定したXQuery式の結果が，数値データ型の基本単位値一つのXQueryシーケンスでない場合，XQuery式の結果をブーリアン値に変換して真となる文脈項目がXQuery述語の評価結果となります。

(d)　規則

一つ以上の斜線（/）を含むXQueryパス式の評価結果であるXQueryシーケンスは次のようになります。

XQueryパス式の最後のステップ式の結果がノードだけを含むXQueryシーケンスである場合，重複されるノードは除かれ，ノードの順序は文書順序に並び替えたXQueryシーケンスが結果になります。

XQueryパス式の最後のステップ式の結果が基本単位値だけを含むXQueryシーケンスである場合は，そのまま結果になります。

XQueryパス式の最後のステップ式の結果がノード及び基本単位値を含むXQueryシーケンスの場合は，エラーになります。

(e)　使用例

XQueryパス式の例を次に示します。

項番

例

説明

1

child::書籍情報

文脈項目の子ノードである「書籍情報」要素ノードを選択します。

2

書籍情報

'child::書籍情報'の省略記法です。

3

attribute::書籍ID

文脈項目の書籍ID属性ノードを選択します。

4

＠書籍ID

'attribute::書籍ID'の省略記法です。

5

attribute::*

文脈項目に属するすべての属性ノードを選択します。

6

parent::element()

文脈項目の親ノードである要素ノードを選択します。

7

書籍情報[カテゴリ="プログラミング"]

子ノードとして，「カテゴリ」要素ノードを持ち，その型付き値プロパティの値が"プログラミング"である「書籍情報」要素ノードを選択します。

8

書籍情報[@書籍ID = "12345"]

文脈項目の子ノードであり，書籍ID属性の値が"12345"である「書籍情報」要素ノードを選択します。

9

著者[2]

文脈項目の子ノードである，2番目の「著者」要素ノードを選択します。

(15)　XQuery基本式

(a)　機能

XQueryパス式を構成する基本的な構成要素です。

XQuery基本式には，次に示すものがあります。

XQuery定数

XQuery変数参照

括弧付きXQuery式

文脈項目式

XQuery関数呼出し

(b)　形式

XQuery基本式 ：：= ｛XQuery定数｜XQuery変数参照｜
                        括弧付きXQuery式｜文脈項目式｜XQuery関数呼出し｝

各XQuery基本式について説明します。

(c)　XQuery定数

機能

XQuery定数は，基本単位値を直接表現するための式です。解析時に値が決定します。

XQuery中で指定できるXQuery定数を次の表に示します。

表1‒97　XQuery定数

項番

XQuery定数

結果

解釈するXQueryデータ型

形式

説明

1

XQuery数値定数

XQuery整数定数※

〔符号〕符号なし整数

（例）

　-123

　45

　6789

符号なし整数は，数字の並びで表します。

符号は，＋又は−で表します。

xs:int

2

XQuery10進数定数

〔符号〕〔整数部〕.〔小数部〕

（例）

　12.3

　-456.

　.789

整数部と小数部は符号なし整数で表します。整数部か小数部のどちらか一方は必ず指定する必要があります。

xs:decimal

3

XQuery浮動小数点定数

仮数｛E｜e｝指数

（例）

　1.0E2

　.5E+67

仮数は,XQuery整数定数又はXQuery10進数定数で表します。指数は1〜3けたのXQuery整数定数で表します。指数は10のべき乗を表します。

xs:double

4

XQuery文字列定数

｛"文字列"｜

'文字列'｝

（例）

　"HiRDB"

　'HITACHI'

　'''06.9.13'

文字列は文字の並びで表します。

引用符で囲んだ文字列中に引用符そのものを指定する場合は，引用符を2個続けて書いてください。

アポストロフィで囲んだ文字列中にアポストロフィそのものを指定する場合は，アポストロフィを2個続けて書いてください。

次に示す文字列は，対応する文字を意味します。

「&amp;」：& (アンパーサンド)

「&lt;」：< (小なり演算子)

「&gt;」：> (大なり演算子)

「&quot;」：" (引用符)

「&apos;」： (アポストロフィ)

'&'は単独で指定できません。

xs:string

注※

XQuery整数定数の値の範囲を超える定数を整数定数の表記法で指定すると，HiRDBは，定数の右側に小数点を仮定し，10進数定数が指定されたものと解釈します。

(d)　XQuery変数参照

機能

XQuery変数参照は，XQuery式中でXQuery変数の値を返却します。

形式

 XQuery変数参照 ：：= $ XQuery変数名

オペランド

XQuery変数名

参照したいXQuery変数の修飾名を指定します。

指定した修飾名を持つ有効なXQuery変数の値を返却します。該当するXQuery変数が複数該当する場合は，最も内側のFLWOR式やXQuery限定式で指定したXQuery変数の値を返却します。

使用例

変数名がPRICEであるXQuery変数の値より大きい型付き値プロパティを持つ「価格」XML要素を，子のXML要素として持つ「書籍情報」XML要素に表します。

/書籍情報[価格> $PRICE]

(e)　括弧付きXQuery式

機能

XQuery式を評価した結果を返却します。括弧で囲まれたXQuery式の評価を先に行う場合に使用します。

また，括弧内にXQuery式を指定しない場合は，空のXQueryシーケンスを表します。

形式

 括弧付きXQuery式 ：：= ( 〔 XQuery式 〕 )

使用例

括弧付きXQuery式の例を次に示します。

項番

例

結果

説明

1

(2 + 4) * 5

( 30 )

括弧で囲まれた'2+4'が先に評価されます。'2+4'を括弧で囲わない場合は，XQuery乗除算式である'4*5'を先に評価するため，結果は22になります。

(f)　文脈項目式

機能

文脈項目式は，文脈項目式を評価する直前の文脈項目を構成するXQueryシーケンスを返却します。

形式

  文脈項目式 ：：= ピリオド
  ピリオド ：：= .

使用例

文脈項目式の例を次に示します。

項番

例

結果

説明

1

(1 to 20)[ . mod 5 eq 0]

(5, 10, 15, 20)

まず，XQuery範囲式により，1から20までの整数値から構成されるXQueryシーケンスが生成されます。生成されたXQueryシーケンスの各XQuery項目が文脈項目となり，範囲式に続くXQuery述語が評価されます。この評価の結果が真となるXQuery項目から構成されるXQueryシーケンスが結果となります。

(g)　XQuery関数呼出し

機能

XQuery関数呼出しは，XQuery関数を呼び出し，評価した結果を返却します。

形式

  関数呼出し ：：= XQuery関数名 ( 〔 引数 〔 , 引数〕… 〕 )
  引数 ：：= XQuery式単独

オペランド

XQuery関数名

呼び出すXQuery関数の修飾名を指定します。

引数：：= XQuery式単独

XQuery式単独

呼び出すXQuery関数のパラメタに対する値を表すXQuery式単独を指定します。

引数にコンマ演算子を含む場合，最上位のコンマ演算子を含むXQuery式を括弧で囲んでください。

規則

引数は，指定した順序でパラメタと対応します。

XQuery関数の引数のXQueryデータ型が基本単位型である場合，次の手順で引数を評価して関数に渡します。

(a) XQuery関数の引数に指定したXQuery単項式を評価し，評価結果であるXQueryシーケンスを求めます。

(b) 引数の評価結果に基本単位化を適用し，基本単位値から構成されたXQueryシーケンスに変換します。

(c) XQueryシーケンスに含まれるXQuery項目それぞれに対して，次の変換をします。

・XQuery項目のXQueryデータ型がxs:untypedAtomic型，又はxs:string型であり，かつ関数のパラメタのXQueryデータ型が数値データ型の場合

xs:double型に変換します。

・上記以外の場合

関数のパラメタのXQueryデータ型に変換します。

XQuery関数の引数のXQueryデータ型が基本単位型以外である場合，XQuery関数の引数に指定したXQuery単項式を評価し，評価結果であるXQueryシーケンスを関数に渡します。

規則2及び3の各手順のXQueryデータ型の変換で，互換性がなく変換できない場合はエラーとなります。互換性があるデータ型については，「XQueryデータ型」を参照してください。

関数の呼出し規則

XQuery関数の修飾名と引数の数が一致すれば，そのXQuery関数を呼び出します。それ以外の場合は，エラーとなります。

(16)　XQuery変換式

(a)　機能

XQueryデータモデルの木に，ノードの挿入，削除，名前変更，又は置換をして，その結果のXQueryデータモデルの木を返却する式です。

XQuery変換式では，テキストノードに含まれる空白類に対して，次の正規化処理をしてからノードの挿入又は置換をします。

先頭及び末尾の空白類を除去

連続する空白類を一つの空白（X'20'）に置き換え

空白類とは，空白（X'20'），水平タブ（X'09'），改行（X'0A'），及び復帰（X'0D'）を指します。

XQuery変換式は，UPDATE文の更新値に指定したXMLQUERYのXQuery式の最上位にだけ指定できます。

XQuery変換式では，DTD，XMLスキーマがないものとして処理されます。

XQuery変換式を使用する場合は，マニュアル「HiRDB XML Extension Version 9」の「XQuery変換式使用時の運用」を参照してください。

(b)　形式

XQuery変換式 ：：= copy $ XQuery変数名 :=  文脈項目式
                    modify ｛ XQuery変更式
                             ｜( XQuery変更式 〔, XQuery変更式 〕… ) ｝
                    return XQuery変数参照
XQuery変更式 ：：=｛ XQuery挿入式
                      ｜ XQuery削除式
                      ｜ XQuery名前変更式
                      ｜ XQuery置換式
                      ｝

(c)　オペランド

XQuery変換式 ：：= copy $ XQuery変数名 := 文脈項目式

　　　modify ｛ XQuery変更式

　　　　　　　　｜( XQuery変更式 〔, XQuery変更式 〕… ) ｝

　　　return XQuery変数参照

XQuery変換式は，最初にcopy句でXQueryデータモデルの木をコピーします。次に，modify句で指定したXQuery変更式で，XQueryデータモデルの木に対して，ノードの挿入，削除，名前変更，又は置換をします。最後に，return句で変換後のXQueryデータモデルの木を返却する式です。

XQuery変数名

文脈項目式をコピーするXQuery変数の名前を指定します。ここで指定したXQuery変数は，該当するXQuery変換式の中のmodify句に指定するXQuery変更式中，及びreturn句に指定するXQuery変数参照で有効となります。

XQuery変更式

copy句でコピーしたXQueryデータモデルの木に，ノードの挿入，削除，名前変更，又は置換をするXQuery変更式を指定します。同じXQuery変換式中にXQuery変更式を複数指定する場合は，次の順序でXQueryデータモデルの木を変更します。

as first into，as last into，before，若しくはafterの指定がないXQuery挿入式，value of指定があるXQueryターゲット式が要素ノード以外のXQuery置換式，又はXQuery名前変更式

as first into，as last into，before，又はafterの指定があるXQuery挿入式

value ofの指定がないXQuery置換式

value ofの指定があるXQueryターゲット式が要素ノードのXQuery置換式

XQuery削除式

変更処理中のXQueryデータモデルの木が，次の条件のどれかを満たす場合はエラーになります。

属性ノードの修飾名の接頭辞が，属性ノードの親ノードの接頭辞又は同じ親を持つ属性ノードの接頭辞と同じで，各接頭辞のXML名前空間URIが異なる。

一つの要素ノードが重複する属性ノードの修飾名を持っている。

ドキュメントノードの子ノードに要素ノードが存在しない。

ドキュメントノードの子ノードに要素ノードが複数存在する。

ドキュメントノードの子ノードにテキストノードが存在する。

接頭辞及び局所名の長さが4,096バイトを超えている。

要素のネスト数が100を超えている。

また，変更処理後のXMLのサイズが5メガバイトを超える場合はエラーになります。

XQuery変数参照

XQuery変数参照には，copy句で指定したXQuery変数名だけ指定できます。

XQuery変更式 ：：=｛ XQuery挿入式

　　　｜ XQuery削除式

　　　｜ XQuery名前変更式

　　　｜ XQuery置換式｝

XQuery変更式は，XQuery変換式のcopy句で指定したXQueryデータモデルの木に存在するノードだけ変更できます。例えば，XQuery削除式は，同じXQuery変換式中のXQuery挿入式で追加したノードは削除できませんが，XQuery変換式のcopy句に指定したXQueryシーケンス中のノードは削除できます。また，XQuery名前変更式で名前変更したノードの変更はできますが，XQuery置換式で置換したノードの変更はできません。

(d)　使用例

表の定義と，表に挿入されているデータを次に示します。

＜表定義SQL＞

CREATE TABLE 書籍管理表 (書籍ID INTEGER, 書籍情報 XML)

＜書籍管理表に挿入されているデータ＞

書籍ID

書籍情報

452469631

<書籍情報>

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

XQuery変換式の例を次に示します。

（例1）

書籍管理表の書籍情報の価格を"2500"から"2000"に置換します。

＜実行SQL＞

UPDATE 書籍管理表 SET 書籍情報 = XMLQUERY(
'copy $new := .
modify replace node $new/書籍情報/価格/text() with "2000"
return $new'
PASSING BY VALUE 書籍情報 EMPTY ON EMPTY)

＜実行結果＞

書籍ID

書籍情報

452469631

<書籍情報>

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2000</価格>

</書籍情報>

（例2）

書籍管理表の書籍情報の書籍情報要素に，書籍管理表の書籍IDの値を属性として挿入します。

＜実行SQL＞

UPDATE 書籍管理表 SET 書籍情報 = XMLQUERY(
'copy $new := .
modify insert node attribute 書籍ID { $value } into $new/書籍情報
return $new'
PASSING BY VALUE 書籍情報, 書籍ID AS "value" EMPTY ON EMPTY)

＜実行結果＞

書籍ID

書籍情報

452469631

<書籍情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

(17)　XQuery挿入式

(a)　機能

XQueryデータモデルの木の指定した位置にノードを挿入する式です。

(b)　形式

XQuery挿入式 ：：= insert ｛ node ｜ nodes ｝XQueryソース式
                    ｛ 〔 as ｛ first ｜ last ｝〕 into
                     ｜ after
                     ｜ before
                     ｝
                    XQueryターゲット式
XQueryソース式 ：：= ｛ XQuery式単独 ｜ XQuery構成子 ｝
XQuery構成子 ：：=｛ XQuery要素構成子 ｜ XQuery属性構成子 ｜ XQueryテキスト構成子
                      ｜ XQueryコメント構成子 ｜ XQuery処理命令構成子 ｝
XQuery要素構成子 ：：= element 修飾名 左波括弧 〔
                       ｛ XQuery式単独 ｜ XQuery構成子 ｝
                         〔, ｛ XQuery式単独 ｜ XQuery構成子 ｝ 〕…
                         〕 右波括弧
XQuery属性構成子 ：：= attribute 修飾名 左波括弧 〔 XQuery式 〕 右波括弧
XQueryテキスト構成子 ：：= text 左波括弧 〔 XQuery式 〕 右波括弧
XQueryコメント構成子 ：：= comment 左波括弧 〔 XQuery式 〕 右波括弧
XQuery処理命令構成子 ：：= processing-instruction 処理命令ターゲット
                            左波括弧 〔 XQuery式 〕 右波括弧
XQueryターゲット式 ：：= XQuery式単独

(c)　オペランド

XQuery挿入式 ：：= insert ｛ node ｜ nodes ｝XQueryソース式

　　　｛ 〔 as ｛ first ｜ last ｝〕 into

　　　｜ after

　　　｜ before｝

　　　XQueryターゲット式

｛ node ｜ nodes ｝

XQueryソース式に指定しているノードの数に関係なく，node又はnodesを指定できます。

as first into

XQueryターゲット式で指定したノードの，最初の子としてノードを挿入します。XQueryソース式のXQueryシーケンスに属性ノードを含む場合は，XQueryターゲット式に指定したノードに属性ノードを挿入します。

as last into

XQueryターゲット式で指定したノードの，最後の子としてノードを挿入します。XQueryソース式のXQueryシーケンスに属性ノードを含む場合は，XQueryターゲット式に指定したノードに属性ノードを挿入します。

into

XQueryターゲット式で指定したノードの子としてノードを挿入します。XQueryソース式のXQueryシーケンスに属性ノードを含む場合は，XQueryターゲット式に指定したノードに属性ノードを挿入します。

after

XQueryターゲット式で指定したノードの直後に弟となるノードを挿入します。XQueryソース式のXQueryシーケンスに属性ノードを含む場合は，XQueryターゲット式に指定したノードの親ノードに属性ノードを挿入します。

before

XQueryターゲット式で指定したノードの直前に兄となるノードを挿入します。XQueryソース式のXQueryシーケンスに属性ノードを含む場合は，XQueryターゲット式に指定したノードの親ノードに属性ノードを挿入します。

XQueryソース式 ：：= ｛ XQuery式単独 ｜ XQuery構成子 ｝

XQueryソース式には，挿入するノードのXQueryシーケンスを指定します。

XQueryソース式のXQueryシーケンスの構成要素として指定するXQuery項目と，挿入されるノードとの関係を次に示します。

項番

XQueryソース式のXQueryシーケンスの構成要素として指定するXQuery項目

挿入されるノード

1

文書ノード

指定した文書ノードの子ノード

2

要素ノード

指定した要素ノード

3

属性ノード※1，※2，※3，※4

指定した属性ノード

4

テキストノード

テキストノードを連続して二つ以上指定した場合

指定した各テキストノードの内容を連結した文字列を内容に持つ，単一のテキストノード※5

その他の場合

指定したテキストノード※5

5

コメントノード

指定したコメントノード

6

処理命令ノード

指定した処理命令ノード

7

基本単位値

基本単位値を連続して二つ以上指定した場合

指定した基本単位値をxs:string型に変換し，各値の間に半角空白（X'20'）を追加して連結した文字列を内容に持つ，単一のテキストノード

その他の場合

指定した基本単位値をxs:string型に変換した文字列を内容に持つ，テキストノード※5

注※1

一つの要素ノード内で重複しない修飾名を指定してください。

注※2

一つの要素ノード内で，属性ノードは属性ノード以外の前に指定してください。

注※3

親ノードと同じ接頭辞の属性ノードを挿入する場合，それらの接頭辞のXML名前空間URIが異なるものは指定できません。

注※4

同じ接頭辞を持つ複数の属性ノードを挿入する場合，それらの接頭辞のXML名前空間URIが異なるものは指定できません。

注※5

テキストノードの内容が空の場合，そのテキストノードは省略されます。

XQuery構成子 ：：= ｛ XQuery要素構成子 ｜ XQuery属性構成子

　　　｜ XQueryテキスト構成子 ｜ XQueryコメント構成子

　　　｜ XQuery処理命令構成子｝

XQuery構成子は，要素ノード，属性ノード，テキストノード，コメントノード，又は処理命令ノードから構成されるXQueryシーケンスを返します。

XQuery構成子の例を次に示します。

＜XQuery構成子の例＞

項番

例

作成されるXQueryデータモデル

説明

1

element タイトル{}

ノード名が「タイトル」の要素ノードを返却します。

2

element データベース {"楽しい"}

ノード名が「データベース」の要素ノードを返却します。

要素ノードは，子ノードに内容が「楽しい」のテキストノードを持ちます。

3

attribute 書籍ID {"1234"}

文字列値に「1234」の値を持つ，ノード名が「書籍ID」の属性ノードを返却します。

4

text{"日立", "太郎"}

内容が「日立△太郎」のテキストノードを返却します。

5

element 書籍情報{

attribute 書籍ID {"12","34"},

text {"XML"},text{"入門"}

}

ノード名が「書籍情報」の要素ノードを返却します。

要素ノードは，子ノードに内容が「XML入門」のテキストノードと，文字列値が「12△34」でノード名が「書籍ID」の属性ノードを持ちます。

＜指定できないXQuery構成子の例＞

項番

例

説明

1

element 書籍情報{

attribute 書籍ID{”123456”},

attribute 書籍ID{”A-1”}

}

同じ名前の属性ノードは複数指定できません。例の下線部が該当します。

2

element 書籍情報{

text {”XML入門”} ,

attribute 書籍ID{”123456”}

}

属性ノード以外の後に属性ノードを指定することはできません。例の下線部が該当します。

XQuery要素構成子 ：：= element 修飾名 左波括弧 〔

　　　｛ XQuery式単独 ｜ XQuery構成子 ｝

　　　〔, ｛ XQuery式単独 ｜ XQuery構成子 ｝ 〕…

　　　〕右波括弧

XQuery要素構成子は，要素ノードのXQueryシーケンスを返します。

修飾名

作成する要素ノードの修飾名を指定します。

修飾名の接頭辞を指定する場合，XML名前空間宣言で宣言した接頭辞を指定してください。XML名前空間宣言については，「XQuery宣言部」を参照してください。

修飾名の接頭辞及び局所名に使用できる文字については，「接頭辞及び局所名に使用できる文字」を参照してください。

なお，次の要素ノードは指定できません。

要素ノードの局所名が「xml」で始まる。

要素ノードの修飾名の接頭辞が「xmlns」である。

要素ノードの修飾名の接頭辞に対応するXML名前空間URIが「http://www.w3.org/2000/xmlns/」である。

要素ノードの修飾名の接頭辞が「xml」で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」以外である。

要素ノードの修飾名の接頭辞が「xml」以外で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」である。

接頭辞が「xmlns」のXML名前空間を含む要素ノードである。

XQuery式

XQuery式には，作成する要素ノードが持つ，0個以上の子ノード又は属性ノードから成るXQueryシーケンスを指定します。

XQuery式の，XQueryシーケンスの構成要素として指定するXQuery項目と，作成する要素ノードが持つことになる子ノード又は属性ノードを次に示します。

項番

XQuery式のXQueryシーケンスの構成要素として指定するXQuery項目

作成する要素ノードが持つことになる子ノード又は属性ノード

1

文書ノード

指定した文書ノードの子ノード

2

要素ノード

指定した要素ノード

3

属性ノード※1，※2

指定した属性ノード

4

テキストノード

テキストノードを連続して二つ以上指定した場合

指定した各テキストノードの内容を連結した文字列を内容に持つ，単一のテキストノード※3

その他の場合

指定したテキストノード※3

5

コメントノード

指定したコメントノード

6

処理命令ノード

指定した処理命令ノード

7

基本単位値

基本単位値を連続して二つ以上指定した場合

指定した基本単位値をxs:string型に変換し，各値の間に半角空白（X'20'）を追加して連結した文字列を内容に持つ，単一のテキストノード

その他の場合

指定した基本単位値をxs:string型に変換した文字列を内容に持つ，テキストノード※3

注※1

一つの要素ノード内で重複しない修飾名を指定してください。

注※2

一つの要素ノード内で，属性ノードは属性ノード以外の前に指定してください。

注※3

テキストノードの内容が空の場合，そのテキストノードは省略されます。

XQuery属性構成子 ：：= attribute 修飾名

　　　左波括弧 〔 XQuery式 〕 右波括弧

XQuery属性構成子は属性ノードを返します。

修飾名

作成する属性ノードの修飾名を指定します。

修飾名の接頭辞を指定する場合，XML名前空間宣言で宣言した接頭辞を指定します。XML名前空間宣言については，「XQuery宣言部」を参照してください。

修飾名の接頭辞及び局所名に使用できる文字については，「接頭辞及び局所名に使用できる文字」を参照してください。

なお，次の属性ノードは指定できません。

属性ノードの修飾名の接頭辞が「xmlns」である。

属性ノードの修飾名の接頭辞に対応するXML名前空間URIが「http://www.w3.org/2000/xmlns/」である。

属性ノードの修飾名の接頭辞が「xml」で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」以外である。

属性ノードの接頭辞が「xml」以外で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」である。

XQuery式

属性ノードの文字列値プロパティの値を指定します。

XQuery式に基本単位化を適用した結果の基本単位値を，xs:string型に変換した値が文字列値プロパティの値となります。基本単位化で二つ以上の基本単位値が返却される場合，各基本単位値の間に半角空白（X'20'）を追加して，連結した一つのxs:string型の値になります。

XQueryテキスト構成子 ：：= text 左波括弧 〔 XQuery式 〕 右波括弧

XQueryテキスト構成子はテキストノードを返します。

XQuery式

内容プロパティの値を指定します。内容プロパティの値が空の場合，テキストノードは省略されます。

基本単位化を適用した結果の基本単位値を，xs:string型に変換した値が内容プロパティの値となります。基本単位化で二つ以上の基本単位値が返却される場合，各基本単位値の間に半角空白（X'20'）を追加して，連結した一つのxs:string型の値になります。

XQueryコメント構成子 ：：= comment 左波括弧 〔 XQuery式 〕 右波括弧

XQueryコメント構成子はコメントノードを返します。

XQuery式

内容プロパティの値を指定します。

基本単位化を適用した結果の基本単位値を，xs:string型に変換した値が内容プロパティの値となります。基本単位化で二つ以上の基本単位値が返却される場合，各基本単位値の間に半角空白（X'20'）を追加して，連結した一つのxs:string型の値になります。

内容プロパティの値には，連続するハイフンを含まない，かつ最後がハイフンで終わらない値を指定してください。

XQuery処理命令構成子 ：：= processing-instruction 処理命令ターゲット

　　　左波括弧 〔 XQuery式 〕 右波括弧

XQuery処理命令構成子は処理命令ノードを返します。

処理命令ターゲット

作成する処理命令ノードの処理命令ターゲットを指定します。

「XML」（大文字，小文字を問わない）でない値を指定してください。

処理命令ターゲットに使用できる文字は，「接頭辞及び局所名に使用できる文字」と同じです。

XQuery式

処理命令ノードの内容プロパティの値を指定します。

XQuery式に，基本単位化を適用した結果の基本単位値を，xs:string型に変換した値が内容プロパティの値となります。基本単位化で二つ以上の基本単位値が返却される場合，各基本単位値の間に半角空白（X'20'）を追加して，連結した一つのxs:string型の値になります。

内容プロパティの値の先頭及び末尾がホワイトスペース（半角空白（X'20'），タブ（X'09'），NL（X'0A'），又はCR（X'0D'））の場合，ホワイトスペースを取り除きます。

内容プロパティの値には，「?>」を含まない値を指定してください。

XQueryターゲット式 ：：= XQuery式単独

ノードを挿入する位置を指定します。XQuery変換式のcopy句に指定する，XQueryデータモデルの木に存在するノードを指定してください。

XQuery挿入式にas first into，as last into，又はintoを指定する場合，XQueryターゲット式には単一の要素ノードを指定してください。

XQuery挿入式にafter又はbeforeを指定する場合，XQueryターゲット式には単一の要素ノード，テキストノード，コメントノード，又は処理命令ノードを指定してください。また，指定するノードは要素ノードである親ノードを持っている必要があります。

(d)　使用例

XQuery挿入式の例を次に示します。

＜文脈項目である文書ノード以下のXML要素＞

<書籍情報 書籍ID="452469631">
　<タイトル>XML入門教科書</タイトル>
　<著者>中村弘子</著者>
　<著者>日立太郎</著者>
　<価格>2500</価格>
</書籍情報>

＜XQuery挿入式の例と結果＞

項番

例

結果（下線部が変更箇所）

1

copy $new := .

modify insert node element カテゴリ{"XML"} after $new/書籍情報/タイトル

return $new

<書籍情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<カテゴリ>XML</カテゴリ>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

2

copy $new := .

modify insert node attribute 保管場所{"倉庫"} before $new/書籍情報/価格

return $new

<書籍情報 書籍ID="452469631" 保管場所="倉庫" >

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

3

copy $new := .

modify ( insert node attribute カテゴリ{"XML"} into $new/書籍情報,

insert node element 保管場所{"倉庫"} into $new/書籍情報 )

return $new

<書籍情報 書籍ID="452469631" カテゴリ="XML">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

　<保管場所>倉庫</保管場所>

</書籍情報>

4

declare namespace hirdb = "http://www.hitachi.co.jp/hirdb/";

copy $new := .

modify insert node attribute hirdb:管理番号{"ABC"} into $new/書籍情報

return $new

<書籍情報 xmlns:hirdb="http://www.hitachi.co.jp/hirdb/" 書籍ID="452469631" hirdb:管理番号="ABC">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

＜指定できないXQuery挿入式の例と結果＞

項番

例

説明

1

copy $new := .

modify insert node element カテゴリ{"XML"} before $new/書籍情報/著者

return $new

XQueryターゲット式には，単一の要素ノードを指定する必要があります。例の下線部が該当します。

2

copy $new := .

modify insert node element カテゴリ{"XML"}into $new/書籍情報/@書籍ID

return $new

into指定した場合，XQueryターゲット式には要素ノードを指定する必要があります。例の下線部が該当します。

(18)　XQuery削除式

(a)　機能

XQueryデータモデルの木の指定した位置のノードを削除する式です。ノードが属性ノード又は子孫ノードを持つ場合は，その属性ノード又は子孫ノードも削除します。

(b)　形式

XQuery削除式 ：：= delete ｛ node ｜ nodes ｝ XQueryターゲット式
XQueryターゲット式 ：：= XQuery式単独

(c)　オペランド

XQuery削除式 ：：= delete｛ node ｜ nodes ｝XQueryターゲット式

XQueryターゲット式で指定しているノードの数に関係なく，node又はnodesを指定できます。

XQueryターゲット式 ：：= XQuery式単独

削除するノードを指定します。XQuery変換式のcopy句に指定する，XQueryデータモデルの木のノード，又は空のXQueryシーケンスを指定してください。

XQueryターゲット式で指定したノードが親を持たない場合は，省略されます。

(d)　使用例

XQuery削除式の例を次に示します。

＜文脈項目である文書ノード以下のXML要素＞

<書籍情報 書籍ID="452469631">
　<タイトル>XML入門教科書</タイトル>
　<著者>中村弘子</著者>
　<著者>日立太郎</著者>
　<価格>2500</価格>
</書籍情報>

＜XQuery削除式の例と結果＞

項番

例

結果

1

copy $new := .

modify delete node $new/書籍情報/著者

return $new

<書籍情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<価格>2500</価格>

</書籍情報>

2

copy $new := .

modify delete node $new/書籍情報/著者[. = "中村弘子"]

return $new

<書籍情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

3

copy $new := .

modify delete node $new/書籍情報/@書籍ID

return $new

<書籍情報>

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

(19)　XQuery名前変更式

(a)　機能

XQueryデータモデルの木の，指定した位置のノードの修飾名又は処理命令ターゲットを変更する式です。

(b)　形式

XQuery名前変更式 ：：= rename node XQueryターゲット式 as
                        XQuery式単独
XQueryターゲット式 ：：= XQuery式単独

(c)　オペランド

XQuery名前変更式 ：：= rename node XQueryターゲット式 as

　　　XQuery式単独

XQuery式単独

名前変更後の修飾名又は処理命令ターゲットを指定します。

修飾名の接頭辞を指定する場合，XML名前空間宣言で宣言した接頭辞を指定します。XML名前空間宣言については，「XQuery宣言部」を参照してください。

修飾名の接頭辞及び局所名に使用できる文字については，「接頭辞及び局所名に使用できる文字」を参照してください。処理命令ターゲットで使用できる文字は，修飾名の接頭辞及び局所名と同じです。

XQuery式単独の規則を次に示します。

XQueryターゲット式が要素ノード又は属性ノードの場合は，修飾名を指定します。

XQuery式単独に，基本単位化を適用した結果が単一の基本単位値になり，その基本単位値のXQueryデータ型がxs:string又はxs:untypedAtomicになるXQuery式単独を指定してください。その基本単位化を適用した結果の基本単位値が修飾名になります。

属性ノードの修飾名に親ノードと同じ接頭辞の指定する場合，それらの接頭辞のXML名前空間URIは同じものを指定してください。

なお，次の修飾名は指定できません。

・修飾名の接頭辞が「xmlns」である。

・修飾名の接頭辞に対応するXML名前空間URIが「http://www.w3.org/2000/xmlns/」である。

・修飾名の接頭辞が「xml」で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」以外である。

・修飾名の接頭辞が「xml」以外で，かつその接頭辞に対応するXML名前空間URIが「http://www.w3.org/XML/1998/namespace」である。

XQueryターゲット式が要素ノードの場合，次の修飾名は指定できません。

・変更後の要素ノードの局所名が「xml」で始まる。

XQueryターゲット式が属性ノードの場合，次の修飾名は指定できません。

・修飾名の接頭辞を指定しないかつ局所名が「xmlns」である。

XQueryターゲット式が処理命令ノードの場合は，処理命令ターゲットを指定します。

XQuery式単独に基本単位化を適用した結果が単一の基本単位値になり，その基本単位値のXQueryデータ型がxs:string又はxs:untypedAtomicになるXQuery式単独を指定してください。その基本単位化を適用した結果の基本単位値が処理命令ターゲットになります。

処理命令ターゲットが「XML」（大文字，小文字を問わない）になるXQuery式単独は指定できません。

XQueryターゲット式 ：：= XQuery式単独

名前を変更するノードを指定します。

XQuery変換式の，copy句に指定するXQueryデータモデルの木に存在する，単一の要素ノード，属性ノード，又は処理命令ノードを指定してください。

同じXQuery変換式中で，複数のXQuery名前変更式に同じノードを指定することはできません。

(d)　使用例

XQuery名前変更式の例を次に示します。

＜文脈項目である文書ノード以下のXML要素＞

<書籍情報 書籍ID="452469631">
 <タイトル>XML入門教科書</タイトル>
  <著者>中村弘子</著者>
  <著者>日立太郎</著者>
  <価格>2500</価格>
</書籍情報>

＜XQuery名前変更式の例と結果＞

項番

例

結果（下線部が変更箇所）

1

copy $new := .

modify rename node $new/書籍情報 as "情報"

return $new

<情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</情報>

2

copy $new := .

modify rename node $new/書籍情報/@書籍ID as "管理ID"

return $new

<書籍情報 管理ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

3

declare namespace hirdb = "http://www.hitachi.co.jp/hirdb/";

copy $new := .

modify rename node $new/書籍情報 as "hirdb:書籍情報"

return $new

<hirdb:書籍情報 xmlns:hirdb="http://www.hitachi.co.jp/hirdb/" 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</hirdb:書籍情報>

＜指定できないXQuery名前変更式の例＞

項番

例

説明

1

copy $new := .

modify rename node $new/書籍情報/著者 as "作者"

return $new

XQueryターゲット式には単一の要素ノードを指定する必要があります。例の下線部が該当します。

(20)　XQuery置換式

(a)　機能

XQueryデータモデルの木の，指定した位置のノード又はノードの値を置換する式です。

(b)　形式

XQuery置換式 ：：= replace 〔 value of 〕 node XQueryターゲット式
                    with XQueryソース式
XQueryターゲット式 ：：= XQuery式単独
XQueryソース式 ：：= ｛ XQuery式単独 ｜ XQuery構成子 ｝
XQuery構成子 ：：=｛ XQuery要素構成子 ｜ XQuery属性構成子 ｜ XQueryテキスト構成子
                      ｜ XQueryコメント構成子 ｜ XQuery処理命令構成子 ｝
XQuery要素構成子 ：：= element 修飾名 左波括弧 〔
                       ｛ XQuery式単独 ｜ XQuery構成子 ｝
                         〔, ｛ XQuery式単独 ｜ XQuery構成子 ｝ 〕…
                         〕 右波括弧
XQuery属性構成子 ：：= attribute 修飾名 左波括弧 〔 XQuery式 〕 右波括弧
XQueryテキスト構成子 ：：= text 左波括弧 〔 XQuery式 〕 右波括弧
XQueryコメント構成子 ：：= comment 左波括弧 〔 XQuery式 〕 右波括弧
XQuery処理命令構成子 ：：= processing-instruction 処理命令ターゲット
                            左波括弧 〔 XQuery式 〕 右波括弧

(c)　オペランド

XQuery置換式 ：：= replace 〔 value of 〕 node XQueryターゲット式

　　　with XQueryソース式

〔 value of 〕

ノードの値を変更する場合は，指定します。

ノードを変更する場合は，省略します。

XQueryターゲット式 ：：= XQuery式単独

置換するノードを指定します。

XQuery変換式のcopy句に指定する，XQueryデータモデルの木に存在する単一の要素ノード，属性ノード，テキストノード，コメントノード，又は処理命令ノードを指定してください。

同じXQuery変換式中で，value ofの指定がない複数のXQuery置換式に同じノードを指定することはできません。

同じXQuery変換式中で，value ofの指定がある複数のXQuery置換式に同じノードを指定することはできません。

XQueryソース式 ：：= ｛ XQuery式単独 ｜ XQuery構成子 ｝

置換後のノードの，XQueryシーケンス又はノードの値を指定します。

value ofの指定がある場合，XQuery式単独だけ指定できます。

value ofを指定しない場合

置換後のノードのXQueryシーケンスを指定します。

XQueryソース式の，XQueryシーケンスの構成要素として指定するXQuery項目と，置換後のノードの関係を次に示します。

項番

XQueryソース式のXQueryシーケンスの構成要素として指定するXQuery項目

置換後のノード

1

文書ノード

指定した文書ノードの子ノード

2

要素ノード

指定した要素ノード

3

属性ノード※1，※2，※3

指定した属性ノード

4

テキストノード

テキストノードを連続して二つ以上指定した場合

指定した各テキストノードの内容を連結した文字列を内容に持つ，単一のテキストノード※4

その他の場合

指定したテキストノード※4

5

コメントノード

指定したコメントノード

6

処理命令ノード

指定した処理命令ノード

7

基本単位値

基本単位値を連続して二つ以上指定した場合

指定した基本単位値をxs:string型に変換し，各値の間に半角空白（X'20'）を追加し連結した文字列を内容に持つ，単一のテキストノード

その他の場合

指定した基本単位値をxs:string型に変換した文字列を内容に持つ，テキストノード※4

注※1

一つの要素ノード内で重複しない修飾名を指定してください。

注※2

親ノードと同じ接頭辞の属性ノードに置換する場合，それらの接頭辞のXML名前空間URIが異なるものは指定できません。

注※3

同じ接頭辞を持つ複数の属性ノードに置換する場合，それらの接頭辞のXML名前空間URIが異なるものは指定できません。

注※4

テキストノードの内容が空の場合，そのテキストノードは省略されます。

XQueryターゲット式が要素ノード，テキストノード，コメントノード，又は処理命令ノードの場合，0個以上の要素ノード，テキストノード，コメントノード，又は処理命令ノードから構成されるXQueryシーケンスを指定してください。

XQueryターゲット式が属性ノードの場合，0個以上の属性ノードから構成されるXQueryシーケンスを指定してください。

value ofを指定する場合

置換後のノードの値を指定します。

XQueryソース式に基本単位化を適用した結果の基本単位値を，xs:string型に変換した値となります。基本単位化で二つ以上の基本単位値が返却される場合，各基本単位値の間に半角空白（X'20'）を追加して，連結した一つのxs:string型の値になります。

XQueryターゲット式がコメントノードの場合，XQueryソース式は連続するハイフンを含まない，かつ最後がハイフンで終わらない値を指定してください。

XQueryターゲット式が処理命令ノードの場合，XQeuryソース式は「?>」を含まない値を指定してください。

XQuery構成子 ：：= ｛ XQuery要素構成子 ｜ XQuery属性構成子

　　　｜ XQueryテキスト構成子 ｜ XQueryコメント構成子

　　　｜ XQuery処理命令構成子｝

XQuery構成子については，「オペランド」を参照してください。

XQuery要素構成子 ：：= element 修飾名 左波括弧 〔

　　　｛ XQuery式単独 ｜ XQuery構成子 ｝

　　　〔, ｛ XQuery式単独 ｜ XQuery構成子 ｝ 〕…

　　　〕 右波括弧

XQuery要素構成子については，「オペランド」を参照してください。

XQuery属性構成子 ：：= attribute 修飾名

　　　左波括弧 〔 XQuery式 〕 右波括弧

XQuery属性構成子については，「オペランド」を参照してください。

XQueryテキスト構成子 ：：= text 左波括弧 〔 XQuery式 〕 右波括弧

XQueryテキスト構成子については，「オペランド」を参照してください。

XQueryコメント構成子 ：：= comment 左波括弧 〔 XQuery式 〕 右波括弧

XQueryコメント構成子については，「オペランド」を参照してください。

XQuery処理命令構成子 ：：= processing-instruction 処理命令ターゲット

　　　左波括弧 〔 XQuery式 〕 右波括弧

XQuery処理命令構成子については，「オペランド」を参照してください。

(d)　使用例

XQuery置換式の入力例を次に示します。

＜文脈項目である文書ノード以下のXML要素＞

<書籍情報 書籍ID="452469631">
　<タイトル>XML入門教科書</タイトル>
　<著者>中村弘子</著者>
　<著者>日立太郎</著者>
　<価格>2500</価格>
</書籍情報>

＜XQuery置換式の例と結果＞

項番

例

結果（下線部が変更箇所）

1

copy $new := .

modify replace value of node $new/書籍情報/著者[.="日立太郎"] with "日立花子"

return $new

<書籍情報 書籍ID="452469631">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立花子</著者>

　<価格>2500</価格>

</書籍情報>

2

copy $new := .

modify replace node $new/書籍情報 with element 書籍情報 {element タイトル{"データベース入門"} , element 著者{"日立太郎"}}

return $new

<書籍情報>

　<タイトル>データベース入門</タイトル>

　<著者>日立太郎</著者>

</書籍情報>

3

copy $new := .

modify replace value of node $new/書籍情報/@書籍ID with "10000"

return $new

<書籍情報 書籍ID="10000">

　<タイトル>XML入門教科書</タイトル>

　<著者>中村弘子</著者>

　<著者>日立太郎</著者>

　<価格>2500</価格>

</書籍情報>

＜指定できないXQuery置換式の例＞

項番

例

説明

1

copy $new := .

modify replace node $new/書籍情報/著者 with element 著者 {"日立花子"}

return $new

XQueryターゲット式には単一の要素ノードを指定する必要があります。例の下線部が該当します。

2

copy $new := .

modify ( replace node $new/書籍情報/タイトル with element 書籍名 {"データベース"},

replace node $new/書籍情報/タイトル with element タイトル {"XML"} )

return $new

複数のXQuery置換式に同じXQueryターゲット式は指定できません。例の下線部が該当します。

1.15.7　XQueryコメント

XQueryコメントは，XQueryの評価結果に影響を及ぼさない注釈です。

次の形式で指定します。

  XQueryコメント ：：= (:〔｛XQueryコメント内容｜XQueryコメント｝〕… :)
  XQueryコメント内容 ：：= 文字

1.15.8　XQuery関数

ここでは，HiRDBが提供するXQuery関数について説明します。

各XQuery関数の形式で記述した引数は，XQuery関数呼出しの規則に従ってXQuery関数にパラメタとして渡されます。XQuery関数呼出しの規則については，「XQuery関数呼出し」を参照してください。

XQuery関数には，XQueryで定義された関数と，HiRDBで定義された関数があります。

XQueryで定義された関数は，接頭辞xsに割り当てられたXML名前空間（http://www.w3.org/2001/XMLSchema），又はfnに割り当てられたXML名前空間（http://www.w3.org/2006/xpath-functions）中にあります。

HiRDBで定義された関数は，接頭辞hi-fnに割り当てられたXML名前空間（http://www.hitachi.co.jp/Prod/comp/soft1/hirdb/xquery-functions）中にあります。HiRDBで定義された関数を呼び出す場合，XQuery関数名に対する既定のXML名前空間を"http://www.hitachi.co.jp/Prod/comp/soft1/hirdb/xquery-functions"で宣言している場合を除き，接頭辞を指定する必要があります。

コンストラクタ関数については，「コンストラクタ関数」を参照してください。

HiRDBで使用できるXQuery関数を，次の表に示します。

表1‒98　HiRDBが提供するXQuery関数

分類

関数

機能

XQuery 関数の種別

コンストラクタ関数

xs:string

xs:string型の値を生成します。

XQuery

xs:decimal

xs:decimal型の値を生成します。

XQuery

xs:int

xs:int型の値を生成します。

XQuery

xs:double

xs:double型の値を生成します。

XQuery

xs:dateTime

xs:dateTime型の値を生成します。

XQuery

xs:date

xs:date型の値を生成します。

XQuery

xs:time

xs:time型の値を生成します。

XQuery

xs:hexBinary

xs:hexBinary型の値を生成します。

XQuery

xs:boolean

xs:boolean型の値を生成します。

XQuery

xs:untypedAtomic

xs:untypedAtomic型の値を生成します。

XQuery

変換関数

fn:boolean

XQueryシーケンスをxs:boolean型の値として評価した結果を返します。

XQuery

fn:data

XQueryシーケンスを基本単位化し，基本単位値から成るXQueryシーケンスを返します。

XQuery

fn:number

引数に指定した値をxs:double型に変換した値を返します。

XQuery

fn:string

XQuery項目の値を文字列表現した値をxs:string型の値として返します。

XQuery

文字列操作関数

fn:compare

二つの文字列を比較します。

XQuery

fn:concat

二つ以上の基本単位値をxs:string型の値に変換して連結した値を返します。

XQuery

fn:contains

引数1で指定した文字列中に引数2で指定した文字列が含まれているかどうかを返します。

XQuery

hi-fn:contains

引数1で指定したノードの文字列値が，引数2で指定した全文検索のテキスト検索条件を満たすかどうかを返します。

HiRDB

fn:ends-with

引数1で指定した文字列が引数2で指定した文字列で終了するかどうかを返します。

XQuery

fn:normalize-space

文字列に対してホワイトスペースの正規化を行った結果を返します。

XQuery

fn:starts-with

引数1で指定した文字列が引数2で指定した文字列で開始するかどうかを返します。

XQuery

fn:string-length

文字列の長さ（文字数）を返します。

XQuery

fn:substring

文字列の部分文字列を返します。

XQuery

fn:substring-after

引数1で指定した文字列中の，引数2で指定した文字列が最初に出現する位置より後の部分文字列を返します。

XQuery

fn:substring-before

引数1で指定した文字列中の，引数2で指定した文字列が最初に出現する位置より前の部分文字列を返します。

XQuery

fn:translate

引数1で指定した文字列中の引数2で指定した文字を，引数3で指定した文字に置換した結果を返します。

XQuery

数学関数

fn:abs

数値データ型の値の絶対値を返します。

XQuery

fn:ceiling

引数の値以上の，最小の整数値を返します。

XQuery

fn:floor

引数の値以下の，最大の整数値を返します。

XQuery

fn:round

引数の値に最も近い整数値を返します。

XQuery

日時抽出関数

fn:year-from-dateTime

時刻印から年の部分だけを抽出して返します。

XQuery

fn:month-from-dateTime

時刻印から月の部分だけを抽出して返します。

XQuery

fn:day-from-dateTime

時刻印から日の部分だけを抽出して返します。

XQuery

fn:hours-from-dateTime

時刻印から時間の部分だけを抽出して返します。

XQuery

fn:minutes-from-dateTime

時刻印から分の部分だけを抽出して返します。

XQuery

fn:seconds-from-dateTime

時刻印から秒の部分だけを抽出して返します。

XQuery

fn:year-from-date

日付から年の部分だけを抽出して返します。

XQuery

fn:month-from-date

日付から月の部分だけを抽出して返します。

XQuery

fn:day-from-date

日付から日の部分だけを抽出して返します。

XQuery

fn:hours-from-time

時刻から時間の部分だけを抽出して返します。

XQuery

fn:minutes-from-time

時刻から分の部分だけを抽出して返します。

XQuery

fn:seconds-from-time

時刻から秒の部分だけを抽出して返します。

XQuery

ブーリアン関数

fn:false

偽を返します。

XQuery

fn:not

引数をxs:boolean型の値に変換し，その値を否定した値を返します。

XQuery

fn:true

真を返します。

XQuery

XQueryシーケンス集約関数

fn:count

XQueryシーケンス中のXQuery項目数を返します。

XQuery

fn:distinct-values

XQueryシーケンスから重複する基本単位値を取り除いたXQueryシーケンスを返します。

XQuery

fn:max

XQueryシーケンスを構成する基本単位値の最大値を返します。

XQuery

fn:min

XQueryシーケンスを構成する基本単位値の最小値を返します。

XQuery

fn:sum

XQueryシーケンスを構成する基本単位値の合計を返します。

XQuery

XQueryシーケンス操作関数

fn:deep-equal

二つのXQueryシーケンスが深等であるかを判別します。

XQuery

fn:index-of

指定したXQueryシーケンス中に，指定した基本単位値と一致するXQuery項目が現れる位置を返します。

XQuery

fn:insert-before

XQueryシーケンスの指定した位置の前に，別のXQueryシーケンス中のXQuery項目を挿入した結果を返します。

XQuery

fn:remove

XQueryシーケンスから指定した位置のXQuery項目を削除した結果を返します。

XQuery

fn:reverse

XQueryシーケンス中のXQuery項目を逆順に並べ替えたXQueryシーケンスを返します。

XQuery

fn:subsequence

XQueryシーケンスの部分XQueryシーケンスを返却します。

XQuery

文脈項目関数

fn:last

文脈サイズを返します。

XQuery

fn:position

文脈位置を返します。

XQuery

ノード関数

fn:local-name

ノードの局所名を返します。

XQuery

fn:name

ノードの修飾名を返します。

XQuery

fn:namespace-uri

ノードの修飾名のXML名前空間URIを返します。

XQuery

（凡例）

XQuery：XQueryで定義された関数

HiRDB：HiRDBで定義された関数

(1)　abs

(a)　機能

数値データ型の値の絶対値を返します。

(b)　形式

fn:abs ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒99　 fn:abs関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

num

数値データ型

（空のXQueryシーケンスを含む）

入力となる数値

結果は，空のXQueryシーケンス，又は次に示す数値データ型の値になります。

表1‒100　 fn:abs関数の結果のXQueryデータ型

項番

パラメタnumの値の

XQueryデータ型

結果のXQueryデータ型

1

xs:double

xs:double

2

xs:decimal

xs:decimal

3

xs:int

xs:int

絶対値が結果のXQueryデータ型の範囲外となった場合はエラーになります。例えば，"fn:abs(-2147483648)"を指定した場合，絶対値は2147483648でxs:intの範囲外の値になるのでエラーになります。

パラメタnumの値が空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタnumの値が数値データ型の値である場合，パラメタnumの値の絶対値を返します。

パラメタnumの値がxs:double型のNaN（非数）の場合， NaN（非数）を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(括弧内はXQueryデータ型)

説明

1

fn:abs(10.5)

10.5 (xs:decimal)

10.5の絶対値は10.5であるため，その値を返します。

2

fn:abs(-10.5)

10.5 (xs:decimal)

-10.5の絶対値は10.5であるため，その値を返します。

(2)　boolean

(a)　機能

XQueryシーケンスをxs:boolean型の値として評価した結果を返します。

(b)　形式

fn:boolean (  引数  )

(c)　規則

この関数は次の表に示すパラメタを持ちます。

表1‒101　 fn:boolean関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意のXQuery項目を持つXQueryシーケンス

入力となるXQueryシーケンス

結果はxs:boolean型の値になります。

パラメタseqの値であるXQueryシーケンスによって，次の表に示す結果を返します。

表1‒102　 fn:boolean関数の結果

項番

パラメタseqの値

結果（xs:boolean型）

1

空のXQueryシーケンス

偽

2

最初のXQuery項目がノードであるXQueryシーケンス

真

3

xs:boolean型の基本単位値一つから構成されるXQueryシーケンス

引数のXQueryシーケンスの基本単位値

4

xs:string型又はxs:untypedAtomic型の基本単位値一つから構成されるXQueryシーケンス

引数のXQueryシーケンスの基本単位値の長さが0ならば偽，そうでなければ真

5

数値データ型の基本単位値一つから構成されるXQueryシーケンス

引数のXQueryシーケンスの基本単位値がNaN（非数）又は0ならば偽，そうでなければ真

6

上記以外

エラー

(d)　使用例

XQuery変数bookが，次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果

（xs:boolean型）

説明

1

$book/fn:boolean(著者[text() = "佐藤優"])

偽

パラメタseqの値が空のXQueryシーケンスになるため，偽を返します。

2

fn:boolean($book)

真

パラメタseqの値が「書籍情報」要素ノード一つから構成されるXQueryシーケンスになるため，真を返します。

3

$book/fn:boolean(@書籍ID = 452469630)

真

パラメタseqの値がxs:boolean型の値一つから構成されるXQueryシーケンスになるため，真を返します。

4

$book/fn:boolean(タイトル/fn:string(text()))

真

パラメタseqの値が長さ1以上のxs:string型の値一つから構成されるXQueryシーケンスになるため，真を返します。

5

$book/fn:boolean(@書籍ID)

真

パラメタseqの値が数値データ一つから構成されるXQueryシーケンスになるため，真を返します。

6

$book/fn:boolean(著者/fn:string(text()))

エラー

パラメタseqの値がxs:string型の値二つから構成されるXQueryシーケンスになるため，エラーになります。

(3)　ceiling

(a)　機能

引数の値以上の，最小の整数値を返します。

(b)　形式

fn:ceiling ( 引数 )

(c)　規則

この関数は次の表に示すパラメタを持ちます。

表1‒103　fn:ceiling関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

num

数値データ型

（空のXQueryシーケンスを含む）

入力となる数値

結果は，空のXQueryシーケンス，又は次の表に示す数値データ型の値になります。

表1‒104　fn:ceiling関数の結果のXQueryデータ型

項番

パラメタnumの値のXQueryデータ型

結果のXQueryデータ型

1

xs:double

xs:double

2

xs:decimal

xs:decimal

3

xs:int

xs:int

パラメタnumの値が空のXQueryシーケンスの場合，空のXQueryシーケンスを返します。

パラメタnumの値がxs:double型で，結果の値が特殊な値になる場合を次の表に示します。

表1‒105　fn:ceiling関数の結果が特殊な値になる場合

項番

パラメタnumの値

結果の値

1

正の0

正の0

2

負の0

負の0

3

-1より大きいかつ0未満

負の0

4

正の無限大

正の無限大

5

負の無限大

負の無限大

6

NaN（非数）

NaN（非数）

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果（括弧内はXQueryデータ型）

説明

1

fn:ceiling(10.5)

11. (xs:decimal)

10.5以上の最小の整数値である11を返します。

2

fn:ceiling(-10.5)

-10. (xs:decimal)

-10.5以上の最小の整数値である-10を返します。

(4)　compare

(a)　機能

二つの文字列を比較した結果を返します。

(b)　形式

fn:compare ( 引数1 , 引数2 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒106　 fn:compare関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

比較する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

比較する文字列

結果は，空のXQueryシーケンス又はxs:int型の値になります。

パラメタstr1の値，パラメタstr2の値のどちらかが空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタstr1及びパラメタstr2がxs:string型の値である場合，パラメタstr1の値とパラメタstr2の値の関係により，次に示す結果を返します。

表1‒107　 fn:compare関数の結果

項番

パラメタstr1とstr2の値の関係

結果(xs:int型)

1

パラメタstr1の値がパラメタstr2の値未満（str1 lt str2 が真になる）

-1

2

パラメタstr1の値がパラメタstr2の値と等しい（str1 eq str2 が真になる）

0

3

パラメタstr1の値がパラメタstr2の値より大きい（str1 gt str2 が真になる）

1

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

(xs:int型)

説明

1

fn:compare("abcde", "abcdef")

-1

"abcde"は"abcdef"未満であるため，-1を返します。

2

fn:compare("abcde", "abcde")

0

パラメタstr1及びstr2の値が両方とも"abcde"であるため，0を返します。

3

fn:compare("abcde", "abade")

1

"abcde"は"abade"より大きいため，1を返します。

(5)　concat

(a)　機能

二つ以上の基本単位値をxs:string型の値に変換して連結した値を返します。

(b)　形式

fn:concat ( 引数 , 引数 〔, 引数〕… )

(c)　規則

この関数は，次の表に示すパラメタを任意の個数（二つ以上）持ちます。

表1‒108　fn:concat関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

val

任意の基本単位型

（空のXQueryシーケンスを含む）

連結する基本単位値

結果は，空のXQueryシーケンス又はxs:string型の値になります。

すべてのパラメタの値が空のXQueryシーケンスの場合，空のXQueryシーケンスを返します。

基本単位値であるパラメタを含む場合，その値をxs:string型の値に変換し，指定した順に連結したxs:string型の値を返します。このとき，空のXQueryシーケンスであるパラメタの値は，長さ0の文字列として扱います。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

（xs:string型）

説明

1

fn:concat("abc","defg")

"abcdefg"

"abc"と"defg"を連結した文字列"abcdefg"を返します。

2

fn:concat("hijk", (), "lmn")

"hijklmn"

空のXQueryシーケンスは長さ0の文字列として扱うため，"hijk"，""，"lmn"を連結した文字列"hijklmn"を返します。

3

fn:concat((),(),())

空のXQueryシーケンス

すべてのパラメタの値が空のXQueryシーケンスであるため，空のXQueryシーケンスを返します。

(6)　contains（XQueryで定義された関数）

(a)　機能

引数1で指定した文字列中に引数2で指定した文字列が含まれているかどうかを返します。

(b)　形式

fn:contains ( 引数1, 引数2 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒109　 fn:contains関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

部分文字列を検索する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

パラメタstr1の文字列中を検索する部分文字列

結果はxs:boolean型の値になります。

パラメタstr1の値が空のXQueryシーケンス又は長さ0の文字列であり，かつパラメタstr2の値が長さ1以上の文字列である場合は偽を返します。

パラメタstr2の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr1の値に関係なく真を返します。

パラメタstr1の値及びパラメタstr2の値が，長さ1以上の文字列である場合，パラメタstr1の文字列中にパラメタstr2の文字列が含まれていれば，真を返します。含まれていなければ偽を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果

（xs:boolean型）

説明

1

fn:contains("abcdefg", "cde")

真

"abcdefg"に"cde"が含まれているため，真を返します。

2

fn:contains("abcdefg", "cdf")

偽

"abcdefg"に"cdf"は含まれていないため，偽を返します。

3

fn:contains((), "")

真

パラメタstr2の値が長さ0の文字列であるため，真を返します。

4

fn:contains((), "a")

偽

パラメタstr1の値が空のXQueryシーケンスで，パラメタstr2の値が長さ1以上の文字列であるため，偽を返します。

5

fn:contains("abcdefg", ())

真

パラメタstr2の値が空のXQueryシーケンスであるため，真を返します。

(7)　contains（HiRDBで定義された関数）

(a)　機能

引数1で指定したノードの文字列値が，引数2で指定した全文検索のテキスト検索条件を満たすかどうかを返します。

(b)　形式

hi-fn:contains ( 引数1, 引数2 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒110　hi-fn:contains関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq

0個以上のノードを持つXQueryシーケンス

検索対象のノード

2

引数2

str

xs:string型

全文検索のテキスト検索条件の文字列

結果はxs:boolean型の値になります。

この関数はXMLEXISTS述語中でだけ使用できます。

この関数を使用する場合は，XML問合せ文脈項目に指定した列にXML型全文検索インデクスが定義されている必要があります。また，使用しているHiRDB XML Extensionのバージョンが08-04以降である必要があります。

パラメタseqには，XML型全文検索用インデクスの使用条件に合致する部分構造パスが指定されている必要があります。合致しない場合，又はインデクスだけで条件評価できない場合は，エラーになります。XML型全文検索用インデクスの使用条件については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

パラメタstrには全文検索のテキスト検索条件をXQuery文字列定数で指定します。テキスト検索条件には，次に示す検索条件が指定できます。なお，パラメタstrの値が長さ0の文字列，又はテキスト検索条件の形式に従っていない場合はエラーになります。テキスト検索条件の詳細な指定方法については，マニュアル「HiRDB XML Extension Version 9」を参照してください。

表1‒111　テキスト検索条件に指定できる検索条件

項番

検索条件

概要

指定例

1

単純文字列条件

次に示すワイルドカード，又は特殊文字を含む検索文字列に一致する文字列を検索します。

*

0文字以上の任意の文字列に相当します。

?

任意の1文字に相当します。

｜

構造の先頭又は末尾に一致します。

¥

ワイルドカード又は特殊文字の意味を消します。

検索したい文字列を引用符（"）で囲んで指定します。ただし，XQuery文字列定数を引用符（"）で囲んでいる場合は，引用符を二つ続けて記述するか，「&quot;」で囲んでください。

「ネットワーク」と「コンピュータ」の間に0文字以上の任意の文字列を含む文字列

"ネットワーク*コンピュータ"

「ネットワーク」と「コンピュータ」の間に任意の1文字を含む文字列

"ネットワーク?コンピュータ"

「ネットワーク」で始まる文字列

"｜ネットワーク"

2

除外文字検索条件

単純文字列条件から，検索文字列の途中又は前後に特定の文字がある場合を除外して検索します。除外する文字の前に「^」を指定します。

「ローマ」の後に任意の1文字を含む文字列から，「ローマ字」を含む文字列を除外

"ローマ^字"

「文書」と「管理」の間に任意の1文字を含む文字列から「文書の管理」を含む文字列を除外

"文書^の管理"

「文書」の前に任意の1文字を含む文字列から「誤文書」を含む文字列を除外

"^誤文書"

3

NOT条件

検索文字列を含まない文字列を検索できます。

「ネットワーク」を含まない文字列

NOT ("ネットワーク")

4

AND/OR条件

検索条件をAND又はORで連結し，複数個指定できます。

「ネットワーク」と「コンピュータ」の両方を含む文字列

"ネットワーク" AND "コンピュータ"

「ネットワーク」と「コンピュータ」のどちらかを含む文字列

"ネットワーク" OR "コンピュータ"

5

近傍条件

二つの検索条件に一致する文字列間の文字数（距離）の条件を指定します。

「最新」と「技術」（順不同）の間の文字数が20文字以下である文字列

PROXIMITY("最新", <=20※1, CHARACTERS※2,ANY_ORDER※3,"技術※4")

6

同義語展開条件

同義語辞書の定義に基づいて，検索文字列の同義語が自動的に展開されます。同義語辞書の作成及び登録方法については，マニュアル「HiRDB XML Extension Version 9」を参照してください。

「COMPUTER」の同義語（アルファベット異表記及び全角半角異表記を含む）を含む文字列

SYNONYM(USR01※4, "COMPUTER", "AE※5")

7

異表記展開条件

ルールに基づいて，検索文字列の異表記が自動的に展開されます。

「COMPUTER」のアルファベット異表記，及び全角半角異表記した文字列を含む文字列

SOUNDEX_EXP("COMPUTER", "AE※5")

「sing」の英単語派生表記した文字列を含む文字列

SOUNDEX_EXP("sing", "S※6")

注※1

距離が20以下で検索することを意味します。

注※2

距離単位を文字とすることを意味します。

注※3

順不同を意味します。

注※4

同義語辞書名を意味します。

注※5

"A"がアルファベット異表記，"E"が全角半角異表記を意味します。

注※6

英単語派生表記を意味します。

パラメタseqの値が空のXQueryシーケンスである場合は偽を返します。

パラメタseqのXQueryシーケンスが持つノードの文字列値のうち，一つ以上の文字列値が，パラメタstrのテキスト検索条件が表す文字列を含んでいる場合，真を返します。テキスト検索条件が表す文字列を含んでいる文字列値が一つもない場合は，偽を返します。

(d)　使用例

次に示すXML文書を表す値を格納している列（XML型全文検索インデクスを定義している）をXML問合せ文脈項目に指定している場合の関数呼出しの指定と，結果の例を次に示します。

＜XML問合せ文脈項目に指定した列に格納されている値が表すXML文書＞

<書籍情報 書籍ID=”452469630”>
  <カテゴリ>データベース</カテゴリ>
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
  <説明>リレーショナルモデルの概念から，それに基づくRDBMS（Relational Database　Management System）の仕組みを解説している。</説明>
</書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果(xs:boolean型)

説明

1

/書籍情報/タイトル[

hi-fn:contains(text(),

"SYNONYM(USR01, &quot;DB&quot;)")]

真

同義語辞書USR01に"データベース"と"DB"が同義語として登録されている場合です。パラメタseqの値中に"DB"の同義語である"データベース"を含むノードがあるため，真を返します。

2

/書籍情報/説明[

hi-fn:contains(text(),

"SOUNDEX_EXP(&quot;DATABASE&quot;,

&quot;AE&quot;) AND

&quot;解説&quot;")]

真

パラメタseqの値中に"DATABASE"のアルファベット異表記である"Database"を含み，かつ"解説"を含むノードがあるため，真を返します。

3

/書籍情報/著者[

hi-fn:contains(text(),

"&quot;佐藤&quot;")]

偽

パラメタseqの値中に"佐藤"を含むノードが一つもないため，偽を返します。

4

/書籍情報/目次[

hi-fn:contains(text(),

"SYNONYM(USR01,

&quot;DB&quot;)")]

偽

パラメタseqが空のXQueryシーケンスであるため，偽を返します。

(8)　count

(a)　機能

XQueryシーケンス中のXQuery項目数を返します。

(b)　形式

fn:count ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒112　fn:count関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意のXQuery項目を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は，xs:int型の値になります。

(d)　使用例

XQuery変数bookが次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果(xs:int型)

説明

1

fn:count($book)

1

パラメタseqの値は「書籍情報」要素ノード一つから構成されるXQueryシーケンスになるため，1を返します。

2

fn:count($book/著者)

2

パラメタseqの値は「書籍情報」要素ノードの子である「著者」要素ノード二つから構成されるXQueryシーケンスになるため，2を返します。

3

fn:count($book/著者[.="佐藤優"])

0

パラメタseqの値は空のXQueryシーケンスになるため，0を返します。

(9)　data

(a)　機能

XQueryシーケンスを基本単位化し，基本単位値から成るXQueryシーケンスを返します。

(b)　形式

fn:data ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒113　 fn:data関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意のXQuery項目を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は，空のXQueryシーケンス又は基本単位値から成るXQueryシーケンスになります。

パラメタseqの値が空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタseqの値が空のXQueryシーケンスでない場合，そのXQueryシーケンス中の各XQuery項目に，次の規則を適用した結果から構成されるXQueryシーケンスを返します。

XQuery項目が基本単位値である場合，その値が結果になります。

XQuery項目がノードであれば，ノード種別に従って，次の表に示す値が結果になります。

表1‒114　XQuery項目がノードである場合，得られる結果

項番

ノード種別

結果

1

文書ノード

型付き値プロパティの値

2

要素ノード

型付き値プロパティの値

3

属性ノード

型付き値プロパティの値

4

処理命令ノード

内容プロパティの値をxs:string型に変換した値

5

コメントノード

内容プロパティの値をxs:string型に変換した値

6

テキストノード

内容プロパティの値をxs:untypedAtomic型に変換した値

(d)　使用例

XQuery変数bookが次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数bookが表す要素＞

<書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果

説明

1

fn:data($book/価格)

空のXQueryシーケンス

パラメタseqの値が空のXQueryシーケンスになるため，空のXQueryシーケンスを返します。

2

fn:data($book/著者)

("伊藤栄一","木村幸一")

パラメタseqの値が「著者」要素ノード二つから構成されるXQueryシーケンスになるため，それらの型付き値プロパティの値二つから成るXQueryシーケンスを返します。

(10)　day-from-date

(a)　機能

日付から日の部分だけを抽出して返します。

(b)　形式

fn:day-from-date ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒115　 fn:day-from-date関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dat

xs:date型

（空のXQueryシーケンスを含む）

抽出元の日付

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdatの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdatの値がxs:date型の値である場合は，その日の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:day-from-date (xs:date("2006-09-26"))

26

パラメタdatの値の日の部分である26を返します。

(11)　day-from-dateTime

(a)　機能

時刻印から日の部分だけを抽出して返します。

(b)　形式

fn:day-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒116　 fn:day-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型 （空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その日の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:day-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

26

パラメタdtmの値の日の部分である26を返します。

(12)　deep-equal

(a)　機能

二つのXQueryシーケンスが深等（同じ構造と同じ値を持っている）かどうかを判別します。

(b)　形式

fn:deep-equal ( 引数1, 引数2 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒117　 fn:deep-equal関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq1

0個以上の任意のXQuery項目を持つXQueryシーケンス

比較するXQueryシーケンス

2

引数2

seq2

0個以上の任意のXQuery項目を持つXQueryシーケンス

比較するXQueryシーケンス

結果はxs:boolean型の値になります。

パラメタseq1及びパラメタseq2の両方が空のXQueryシーケンスである場合，結果は真となります。

パラメタseq1を構成するXQuery項目の数とパラメタseq2を構成するXQuery項目の数が異なる場合は偽となります。

パラメタseq1を構成するすべてのXQuery項目が，パラメタseq2を構成する同じ位置のXQuery項目と深等である場合結果は真となり，そうでないXQuery項目が一つでもある場合結果は偽となります。

二つのXQuery項目が深等であるかどうかは，次に示す規則によって決定します。

二つのXQuery項目をitem1，item2とします。

表1‒118　 XQuery項目の深等の規則

項番

item1の種類

item2の種類

規則

1

基本単位値

基本単位値

次に示すすべての条件を満たす場合だけ真となります。

item1とitem2がeq演算子で比較できるXQueryデータ型である。

(item1 eq item2)が真となる，又はitem1及びitem2の両方がxs:double型で値がNaN（非数）である。

2

上記以外

偽となります。

3

文書ノード

文書ノード

item1の子である要素ノード及びテキストノードのXQueryシーケンスと，item2の子である要素ノード及びテキストノードのXQueryシーケンスに対するfn:deep-equal関数が真となる場合だけ真となります。

4

上記以外

偽となります。

5

要素ノード

要素ノード

次に示すすべての条件を満たす場合だけ真となります。

二つの要素ノードの名前空間及びノード名が一致する。

item1が持つ属性ノードの数と，item2が持つ属性ノードの数が等しく，item1が持つ各属性ノードがすべてitem2の対応する属性ノードと深等である。

このとき，item1が持つ属性ノードの順序と，item2が持つ属性ノードの順序が同じである必要はない。

item1の子である要素ノード及びテキストノードのXQueryシーケンスと，item2の子である要素ノード及びテキストノードのXQueryシーケンスに対するfn:deep-equal関数が真となる。

6

上記以外

偽となります。

7

属性ノード

属性ノード

次に示すすべての条件を満たす場合だけ真となります。

二つの属性ノードの名前空間及びノード名が一致する。

item1の型付き値とitem2の型付き値が深等である。

8

上記以外

偽となります。

9

処理命令ノード

処理命令ノード

次に示すすべての条件を満たす場合だけ真となります。

二つの処理命令ノードの処理命令ターゲットが一致する。

item1の内容とitem2の内容が深等である。

10

上記以外

偽となります。

11

テキストノード

テキストノード

二つのテキストノードの文字列値が深等である場合だけ真となります。

12

上記以外

偽となります。

13

コメントノード

コメントノード

二つのコメントノードの文字列値が深等である場合だけ真となります。

14

上記以外

偽となります。

(d)　使用例

XQuery変数booksが次に示す要素を表したノードを示している場合の，関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数booksが表す要素＞

<書籍一覧>
  <書籍情報 書籍ID="452469630">
    <タイトル>リレーショナルデータベース解説</タイトル>
    <著者>木村幸一</著者>
    <著者>伊藤栄一</著者>
  </書籍情報>
  <書籍情報 書籍ID="45241350">
    <タイトル>続・リレーショナルデータベース解説</タイトル>
    <著者>木村幸一</著者>
    <著者>伊藤栄一</著者>
  </書籍情報>
</書籍一覧>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果

(xs:boolean型)

説明

1

fn:deep-equal(

$books/書籍情報[1]/タイトル,

"リレーショナルデータベース解説")

偽

パラメタseq1は要素ノード一つのXQueryシーケンスであり，パラメタseq2は基本単位値一つのXQueryシーケンスであるため，偽となります。

2

fn:deep-equal($books/書籍情報[1],

$books/書籍情報[2])

偽

パラメタseq1とパラメタseq2は，両方とも「書籍情報」要素ノード一つのXQueryシーケンスですが，「書籍ID」属性ノードが深等でないため，又は子要素の「タイトル」要素が深等でないため，偽となります。

3

fn:deep-equal($books/書籍情報[1]/著者,

$books/書籍情報[2]/著者)

真

パラメタseq1とパラメタseq2は，両方とも「著者」要素ノード二つのXQueryシーケンスであり，かつそれぞれの「著者」要素ノードが深等であるため，真となります。

(13)　distinct-values

(a)　機能

XQueryシーケンスから重複する基本単位値を取り除いたXQueryシーケンスを返します。

(b)　形式

fn:distinct-values ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒119　 fn:distinct-values関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意の基本単位型の値を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は，空のXQueryシーケンス又は基本単位値だけから構成されるXQueryシーケンスになります。

パラメタseqの値が空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

基本単位値が重複しているかどうかの判定は，値比較のeq演算子を使用して行います。eq演算子で比較できない値同士又は比較結果が偽になる場合は，重複していないとみなします。比較結果が真になる場合は，重複しているとみなし，一方が取り除かれます。

パラメタseqの値であるXQueryシーケンスにxs:double型のNaN（非数）が複数含まれる場合，それらのうち一つ以外は取り除かれます。

結果のXQueryシーケンス内のXQuery項目の順序は，パラメタseqの値であるXQueryシーケンス内のXQuery項目の順序を保証しません。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

fn:distinct-values(("a", 1, "A", 0, 1))

("a", 1, "A", 0)

順序は異なる場合があります。

パラメタseqの値であるXQueryシーケンス中に1が重複しているため，重複を排除します。

(14)　ends-with

(a)　機能

引数1で指定した文字列が引数2で指定した文字列で終了するかどうかを返します。

(b)　形式

fn:ends-with ( 引数1, 引数2 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒120　 fn:ends-with関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

部分文字列で終了するか検査する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

パラメタstr1の文字列の最後にあるか検査する部分文字列

結果はxs:boolean型の値になります。

パラメタstr1の値が空のXQueryシーケンス又は長さ0の文字列であり，かつパラメタstr2の値が長さ1以上の文字列である場合は偽を返します。

パラメタstr2の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr1の値に関係なく真を返します。

パラメタstr1の値及びパラメタstr2の値が，長さが1以上の文字列である場合，パラメタstr1の文字列がパラメタstr2の文字列で終了していれば，真を返します。それ以外の場合は偽を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:boolean型)

説明

1

fn:ends-with("abcdefg", "efg")

真

"abcdefg"は"efg"で終了しているため，真を返します。

2

fn:ends-with("abcdefg", "abc")

偽

"abcdefg"は"abc"で終了していないため，偽を返します。

3

fn:ends-with((), "")

真

パラメタstr2の値が長さ0の文字列であるため，真を返します。

4

fn:ends-with((), "a")

偽

パラメタstr1の値が空のXQueryシーケンスあり，パラメタstr2の値が長さ1以上の文字列であるため，偽を返します。

5

fn:ends-with("abcdefg", ())

真

パラメタstr2の値が空のXQueryシーケンスであるため，真を返します。

(15)　false

(a)　機能

偽を返します。

(b)　形式

fn:false ( )

(c)　規則

この関数はパラメタを持ちません。

結果は，xs:boolean型の値の偽になります。

(16)　floor

(a)　機能

引数の値以下の，最大の整数値を返します。

(b)　形式

fn:floor ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒121　fn:floor関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

num

数値データ型

（空のXQueryシーケンスを含む）

入力となる数値

結果は，空のXQueryシーケンス，又は次の表に示す数値データ型の値になります。

表1‒122　fn:floor関数の結果のXQueryデータ型

項番

パラメタnumの値のXQueryデータ型

結果のXQueryデータ型

1

xs:double

xs:double

2

xs:decimal

xs:decimal

3

xs:int

xs:int

パラメタnumの値が空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタnumの値がxs:double型で，結果が特殊な値になる場合を次の表に示します。

表1‒123　fn:floor関数の結果が特殊な値になる場合

項番

パラメタnumの値

結果の値

1

正の0

正の0

2

負の0

負の0

3

正の無限大

正の無限大

4

負の無限大

負の無限大

5

NaN（非数）

NaN（非数）

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（括弧内はXQueryデータ型）

説明

1

fn:floor(10.5)

10. (xs:decimal)

10.5以下の最大の整数値である10を返します。

2

fn:floor(-10.5)

-11. (xs:decimal)

-10.5以下の最大の整数値である-11を返します。

(17)　hours-from-dateTime

(a)　機能

時刻印から時の部分だけを抽出して返します。

(b)　形式

fn:hours-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒124　 fn:hours-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型

（空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その時の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:hours-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

18

パラメタdtmの値の時の部分である18を返します。

(18)　hours-from-time

(a)　機能

時刻から時の部分だけを抽出して返します。

(b)　形式

fn:hours-from-time ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒125　 fn:hours-from-time関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

tim

xs:time型

（空のXQueryシーケンスを含む）

抽出元の時刻

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタtimの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタtimの値がxs:time型の値である場合は，その時の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:hours-from-time(xs:time("18:44:58"))

18

パラメタdat値の時の部分である18を返します。

(19)　index-of

(a)　機能

指定したXQueryシーケンス中に，指定した基本単位値と一致するXQuery項目が現れる位置を返します。

(b)　形式

fn:index-of ( 引数1 , 引数2 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒126　 fn:index-of関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq

0個以上の任意の基本単位型の値を持つXQueryシーケンス

検索対象のXQueryシーケンス

2

引数2

val

任意の基本単位型

検索する基本単位値

結果は，0個以上のxs:int型の値から構成されるXQueryシーケンスになります。

パラメタseqが空のXQueryシーケンスの場合，空のXQueryシーケンスを返します。

パラメタvalの値と一致するXQuery項目がパラメタseq中に存在する場合，その位置をxs:int型の値で返します。先頭位置は1となります。

基本単位値が一致しているかどうかの判定は，値比較のeq演算子を使用して行います。eq演算子で比較できない値同士又は比較結果が偽になる場合は，一致していないとみなします。

該当するXQuery項目が，パラメタseqのXQueryシーケンス中に複数存在する場合は，位置を示すxs:int型の値を，昇順に並べたXQueryシーケンスを返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

fn:index-of((10, 20, 30, 40), 35)

空のXQueryシーケンス

パラメタseqのXQueryシーケンス中に一致するXQuery項目がないので，空のXQueryシーケンスを返します。

2

fn:index-of((10, 20, 30, 40), 30)

(3)

パラメタseqのXQueryシーケンス中の3番目のXQuery項目が一致するので，xs:int型の値3から成るXQueryシーケンスを返します。

3

fn:index-of((10, 20, 30, 40,30,50), 30)

(3,5)

パラメタseqのXQueryシーケンス中の3番目と5番目のXQuery項目が一致するので，xs:int型の値3と5から成るXQueryシーケンスを返します。

(20)　insert-before

(a)　機能

XQueryシーケンスの指定した位置の前に，別のXQueryシーケンス中のXQuery項目を挿入した結果を返します。

(b)　形式

fn:insert-before ( 引数1 , 引数2 , 引数3 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒127　 fn:insert-before関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq1

0個以上の任意のXQuery項目を持つXQueryシーケンス

挿入されるXQueryシーケンス

2

引数2

pos

xs:int

挿入位置

3

引数3

seq2

0個以上の任意のXQuery項目を持つXQueryシーケンス

挿入するXQuery項目が含まれるXQueryシーケンス

結果は0個以上の任意のXQuery項目から構成されるXQueryシーケンスになります。

パラメタseq1の値が空のXQueryシーケンスである場合，パラメタseq2の値も空のXQueryシーケンスであれば空のXQueryシーケンスを，そうでなければパラメタseq2の値であるXQueryシーケンスを返します。

パラメタseq2の値が空のXQueryシーケンスである場合，パラメタseq1の値であるXQueryシーケンスを返します。

パラメタposには挿入位置を指定します。先頭に挿入する場合は1を指定します。パラメタposの値が1より小さい場合は，挿入位置は1として扱います。パラメタposの値が，パラメタseq1の値であるXQueryシーケンスのXQuery項目数より大きい場合は，挿入位置は，(パラメタseq1の値であるXQueryシーケンスのXQuery項目数+1)として扱います。

結果のXQueryシーケンスは，パラメタseq1の値であるXQueryシーケンス中の挿入位置より一つ前までのXQuery項目，パラメタseq3の値であるXQueryシーケンス中のXQuery項目，パラメタseq1の値であるXQueryシーケンス中の挿入位置以降のXQuery項目，の順で構成されます。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

fn:insert-before(("a", "b", "c"), 0, "z")

("z", "a", "b", "c")

パラメタposの値が0であるため，先頭に"z"を挿入します。

2

fn:insert-before(("a", "b", "c"), 1, "z")

("z", "a", "b", "c")

パラメタposの値が1であるため，先頭に"z"を挿入します。

3

fn:insert-before(("a", "b", "c"), 3, "z")

("a", "b", "z", "c")

パラメタposの値が3であるため，三つ目のXQuery項目"c"の前に"z"を挿入します。

4

fn:insert-before(("a", "b", "c"), 4, "z")

("a", "b", "c", "z")

パラメタposの値が4であるため，最後に"z"を挿入します。

(21)　last

(a)　機能

文脈サイズを返します。

(b)　形式

fn:last ( )

(c)　規則

この関数はパラメタを持ちません。

結果は，xs:int型の値になります。

この関数の関数呼出しを評価する時点での文脈項目の数を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

("a", "b", "c")[ fn:last() ]

"c" (xs:string)

※fn:last関数の結果は3

文脈項目の数は3であるため，fn:last関数は3を返します。よって，3番目の文脈項目である"c"が結果になります。

(22)　local-name

(a)　機能

ノードの局所名を返します。

(b)　形式

fn:local-name ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒128　fn:local-name関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

node

任意のノード

（空のXQueryシーケンスを含む）

局所名を取得するノード

結果はxs:string型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目のノードの局所名を返します。つまり，"fn:local-name(.)"を指定した場合と同じ結果になります。文脈項目がノードでない場合はエラーになります。

パラメタnodeの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタnodeの値が名前を持たないノード（文書ノード，コメントノード，テキストノード）である場合，長さ0の文字列を返します。

パラメタnodeの値が名前を持つノード（要素ノード，属性ノード，処理命令ノード）である場合，そのノードの局所名を返します。

(d)　使用例

XQuery変数bookが次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数bookが表す要素＞

<bookinfo:書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</bookinfo:書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果（xs:string型）

説明

1

$book/fn:local-name()

"書籍情報"

引数を指定していないため，文脈項目である「bookinfo:書籍情報」要素ノードの局所名を返します。

2

$book/fn:local-name(./タイトル)

"タイトル"

パラメタnodeの値が「タイトル」要素ノードであるため，その局所名を返します。

3

$book/タイトル/fn:local-name(./text())

"" (長さ0の文字列)

パラメタnodeの値がテキストノードであるため，長さ0の文字列を返します。

(23)　max

(a)　機能

XQueryシーケンスを構成する基本単位値の最大値を返します。

(b)　形式

fn:max ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒129　 fn:max関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意の基本単位型の値を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は，空のXQueryシーケンス，又は基本単位型の値になります。

パラメタseqの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

基本単位値の大小比較は，値比較のge演算子を使用して行います。パラメタseqの値であるXQueryシーケンスにge演算子で比較できないXQueryデータ型が混在している場合，エラーになります。

数値データ型の比較では，すべての値を共通の数値データ型に変換してから比較します。このため，パラメタseqのXQueryシーケンスが数値データ型の値だけで構成されている場合の結果は次に示すXQueryデータ型の値になります。

表1‒130　 fn:max関数の結果のXQueryデータ型

項番

パラメタseqの値であるXQueryシーケンス中の値のXQueryデータ型

結果のXQueryデータ型

xs:double

xs:decimal

xs:int

1

○

−

−

xs:double

2

×

○

−

xs:decimal

3

×

×

−

xs:int

（凡例）

○：含みます。

×：含みません。

−：結果のデータ型に影響しません。

パラメタseqの値であるXQueryシーケンスがNaN（非数）であるxs:double型の値を含む場合，結果はNaN（非数）になります。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(括弧内はXQueryデータ型)

説明

1

fn:max((3,4.0,5))

5. (xs:decimal)

3，4.0，5の中での最大値である5をxs:decimal型の値として返します。

2

fn:max(())

空のXQueryシーケンス

パラメタseqの値が空のXQueryシーケンスであるため，空のXQueryシーケンスを返します。

3

fn:max((1.0E2, 2.0E-3, 100))

1.0E2 (xs:double)

1.0E2，2.0E-3，100の中での最大値である1.0E2をxs:double型の値として返します。

(24)　min

(a)　機能

XQueryシーケンスを構成する基本単位値の最小値を返します。

(b)　形式

fn:min ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒131　 fn:min関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意の基本単位型の値を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は，空のXQueryシーケンス，又は基本単位型の値になります。

パラメタseqの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

基本単位値の大小比較は，値比較のle演算子を使用して行います。パラメタseqの値であるXQueryシーケンスにle演算子で比較できないXQueryデータ型が混在している場合，エラーになります。

数値データ型の比較では，すべての値を共通の数値データ型に変換してから比較します。このため，パラメタseqのXQueryシーケンスが数値データ型の値だけで構成されている場合の結果は次に示すXQueryデータ型の値になります。

表1‒132　 fn:min関数の結果のXQueryデータ型

項番

パラメタseqの値であるXQueryシーケンス中の

値のXQueryデータ型

結果のXQueryデータ型

xs:double

xs:decimal

xs:int

1

○

−

−

xs:double

2

×

○

−

xs:decimal

3

×

−

xs:int

（凡例）

○：含みます。

×：含みません。

−：結果のデータ型に影響しません。

パラメタseqの値であるXQueryシーケンスがNaN（非数）であるxs:double型の値を含む場合，結果はNaN（非数）になります。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(括弧内はXQueryデータ型)

説明

1

fn:min((3,4.0,5))

3. (xs:decimal)

3，4.0，5の中での最小値である3をxs:decimal型の値として返します。

2

fn:min(())

空のXQueryシーケンス

パラメタseqの値が空のXQueryシーケンスであるため，空のXQueryシーケンスを返します。

3

fn:min((1.0E2, 2.0E3, 100))

1.0E2 (xs:double)

1.0E2，2.0E3，100の中での最小値である1.0E2をxs:double型の値として返します。

(25)　minutes-from-dateTime

(a)　機能

時刻印から分の部分だけを抽出して返します。

(b)　形式

fn:minutes-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒133　 fn:minutes-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型

（空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その分の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:minutes-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

44

パラメタdtmの値の分の部分である44を返します。

(26)　minutes-from-time

(a)　機能

時刻から分の部分だけを抽出して返します。

(b)　形式

fn:minutes-from-time ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒134　 fn:minutes-from-time関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

tim

xs:time型

（空のXQueryシーケンスを含む）

抽出元の時刻

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタtimの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタtimの値がxs:time型の値である場合は，その分の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:minutes-from-time(xs:time("18:44:58"))

44

パラメタtimの値の分の部分である44を返します。

(27)　month-from-date

(a)　機能

日付から月の部分だけを抽出して返します。

(b)　形式

fn:month-from-date ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒135　 fn:month-from-date関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dat

xs:date型

（空のXQueryシーケンスを含む）

抽出元の日付

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdatの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdatの値がxs:date型の値である場合は，その月の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:month-from-date(xs:date("2006-09-26"))

9

パラメタdatの値の月の部分である9を返します。

(28)　month-from-dateTime

(a)　機能

時刻印から月の部分だけを抽出して返します。

(b)　形式

fn:month-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒136　 fn:month-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型

（空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その月の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:month-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

9

パラメタdtmの値の月の部分である9を返します。

(29)　name

(a)　機能

ノードの修飾名を返します。

(b)　形式

fn:name ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒137　fn: name関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

node

任意のノード

（空のXQueryシーケンスを含む）

修飾名を取得するノード

結果はxs:string型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目のノードの修飾名を返します。つまり，"fn:name(.)"を指定した場合と同じ結果になります。文脈項目がノードでない場合はエラーになります。

パラメタnodeの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタnodeの値が名前を持たないノード（文書ノード，コメントノード，テキストノード）である場合，長さ0の文字列を返します。

パラメタnodeの値が名前を持つノード（要素ノード，属性ノード，処理命令ノード）である場合，そのノードの修飾名を返します。

(d)　使用例

XQuery変数bookが次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。

＜XQuery変数bookが表す要素＞

<bookinfo:書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</bookinfo:書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果（xs:string型）

説明

1

$book/fn:name()

"bookinfo:書籍情報"

引数を指定していないため，文脈項目である「bookinfo:書籍情報」要素ノードの修飾名を返します。

2

$book/fn:name(./タイトル)

"タイトル"

パラメタnodeの値が「タイトル」要素ノードであるため，その修飾名を返します。

3

$book/タイトル

/fn:name(./text())

"" (長さ0の文字列)

パラメタnodeの値がテキストノードであるため，長さ0の文字列を返します。

(30)　namespace-uri

(a)　機能

ノードの修飾名のXML名前空間URIを返します。

(b)　形式

fn:namespace-uri ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒138　fn: namespace-uri関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

node

任意のノード

（空のXQueryシーケンスを含む）

修飾名のXML名前空間を取得するノード

結果はxs:string型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目のノードの修飾名のXML名前空間を返します。つまり，"fn:namespace-uri(.)"を指定した場合と同じ結果になります。文脈項目がノードでない場合はエラーになります。

パラメタnodeの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタnodeの値が要素ノードでも属性ノードでもないノードの場合，長さ0の文字列を返します。

パラメタnodeの値が，展開後修飾名がXML名前空間URIを持たない要素ノード又は属性ノードである場合，長さ0の文字列を返します。

パラメタnodeの値が，展開後修飾名がXML名前空間URIを持つ要素ノード又は属性ノードである場合，そのノードの修飾名のXML名前空間URIを返します。

(d)　使用例

XQuery変数bookが次に示す要素を表したノードを示している場合の関数呼出しの指定と，結果の例を次に示します。接頭辞bookinfoに対応するXML名前空間URIは" http://www.hirdb-example.com/bookinfo"，要素名及び属性名に対する既定のXML名前空間URIは" http://www.hirdb-example.com/default"とします。

＜XQuery変数bookが表す要素＞

<bookinfo:書籍情報 書籍ID="452469630">
  <タイトル>リレーショナルデータベース解説</タイトル>
  <著者>伊藤栄一</著者>
  <著者>木村幸一</著者>
</bookinfo:書籍情報>

＜関数呼出し指定例と結果＞

項番

関数呼出し

結果(xs:string型)

説明

1

$book/fn:namespace-uri()

" http://www.hirdb-example.com/bookinfo"

引数を指定していないため，文脈項目である「bookinfo:書籍情報」要素ノードの修飾名のXML名前空間URIを返します。

2

$book/fn:namespace-uri(./タイトル)

" http://www. hirdb-example.com/default"

パラメタnodeの値が「タイトル」要素ノードであるため，その修飾名のXML名前空間URIを返します。

3

$book/タイトル

/fn:namespace-uri(./text())

"" (長さ0の文字列)

パラメタnodeの値がテキストノードであるため，長さ0の文字列を返します。

(31)　normalize-space

(a)　機能

文字列に対してホワイトスペースの正規化を行った結果を返します。

ホワイトスペースの正規化では，文字列中の連続するホワイトスペース（半角空白(X'20')，タブ(X'09')，NL(X'0A')，又はCR(X'0D')）を一つの半角空白に置き換え，先頭及び末尾のホワイトスペースを除去します。

(b)　形式

fn:normalize-space ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒139　fn:normalize-space関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

str

xs:string型

（空のXQueryシーケンスを含む）

入力となる文字列

結果は，xs:string型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目の値を文字列表現した値に対して，ホワイトスペースの正規化を行った結果を返します。つまり，"fn:normalize-space(fn:string(.))"を指定した場合と同じ結果になります。

パラメタstrの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタstrの値がxs:string型の値である場合，その値に対してホワイトスペースの正規化を行った結果を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果(xs:string型)

説明

1

fn:normalize-space(())

"" (長さ0の文字列)

パラメタstrの値が空のXQueryシーケンスであるため，長さ0の文字列を返します。

2

fn:normalize-space(" a b c d ")

"a b c d"

" a b c d "に対してホワイトスペースの正規化を行った結果を返します。

(32)　not

(a)　機能

引数に指定した値をxs:boolean型の値に変換し，その値を否定した値を返します。

(b)　形式

fn:not ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒140　fn:not関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上のXQuery項目を持つXQueryシーケンス

入力となるXQueryシーケンス

結果はxs:boolean型の値になります。

次に示す手順で，結果を返します。

パラメタseqの値に対してfn:boolean関数を適用し，ブーリアン値を求めます。

求めたブーリアン値が真の場合，偽を返します。求めたブーリアン値が偽の場合，真を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

(xs:boolean型)

説明

1

fn:not(fn:true())

偽

パラメタseqの値が真であるため，その否定である偽を返します。

2

fn:not(0)

真

0をブーリアン値として評価すると偽になるため，その否定である真を返します。

3

fn:not("ABC")

偽

"ABC"をブーリアン値として評価すると真になるため，その否定である偽を返します。

(33)　number

(a)　機能

引数に指定した値をxs:double型に変換した値を返します。

(b)　形式

fn:number ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒141　fn:number関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

item

任意のXQuery項目

（空のXQueryシーケンスを含む）

入力となるXQuery項目

結果はxs:double型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目を基本単位化してから，xs:double型に変換した値を返します。つまり，"fn:number(.)"を指定した場合と同じ結果になります。

パラメタitemの値が空のXQueryシーケンスの場合，NaN（非数）を返します。

パラメタitemの値がXQuery項目である場合，そのXQuery項目を基本単位化し，その結果である基本単位値をxs:double型に変換した値を返します。変換できない場合は，NaN（非数）を返します。変換の可否については，「変換可能なXQueryデータ型」を参照してください。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果（xs:double型）

説明

1

fn:number(())

NaN(非数)

パラメタitemの値が空のXQueryシーケンスであるため，NaNを返します。

2

fn:number("abcde")

NaN(非数)

"abcde"はxs:double型に変換できないため，NaNを返します。

3

fn:number(fn:false())

0.0E0

xs:boolean型の真をxs:double型に変換すると0.0E0になるため，その値を返します。

4

fn:number(" 15000000 ")

1.5E7

" 15000000 "をxs:double型に変換すると1.5E7になるため，その値を返します。

5

fn:number("INF")

正の無限大

"INF"をxs:double型に変換すると正の無限大になるため，その値を返します。

(34)　position

(a)　機能

文脈位置を返します。

(b)　形式

fn:position ( )

(c)　規則

この関数はパラメタを持ちません。

結果は，xs:int型の値になります。

この関数の関数呼出しを評価する時点での文脈項目の文脈位置を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果

説明

1

("a", "b", "c")[fn:position() ge 2]

("b", "c")

※文脈項目"a","b","c"に対するfn:position関数の結果は，それぞれ1,2,3になります。

結果は文脈位置が2以上である文脈項目"b"，"c"から成るXQueryシーケンスになります。

(35)　remove

(a)　機能

XQueryシーケンスから指定した位置のXQuery項目を削除した結果を返します。

(b)　形式

fn:remove ( 引数1 , 引数2 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒142　 fn:remove関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq

0個以上のXQuery項目を含むXQueryシーケンスを含む

入力となるXQueryシーケンス

2

引数2

pos

xs:int

削除位置

結果は0個以上の任意のXQuery項目から構成されるXQueryシーケンスになります。

パラメタseqの値が空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタposには，削除するXQuery項目の位置を指定します。パラメタposの値が1より小さい場合，又はパラメタseqの値であるXQueryシーケンスのXQuery項目数より大きい場合は，パラメタseqの値であるXQueryシーケンスを返します。

結果のXQueryシーケンスは，パラメタseqの値であるXQueryシーケンス中の削除するXQuery項目より一つ前までのXQuery項目，パラメタseqの値であるXQueryシーケンス中の削除するXQuery項目の次以降のXQuery項目，の順で構成されます。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

fn:remove(("a", "b", "c"), 0)

("a", "b", "c")

パラメタposの値が1より小さいため，パラメタseqの値をそのまま返します。

2

fn:remove(("a", "b", "c"), 1)

("b", "c")

一つ目のXQuery項目を削除したXQueryシーケンスを返します。

3

fn:remove(("a", "b", "c"), 4)

("a", "b", "c")

パラメタposの値(4)がパラメタseqの値であるXQueryシーケンスのXQuery項目数(3)より大きいため，パラメタseqの値をそのまま返します。

(36)　reverse

(a)　機能

XQueryシーケンス中のXQuery項目を逆順に並べ替えたXQueryシーケンスを返します。

(b)　形式

fn:reverse ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒143　fn:reverse関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の任意のXQuery項目から成るXQueryシーケンス

入力となるXQueryシーケンス

結果は，0個以上の任意のXQuery項目から成るXQueryシーケンスになります。

パラメタseqが空のXQueryシーケンスの場合，空のXQueryシーケンスを返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

説明

1

fn:reverse((10, 20, 30, 40))

(40,30,20,10)

パラメタseqのXQueryシーケンス中のXQuery項目を逆順に並び替えたXQueryシーケンスを返します。

2

fn:reverse(("abcde"))

("abcde")

パラメタseqのXQueryシーケンス中のXQuery項目が一つであるため，パラメタseqのXQueryシーケンスをそのまま返します。

3

fn:reverse(())

空のXQueryシーケンス

パラメタseqのXQueryシーケンスが空のXQueryシーケンスであるため，空のXQueryシーケンスを返します。

(37)　round

(a)　機能

引数の値に最も近い整数値を返します。

(b)　形式

fn:round ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒144　fn:round関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

num

数値データ型

（空のXQueryシーケンスを含む）

入力となる数値

結果は，空のXQueryシーケンス，又は次の表に示す数値データ型の値になります。

表1‒145　fn:round関数の結果のXQueryデータ型

項番

パラメタnumの値のXQueryデータ型

結果のXQueryデータ型

1

xs:double

xs:double

2

xs:decimal

xs:decimal

3

xs:int

xs:int

パラメタnumの値が空のXQueryシーケンスの場合，空のXQueryシーケンスを返します。

該当する値が二つ存在する場合は，大きい方を返します。

パラメタnumの値がxs:double型で，結果が特殊な値になる場合を次の表に示します。

表1‒146　 fn:round関数の結果が特殊な値になる場合

項番

パラメタnumの値

結果の値

1

正の0

正の0

2

負の0

負の0

3

-0.5以上かつ0未満

負の0

4

正の無限大

正の無限大

5

負の無限大

負の無限大

6

NaN（非数）

NaN（非数）

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果（括弧内はXQueryデータ型）

説明

1

fn:round(2.5)

3. (xs:decimal)

2.5に最も近い整数2，3のうち大きい方である3を返します。

2

fn:round(2.4999)

2. (xs:decimal)

2.4999に最も近い整数2を返します。

3

fn:round(-2.5)

-2. (xs:decimal)

-2.5に最も近い整数-2，-3のうち大きい方である-2を返します。

4

fn:round(-4.5E-1)

負の0 (xs:double)

-4.5E-1は0未満かつ-0.5以上であるため，負の0を返します。

(38)　seconds-from-dateTime

(a)　機能

時刻印から秒の部分だけを抽出して返します。

(b)　形式

fn:seconds-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒147　 fn:seconds-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型

（空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:decimal型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その小数秒部分を含む秒の部分の値をxs:decimal型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

(xs:decimal型)

説明

1

fn:seconds-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

58.153

パラメタdtmの値の秒の部分である58.153を返します。

(39)　seconds-from-time

(a)　機能

時刻から秒の部分だけを抽出して返します。

(b)　形式

fn:seconds-from-time ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒148　 fn:seconds-from-time関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

tim

xs:time型

（空のXQueryシーケンスを含む）

抽出元の時刻

結果は空のXQueryシーケンス又はxs:decimal型の値になります。

パラメタtimの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタtimの値がxs:time型の値である場合は，その秒の部分の値をxs: decimal型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果

(xs:decimal型)

説明

1

fn:seconds-from-time(xs:time("18:44:58"))

58

パラメタtimの値の秒の部分である58を返します。

(40)　starts-with

(a)　機能

引数1で指定した文字列が引数2で指定した文字列で開始するかどうかを返します。

(b)　形式

fn:starts-with ( 引数1, 引数2 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒149　fn:starts-with関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

部分文字列で開始するか検査する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

パラメタstr1の文字列の最初にあるか検査する部分文字列

結果はxs:boolean型の値になります。

パラメタstr1の値が空のXQueryシーケンス又は長さ0の文字列であり，かつパラメタstr2の値が長さ1以上の文字列である場合は偽を返します。

パラメタstr2の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr1の値に関係なく真を返します。

パラメタstr1の値及びパラメタstr2の値が，長さ1以上であるxs:string型の値である場合，パラメタstr1の文字列がパラメタstr2の文字列で開始していれば，真を返します。それ以外の場合は偽を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:boolean型）

説明

1

fn:starts-with("abcdefg", "abc")

真

"abcdefg"は"abc"で開始しているため，真を返します。

2

fn:starts-with("abcdefg", "cde")

偽

"abcdefg"は"cde"で開始していないため，偽を返します。

3

fn:starts-with((), "")

真

パラメタstr2の値が長さ0の文字列であるため，真を返します。

4

fn:starts-with((), "a")

偽

パラメタstr1の値が空のXQueryシーケンスであり，パラメタstr2の値が長さ1以上の文字列であるため，偽を返します。

5

fn:starts-with("abcdefg", ())

真

パラメタstr2の値が空のXQueryシーケンスであるため，真を返します。

(41)　string

(a)　機能

XQuery項目の値を文字列表現した値をxs:string型の値として返します。

(b)　形式

fn:string ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒150　 fn:string関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

item

任意のXQuery項目

（空のXQueryシーケンスを含む）

入力となるXQuery項目

結果はxs:string型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目の値を文字列表現した値を返します。つまり，"fn:string(.)"を指定した場合と同じ結果になります。

パラメタitemの値が空のXQueryシーケンスの場合，長さ0の文字列を返します。

パラメタitemの値がノードの場合，ノード種別に従って，次の表に示す値を返します。

表1‒151　パラメタitemの値がノードである場合，得られる結果

項番

ノード種別

string関数が返す値

1

文書ノード

文字列値プロパティの値

2

要素ノード

文字列値プロパティの値

3

属性ノード

文字列値プロパティの値

4

処理命令ノード

内容プロパティの値

5

コメントノード

内容プロパティの値

6

テキストノード

内容プロパティの値

パラメタitemの値が基本単位値の場合，基本単位値をxs:string型に変換した値を返します。xs:string型への変換規則については，「変換可能なXQueryデータ型」を参照してください。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果

（xs:string型）

説明

1

fn:string(())

"" (長さ0の文字列)

パラメタitemの値が空のXQueryシーケンスであるため，長さ0の文字列を返します。

2

fn:string("abcde")

"abcde"

文字列"abcde"をそのまま返します。

3

fn:string(1.234E4)

"12340"

xs:decimal型の値1.234E4をxs:string型に変換した値"12340"を返します。

4

fn:string(0.1234E10)

"1.234E9"

xs:decimal型の値0.1234E10をxs:string型に変換した値"1.234E9"を返します。

5

fn:string(fn:true())

"true"

xs:boolean型の値である真をxs:string型に変換した値"true"を返します。

(42)　string-length

(a)　機能

文字列の長さ（文字数）を返します。

(b)　形式

fn:string-length ( 〔 引数 〕 )

(c)　規則

この関数は，次の表に示すパラメタを0個又は1個持ちます。

表1‒152　fn:string-length関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

str

xs:string型

（空のXQueryシーケンスを含む）

入力となる文字列

結果は，xs:int型の値になります。

引数を指定しない場合，この関数の関数呼出しを評価する時点での文脈項目の値を文字列表現した値の長さを返します。つまり，"fn:string-length(fn:string(.))"を指定した場合と同じ結果になります。

パラメタstrの値が空のXQueryシーケンスである場合，0を返します。

パラメタstrの値がxs:string型の値である場合，その値中の文字数を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:int型）

説明

1

fn:string-length(())

0

パラメタstrの値が空のXQueryシーケンスであるため，0を返します。

2

fn:string-length("abcde")

5

"abcde"の長さ5を返します。

3

fn:string-length("あいうえお")

5

"あいうえお"の長さ5を返します。

(43)　subsequence

(a)　機能

XQueryシーケンスの部分XQueryシーケンスを返却します。

(b)　形式

fn:subsequence ( 引数1, 引数2〔, 引数3〕 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。ただし，パラメタlenは省略できます。

表1‒153　fn:subsequence関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

seq

0個以上のXQuery項目から構成されるXQueryシーケンス

部分XQueryシーケンスを取り出すXQueryシーケンス

2

引数2

pos

xs:double型

部分XQueryシーケンスの取り出し開始位置

3

引数3

len

xs:double型

取り出すXQuery項目数

結果は0個以上のXQuery項目から構成されるXQueryシーケンスになります。

パラメタseqが空のXQueryシーケンスである場合，空のXQueryシーケンスを返します。

パラメタposには，部分XQueryシーケンスを取り出す開始位置を指定します。パラメタposに対してfn:round関数を評価した結果の整数値が開始位置になります。先頭位置は1になります。

パラメタposに対してfn:round関数を評価した結果の整数値が正の値でない場合は，先頭位置から取り出します。

パラメタposに対してfn:round関数を評価した結果の整数値がパラメタseqのXQuery項目数より大きい場合，空のXQueryシーケンスを返します。

パラメタlenには取り出す部分XQueryシーケンス中のXQuery項目の数を指定します。パラメタlenに対してfn:round関数を評価した結果の整数値が，取り出す部分XQueryシーケンス中のXQuery項目の数になります。

パラメタlenに対してfn:round関数を評価した結果の整数値が正の値でない場合は，空のXQueryシーケンスを返します。

パラメタlenに対してfn:round関数を評価した結果の整数値が，パラメタseqのXQueryシーケンスでの開始位置から末尾までの数より大きい場合，又はパラメタlenを省略した場合は，パラメタseqのXQueryシーケンスの末尾まで取り出します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果

説明

1

fn:subsequence(

("a","b","c","d","e","f","g"), 5)

("e","f","g")

パラメタseqのXQueryシーケンス中の5番目から末尾までのXQuery項目から成るXQueryシーケンスを返します。

2

fn:subsequence(

("a","b","c","d","e","f","g"),

2, 2.5)

("b","c","d")

2.5に対してfn:round関数を評価した結果が3となるため，パラメタseqのXQueryシーケンス中の2番目から三つ分のXQuery項目から成るXQueryシーケンスを返します。

3

fn:subsequence((), 10)

空のXQueryシーケンス

パラメタseqが空のXQueryシーケンスであるため，空のXQueryシーケンスを返します。

4

fn:subsequence (("a","b","c","d","e","f","g"),

-10, 10)

("a","b","c","d",

"e","f","g")

パラメタposの値が負であるため先頭位置から取り出します。また，パラメタlenの値がパラメタseqの先頭位置から末尾までのXQuery項目数より大きいため，末尾まで取り出します。

(44)　substring

(a)　機能

文字列の部分文字列を返します。

(b)　形式

fn:substring ( 引数1, 引数2〔, 引数3〕 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。ただし，パラメタlenは省略できます。

表1‒154　fn:substring関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str

xs:string型

（空のXQueryシーケンスを含む）

部分文字列を取り出す文字列

2

引数2

pos

xs:double型

部分文字列の取り出し開始位置

3

引数3

len

xs:double型

取り出す部分文字列の長さ（文字数）

結果はxs:string型の値になります。

パラメタstrの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタstrの値が長さ0のxs:string型の値である場合，長さ0の文字列を返します。

パラメタposには，部分文字列を取り出す開始位置を指定します。パラメタposに対してfn:round関数を評価した結果の整数値が開始位置になります。先頭位置は1になります。

パラメタposに対してfn:round関数を評価した結果の整数値が正の値でない場合は，先頭位置から取り出します。

パラメタposに対してfn:round関数を評価した結果の整数値がパラメタstrの値の長さより大きい場合，長さ0の文字列を返します。

パラメタlenには取り出す部分文字列の長さ（文字数）を指定します。パラメタlenに対してfn:round関数を評価した結果の整数値が，取り出す部分文字列の長さになります。

パラメタlenに対してfn:round関数を評価した結果の整数値が正の値でない場合は，長さ0の文字列を返します。

パラメタlenに対してfn:round関数を評価した結果の整数値が，パラメタstrの値での開始位置から末尾までの長さより大きい場合，又はパラメタlenを省略した場合は，パラメタstrの値である文字列の末尾まで取り出します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:string型）

説明

1

fn:substring ("abcdefg", 5)

"efg"

"abcdefg"の5文字目から末尾までの部分文字列を返します。

2

fn:substring("abcdefg", 2, 2.5)

"bcd"

2.5に対してfn:round関数を評価した結果が3となるため，"abcdefg"の2文字目から3文字分の部分文字列を返します。

3

fn:substring((), 10)

"" (長さ0の文字列)

パラメタstrの値が空のXQueryシーケンスであるため，長さ0の文字列を返します。

4

fn:substring ("abcdefg",-10, 10)

"abcdefg"

パラメタposの値が負であるため先頭位置から取り出します。また，パラメタlenの値が"abcdefg"の先頭位置から末尾までの長さより大きいため，末尾まで取り出します。

(45)　substring-after

(a)　機能

引数1で指定した文字列中の，引数2で指定した文字列が最初に出現する位置より後の部分文字列を返します。

(b)　形式

fn:substring-after ( 引数1, 引数2 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒155　fn:substring-after関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

部分文字列を検索する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

パラメタstr1の文字列中を検索する部分文字列

結果はxs:string型の値になります。

パラメタstr1の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr2の値に関係なく長さ0の文字列を返します。

パラメタstr1の値が長さ1以上の文字列であり，かつパラメタstr2の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr1の値を返します。

パラメタstr1の値及びパラメタstr2の値が，長さ1以上である文字列である場合，パラメタstr1の文字列中にパラメタstr2の文字列が含まれていれば，その最初の出現位置より後の部分文字列を返します。それ以外の場合は長さ0の文字列を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:string型）

説明

1

fn:substring-after("abcdefg", "efg")

"" (長さ0の文字列)

"abcdefg"中の"efg"が出現する位置より後の部分文字列を返します。

2

fn:substring-after("abcdefgcde", "cde")

"fgcde"

"abcdefgcde"中の"cde"が最初に出現する位置より後の部分文字列を返します。

3

fn:substring-after((), "abc")

"" (長さ0の文字列)

パラメタstr1の値が空のXQueryシーケンスになるため，長さ0の文字列を返します。

4

fn:substring-after("abcdefg", ())

"abcdefg"

パラメタstr2の値が空のXQueryシーケンスになるため，"abcdefg"をそのまま返します。

(46)　substring-before

(a)　機能

引数1で指定した文字列中の，引数2で指定した文字列が最初に出現する位置より前の部分文字列を返します。

(b)　形式

fn:substring-before ( 引数1, 引数2 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒156　fn:substring-before関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str1

xs:string型

（空のXQueryシーケンスを含む）

部分文字列を検索する文字列

2

引数2

str2

xs:string型

（空のXQueryシーケンスを含む）

パラメタstr1の文字列中を検索する部分文字列

結果はxs:string型の値になります。

パラメタstr1の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr2の値に関係なく長さ0の文字列を返します。

パラメタstr1の値が長さ1以上の文字列であり，かつパラメタstr2の値が空のXQueryシーケンス又は長さ0の文字列である場合，パラメタstr1の値を返します。

パラメタstr1の値及びパラメタstr2の値が，長さ1以上である文字列である場合，パラメタstr1の文字列中にパラメタstr2の文字列が含まれていれば，その最初の出現位置より前の部分文字列を返します。それ以外の場合は長さ0の文字列を返します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:string型）

説明

1

fn:substring-before("abcdefg", "abc")

"" (長さ0の文字列)

"abcdefg"中の"abc"が出現する位置より前の部分文字列を返します。

2

fn:substring-before("abcdefgdef", "def")

"abc"

"abcdefgdef"中の"def"が最初に出現する位置より前の部分文字列を返します。

3

fn:substring-before((), "abc")

"" (長さ0の文字列)

パラメタstr1の値が空のXQueryシーケンスになるため，長さ0の文字列を返します。

4

fn:substring-before("abcdefg", ())

"abcdefg"

パラメタstr2の値が空のXQueryシーケンスになるため，"abcdefg"をそのまま返します。

(47)　sum

(a)　機能

XQueryシーケンスを構成する基本単位値の合計を返します。

(b)　形式

fn:sum ( 引数 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒157　fn:sum関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

seq

0個以上の数値データ型の値を持つXQueryシーケンス

入力となるXQueryシーケンス

結果は空のXQueryシーケンス又は数値データ型の値になります。

パラメタseqの値が空のXQueryシーケンスである場合，結果はxs:int型の0を返します。

パラメタseqの値である，XQueryシーケンスごとの結果のXQueryデータ型を，次の表に示します。

表1‒158　fn:sum関数の結果のXQueryデータ型

項番

パラメタseqの値であるXQueryシーケンス中の

値のXQueryデータ型

結果のXQueryデータ型

xs:double

xs:decimal

xs:int

1

×

×

×

xs:int

2

○

−

−

xs:double

3

×

○

−

xs:decimal

4

×

○

xs:int

（凡例）

○：含みます。

×：含みません。

−：結果のデータ型に影響しません。

パラメタseqの値であるXQueryシーケンスがNaN（非数）を含む場合，結果はNaN（非数）になります。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果（括弧内はXQueryデータ型）

説明

1

fn:sum((3,4,5))

12 (xs:int)

3，4，5の合計値12を返します。

2

fn:sum(())

0 (xs:int)

パラメタseqが空のXQueryシーケンスであるため，0を返します。

3

fn:sum((1.0E2, 2.0E3))

2.1E3(xs:double)

1.0E2，2.0E3の合計値2.1E3を返します。

(48)　translate

(a)　機能

引数1で指定した文字列中の引数2で指定した文字を，引数3で指定した文字に置換した結果を返します。

(b)　形式

fn:translate ( 引数1, 引数2, 引数3 )

(c)　規則

この関数は，次の表に示すパラメタを持ちます。

表1‒159　fn:translate関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数1

str

xs:string型

（空のXQueryシーケンスを含む）

入力となる文字列

2

引数2

from

xs:string型

置換対象の文字から成る文字列

3

引数3

to

xs:string型

置換文字から成る文字列

結果はxs:string型の値になります。

パラメタstrの値が空のXQueryシーケンスである場合，長さ0の文字列を返します。

パラメタstrの値がxs:string型の値である場合，その値中の文字について，パラメタfromの値である文字列に存在する置換対象の文字は，パラメタtoの値である文字列中の対応する位置の置換文字で置換し，その結果を返します。置換対象の文字がパラメタfromの値である文字列中のN文字目であった場合，パラメタtoの値である文字列中のN文字目の文字が置換文字になります。置換対象の文字がパラメタfromの値である文字列中のM文字目であり，パラメタtoの値である文字列の長さがM未満であった場合，置換対象の文字を除去します。

パラメタfromの値である文字列中に同じ文字が複数存在する場合，最初の位置に対応した置換文字で置換します。

(d)　使用例

関数呼出しの指定と，結果の例を次の表に示します。

項番

関数呼出し

結果（xs:string型）

説明

1

fn:translate("abcdef", "ace", "ACE")

"AbCdEf"

"abcdef"中の"a"，"c"，"e"をそれぞれ"A"，"C"，"E"に置換した文字列を返します。

2

fn:translate("abcdefg", "aceg", "ACE")

"AbCdEf"

"abcdef"中の"a"，"c"，"e"をそれぞれ"A"，"C"，"E"に置換し，"g"を除去した文字列を返します。

3

fn:translate("abcdef", "acea", "ACEB")

"AbCdEf"

"abcdef"中の"a"，"c"，"e"をそれぞれ"A"，"C"，"E"に置換した文字列を返します。

(49)　true

(a)　機能

真を返します。

(b)　形式

fn:true ( )

(c)　規則

この関数はパラメタを持ちません。

結果は，xs:boolean型の値の真になります。

(50)　year-from-date

(a)　機能

日付から年の部分だけを抽出して返します。

(b)　形式

fn:year-from-date ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒160　 fn:year-from-date関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dat

xs:date型

（空のXQueryシーケンスを含む）

抽出元の日付

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdatの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdatの値がxs:date型の値である場合は，その年の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:year-from-date(xs:date("2006-09-26"))

2006

パラメタdatの値の年の部分である2006を返します。

(51)　year-from-dateTime

(a)　機能

時刻印から年の部分だけを抽出して返します。

(b)　形式

fn:year-from-dateTime ( 引数 )

(c)　規則

この関数は次に示すパラメタを持ちます。

表1‒161　 fn:year-from-dateTime関数のパラメタ

項番

対応する引数

パラメタ

XQueryデータ型

説明

1

引数

dtm

xs:dateTime型

（空のXQueryシーケンスを含む）

抽出元の時刻印

結果は空のXQueryシーケンス又はxs:int型の値になります。

パラメタdtmの値が空のXQueryシーケンスである場合は，空のXQueryシーケンスを返します。

パラメタdtmの値がxs:dateTime型の値である場合は，その年の部分の値をxs:int型で返します。

(d)　使用例

関数呼出しの指定と，結果の例を次に示します。

項番

関数呼出し

結果(xs:int型)

説明

1

fn:year-from-dateTime(xs:dateTime("2006-09-26T18:44:58.153"))

2006

パラメタdtmの値の年の部分である2006を返します。

2　構成要素の詳細

この章では，SQLを使用する場合の構成要素の詳細について説明します。

2.1　カーソル指定

2.1.1　カーソル指定　形式1

(1)　機能

一つ以上の表からのデータの検索，検索結果の並べ替え（ソート）をするために指定します。

カーソル指定はカーソル宣言中，及び動的SELECT文中に指定します。

動的SELECT文については，「動的SELECT文　形式1（動的検索）」を参照してください。

(2)　使用権限

カーソル指定に含まれるすべての問合せ指定，又は副問合せを使用できるユーザは，カーソル指定を使用できます。

問合せ指定の権限については「問合せ指定」，副問合せの権限については「副問合せ」を参照してください。

(3)　形式

形式1＜一つ以上の表の検索＞

　問合せ式〔ORDER BY｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕
　　　　　　〔，｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕〕… 〕
　　　　　〔LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝
　　　　　　　　　｜ ｛リミット行数｜ALL｝〔OFFSET オフセット行数〕｝〕

(4)　オペランド

問合せ式

問合せ指定，又は問合せ指定の結果得られる導出表同士の和集合，又は差集合を求めるために指定します。

問合せ式については，「問合せ式」を参照してください。

ORDER BY｛列指定｜ソート項目指定番号｝

問合せ式での検索結果を，昇順，又は降順に並べ替える場合のソートの方法を指定します。

ORDER BY句を省略した場合，導出表中の行の並びは保証しません。

ORDER BY句についての規則を次に示します。

ソートのキーに指定できる列の最大数は255個です。

同じ列は2回以上指定できません。

最も外側の問合せの選択式にAS 列名を指定している場合，問合せ式で導出される表に重複する列名があるときは，その列名をソートのキーに指定できません。

ソートのキーになる項目で，次の項目は指定できません。

繰返し列，及び繰返し列を含む値式

予備列，及び予備列を含む値式

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

ORDER BY句を指定した場合，選択式には，次に示すデータ型のSQL変数，SQLパラメタ，及び定数は単独で指定できません。

BLOB

定義長が32,001バイト以上のBINARY

抽象データ型

列指定

ソートのキーにする列を指定します。

列指定についての規則を次に示します。

問合せ式にUNION〔ALL〕，又はEXCEPT〔ALL〕を含む場合，列指定はできません。ただし，問合せ式で導出される表に重複のない列名がある場合は，その列名を指定できます。

最も外側の問合せにSELECT DISTINCTを指定している場合，ORDER BY句に指定する列は，検索結果として出力する項目（選択式で指定されている項目）でなければなりません。

最も外側の問合せ指定にSELECT DISTINCTの指定がなく，GROUP BY句又は集合関数を指定している場合は，ORDER BY句に指定する列はGROUP化列でなければなりません。そのほかの場合には，最も外側の問合せ指定で指定している表の，すべての列を指定できます。

ソート項目指定番号

UNION〔ALL〕，又はEXCEPT〔ALL〕を指定した場合は，問合せ式の結果得られた導出表の列のうち，ソートのキーにしたい列が導出表中で何番目にあるのか，その位置を示す番号を指定します。

UNION〔ALL〕，又はEXCEPT〔ALL〕の指定がなく，集合関数，ウィンドウ関数，定数，四則演算，日付演算，スカラ関数，CASE式，CAST指定，関数呼出し，コンポネント指定，及び連結演算の結果得られた導出表中の列をソートのキーにする場合は，ソートのキーにしたい列が導出表の中で何番目に指定されているのか，その位置を表す番号を指定します。

選択式にROWを指定した問合せ式のORDER BY句にはソート項目の指定番号は指定できません。

｛ASC｜DESC｝

ASC

検索結果を昇順に並べ替える場合，指定します。

DESC

検索結果を降順に並べ替える場合，指定します。

LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝｜ ｛リミット行数｜ALL｝ 〔OFFSET オフセット行数〕｝

問合せ式での検索結果のうち，先頭から読み飛ばす行数，及び取得する行数を指定します。LIMIT句を指定すると，SQLの検索性能の向上が期待できます。どのような場合に指定するかについては，マニュアル「HiRDB Version 9 UAP開発ガイド」の先頭からn行の検索結果を取得する機能を参照してください。

オフセット行数

オフセット行数は，問合せ式の結果のうち先頭から読み飛ばす行数を指定します。

リミット行数

オフセット行数の指定がない場合，問合せ式の結果から取得する行数を指定します。

オフセット行数の指定がある場合，問合せ式の結果のうち先頭からオフセット行数を読み飛ばしたところから取得する行数を指定します。

ALL

オフセット行数の指定がない場合，問合せ式の結果のすべてを取得します。

オフセット行数の指定がある場合，問合せ式の結果のうち先頭からオフセット行数を読み飛ばした残りのすべてを取得します。

LIMIT句についての規則を次に示します。

オフセット行数，及びリミット行数には，整数定数，埋込み変数，?パラメタ，SQL変数，及びSQLパラメタを指定できます。

オフセット行数，及びリミット行数のデータ型は整数（SMALLINT又はINTEGER）にしてください。

オフセット行数，及びリミット行数にナル値は指定できません。

オフセット行数，及びリミット行数に?パラメタ，又は埋込み変数を指定した場合，?パラメタ，又は埋込み変数のデータ型は，INTEGER型（標識変数なし）が仮定されます。

オフセット行数に指定できる値の範囲は0〜2,147,483,647です。

オフセット行数に0を指定した場合は，オフセット行数に指定がない場合と同じになります。

リミット行数に指定できる値の範囲は−1〜2,147,483,647です。

リミット行数に−1を指定する場合は，定数で指定してください。

オフセット行数とリミット行数に指定できる値の合計は，2,147,483,647までです。

リミット行数≧0の場合，検索結果行数は次のようになります。

Max（Min（問合せ式の結果行数−オフセット行数，リミット行数），0）

リミット行数＝−1，又はALLを指定した場合，検索結果行数は次のようになります。

Max（問合せ式の結果行数−オフセット行数，0）

オフセット行数を指定した場合，読み飛ばした最終行と同じソートのキーの値を持つ行が複数存在するか，又はソートのキーの指定がないと，検索結果は一意に決まりません。

問合せ式の結果がリミット行数を超える場合，リミット行数の最終行と同じソートのキーの値を持つ行が複数存在するか，又はソートのキーの指定がないと検索結果は一意に決まりません。検索結果が一意に決まらない場合の例を次に示します。

(例)

次のSQLで宣言したカーソルを使用して表（ZAIKO）を検索した場合，ソートのキーとなる列（TANKA）に，３番目に小さい値である'3640'を持つ行が複数あるため，検索結果が結果1となるか，結果2となるかは不定となります。

DECLARE CR1 CURSOR FOR
  SELECT * FROM ZAIKO ORDER BY TANKA LIMIT 3

(5)　留意事項

ORDER BYを指定すると，HiRDBが作業表を作成することがあります。このとき，作業表の行長によっては，ORDER BYの処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(6)　指定例

カーソル宣言中でカーソル指定を指定します。

  DECLARE CR1 CURSOR FOR
    SELECT SNAME,SUM(ZSURYO)
      FROM ZAIKO
      GROUP BY SNAME
      ORDER BY SNAME ASC

カーソル宣言中のカーソル指定でLIMIT句を指定します。

  DECLARE CR1 CURSOR FOR
    SELECT SCODE,ZSURYO
      FROM ZAIKO
      WHERE ZSURYO>20
      ORDER BY 2,1
      LIMIT 10

2.1.2　カーソル指定　形式2

(1)　機能

リストを介して表を検索するときに指定します。

リストを介した表の検索に対するカーソル指定は，動的SELECT文中に指定します。

動的SELECT文については，操作系SQLの「動的SELECT文　形式1（動的検索）」を参照してください。

(2)　使用権限

実表に対するSELECT権限を持つユーザが，リストを介してその実表を検索するカーソル指定　形式2を実行できます。

(3)　形式

　SELECT ｛｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝
　　　　　　　　　 〔〔AS〕 列名〕
　　　　　　〔，｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝
　　　　　　　　　　 〔〔AS〕 列名〕〕…
　　　　　　 ｜＊｝
　　　FROM LIST リスト名
　　　〔ORDER BY｛列名｜ソート項目指定番号｝〔｛ASC｜DESC｝〕
　　　　　　　　　　〔，｛列名｜ソート項目指定番号｝〔｛ASC｜DESC｝〕〕… 〕
　　　〔LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝
　　　　　　　｜ ｛リミット行数｜ALL｝ 〔OFFSET オフセット行数〕｝〕

(4)　オペランド

｛｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝〔〔AS〕 列名〕

〔，｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝〔〔AS〕 列名〕〕…

｜＊｝

値式

検索する値式を指定します。

SELECT句の値式についての規則を次に示します。

列名には検索するリストの基表の列名を指定します。

繰返し列には検索するリストの基表の繰返し列を指定します。

繰返し列を単独で指定する場合，添字にANYは指定できません。

属性名には検索するリストの基表の抽象データ型の属性を指定します。

SELECT句の値式中に次のものは指定できません。

リストの基表の予備列

基表の列指定中の表指定

基表（の列）に対する外への参照

集合関数

ウィンドウ関数

副問合せ

プラグイン提供関数の受渡し値送信関数の指定なしで，一部の受渡し値受信関数を指定できます。指定できる受渡し値受信関数については，マニュアル「HiRDB Version 9 UAP開発ガイド」，及び各種プラグインマニュアルを参照してください。

プラグイン提供関数の受渡し値受信関数は二つ以上指定できません。

WRITE指定

BLOBデータの検索結果をファイル出力する場合に指定します。WRITE指定については，「WRITE指定」を参照してください。

GET_JAVA_STORED_ROUTINE_SOURCE指定

JARファイルからJavaクラスのソースファイルを抽出する場合に指定します。GET_JAVA_STORED_ROUTINE_SOURCE指定については，「GET_JAVA_STORED_ROUTINE_SOURCE指定」を参照してください。

〔AS〕 列名

値式，WRITE指定，又はGET_JAVA_STORED_ROUTINE_SOURCE指定に対して名称を付ける場合に指定します。

＊

リストの基表のすべての列を検索します。

リスト名

検索する集合を格納したリストの名前を指定します。

ORDER BY｛列名｜ソート項目指定番号｝｛ASC｜DESC｝

ORDER BY句の規則については形式１を参照してください。

LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝｜ ｛リミット行数｜ALL｝ 〔OFFSET オフセット行数〕｝

LIMIT句の規則については形式１を参照してください。

(5)　共通規則

リスト作成時にあった行が検索時にない場合には，SQLCODE＋110を返します。この場合，検索は続行します。ただし，次に示すどちらかの場合にはSQLCODE＋110は返しません。

受渡し値受信関数の引数以外にリストの基表の列名の指定がなく，かつリストの基表の列の＊の指定がない

ORDER BY句の指定がある

LIMIT句にオフセット行数の指定がある場合，SQLCODE＋110を返す行を読み飛ばす行数に含めます。

LIMIT句にリミット行数の指定がある場合，SQLCODE＋110を返す行を取得する行数に含めます。

同一ユーザが，複数同時にHiRDBと接続してリストを操作できません。

(6)　留意事項

リスト作成後に基表の行を削除した場合，検索時にその行は検索されません。ただし，選択式に次に示すものだけを指定した場合，基表の行の削除前のデータが検索されます。

基表の列名を含まない値式

受渡し値受信関数

リスト作成後に基表の行を更新した場合，更新後のデータが検索されます。ただし，選択式に指定した受渡し値受信関数については，基表の行の更新前のデータが検索されます。

リスト作成後に，基表の行を削除してから行を挿入した場合，挿入した行が検索されることがあります。

リストを介して表を検索するSQLを，PREPARE文で前処理してからOPEN文を実行するまでの間に，同一リスト名のリストを作成するASSIGN LIST文は実行しないでください。

WRITE指定をする場合，第一引数には基表のBLOB型の列名，又は抽象データ型のBLOB型の属性名を指定できます。

(7)　指定例（カーソル宣言中でカーソル指定を指定した場合）

  PREPARE P1 FROM
   'SELECT SCODE,SNAME FROM LIST LIST1'
  DECLARE CRL1 CURSOR FOR P1

2.2　問合せ式

2.2.1　問合せ式　形式1（一般問合せ式）

(1)　機能

WITH句中の導出問合せ式と問合せ式本体との組み合わせを指定します。WITH句を用いた場合，導出問合せ式の結果得られる導出表を問合せ名とし，問合せ式本体に指定できます。

問合せ式本体では，問合せ指定，又は問合せ指定の結果得られる導出表同士の和集合，又は差集合を求めるため，集合演算を指定します。和集合を求める場合はUNION〔ALL〕，差集合を求める場合はEXCEPT〔ALL〕を指定します。問合せ式は，カーソル宣言，又は動的SELECT文中のカーソル指定中に指定できます。

(2)　形式

　問合せ式：：＝〔WITH 問合せ名〔（列名〔，列名〕…）〕
　　　　　　　　　　　　　　　　　　AS（導出問合せ式）
　　　　　　　　　　〔，問合せ名〔（列名〔，列名〕…）〕
　　　　　　　　　　　　　　　　　　AS（導出問合せ式）〕…〕
　　　　　　　　問合せ式本体

　導出問合せ式：：＝　問合せ式本体
　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝

(3)　オペランド

WITH 問合せ名〔（列名〔，列名〕…）〕

WITH 問合せ名

問合せ式本体の表式に指定する導出表の名称を指定します。WITH句中に複数の問合せ名を指定する場合，同じ問合せ名は指定できません。

列名

WITH句中の一つの導出問合せ式によって指定された導出表から導き出される列に対応させて指定します。

列名についての規則を次に示します。

列名を省略した場合，次のようになります。

WITH句中の導出問合せ式に集合演算を指定しない場合，WITH句中の一つの問合せ指定によって指定された導出表の各列の列名（AS 列名を指定している場合は，AS句で指定した列名）がWITH句問合せ名の列名となります。

WITH句中の導出問合せ式に集合演算を指定した場合，導出問合せ式の1番目の問合せ指定によって指定された導出表の各列の列名（AS 列名を指定している場合は，AS句で指定した列名）が，WITH句問合せ名の列名となります。

ただし，WITH句中の一つの導出問合せ式によって指定された導出表が，列名が同じである二つ以上の列を含む，又は名前のない列を含む場合は省略できません。

導出表の列が次に示す項目から導き出された列で，AS列名を省略した場合，その列は名前のない列になります。

スカラ演算

関数呼出し

集合関数

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

SQL変数

SQLパラメタ

コンポネント指定

WITH句中の一つの問合せ名について，同じ名前は指定できません。

WITH句中の一つの問合せ名について，列名で指定する列の数は，そのWITH句の導出問合せ式の結果で得られる導出表の列と同じ数にしてください。

WITH句中の一つの問合せ名について，列名で指定できる列の数の最大値は30,000個です。

導出問合せ式：：＝ 問合せ式本体

表式，問合せ名として導出する列，集合演算，及び行の重複排除の有無を指定します。問合せ式本体の表式に含まれるFROM句には，表名，ビュー表名のどちらかを指定してください。

問合せ式本体：：＝｛問合せ指定｜（問合せ式本体）｜問合せ式本体

　　　　　　　　　　　　｛UNION｜EXCEPT｝〔ALL〕

　　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝

システム定義pd_sql_modeに「1」を指定した場合は，差集合を求める集合演算子としてEXCEPTに加えてMINUSも指定できます。

WITH句を用いた場合，問合せ式本体の表式に含まれるFROM句には，表名，ビュー表名，又は問合せ名のどれかを指定してください。

WITH句を用いた場合，問合せ式本体には，1行SELECT文は指定できません。

問合せ指定

表式，選択する列，及び行の重複排除の有無を指定します。

問合せ指定については，「問合せ指定」を参照してください。

（問合せ式本体）

UNION又はEXCEPTによって結合している問合せ指定の組みが二つ以上指定されている場合，その問合せ式本体中の集合演算の評価順序を指定するために問合せ式本体を括弧で囲んで指定します。

問合せ式本体｛UNION｜EXCEPT｝〔ALL〕｛問合せ指定｜（問合せ式本体）｝

二つの問合せ指定，又は問合せ式本体の結果から得られる導出表同士の和集合，又は差集合を求める場合に，指定します。集合演算については，「集合演算の共通規則」を参照してください。

(4)　WITH句中の導出問合せ式についての規則

WITH句中の導出問合せ式によって，問合せ名として導出される列の属性（データ型，データ長，及び非ナル値制約の有無）は，WITH句中の導出問合せ式で指定した導出表の対応する列の属性と同じになります。

WITH句中の導出問合せ式のFROM句には，実表名又はビュー表名を指定してください。問合せ名は指定できません。

WITH句中の導出問合せ式には，選択式に〔表指定.〕ROWは指定できません。

WITH句中の導出問合せ式には，直接含まれるSELECT句に添字付きの繰返し列は指定できません。

WITH句中の導出問合せ式には，次に示す値式は指定できません。

XMLコンストラクタ関数

SQL/XMLスカラ関数

SQL/XML述語

SQL/XML集合関数

WITH句中の導出問合せ式のGROUP BY句には，列指定以外の値式は指定できません。

WITH句中の最も外側の問合せ指定の選択式にCASE式を指定した場合，そのCASE式の探索条件には繰返し列を指定できません。

WITH句中の導出問合せ式では，選択式に次の項目を指定できません。

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

ウィンドウ関数

(5)　問合せ式本体についての規則

WITH句を用いた場合，問合せ式本体の表式に含まれるFROM句には，表名，ビュー表名，又は問合せ名のどれかを指定してください。

WITH句を用いた場合，問合せ式本体には1行SELECT文は指定できません。

ビュー定義又はWITH句中の導出問合せ式によって導き出される列が，値式を引数とした集合関数の場合，問合せ式本体ではその導出列を外への参照として用いることができません。

（例）

  WITH QRY1(QC1,QC2) AS (SELECT MAX(C1+C2),AVG(C1+C2) FROM T1),
       QRY2(QC1,QC2) AS (SELECT C1+C2,C3-C4 FROM T2)
    SELECT * FROM QRY1 X
       WHERE QC1>(SELECT QC1 FROM QRY2 WHERE QC2 = X.QC2)

ビュー定義又はWITH句中の導出問合せ式によって導き出される列がCOUNT（＊）又はCOUNT_FLOAT（＊）の場合，問合せ式本体ではその導出列を外への参照として用いることができません。

（例）

  WITH QRY1(QC1) AS (SELECT COUNT(*) FROM T1),
       QRY2(QC1,QC2) AS (SELECT C1+C2,C3/C4 FROM T2)
   SELECT * FROM QRY1 WHERE EXISTS
       (SELECT * FROM QRY2 WHERE QC1 = QRY1.QC1)

WITH句中の最も外側の問合せ指定の選択式に，次に示す属性の値式を指定して導出した表を問合せ式本体に指定する場合，内部導出表を作成する問合せは指定できません。内部導出表を作成する条件については，「内部導出表」を参照してください。

BLOB

最大長が32,001バイト以上のBINARY

抽象データ型

繰返し列

次に示す属性の関数呼出し，コンポネント指定，SQL変数，及びSQLパラメタによって導出された列を，問合せ式本体の選択式に指定した場合，そのSELECT句を直接含む問合せには，FOR READ ONLYを指定できません。

BLOB

定義長が32,001バイト以上のBINARY

抽象データ型

ビュー定義又はWITH句中の導出問合せ式によって導出される列が列指定以外の値式から導出されている場合，その導出列に対してコンポネント指定は指定できません。

ビュー定義又はWITH句中の導出問合せ式によって導出される列がコンポネント指定によって導出されている場合，問合せ式本体ではその導出列を外への参照として用いることができません。

プラグインが提供する関数のうち，受け渡しする値を受信する関数（受渡し値受信関数）と受け渡しする値を送信する関数（受渡し値送信関数）のどちらかを指定して定義したビュー表に対する問合せでは，次のどれかに該当する場合，エラーになります。

ビュー定義中のCASE式，又はスカラ関数VALUE中で受渡し値受信関数を指定している。

ビュー定義に受渡し値受信関数を指定し，その受渡し値受信関数に対応した受渡し値送信関数を二つ以上指定し，かつ，それらの受渡し値送信関数の第１引数が同じである。

ビュー定義に受渡し値受信関数又は受渡し値送信関数のどちらかを指定しかつ，そのビュー表を指定した問合せ指定が内部導出表を作成する。内部導出表を作成する条件については，「内部導出表」を参照してください。

ビュー定義に指定した受渡し値受信関数に対応する受渡し値送信関数が，そのビュー定義中と，定義したビュー表を指定した問合せ指定のどれにも存在しない。

ビュー表を指定した問合せ指定中の受渡し値受信関数に対応する受渡し値送信関数が，その問合せ指定中と，そのビュー表を定義した問合せのどちらにも存在しない。

(6)　集合演算の共通規則

集合演算をする場合，その対象になる二つの問合せ指定，導出問合せ式，又は問合せ式本体の結果から得られる導出表をそれぞれ行の集合とみなして，集合演算（和集合，又は差集合を求める）をします。

したがって，これらの集合演算の対象になる導出表同士の構成列の列数，及び列の並び順は，同じにしてください。また，対応する列のデータ型は，比較できるデータ型にしてください。ただし，日付データと日付データの文字列表現，時刻データと時刻データの文字列表現，時刻印データと時刻印データの文字列表現，日間隔データと日間隔データの10進数表現，及び時間隔データと時間隔データの10進数表現とは集合演算できません。

集合演算の対象になる導出表同士の列が文字データ型の場合，対応するそれぞれの列の文字集合はすべて同じにしてください。ただし，2番目以降の問合せ指定によって指定された導出表の列が次に示す値式の場合，1番目の問合せ指定によって指定された導出表の列の文字集合に変換されます。

文字列定数

集合演算で導出される表の列名は，問合せ式本体の1番目の問合せ指定によって指定された導出表の各列の列名（AS 列名を指定している場合は，AS句で指定した列名）となります。

導出表の列が次の項目から導き出された列で，AS列名を省略した場合，その列は名前のない列になります。

四則演算，日付演算，時刻演算，連結演算，又はシステム組込みスカラ関数を含む値式

CASE式

CAST指定

集合関数

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

SQL変数

SQLパラメタ

コンポネント指定

関数呼出し

集合演算の結果，得られた導出表の構成列の列数，及び列の並び順は演算対象の導出表の構成列と同じになります。

定数，集合関数，日付演算，時刻演算，四則演算，CASE式，及びCAST指定の結果は，非ナル値制約なし（ナル値を許します）になります。

集合演算をする場合，問合せ指定中のFROM句に問合せ式本体は指定できません。

集合演算をする場合，対象となる導出表の構成列には，結果が次のデータ型となる値式は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

集合演算を指定する場合，対象になる導出表の列に，繰返し列を含むことはできません。

集合演算をする場合，対象となる導出表の列にWRITE指定，GET_JAVA_STORED_ROUTINE_SOURCE指定，及びウィンドウ関数は指定できません。

集合演算の結果のデータ型，及びデータ長は次のとおりです。

＜文字データ，各国文字データ，混在文字データの場合＞

値式のどれかが可変長データの場合の結果のデータは，可変長データになります。

結果のデータ長は，一番長いデータ長を持つ値式のデータ長になります。

値式に文字データと混在文字データが含まれる場合の結果のデータ型は，混在文字データになります。

＜数値データの場合＞

数値データの場合の，結果のデータ型を次に示します。

オペランド1

オペランド2

SMALLINT

INTEGER

DECIMAL

SMALLFLT

FLOAT

SMALLINT

SMALLINT

INTEGER

DECIMAL

SMALLFLT

FLOAT

INTEGER

INTEGER

INTEGER

DECIMAL

FLOAT

FLOAT

DECIMAL

DECIMAL

DECIMAL

DECIMAL

FLOAT

FLOAT

SMALLFLT

SMALLFLT

FLOAT

FLOAT

SMALLFLT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

結果のデータ型がDECIMALの時の精度と位取りを次に示します。p，sをオペランド1の精度と位取り，p2，s2をオペランド2の精度と位取りにします。

・精度＝max（p1−s1，p2−s2）＋max（s1，s2）

・位取り＝max（s1，s2）

pd_sql_dec_op_maxprecオペランドの指定値によって，次のように精度が決まります。

pd_sql_dec_op_maxprecオペランドの値

集合演算オペランドの結果列と対応する列の精度

max（p1−s1，p2−s2）＋max（s1，s2）で求めた精度

集合演算オペランドの結果列の精度

29

すべての列が29けた以下

29けた以下

max（p1−s1，p2−s2）＋max（s1，s2）で求めた精度

30けた以上

エラー

30けた以上の列を含む

38けた以下

max（p1−s1，p2−s2）＋max（s1，s2）で求めた精度

39けた以上

エラー

38

任意

38けた以下

max（p1−s1，p2−s2）＋max（s1，s2）で求めた精度

39けた以上

エラー

pd_sql_dec_op_maxprecオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

また，INTEGERはDECIMAL（10，0），SMALLINTはDECIMAL（5，0）として扱われます。ただし，非ナル値制約の有無については，対応する構成列がすべて非ナル値制約ありの場合だけ非ナル値制約ありとして扱います。それ以外の場合は非ナル値制約なしとして扱います。

＜時刻印データの場合＞

時刻印データ同士の集合演算ができます。結果のデータ型も同じです。集合演算項が小数秒精度を含む場合の，結果の小数秒精度は，「Q1 集合演算 Q2」でのQ1の小数秒精度をp1，Q2の小数秒精度をp2としたとき，MAX（p1，p2）となります。

＜バイナリデータの場合＞

結果のデータ長は，一番長いデータ長を持つ値式のデータ長になります。

ALLを指定した場合，重複した行があっても取り除かないでそのまま残し，それぞれの行とします。ALLを省略した場合，重複した行があれば，重複を排除し一つの行とみなします。

「Q1 集合演算 Q2」の結果の重複行の行数は，ALL指定があるかないかによって異なります。Q1は問合せ式本体（導出問合せ式），Q2は問合せ式本体（導出問合せ式），又は問合せ指定です。Q1中の重複行，Q2中の重複行，Q1及びQ2中の重複行をRとし，重複行RのQ1中の行数をm，Q2中の行数をnとします（m≧0，n≧0）。Q1，Q2，又はQ1とQ2の重複した行がない場合は，重複行Rが1行ある（m＝1，n＝0又はm＝0，n＝1）とみなして，集合演算します。各集合演算の結果の各重複行Rの行数を次に示します。

集合演算

ALL指定なし

ALL指定あり

UNION

min（1，n＋m）

m＋n

EXCEPT

1（m＞0 かつ n＝0）

0（m＝0 又は n＞0）

max（m−n，0）

(7)　留意事項

次の条件を満たす場合，HiRDBが作業表を作成することがあります。

UNION〔ALL〕，又はEXCEPT〔ALL〕を指定している

このとき，作業表の行長によっては，上記の処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(8)　指定例

<WITH句を用いた場合>

    DECLARE CR1 CURSOR FOR
        WITH QRY1(QSCODE,QSNAME,QCOL,QURIAGE) AS
            (SELECT SCODE,SNAME,COL,TANKA*ZSURYO FROM ZAIKO)
                SELECT QSNAME,MAX(QURIAGE) FROM QRY1 GROUP BY QSNAME

<WITH句を用いない場合>

    DECLARE CR1 CURSOR FOR
        SELECT SCODE,SNAME,COL,TANKA,ZSURYO
            FROM ZAIKO

2.2.2　問合せ式　形式2（繰返し列平坦化問合せ式）

(1)　機能

繰返し列を要素ごとに分割し，それぞれを別の行として検索できます。

また，複数の繰返し列の添字が等しい要素同士を，同じ行として検索できます。これを，繰返し列の平坦化機能といいます。

(2)　形式

         SELECT 〔ALL｜DISTINCT〕｛選択式〔，選択式〕 …｜＊｝
          FROM〔認可識別子.〕表識別子
                〔IN （RDエリア名指定）〕
                （FLAT（列名〔，列名〕 …））〔〔AS〕相関名〕
                〔使用インデクスのSQL最適化指定〕
                〔WHERE 探索条件〕
                〔GROUP BY 列指定〔，列指定〕…〕
                〔HAVING 探索条件〕

(3)　オペランド

選択式，FLAT，及び探索条件以外のオペランドについては，「問合せ式　形式1（一般問合せ式）」を参照してください。

｛選択式〔，選択式〕…｜＊｝

検索結果として出力する項目を指定します。

選択式については，「問合せ指定」を参照してください。

〔IN （RDエリア名指定）〕

IN

アクセス対象のRDエリアを指定します。指定できない場合を次に示します。

表識別子に指定した表が読み込み専用のビュー表の場合

ビュー定義の導出問合せ式中の場合

表識別子に指定した表が一時表の場合

RDエリア名指定：：＝値指定

表識別子に指定した表を格納しているRDエリアのうち，アクセスするRDエリアの名称をVARCHAR型，CHAR型，MVARCHAR型，又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ（，）で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については，「名前の指定」を参照してください。また，値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符（"）で囲んだ場合は，引用符（"）の外側の空白だけを無視します。

インナレプリカ機能を適用しているRDエリアを指定する場合，オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は，カレント切り替えコマンド（pddbchgコマンド），又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

（FLAT（列名〔，列名〕…））

平坦化の対象となる繰返し列又は，繰返し列を含む列の並びを指定します。

複数の繰返し列を指定した場合は，添字が等しい要素が同じ行に含まれるように平坦化されます。

通常の列（繰返し構造でない列）も含む場合は，繰返し列のどの要素に対しても同じ値を持つ行が生成されます。

繰返し列，又は繰返し列を含む列の組を平坦化した後は，通常の列になります。したがって，その問合せ式中では通常の列として指定します。

探索条件

探索条件中には，平坦化した後の項目を指定できます。

探索条件については，「探索条件」を参照してください。

(4)　規則

平坦化する列とインデクスとの関係を次に示します。

列名に指定した列とインデクスの関係

SQL文

実行可否

インデクス定義あり

繰返し列を含むインデクスがある

FLATの列名に指定した列のうち，SQL中に指定した列をすべて包括したインデクスがある

FLATの列名中に一つでも繰返し列が存在する

○

FLATの列名中に一つも繰返し列が存在しない

×

FLATの列名に指定した列のうち，SQL中に指定した列をすべて包括したインデクスがない

×

繰返し列を含むインデクスがない

×

インデクス定義なし

×

（凡例）

　　　○：実行可能 ×：エラー

使用インデクスのSQL最適化指定にWITHOUT INDEXを指定した場合，その最適化指定を無視し，HiRDBが使用できるインデクスを用いて検索します。

使用インデクスのSQL最適化指定にWITH INDEXを指定する場合，規則1に示したSQL文実行可能な条件を満たすインデクスを指定してください。指定したインデクスがSQL文実行可能な条件を満たしていない場合，その最適化指定を無視し，HiRDBが利用できるインデクスを用いて検索します。

FROM句のFLAT指定は，INSERT SELECTのSELECT文，WITH句問合せ，ビュー定義，FROM句の導出表，及び副問合せ中には指定できません。

FLATに指定できる列名は最大64個です。

平坦化を指定したSQL中で指定する列名には，FLATで指定した列名を指定してください。

表識別子には，ビュー表を指定できません。

平坦化を指定する場合，以下の項目を指定できません。

FOR UPDATE句

FOR READ ONLY

LIMIT句

コンポネント指定

関数呼出し

副問合せ

FLAT指定のある集合関数

添字を指定した列

平坦化を指定する場合，探索条件中に以下の項目を指定できません。

構造化繰返し述語

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(5)　指定例

繰返し列を用いた成績表を平坦化し，成績が70点以上の学生の一覧を検索します。

SELECT 氏名,科目名,成績 FROM 成績表 (FLAT(氏名,科目名,成績))
    WHERE 成績>=70

成績表の表定義及びインデクス定義は次のとおりです。

表定義：
    CREATE TABLE 成績表(氏名 MCHAR(10),
                        科目名 MCHAR(10) ARRAY[4],
                        成績 SMALLINT ARRAY[4]);
インデクス定義：
    CREATE INDEX 科目成績 ON 成績表(氏名,科目名,成績);

2.3　問合せ指定

2.3.1　問合せ指定の形式と規則

(1)　機能

表に対する検索の条件（表式），及び検索した結果を出力する項目（選択式）を指定することで，選択式を列とする検索結果で構成された表を導き出します。この導き出された表のことを導出表といいます。

(2)　使用権限

表に対するSELECT権限を持つユーザが，その表を検索する問合せ指定を実行できます。

(3)　形式

　SELECT〔｛ALL｜DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝表式

(4)　オペランド

〔｛ALL｜DISTINCT｝〕

検索した結果，重複した行（選択式で指定した項目で一つの行を構成し，その行が同一のもの）があった場合，重複した行を排除するかどうかを指定します。

重複した行を排除することを行の重複排除といいます。

ALL

検索した結果，重複した行があっても重複を許し，そのまま出力します。

DISTINCT

検索した結果，重複した行があったら，重複を排除し，一つの行とみなして出力します。

｛選択式〔，選択式〕…｜＊｝

検索結果として出力する項目を指定します。

選択式

選択式として次に示すものが指定できます。

列指定

〔表指定.〕ROW

集合関数

ウィンドウ関数

スカラ関数※

CASE式

CAST指定

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

SQL変数又はSQLパラメタ

値式※ 〔〔AS〕列名〕

表指定.*

コンポネント指定

関数呼出し※

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

スカラ副問合せ

注※

関数呼出しの引数には，？パラメタ，及び埋込み変数を指定できます。指定方法については，「規則」を参照してください。

スカラ関数のLENGTH，SUBSTR及びPOSITIONの引数には，？パラメタ及び埋込み変数を指定できます。指定方法についてはそれぞれの関数の規則を参照してください。

選択式についての規則を次に示します。

スカラ関数LENGTH，SUBSTR，及びPOSITIONの引数には，？パラメタ及び埋込み変数を指定できます。ただし，LENGTHの引数，SUBSTRの第1引数，POSITIONの第1引数，及び第2引数にはデータ型がBLOB型又はBINARY型，かつAS データ型を指定した場合だけ指定できます。

選択式中には結果のデータ型が次に示すデータ型の値式は指定できません。

BOOLEAN

カーソル宣言，動的SELECT文，1行SELECT文，FROM句の導出表，及び述語中の副問合せの選択式中には，結果のデータ型が抽象データ型の値式は指定できません。

SELECT DISTINCTを指定した場合，選択式中又は表式中では，DISTINCT指定の集合関数は指定できません。

選択式に繰返し列を指定した場合，次の指定はできません。

SELECT DISTINCT

その問合せに対するUNION 〔ALL〕

その問合せに対するEXCEPT 〔ALL〕

〔表指定．〕ROWは，FIX属性の実表に対してだけ指定できます。ROWは行全体（予備列を含む）を意味し，これを指定することで行全体を一つのデータとして一つの領域に取り出します。取り出されるデータのデータ型は，各列のデータ型にかかわらずROW型（ROW型に対しては，CHAR(n)（nは行長）に対応する変数，又は構造体を指定できます。ただし，構造体中に境界調整による空きがあってはいけません）とします。また，データ長は行長（各列のデータ長の総和）になります。表に予備列が定義してある場合は，取り出した領域中の予備列に対応する部分は予備列に格納されているデータ（予備列の定義長分の0x00）になります。選択式中にROWを指定した場合，その問合せ指定に対する次のものと同時に指定できません。

集合関数

GROUP BY句

UNION〔ALL〕，又はEXCEPT〔ALL〕

〔表指定.〕ROWは，既定文字集合以外の文字データ型の列を含む表には指定できません。

ROW型を使用する場合は，UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では，ROW型は使用できません。例えば，WindowsのUAPでROW型を使用する場合は，HiRDBサーバも同じエンディアンのWindows版を使用してください。

〔表指定.〕ROWは，結合表の内表に対して指定できません。

SELECT句に指定する列は，その表式のFROM句で指定した表を参照してください。

表式中に集合関数，GROUP BY句，又はHAVING句を指定した場合，SELECT句の列指定は次のどちらかにしてください。

グループ化列（GROUP BY句で指定した値式）

集合関数の引数中で指定

次のデータ型のSQL変数又はSQLパラメタを選択式に指定した場合，そのSELECT句を直接含む問合せ指定，及びそのSELECT句を含む問合せには，次の機能又は句は指定できません。

＜SQL変数又はSQLパラメタのデータ型＞

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

＜問合せ指定中に同時に指定できない機能又は句＞

集合関数

GROUP BY句

HAVING句

DISTINCT

ビュー定義中の導出問合せ式で，上記の機能，句を指定したビュー表を，FROM句に指定

＜問合せ中に同時に指定できない機能又は句＞

集合演算

ORDER BY句

FOR UPDATE句

FOR READ ONLY

表指定.＊を指定した場合，指定した表のすべての列（予備列を除く）を表定義時に指定した順序で指定することを意味します。

AS 列名は，選択式に対して名称を付ける場合に指定します。

n番目の選択式にAS 列名を指定した場合，その列名は選択式を指定した問合せ指定によって導出される表のn番目の列名になります。

n番目の選択式にAS 列名を指定しない場合，選択式に指定した列名が問合せ指定によって導出される表のn番目の列名になります。ただし，選択式が列指定だけでない場合，n番目の列は名前のない列になります。

n番目の選択式にスカラ副問合せを指定した場合，問合せ指定によって導出されるn番目の列名は，スカラ副問合せの問合せ指定によって導出される列名になります。ただし，AS 列名を指定している場合は，AS列名で指定した列名になります。また，スカラ副問合せの問合せ指定によって導出される列が名前のない列の場合，問合せ指定によって導出されるn番目の列は，名前のない列になります。

WRITE指定は，選択式に単独で指定できます。

GET_JAVA_STORED_ROUTINE_SOURCE指定は次の箇所で指定できます。

最も外側の問合せ指定の選択式に単独で指定

最も外側の問合せ指定の選択式の，スカラ関数LENGTHの引数に指定

DISTINCTを指定した場合，WRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

INSERT文の問合せ指定の選択式には，WRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

表式中に列指定以外の値式を指定したGROUP BY句を指定した場合，

選択式に指定したスカラ副問合せ中からそのグループ化列を参照することはできません。

選択式にウィンドウ関数を指定する場合，ウィンドウ関数以外の選択式を一つ以上指定してください。

スカラ演算中にウィンドウ関数は指定できません。

ウィンドウ関数を指定した場合，選択式に集合関数を指定できません。

選択式中には，予備列，及び予備列を指定した値式は指定できません。

＊

表のすべての列を出力する場合，指定します。

＊は，その問合せ指定のFROM句で指定したすべての表の，すべての列（予備列を除く）を，FROM句で指定した表の順序で指定することを意味します。各表中の列の順序は，表定義時に指定した順序になります。

表式

表式については，「表式」を参照してください。

なお，ビュー定義文中の導出問合せ式の制限項目については，「CREATE 〔PUBLIC〕VIEW（ビュー定義，パブリックビュー定義）」を参照してください。

(5)　規則

最も外側の問合せ指定の選択式に，次に示す属性の値式を指定して導出した，名前付きの導出表に対する問合せ指定では，内部導出表を作成する問合せは指定できません。内部導出表を作成する条件については，「内部導出表」を参照してください。

BLOB

最大長が32,001バイト以上のBINARY

抽象データ型

繰返し列

関数呼出しの引数に？パラメタ，又は埋込み変数を指定する場合，引数は次の形式で指定してください。

？ AS データ型

：埋込み変数〔：標識変数〕 AS データ型

(6)　留意事項

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の日付データ型の部分は4バイトです。また，形式はX'YYYYMMDD'にしてください。

行単位（ROW指定）インタフェースを使用して，日付データを文字表現で受け渡しする場合，列は日付データ型ではなく，CHAR（10）で定義してください。さらに，日付演算は，スカラ関数DATEを使用し，日付データ型に変換してから指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻データ型の部分は3バイトです。また，形式はX'hhmmss'にしてください。行単位（ROW指定）インタフェースを使用して，時刻データを文字表現で受け渡しする場合，列は時刻データ型ではなく，CHAR（8）で定義してください。さらに，時刻演算は，スカラ関数TIMEを使用し，時刻データ型に変換してから指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻印データ型の部分は（7＋(p÷2)）バイトです。また，形式はX'YYYYMMDDhhmmss〔nn…n〕'にしてください。行単位（ROW指定）インタフェースを使用して，時刻印データを文字表現で受け渡しする場合，列は時刻印データ型ではなく，長さが19，22，24，又は26バイトのCHARで定義してください。

次のどちらかの条件を満たす場合，HiRDBが作業表を作成することがあります。

DISTINCTを指定している

選択式中に集合関数を含む値式を指定している

選択式中にウィンドウ関数を含む値式を指定している

このとき，作業表の行長によっては，上記の処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

2.4　副問合せ

2.4.1　副問合せ指定の形式と規則

(1)　機能

表を検索して得られる値，又は値の集合を指定します。

副問合せの種類を次に示します。

スカラ副問合せ

スカラ副問合せとは，結果の列数が1列，結果の行数が1行以下の副問合せを示します。

行副問合せ

行副問合せとは，結果の列数が2列以上，結果の行数が1行以下の副問合せを示します。

表副問合せ

表副問合せとは，結果の列数が1列以上，結果の行数が0行以上の副問合せを示します。

各副問合せは，次に示す箇所に指定します。

スカラ副問合せ

値式を指定できる箇所

行副問合せ

行値構成子を指定できる箇所

UPDATE文のSET句

表副問合せ

IN述語の右側

限定述語の右側

EXISTS述語

FROM句の導出表

(2)　使用権限

表に対するSELECT権限を持つユーザが，その表を検索する副問合せを実行できます。

(3)　形式

　スカラ副問合せ：：＝副問合せ
　行副問合せ：：＝副問合せ
　表副問合せ：：＝副問合せ

　副問合せ：：＝（〔副問合せ実行方式のSQL最適化指定〕問合せ式本体）

(4)　オペランド

（〔副問合せ実行方式のSQL最適化指定〕問合せ式本体）

副問合せ実行方式のSQL最適化指定については「SQL最適化指定」を，問合せ式本体については「問合せ式」を参照してください。

(5)　述語（IN述語，比較述語，限定述語，及びEXISTS述語）中，又はFROM句の導出表の副問合せの規則

述語中，又は導出表の副問合せの選択式には，結果が次のデータ型となる値式は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

抽象データ型

EXISTS述語の副問合せで*又は表指定.*を指定した場合は，次のようになります。

集合演算を指定しない場合

集合関数以外のその副問合せで許される任意の1列を意味します。

集合演算を指定した場合

*を指定した場合は，その問合せ指定のFROM句で指定したすべての表のすべての列（予備列を除く）を，FROM句で指定した表の順序で指定することを意味します。各表中の列の順序は，表定義時に指定した順序になります。

表指定.*を指定した場合は，指定した表のすべての列（予備列を除く）を，表定義時に指定した順序で指定することを意味します。

(6)　規則

副問合せの結果は，非ナル値制約なし（ナル値を許します）になります。ただし，FROM句の導出表に指定した表副問合せの結果は，その問合せ式の結果の制約となります。

行値構成子に指定した行副問合せの結果の列数は，最大255個です。

UPDATEのSET句に指定した行副問合せの結果の列数は，最大30,000個です。

表副問合せの結果の列数は，最大255個です。ただし，FROM句の導出表の表副問合せの結果の列数は，最大30,000個です。

スカラ副問合せ及び行副問合せを指定する場合は，結果の行数は1行以下でなければなりません。

スカラ副問合せの結果が0行の場合，結果の値はナル値になります。

行副問合せの結果が0行の場合，結果は構成要素がすべてナル値となる行になります。

副問合せ中の選択式には，結果のデータ型が次に示すデータ型の値式は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

抽象データ型

BOOLEAN

ただし，UPDATE文のSET句中で，更新値として直接指定したスカラ副問合せ及び行副問合せの選択式については，上記制限はありません。

また，XMLQUERY関数のXML問合せ変数の値式に指定したスカラ副問合せ中の選択式には，XML型の値式としてXMLAGG集合関数が指定できます。

副問合せ中の選択式には，〔表指定.〕ROWは指定できません。

副問合せ中の選択式にWRITE指定，GET_JAVA_STORED_ROUTINE_SOURCE指定，及びウィンドウ関数は指定できません。

副問合せ中の選択式には，添字のない繰返し列を指定できません。

ただし，UPDATE文のSET句中で，更新値として直接指定したスカラ副問合せ及び行副問合せの選択式については，上記の制限はありません。

集合関数の引数に指定する値式中に，副問合せは指定できません。

副問合せ中に予備列は指定できません。

(7)　指定例

SELECT文中の限定述語中で表副問合せを指定した場合

    SELECT DISTINCT SNAME FROM ZAIKO
        WHERE SURYO > ALL
        (SELECT SURYO FROM ZAIKO
        WHERE SNAME = N'ソックス')

UPDATE文のSET句でスカラ副問合せを指定した場合

在庫表（ZAIKO）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）列を，在庫表と同じ列定義情報を持つ在庫表2（ZAIKO2）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）に変更します。

    UPDATE ZAIKO
        SET ZSURYO =
            (SELECT ZSURYO FROM ZAIKO2 WHERE SCODE = '302S')
        WHERE SCODE = '302S'

UPDATE文のSET句で行副問合せを指定した場合

在庫表（ZAIKO）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）列と単価（TANKA）列を，在庫表と同じ列定義情報を持つ在庫表2（ZAIKO2）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）と単価（TANKA）に変更します。

    UPDATE ZAIKO
        SET (TANKA,ZSURYO) =
            (SELECT TANKA,ZSURYO FROM ZAIKO2 WHERE SCODE = '302S')
        WHERE SCODE = '302S'

2.5　表式

2.5.1　表式の形式と規則

(1)　機能

検索の対象となる一つ又は複数の表を指定します。また，表を検索，又は結合するときの条件（探索条件やグループ分け）が指定できます。表式は副問合せ及び問合せ指定中，又は1行SELECT文中に指定します。

(2)　形式

　FROM　表参照〔，表参照〕…
　〔WHERE 探索条件〕
　〔GROUP BY 値式〔，値式〕…〕
　〔HAVING 探索条件〕

(3)　オペランド

(a)　副問合せを使用しない場合

FROM 表参照〔，表参照〕…

検索する，表，問合せ名，導出表，又は結合表を指定します。表参照については，「表参照」を参照してください。

〔WHERE 探索条件〕

探索条件を省略すると，表（指定した表，結合表，導出表，及びWITH句中の導出問合せ式から問合せ名として導出された表）から導き出されるすべての行が検索されます。

探索条件中に，埋込み変数を指定できます。PREPARE文で前処理をするSELECT文中では，埋込み変数の代わりに？パラメタを指定します。SQL手続き中では，SQL変数又はSQLパラメタを使用します。Java手続き中については，マニュアル「HiRDB Version 9 UAP開発ガイド」のJDBCドライバを参照してください。

〔GROUP BY 値式〔，値式〕…〕

グループ分けでは，GROUP BY句で指定した値式のすべての結果の値が同一の行をそれぞれ一つのグループとして分け，その結果をグループごとに1行にして出力します。

選択式には，グループ分けする列の名称，集合関数，定数，若しくはこれらを一次子とする値式，又はグループ分けをする値式だけ指定できます。すなわち，グループ分けする値式（値式が列指定の場合を除く）を一次子として含む値式は指定できません。なお，GROUP BY句で指定した値式をグループ化列といいます。

GROUP BY句についての規則を次に示します。

グループ分けの条件となる列にナル値を持つ行がある場合は，ナル値を同じ値として扱いグループ分けします。

GROUP BY句に指定する値式は，同じ形式の値式を重複して指定できません。

GROUP BY句に指定する値式は，集合関数を含むことはできません。

GROUP BY句に指定する値式は，ウィンドウ関数を含むことはできません。

GROUP BY句に指定する値式中には，コンポネント指定を含むことはできません。

GROUP BY句に指定する値式中には，繰返し列は指定できません。

GROUP BY句に指定する値式中には，予備列は指定できません。

GROUP BY句に指定する値式には，副問合せを含むことはできません。

〔HAVING 探索条件〕

集合関数（AVG，MAX，MIN，SUM，COUNT及びCOUNT_FLOAT）を指定できます。

HAVING句についての規則を次に示します。

集合関数以外の探索条件には，グループ分けした値式だけ指定できます。

グループ分けした値式は，GROUP BY句で指定した値式と全く同じ形式にしてください。

探索条件を省略した場合は，すべてのグループを出力します。

(b)　副問合せを使用する場合

FROM 表参照〔，表参照〕…

検索する，表，問合せ名，導出表，又は結合表を指定します。表参照については，「表参照」を参照してください。

FROM句に複数の表を追加した場合，各表から1行ずつ組み合わせて指定した表の順序に連結した行がFROM句の結果の表の行になり，その行数は各表の行数の積になります。

〔WHERE 探索条件〕

副問合せ中の探索条件中の列指定は，副問合せの外側で指定した表の列を参照できます。

問合せが入れ子の場合，内側の問合せから外側の問合せで指定している表（の列）を参照することを，外への参照をするといいます。

WHERE句についての規則を次に示します。

WHERE句にCOUNT（＊）又はCOUNT_FLOAT（＊）は指定できません。

HAVING句に属するWHERE句中だけ，WHERE句に集合関数を指定できます。

HAVING句に属するWHERE句に集合関数を指定した場合，その集合関数中の列指定は，そのHAVING句に先行するFROM句に指定した表を参照（外への参照）してください。

GROUP BY句に列指定以外の値式を指定した問合せ指定のWHERE句の副問合せには，GROUP BY句に列指定以外の値式を指定できません。

〔GROUP BY 値式〔，値式〕…〕

GROUP BY句に指定する列は，そのGROUP BY句がある表式中のFROM句で指定している表を参照してください。

グループ分けでは，GROUP BY句で指定した値式のすべての結果の値が同一の行をそれぞれ一つのグループとして分け，その結果をグループごとに1行にして出力します。

選択式には，グループ分けする列の名称，集合関数，定数，若しくはこれらを一次子とする値式，又はグループ分けをする値式だけ指定できます。すなわち，グループ分けする値式（値式が列指定の場合を除く）を一次子として含む値式は指定できません。なお，GROUP BY句に指定した値式をグループ化列といいます。

また，値式に列指定以外を指定した場合，選択式に指定したスカラ副問合せ中からそのグループ化列を参照することはできません。

GROUP BY句についての規則を次に示します。

グループ分けの条件になる列にナル値を持つ行がある場合，ナル値同士を同じ扱いとしてグループ分けします。

GROUP BY句に指定する値式は，同じ形式の値式を重複して指定できません。

GROUP BY句に指定する値式は，集合関数を含むことはできません。

GROUP BY句に指定する値式は，ウィンドウ関数を含むことはできません。

GROUP BY句に指定する値式中には，コンポネント指定を含むことはできません。

GROUP BY句に指定する値式中には，繰返し列は指定できません。

GROUP BY句に指定する値式中には，予備列は指定できません。

GROUP BY句に指定する値式には，副問合せを含むことはできません。

〔HAVING 探索条件〕

HAVING句は，先行するGROUP BY句，WHERE句，又はFROM句の結果，得られる各グループを選択する条件を指定します。ただし，GROUP BY句を指定しないと，WHERE句，又はFROM句の結果はグループ化列を持たない一つのグループになります。

HAVING句についての規則を次に示します。

HAVING句中に指定した探索条件の結果が真となるグループが選択されます。

HAVING句を省略すると，先行するGROUP BY句，WHERE句，又はFROM句の結果のすべてのグループが選択されます。

グループ分けした値式は，GROUP BY句で指定した値式と全く同じ形式にしてください。

HAVING句中に列指定を指定する場合，次のようにしてください。

その表式中のFROM句の表を参照するか，又は外側の表式中のFROM句の表を参照（外への参照）する

その表式中のFROM句の表を参照している場合，グループ化列（GROUP BY句で指定した値式）か，又は集合関数の引数中に指定する

(4)　共通規則

探索条件中に埋込み変数を指定できます。

PREPARE文で前処理をするSQL文中では，埋込み変数の代わりに?パラメタを指定します。

(5)　結合についての規則

一つのFROM句に複数の表，又は問合せ名を指定した検索（複数の表にわたる検索）を結合といいます。

FROM句に，結合するすべての表，又は問合せ名を指定します。WHERE句に結合条件がない場合は，結合する各表から一つずつ行を取り出して組み合わせたものが結果になります。例えば，ｌ行，m行，n行から成る三つの表を無条件で結合するとｌ×m×n個の行になります。

WHERE句に表間の関係を示す条件（結合条件）を指定した場合は，1.の結合結果から条件に合った行を選択します。

結合条件中に指定する列（結合列）のデータ型は，互いに変換できるようにします。（数値と数値，文字と文字が変換できます）。

結合する列にナル値を持つ行は，どの行に対しても条件を満足しません。

同じ列名の列がある表，又はWITH句の導出問合せ式から問合せ名として導出される表を結合する場合は，その列を指定するときに表名，又は相関名を付けてその列を一意にして指定します。

結合できる（FROM句に指定できる）実表，FROM句の導出表の延べ数は，最大128個です。

また，一つのSQL文中に指定できる実表の延べ数（副問合せで指定する実表の延べ数も含む）は最大128個です。相関名の延べ数は，最大129個です。

1トランザクションで同時にアクセスできる表数は，システム定義のpd_max_access_tablesオペランドの値までです。pd_max_access_tablesオペランドのデフォルト値は64のため，必要に応じてpd_max_access_tablesオペランドの値を変更してください。pd_max_access_tablesオペランドの値を増やすとメモリ所要量が増加します。詳細は，マニュアル「HiRDB Version 9 システム定義」のpd_max_access_tablesオペランドを参照してください。

名前付きの導出表（ビュー表又はWITH句の問合せ）を使用した場合，その名前付きの導出表一つに対する表の結合数は，ビュー定義文中，又はWITH句中の導出問合せ式で指定している実表，及びFROM句の導出表の延べ数になります。同様に，その名前付きの導出表一つに対するSQL文中で指定した表数は，ビュー定義文中，又はWITH句中の導出問合せ式で指定した実表の延べ数になります。その名前付きの導出表一つに対するSQL文中で指定した相関名数は，ビュー定義文中，又はWITH句中の導出問合せ式で指定した相関名数になります。

また，ビュー定義文中，又はWITH句中の導出問合せ式に集合演算を指定して導出した名前付きの導出表を，SQL文中で指定し，かつ，その名前付きの導出表が内部導出表となる条件をどれも満たさない場合，表数，相関名数は次のようになります。

表数＝

　（導出問合せ式中で指定した実表の延べ数）

　＋（（導出問合せ式中の集合演算数＋1）

　×（副問合せ中の実表の延べ数））

相関名数＝

　（導出問合せ式中で指定した相関名の延べ数）

　＋（（導出問合せ式中の集合演算数＋1）

　×（副問合せ中の相関名の延べ数））

なお，ビュー定義文中の導出問合せ式の制限項目については，「CREATE 〔PUBLIC〕VIEW（ビュー定義，パブリックビュー定義）」を参照してください。また，WITH句中の導出問合せ式の制限項目については，「問合せ式」を参照してください。また，名前付きの導出表が内部導出表となる条件は，「内部導出表」を参照してください。

内部導出表を作成する問合せ指定では，内部導出表の作成対象となる一つの名前付きの導出表同士の結合は指定できません。内部導出表を作成する条件については，「内部導出表」を参照してください。

(6)　GROUP BY句，及びHAVING句についての規則

ビュー定義中，又はWITH句中の導出問合せ式のGROUP BY句には，列指定の値式を指定してください。

問合せ指定にウィンドウ関数を指定した場合，GROUP BY句及びHAVING句は指定できません。

(7)　留意事項

次のどれかの条件を満たす場合，HiRDBが作業表を作成することがあります。

複数の表を結合している

GROUP BY句を指定している

表一次子にビュー表又は問合せ名を指定し，内部導出表を作成している（内部導出表については，「内部導出表」を参照してください）

このとき，作業表の行長によっては，上記の処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(8)　指定例（動的SELECT文中で表式を指定した場合）

  SELECT SUM(ZSURYO) FROM ZAIKO
      WHERE TANKA >= (SELECT AVG(TANKA)
      FROM ZAIKO)

(9)　使用例

表Aは商品の単価の表，表Bは受注のあった商品の受注量の表，表Cは先月受注のあった商品の受注量の表です。

単価が200より大きい商品の商品コード，単価，及び受注量を取得します。

  SELECT A.SCODE,TANKA,JSURYO FROM A LEFT OUTER JOIN B
      ON A.SCODE = B.SCODE WHERE TANKA > 200

すべての商品コード，及び単価と，受注量が40以上の受注量を取得します。

  SELECT A.SCODE,TANKA,JSURYO FROM A LEFT OUTER JOIN B
      ON A.SCODE = B.SCODE AND JSURYO >= 40

すべての商品コード，及び単価と，単価が400以上の商品の受注量を取得します。

  SELECT A.SCODE,TANKA,JSURYO FROM A LEFT OUTER JOIN B
      ON A.SCODE = B.SCODE AND TANKA >= 400

単価が500以下の商品について，商品コード及び単価と，40以上の今月の受注量，30以下の先月の受注量を取得します。

  SELECT A.SCODE,A.TANKA,B.JSURYO,C.SENRYO
    FROM A LEFT OUTER JOIN B ON A.SCODE=B.SCODE AND B.JSURYO >= 40
           LEFT OUTER JOIN C ON A.SCODE=C.SCODE AND C.SENRYO <= 30
      WHERE A.TANKA <= 500

すべての商品コード及び単価と，単価が400以下の商品の今月の受注量と，先月の受注量を取得します。

  SELECT A.SCODE,A.TANKA,B.JSURYO,C.SENRYO
    FROM A LEFT OUTER JOIN B ON A.SCODE = B.SCODE
             AND A.TANKA <= 400
           LEFT OUTER JOIN C ON A.SCODE = C.SCODE
             AND A.TANKA <= 400

すべての商品コードと，各商品の今月の受注量の，先月の受注量に対する比率を求めます。ただし，今月又は先月に受注のなかった商品については，ナル値を出力します。

  SELECT A.SCODE,100.0*B.JSURYO/C.SENRYO
    FROM A LEFT OUTER JOIN (B INNER JOIN C ON B.SCODE=C.SCODE)
             ON A.SCODE = B.SCODE

すべての商品コード及び単価と，今月の受注量と，先月の受注量から，今月と先月の売上を取得します。

    SELECT SCODE,TANKA*JSURYO,TANKA*SENRYO
        FROM(SELECT A.SCODE,A.TANKA,B.JSURYO,C.SENRYO
                FROM A LEFT OUTER JOIN B ON A.SCODE = B.SCODE
                       LEFT OUTER JOIN C ON A.SCODE = C.SCODE)
        AS DT1(SCODE,TANKA,JSURYO,SENRYO)

2.6　表参照

2.6.1　表参照の形式と規則

(1)　機能

検索する表，又は表の結合を指定します。表参照は表式中に指定します。

(2)　形式

　表参照：：＝｛表一次子｜結合表｝
　表一次子：：＝｛〔認可識別子.〕表識別子
　　　　　　　　　　　　　〔IN （RDエリア名指定）〕
 　　　　　　　　　　　　　　　　　〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕
                  ｜問合せ名 〔〔AS〕相関名 〕〔使用インデクスのSQL最適化指定〕
                  ｜（結合表）
                  ｜導出表〔〔AS〕相関名〔（導出列リスト）〕〕｝
　導出表：：＝表副問合せ
　導出列リスト：：＝列名リスト
　列名リスト：：＝列名〔，列名〕…
　結合表：：＝｛表参照〔｛INNER｜｛LEFT｜RIGHT｝ 〔OUTER〕｝〕 JOIN
　　　　　　　　　〔結合方式のSQL最適化指定〕
　　　　　　　　　表参照 ON 探索条件
　　　　　　　｜表参照 CROSS JOIN 表一次子｝

(3)　オペランド

表一次子：：＝｛〔認可識別子.〕表識別子

　　　　　　　　　　〔IN （RDエリア名指定）〕

　　　　　　　　　 〔〔AS〕相関名〕 〔使用インデクスのSQL最適化指定〕

　　　　　｜問合せ名〔〔AS〕相関名〕〔使用インデクスのSQL最適化指定〕

　　　　　｜（結合表）

　　　　　｜導出表〔〔AS〕相関名〔（導出列リスト）〕〕｝

認可識別子

表の所有者の認可識別子を指定します。データディクショナリ表を検索する場合は，認可識別子にMASTERを指定します。

表識別子

検索する表の名称を指定します。

〔IN （RDエリア名指定）〕

IN

アクセス対象のRDエリアを指定します。指定できない場合を次に示します。

表識別子に指定した表が読み込み専用のビュー表の場合

ビュー定義の導出問合せ式中の場合

表識別子に指定した表が一時表の場合

RDエリア名指定：：＝値指定

表識別子に指定した表を格納しているRDエリアのうち，アクセスするRDエリアの名称をVARCHAR型，CHAR型，MVARCHAR型，又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ（，）で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については，「名前の指定」を参照してください。また，値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符（"）で囲んだ場合は，引用符（"）の外側の空白だけを無視します。

インナレプリカ機能を適用しているRDエリアを指定する場合，オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は，カレント切り替えコマンド（pddbchgコマンド），又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

問合せ名

検索の対象となるWITH句中の導出問合せ式から導出される表の名称を指定します。

〔AS〕相関名

同じ表を結合する場合，又は内側の副問合せで同じ表の列を参照する場合に，表同士を区別するために付ける名称を指定します。ASは省略できます。

一つのFROM句中で同じ表，又は問合せ名を複数回指定する場合は，相関名を指定してそれぞれの表，及び問合せ名が一意に識別できるようにしてください。また，問合せ名と表名が同じ場合も，相関名を指定して一意に識別できるようにしてください。

相関名には一つのFROM句中に指定したほかの相関名と同じ名称を指定できません。

相関名には，一つのFROM句中に指定したその相関名を指定する表名，又は問合せ名以外の表識別子と同じ名称を指定できません。

該当する相関名を指定する表名，又は問合せ名と同一名称の相関名を指定した場合，そのFROM句中に指定した相関名指定のある表名，又は問合せ名は有効範囲がありません。

相関名の有効範囲は，導出表を介さないでその相関名を指定した表参照をFROM句に含む問合せ指定，１行SELECT，及びそれらの内側の副問合せとします。

使用インデクスのSQL最適化指定

使用インデクスのSQL最適化指定については「SQL最適化指定」を参照してください。

（結合表）

結合表の評価順序を指定する場合，結合表を括弧で囲んで指定します。括弧で囲まない場合は，最も左側の表参照から順に評価します。

結合表：：＝｛表参照〔｛INNER｜｛LEFT｜RIGHT｝ 〔OUTER〕｝〕 JOIN

　　　　　　　〔結合方式のSQL最適化指定〕

　　　　　　　表参照 ON 探索条件

　　　　　　｜表参照 CROSS JOIN 表一次子｝

結合表には，内結合，外結合又は交差結合によって導き出される表を指定します。

内結合では，右側の表と左側の表から一つずつ行を取り出して組み合わせた行のうち，探索条件を満たす行が検索されます。外結合では，外表のすべての行と，探索条件を満たす内表の行が検索されます。交差結合では，右側の表と左側の表から一つずつ行を取り出して組み合わせた行が検索されます。

表参照〔｛INNER｜｛LEFT｜RIGHT｝ 〔OUTER〕｝〕 JOIN 表参照

外表と内表の二つの表を突き合わせ処理する（内結合又は外結合する）場合に指定します。

「表参照1 〔INNER〕 JOIN 表参照2」の場合，「〔INNER〕 JOIN」の左側に指定する表参照の結果の表（表参照1）が外表となり，右側に指定する表参照の結果の表（表参照2）が内表となります。このときの突き合わせの結果のうち，探索条件を満たす行が導き出されます。

「表参照1 LEFT 〔OUTER〕 JOIN 表参照2」の場合，「LEFT 〔OUTER〕 JOIN」の左側に指定する表参照の結果の表（表参照1）が外表となり，右側に指定する表参照の結果の表（表参照2）が内表となります。外表の行は，突き合わせの結果の真偽に関係なくすべて導き出されます。また，内表の行は，探索条件を満たす行だけ導き出されます。

「表参照1 RIGHT 〔OUTER〕 JOIN 表参照2」の場合，「RIGHT 〔OUTER〕 JOIN」の右側に指定する表参照の結果の表（表参照2）が外表となり，左側に指定する表参照の結果の表（表参照1）が内表となります。外表の行は，突き合わせの結果の真偽に関係なくすべて導き出されます。また，内表の行は，探索条件を満たす行だけ導き出されます。

結合方式のSQL最適化指定

結合方式のSQL最適化指定については「SQL最適化指定」を参照してください。

ON 探索条件

内結合又は外結合の結合条件を指定します。

探索条件には，外表又は内表の列が指定できます。

また，副問合せ中の探索条件の列指定は，副問合せの外側で指定した表の列を参照できます。問合せが入れ子の場合，内側の問合せから外側の問合せで指定している表，又は列を参照することを外への参照といいます。

探索条件中の列指定を表名で修飾する場合，相関名を指定した表の列に対しては相関名で修飾してください。

副問合せ中のON探索条件にCOUNT（＊），COUNT_FLOAT（＊），及びウィンドウ関数は指定できません。また，HAVING句に属するFROM句のON探索条件中にだけ，ON探索条件に集合関数を指定できます。HAVING句に属するFROM句のON探索条件中に集合関数を指定した場合，その集合関数の列指定は，HAVING句に先行するFROM句に指定した表を参照（外への参照）してください。

表参照 CROSS JOIN 表一次子

左側に指定した表参照と右側に指定した表一次子との直積を求める場合に指定します。

導出表〔〔AS〕相関名〔（導出列リスト）〕〕

表副問合せを指定します。この問合せで導き出された表をFROM句の導出表と呼びます。表副問合せのｎ番目の列が導出表のｎ番目の列となります。

導出表を含む問合せ指定は読み込み専用となります。

導出表を指定する場合の留意事項を次に示します。

表参照に導出表を指定した場合，導出表に対する相関名を指定してください。ただし，最も外側の問合せに次に示す形式を指定した場合だけ，〔AS〕相関名〔（導出列リスト）〕を省略できます。

SELECT COUNT(*) FROM 導出表

SELECT COUNT_FLOAT(*) FROM 導出表

値式を選択式に指定した表副問合せの結果導出される表の構成列に次の構造，又はデータ型を指定できません。

繰返し構造

BLOB

32,001バイト以上のBINARY

BOOLEAN

抽象データ型

導出表に対して行インタフェース（ROW）は指定できません。

導出表中にはウィンドウ関数を指定できません。

導出表中には予備列を指定できません。

〔AS〕相関名

導出表の名称を指定します。

〔（導出列リスト）〕

導出表の各列の列名を指定します。

導出列リストを省略した場合，導出表中の最も外側の問合せの結果導出される列名が導出表の列名となります。したがって，選択式の列指定（AS句を指定している場合AS句の列名）が導出表の列名となります。それ以外は，HiRDBがSQL文中のどの列名とも異なる列名を仮定します。

導出列リストを省略した場合，表副問合せの結果，導出される列名が重複してはいけません。

同じ列名は導出列リスト中に指定できません。

導出列リストを指定する場合，導出列リスト中の列名の数は，導出表によって導出された表の列数と同じにしてください。

導出列リスト中又は表副問合せによって導出される列数は，30,000以下にしてください。

(4)　共通規則

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(5)　結合表についての規則

外結合を指定した場合，外結合の結果の内表の列にはナル値を指定できるようになります。

「ON 探索条件」に指定できる列は，外表若しくは内表の列，又は外への参照列です。

結合表は，読み込み専用の表とします。

内結合によって導き出される表は，外表と内表のON 探索条件を満たす行を連結したもので構成されます。

外結合によって導き出される表は，外表と内表のON 探索条件を満たす行を連結したものと，外表のON 探索条件を満たさない行に内表の列数分のナル値を追加したもので構成されます。

結合表を含む問合せ指定の場合，外結合の内表から導き出される選択式には，ROWは指定できません。

(6)　FROM句の導出表についての規則

FROM句導出表の選択式には，ROWは指定できません。

FROM句の導出表の選択式には，添字のない繰返し列は指定できません。

FROM句の導出表には，予備列は指定できません。

FROM句の導出表の選択式には，WRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

〔AS〕相関名〔（導出列リスト）〕を省略できる形式（SELECT COUNT(*) FROM 導出表又はSELECT COUNT_FLOAT(*) FROM 導出表）は，WITH句問合せ，ビュー定義，集合演算，INSERT文，及び副問合せに指定できません。

FROM句の導出表を指定すると，内部的に作業表を作成します。ただし，FROM句の導出表に関する次のすべての条件を満たす場合は作業表を作成しません。

FROM句の導出表の条件

・DISTINCTを指定していない

・選択式に副問合せを指定していない

・選択式にBINARY型の列を指定していない

・選択式にコンポネント指定がない

・FROM句に1表だけを指定している

・GROUP BY句，HAVING句，及び集合関数を指定していない

・集合演算を指定していない

・外への参照がある副問合せを指定していない

FROM句の導出表の外側の問合せの条件

・導出表を含む問合せ指定で，外結合の内表として使用していない

・導出表の選択式に列指定以外の値式がある場合，その値式から導出される列指定を，導出表を含む問合せ指定のGROUP BY句に指定していない

・ORDER BY句に指定している導出表のすべての列指定を，選択式に指定している

SQL文全体に対する条件

・プラグイン関数を指定していない

・SQL/XMLスカラ関数，SQL/XML述語，及びSQL/XML集合関数を指定していない

(7)　留意事項

FROM句中で指定した相関名，相関名なしで指定した表名，又は問合せ名の有効範囲は，そのFROM句を含む最も内側の副問合せ，問合せ指定，又は1行SELECT文中です。なお，それらの内側の副問合せも含みます。

副問合せ中のFROM句で相関名を指定すると，表名，又は問合せ名は，有効範囲がありません。

最も外側の問合せ指定，1行SELECT文に直接含まれるFROM句で相関名を指定した場合の表名，又は問合せ名の有効範囲は，内側の副問合せを除いて，問合せ指定，又は1行SELECT文中です。ただし，FROM句の表名，又は問合せ名に対して同一名称の相関名を指定した場合，そのFROM句中に指定した相関名指定のある表名，又は問合せ名は有効範囲がありません。

相関名，表名，又は問合せ名の有効範囲の例を次の図に示します。

副問合せ中のFROM句に指定した表名，又は問合せ名に相関名がある場合，その表名，又は問合せ名は有効範囲がありません（図中のT3）。また，自分の問合せで直接指定した相関名のある表（図中のT2 X）を内側の問合せが参照する場合，列名は表名（T2）ではなく，相関名（X）で修飾してください。

図2‒1　相関名，表名，又は問合せ名の有効範囲の例

同じ名称の有効な相関名，表名，又は問合せ名が複数ある範囲でその名称を参照した場合，最も局所的な有効範囲を持つものが指定されます。このとき，外側の表を参照するには，FROM句で異なる相関名を指定し，その名称で参照してください。

図2‒2　相関名，表名，又は問合せ名の有効範囲の例（FROM句の表名，又は問合せ名に対して同一名称の相関名を指定した場合）

FROM句の表名，又は問合せ名に対して同一名称の相関名を指定した場合，そのFROM句中に指定した相関名指定のある表名，又は問合せ名は有効範囲がありません。

FROMの導出表を指定した場合の相関名，表名，有効範囲の例を次の図に示します。

図2‒3　FROMの導出表を指定した場合の相関名，表名，有効範囲の例

2.7　探索条件

2.7.1　機能

外結合を指定しない場合は，SQL中に指定した探索条件によって論理演算を実行し，その結果が真のものだけを検索の対象にします。外結合を指定する場合は，ON 探索条件が真にならない外表の行も検索の対象にします。

探索条件は次の箇所に指定します。

FROM句中のON 探索条件

WHERE句

HAVING句

探索CASE式のWHEN

トリガ動作条件のWHEN

IF文

WHILE文

検査制約定義

形式

　探索条件：：＝｛〔NOT〕 ｛（探索条件）｜述語｝
　　　　　　　　　｜探索条件 OR ｛（探索条件）｜述語｝
　　　　　　　　　｜探索条件 AND｛（探索条件）｜述語｝｝
　述語：：＝｛NULL述語｜IN述語｜LIKE述語｜XLIKE述語｜SIMILAR述語｜BETWEEN述語
　　　　　　　｜比較述語｜限定述語｜EXISTS述語｜論理述語｜構造化繰返し述語｝

2.7.2　論理演算

次の規則に従って論理演算をします。

論理演算の評価順序は，括弧内，NOT，AND，ORの順

論理演算の最大ネスト数は，255個

論理演算のネスト数は，論理演算子AND，又はOR（NOTは除く）の評価順序を表す括弧を省略しないで指定した場合の括弧のネスト数

名前付き導出表を問合せ指定に指定して，かつ指定した名前付き導出表が内部導出表を作成しない場合，その名前付き導出表を導出した問合せの探索条件がAND論理演算で結合されることで，論理演算の最大ネスト数を超えることがあります。

2.7.3　述語の結果

各論理演算をした場合の述語の結果を，次の図に示します。

なお，NULL述語及び論理述語以外では，ナル値を含む述語の結果は不定になります。不定となった場合，検索の対象にはなりません。

図2‒4　論理演算をした場合の述語の結果

2.7.4　述語の共通規則

比較できるデータについては，「変換（代入，比較）できるデータ型」を参照してください。ただし，各国文字データの比較対象として文字列定数を指定した場合は，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字データは長さチェックだけで，文字コードのチェックはされません。

文字データ同士の比較で，文字集合が異なる場合は比較できません。ただし，次の表に示す条件を満たす場合は，比較対象の文字集合に変換して比較できます。

表2‒1　異なる文字集合間の比較ができる条件（EBCDIKと既定文字集合（SJIS）の場合）

EBCDIKの値式

既定文字集合（SJIS）の値式

文字列定数

埋込み変数，？パラメタ

文字列定数，埋込み変数，？パラメタ以外

文字列定数

−

−

−

埋込み変数，？パラメタ

×

×

×

文字列定数，埋込み変数，？パラメタ以外

○

○

×

（凡例）

○：文字集合（EBCDIK）の文字コードに変換して比較します。

×：比較できません。

−：サポートしていません。

表2‒2　異なる文字集合間の比較ができる条件（UTF16と既定文字集合（UTF-8）の場合）

UTF16の値式

既定文字集合（UTF-8）※の値式

文字列定数

埋込み変数，？パラメタ

文字列定数，埋込み変数，？パラメタ以外

文字列定数

−

−

−

埋込み変数，？パラメタ

●

×

●

文字列定数，埋込み変数，？パラメタ以外

○

○

×

注※

混在文字データを含みます。

（凡例）

○：文字集合（UTF16）の文字コードに変換して比較します。

●：文字集合（UTF-8）の文字コードに変換して比較します。

×：比較できません。

−：サポートしていません。

固定長データと固定長データ，又は固定長データと可変長データを比較する場合は，短い方のデータの右側に比較で使用する文字集合の空白を埋めて，文字列長を同じにしてから比較します。

可変長文字データ同士の比較で，比較するデータの長さが異なる場合は，短い方のデータの長さ分だけ左側から比較します。このとき，結果が等しければ更に文字列長を比較します。

数データ同士の比較で，比較するデータのデータ型が異なる場合は，範囲の広い方のデータ型で比較します。範囲の広さを次に示します。

　FLOAT > SMALLFLT > DECIMAL > INTEGER > SMALLINT

ただし，比較対象の一方がSMALLFLT型の場合，範囲の広さに関係なく，FLOAT型で比較します。

時刻印データ同士の比較で，小数秒精度が異なるデータ同士を比較する場合，精度を高い方に合わせて，拡張した小数秒部分に0を補います。

BINARY型同士の比較で，比較するデータの長さが異なる場合は，短い方のデータの長さ分だけを左側から比較します。このとき，結果が等しければ更にデータ長を比較します。

予備列は指定できません。

2.7.5　述語

(1)　比較述語

形式

　行値構成子 ｛＝｜＜＞｜^＝｜!＝｜＜｜＜＝｜＞｜＞＝｝行値構成子

述語が真となる場合

行値構成子要素が一つの場合

左右の行値構成子要素が，比較条件を満たす場合に真となります。

なお，行値構成子要素のどれかがナル値の場合は不定となります。

行値構成子要素が二つ以上の場合

（＝）

左右の行値構成子中の対応する要素間の関係が，すべて「＝」である場合に真となります。

なお，「＜＞」が成立する要素の組み合わせが一つ以上存在するときは偽となります。

「＜＞」が成立する要素の組み合わせがない場合で，比較する要素にナル値が一つ以上存在するときは不定となります。

・（真となる例）

(1,2,3)＝(1,2,3)

('A','B','C')＝('A','B','C')

（＜＞｜^＝｜!＝）

左右の行値構成子中の対応する要素を比較し，少なくとも一つ「＜＞」が成立する組み合わせが存在する場合に真となります。

なお，対応する要素間の関係がすべて「＝」である場合は偽となります。

「＜＞」が成立する組み合わせが一つも存在しない場合で，比較する要素にナル値が一つ以上存在するときは不定となります。

・（真となる例）

(1,2,3)＜＞(1,5,3)

('A','B','C')＜＞('C','A','B')

（＜）

左右の行値構成子中の対応する要素を左から順に，「＝」が成立する間比較をします。「＝」が成立しない最初の要素間に「＜」の関係が成立する場合に真となります。

なお，「＝」が成立しない最初の要素間の関係が「＞」である場合，及び対応する要素間のすべてに「＝」が成立する場合は偽となります。

「＝」が成立しない最初の要素にナル値が存在する場合は不定となります。

・（真となる例）

(1,2,3)＜(3,1,2)

1番目の要素間の関係が1＜3であるため，真となります。

('A','B','C','D')＜('A','B','E','A')

左から順に比較し，「＝」の成立しない最初の要素間の関係が'C'＜'E'であるため，真となります。

（＞）

左右の行値構成子中の対応する要素を左から順に，「＝」が成立する間比較をします。「＝」が成立しない最初の要素間に「＞」の関係が成立する場合に真となります。

なお，「＝」が成立しない最初の要素間の関係が「＜」である場合，又は対応する要素間のすべてに「＝」が成立する場合は偽となります。

「＝」が成立しない最初の要素にナル値が存在する場合は不定となります。

・（真となる例）

(1,2,3)＞(1,1,5)

左から順に比較し，「＝」が成立しない最初の要素間の関係が2＞1であるため，真となります。

('A','A',C')＞('A','A','A')

左から順に比較し，「＝」が成立しない最初の要素間の関係が'C'＞'A'であるため，真となります。

（＜＝）

左右の行値構成子中の対応する要素を左から順に，「＝」が成立する間比較をします。「＝」が成立しない最初の要素間に「＜」の関係が成立する場合，又は対応する要素間のすべてに「＝」の関係が成立する場合に真となります。

なお，「＝」が成立しない最初の要素間の関係が「＞」である場合は偽となります。

「＝」が成立しない最初の要素にナル値が存在する場合は不定となります。

（＞＝）

左右の行値構成子中の対応する要素を左から順に，「＝」が成立する間比較をします。「＝」が成立しない最初の要素間に「＞」の関係が成立する場合，又は対応する要素間のすべてに「＝」の関係が成立する場合に真となります。

なお，「＝」が成立しない最初の要素間の関係が「＜」である場合は偽となります。

「＝」が成立しない最初の要素にナル値が存在する場合は不定となります。

各比較述語は，論理演算を用いた形に展開できます。論理演算を用いて展開した形式を次に示します。

演算子

行値構成子を用いた記述

論理演算を用いた記述

＝

(Rx1,Rx2,…,Rxn)＝(Ry1,Ry2,…,Ryn)

Rx1=Ry1 AND Rx2=Ry2 AND…AND Rxn=Ryn

＜＞

(Rx1,Rx2,…,Rxn)＜＞(Ry1,Ry2,…,Ryn)

Rx1<>Ry1 OR Rx2<>Ry2 OR … OR Rxn<>Ryn

＜

(Rx1,Rx2,Rx3,…,Rxn)＜(Ry1,Ry2,Ry3,…,Ryn)

Rx1<Ry1 OR

(Rx1=Ry1 AND Rx2<Ry2) OR

(Rx1=Ry1 AND Rx2=Ry2 AND Rx3<Ry3) OR … OR (Rx1=Ry1 AND Rx2=Ry2 AND Rx3=Ry3 AND … AND Rxn-1=Ryn-1 AND Rxn<Ryn)

＞

(Rx1,Rx2,Rx3,…,Rxn)＞(Ry1,Ry2,Ry3,…,Ryn)

Rx1>Ry1 OR

(Rx1=Ry1 AND Rx2>Ry2) OR

(Rx1=Ry1 AND Rx2=Ry2 AND Rx3>Ry3) OR …

OR (Rx1=Ry1 AND Rx2=Ry2 AND Rx3=Ry3 AND … AND Rxn-1=Ryn-1 AND Rxn>Ryn)

規則

比較演算子（＝，＜＞，^＝，!＝，＜，＜＝，＞，＞＝）の両側に定数だけの行値構成子を指定してもかまいません。

演算結果のデータ型が，次のデータ型となる値を指定できません。

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

行値構成子については，「行値構成子」を参照してください。

左右の行値構成子中で，同じ位置にある行値構成子要素を対応値とします。対応値のデータ型は比較可能なデータ型にしてください。

次に示す箇所の比較述語には，副問合せは指定できません。

IF文の探索条件

WHILE文の探索条件

CREATE TRIGGERのWHEN探索条件（トリガ動作条件）

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，対応値との比較結果は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，比較結果は真となります。比較結果が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，その比較結果は不定になります。比較結果が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないと対応値との比較結果は不定になります。

比較対象となる行値構成子は，結果の列数を同じにしてください。

うるう秒は1分より小さい値として扱われます。

（例）

　'00:00:61' < '00:01:00'

(2)　NULL述語

形式

　値式 IS 〔NOT〕 NULL

述語が真となる場合

指定した値式の値がナル値である行に対して，NULL述語は真になります。NOTを指定した場合は，ナル値でない行に対して真になります。ナル値については，「ナル値」を参照してください。

規則

次のデータ型の値式は，指定できません。

BLOB（？パラメタ，又は埋込み変数を単独で指定した場合を除く）

定義長が32,001バイト以上のBINARY（？パラメタ，又は埋込み変数を単独で指定した場合を除く）

BOOLEAN

繰返し列を添字なしで指定した場合，その列に要素がないとき（NOT指定の場合は要素が一つ以上あるとき）に，NULL述語は真となります。列のすべての要素がナル値であっても，NULL述語は真とはなりません。

繰返し列を添字付きで指定した場合，指定した要素がナル値ならばNULL述語は真となります。

繰返し列を添字付きで指定した場合，その要素がないとNULL述語は不定になります。

繰返し列を添字付きで指定する場合は，添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，NULL述語は真となります。

留意事項

オーバフローエラー抑止が設定されている場合，値式の演算結果がオーバフローによってナル値となった場合にも，NULL述語は真となります。

(3)　IN述語

形式

　行値構成子〔IS〕 〔NOT〕 IN
　｛（行値構成子〔，行値構成子〕…）｜
　　〈表副問合せ〉
　　（〔副問合せ実行方式のSQL最適化指定〕
　　　SELECT〔｛ALL｜DISTINCT｝〕｛選択式｜＊｝
　　　〈表 式〉
　　　　FROM 表参照〔，表参照〕…
　　　　〔WHERE 探索条件〕
　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　〔HAVING 探索条件〕）｝

述語が真となる場合

次の条件のどちらかを満たしている場合，IN述語は真となります。

左側の行値構成子が，右側の任意の行値構成子と一致する場合。

左側の行値構成子が，表副問合せの任意の結果行と一致する場合。

NOTを指定した場合は，左側の行値構成子が，右側に指定したすべての行値構成子又は表副問合せのすべての結果行と一致しない行に対して，IN述語は真となります。

規則

行値構成子又は表副問合せの結果の各データ項目が，次のデータ型となる値を指定できません。

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

右側の行値構成子は，最大30,000個指定できます。

右側が表副問合せでないIN述語の左辺には，値指定だけの行値構成子を指定できません。

表副問合せについては，「副問合せ」を参照してください。

IN述語は，限定述語と同じ意味を表すものがあります。同じ意味を表す述語を次に示します。

IN述語

限定述語

行値構成子 IN 表副問合せ

行値構成子 ＝ ANY 表副問合せ

又は

行値構成子 ＝ SOME 表副問合せ

行値構成子 NOT IN 表副問合せ

行値構成子 ＜＞ ALL 表副問合せ

表副問合せの結果が空集合の場合，IN述語の結果は偽になります。ただし，NOTを指定した場合は真になります。

次に示す箇所のIN述語には，表副問合せは指定できません。

IF文の探索条件

WHILE文の探索条件

CREATE TRIGGERのWHEN探索条件（トリガ動作条件）

各行値構成子中で，同じ位置にある行値構成子要素及び表副問合せの選択式を対応値とします。対応値のデータ型は，変換，又は比較できるデータ型にしてください。ただし，左側に指定した行値構成子中の行値構成子要素の結果のデータ型が各国文字データで，その対応値に文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，IN述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，IN述語は真となります。IN述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，そのIN述語は不定になります。IN述語が真又は不定でない場合，偽となります。

右側の行値構成子には，添字にANYを指定した繰返し列を指定できません。

繰返し列を添字付きで指定した場合，その要素がないとIN述語は不定になります。

行値構成子の結果がナル値の場合，その対応値の比較結果は不定となります。

比較対象となる行値構成子は，結果の列数を同じにしてください。

留意事項

IN述語に表副問合せを指定した場合，HiRDBが作業表を作成することがあります。このとき，作業表の行長によっては，IN述語の副問合せの処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(4)　LIKE述語

形式

　値式 〔NOT〕 LIKE パターン文字列 〔ESCAPE エスケープ文字〕

述語が真となる場合

指定した値式の値が，パターン文字列の表すパターンと一致する行に対して，LIKE述語は真になります。NOTを指定した場合は，パターン文字列の表すパターンと一致しない行に対して，述語は真になります。

（値式）

値式には，文字列のパターン比較の対象となる値式を指定します。ただし，SQL変数，及びSQLパラメタ以外の値指定だけの値式は指定できません。

値式及びパターン文字列に指定できるデータ型は，文字列データ，各国文字列データ，混在文字列データ，又は定義長が32,000バイト以下のBINARYです。

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，LIKE述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，LIKE述語は真となります。LIKE述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，そのLIKE述語は不定になります。LIKE述語が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないとLIKE述語は不定になります。

（パターン文字列）

パターン文字列には，値指定を指定します。

指定できるパターン文字列のデータ型は，値式に指定できるデータ型と同じです。

値式のデータ型とパターン文字列のデータ型の組み合わせは，次のとおりです。

値式のデータ型

パターン文字列，又はエスケープ文字列のデータ型

文字列データ

各国文字列

データ

混在文字列

データ

バイナリ

データ

既定文字集合

EBCDIK

UTF16

文字列データ

既定文字集合

○

×

×

×

○

×

EBCDIK

△※３

○

×

×

UTF16

△※３

×

○

各国文字列データ

△※１

×

×

○

×

×

混在文字列データ

○

×

×

×

○

×

バイナリデータ

△※２

×

×

×

×

○

（凡例）

○：指定できます。

△：制限付きで指定できます。

×：指定できません。

注※1

パターン文字列には文字列定数だけ指定できます。この場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。特殊文字を指定する場合は，必ず全角文字で指定してください。

注※2

16進文字列定数だけ指定できます。

注※3

文字列定数，埋込み変数，又は？パラメタだけ指定できます。

値式，パターン文字列，エスケープ文字列の文字集合は，同じにしてください。ただし，パターン文字列，エスケープ文字列が次に示す場合は，値式の文字集合に変換されるので比較できます。

・文字列定数

・埋込み変数（既定文字集合）

・？パラメタ

パターン文字列中の特殊文字には，＿（下線），%（パーセント），及びエスケープ文字があります。バイナリデータでの特殊文字は，＿，％，及びエスケープ文字を表すコードを指定してください。パターン文字列中の特殊文字＿と%の意味を次の表に示します。

表2‒3　パターン文字列中での特殊文字の意味（LIKE述語）

特殊文字

項目指定のデータ型

特殊文字の意味

特殊文字の表現方法

＿（下線）

文字列データ

既定文字集合※1

任意の1文字

半角文字の_（下線）

EBCDIK※1

UTF16

各国文字列データ

全角文字の＿（下線）

混在文字列データ

半角文字の_（下線）

バイナリデータ

任意の1バイト

5f（下線を表すコード）※3

%（パーセント）

文字列データ

既定文字集合※1

任意の長さ（0文字以上）の任意の文字列

半角文字の%（パーセント）

EBCDIK※1

UTF16

各国文字列データ※2

全角文字の％（パーセント）

混在文字列データ

半角文字の%（パーセント）

バイナリデータ

任意の長さ（0バイト以上）の任意のバイト列

25（パーセントを表すコード）※3

注※1

すべての文字，又はデータ値を1バイト文字として扱います。

注※2

すべての文字，又はデータ値を2バイト文字として扱います。

注※3

バイナリデータで特殊文字を指定する場合は，HiRDBのセットアップ時に指定した文字コードで，かつ特殊文字（＿又は％）を表すコードを指定してください。

パターン文字列中に%を含まない場合，列のデータとパターン文字列の長さが異なる場合は，この述語は真になりません。

値式で指定した文字列とパターン文字列が，可変長データ（VARCHAR，NVARCHAR，MVARCHAR，又はBINARY）の場合は，値式のデータとパターン文字列データとの比較のほかに，データ長も比較します。

パターン文字列として埋込み変数，SQL変数，又はSQLパラメタを指定する場合，次のことに注意してください。パターン文字列を固定長の埋込み変数，SQL変数，又はSQLパラメタにした場合に変数の長さより短いパターン文字列を設定すると，変数の後ろに空白が入ったり，残っていた不当文字が値として設定されてしまう場合があります。このようなパターン文字列で検索すると，後ろに空白，又は不当文字と同じ値がないデータは検索されません。したがって，固定長の変数をパターン文字列として使用する場合は，後ろにすべて%を設定する必要があります。

（例）

変数にパターン文字列として'AB%'，及び'AB%%'を設定した場合，文字列データが'ABCD'のときの比較を次に示します。

変数のデータ型

パターン文字列

文字列データ

比較結果

可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）

'AB%'

'ABCD'

一致します

'AB%%'

'ABCD'

一致します

固定長文字列（4バイト）

'AB%△'

'ABCD'

一致しません

'AB%%'

'ABCD'

一致します

（例）

変数にパターン文字列としてX'52454425'を設定した場合，バイナリデータが52454452554dのときの比較を次に示します。

変数のデータ型

パターン文字列

バイナリデータ

比較結果

BINARY型

X'52454425'

52454452554d

一致します

X'5245442525'

52454452554d

一致します

パターン文字列の例

LIKE述語の代表的なパターン文字列の例を次の表に示します。

表2‒4　LIKE述語の代表的なパターン文字列の例

項　目

パターン文字列

意　味

例

パターン文字列

パターンの一致する文字列

前方一致

nnn%

文字列の先頭部分がnnnです。

'ACT%'

ACT，ACTOR，ACTIONなどACTで始まる文字列

後方一致※1

%nnn

文字列の最後の部分がnnnです。

'%ING'

ING，BEING，HAVINGなどINGで終わる文字列

任意一致

%nnn%

文字列中の任意の部分にnnnを含みます。

N'%日%'

日，日立，昨日，本日中など日を含む文字列※2

完全一致

nnn

文字列がnnnと同じです。

'EQUAL'

EQUAL

部分一致

_…_nnn_…_

文字列中の特定の部分がnnnと同じで，ほかの部分には任意の文字があります。

'_I_'

BIT，HIT，KITなど3文字で2文字目がIの文字列

その他

nnn%mmm

文字列の先頭部分が nnnで，最後の部分がmmmです。

'O%N'

ON，OWN，ORIGINなどOで始まりNで終わる文字列

%nnn%mmm%

文字列中の任意の部分にnnnを含み，その部分より後の任意の部分にmmmを含みます。

'%O%N%'

ON，ONE，DOWN，COUNTなどOを含み，その部分より後にNを含む文字列

nnn_…_mmm%

先頭部分がnnnで始まり，後方にmmmがある文字列です。

'CO_ _ECT%'

CORRECT，

CONNECTOR，

CONNECTIONなどCOで始まり5文字目から7文字目がECTの文字列

注

nnn，mmmは，%，_を含まない任意の文字列

注※1

空白も比較対象の文字として扱うため，後方に空白のあるデータと比較した場合，結果は偽になります。

注※2

各国文字列中での特殊文字（%，_）は，各国文字の「%」，「_」を使用します。

エスケープ文字

パターン文字列中に ＿（下線）や%（パーセント）を記述すると，無条件に特殊文字とみなされ，通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は，エスケープ文字を指定します。キーワードESCAPEの後に，任意の1文字（エスケープ文字）を指定しておくと，パターン文字列中に記述したエスケープ文字の直後の特殊文字を通常の文字として扱えます。

（例1）

'5%'，'25%'など，文字列中に'5%'を含む文字列の場合

  '%5?%%' ESCAPE '?'

（例2）

'SQLPRINT_REC'など，文字列の最後が'PRINT_REC'となる文字列の場合

  '%PRINT@_REC' ESCAPE '@'

（例3）

X'48695244425f'など，バイナリ列中にX'48695244425f'を含む16進文字列の場合

  X'4869524442ee5f' ESCAPE X'ee'

エスケープ文字に指定できる文字を次に示します。

項目のデータ型

指定できる文字

文字データ（CHAR，VARCHAR）

既定文字集合

任意の1文字（1バイト文字）※1

EBCDIK

UTF16

任意の1文字※2

混在文字データ（MCHAR，MVARCHAR）

任意の1文字※2

各国文字データ（NCHAR，NVARCHAR）

任意の1文字（2バイト文字）※3

バイナリデータ（BINARY）

任意の1バイトの値

注

エスケープ文字の次には，必ず特殊文字を指定してください。

注※1

すべての文字，又はデータ値を1バイト文字として扱います。

注※2

文字でないデータ値の場合は，その文字コードの最小の長さ（UTF16の場合は長さ2，UTF8，SJISなどの場合は長さ1）の文字として扱います。

注※3

すべての文字，又はデータ値を2バイト文字として扱います。

留意事項

LIKEの左辺の値式で使用する列の定義長は，255バイト以下（CHAR，VARCHAR，MCHAR，MVARCHAR，及びBINARY）又は，127文字以下（NCHAR，及びNVARCHAR）の方が性能が良くなります。

CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合，そのマルチバイト文字は1バイトずつ評価されます。したがって，パターン文字列中に指定した1バイト文字の文字コードが，マルチバイト文字の文字コードに含まれる場合，LIKE述語の結果は真となります。

(例)

sjisの文字コードでセットアップし，表T1にCHAR型の列C1があり，列C1中に「ア」という行がある状態で，次の問合せを実行します。

SELECT C1 FROM T1 WHERE C1 LIKE '%A%' ;

「ア」は，文字コードを16進数で表すと8341となります。パターン文字列中の「A」は，文字コードを16進数で表すと41となります。したがって，マルチバイト文字である「ア」の文字コードの中に，1バイト文字「A」の文字コードを含んでいるため，LIKE述語の結果は真となります。

(5)　XLIKE述語

形式

　値式 〔NOT〕 XLIKE パターン文字列 〔ESCAPE エスケープ文字〕

述語が真となる場合

指定した値式の値が，パターン文字列の表すパターンと一致する行に対して，XLIKE述語は真になります。NOTを指定した場合は，パターン文字列の表すパターンと一致しない行に対して，述語は真になります。ただし，比較するときに大文字と小文字が区別されないため，同等に扱われます。

（値式）

値式には，文字列のパターン比較の対象となる列を指定します。ただし，SQL変数，及びSQLパラメタ以外の値指定だけの値式は指定できません。

指定できる値式のデータ型は，文字列データ，各国文字データ，又は混在文字列データです。

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，XLIKE述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，XLIKE述語は真となります。XLIKE述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，そのXLIKE述語は不定になります。XLIKE述語が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないとXLIKE述語は不定になります。

（パターン文字列）

パターン文字列には，値指定を指定します。

指定できるパターン文字列のデータ型は，値式に指定できるデータ型と同じです。

値式のデータ型とパターン文字列のデータ型の組み合わせは，次のとおりです。

値式のデータ型

パターン文字列，又はエスケープ文字のデータ型

文字列データ

各国文字列

データ

混在文字列

データ

既定

文字集合

EBCDIK

UTF16

文字列データ

既定文字集合

○

×

×

×

○

EBCDIK

△※2

○

×

×

UTF16

△※2

×

○

各国文字列データ

△※1

×

×

○

×

混在文字列データ

○

×

×

×

○

（凡例）

○：指定できます。

△：制限付きで指定できます。

×：指定できません。

注※1

パターン文字列には文字列定数だけ指定できます。この場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。特殊文字を指定する場合は，必ず全角文字で指定してください。

注※2

文字列定数，埋込み変数，又は？パラメタだけ指定できます。

値式，パターン文字列，エスケープ文字列の文字集合は，同じにしてください。ただし，パターン文字列，エスケープ文字列が次に示す場合は，値式の文字集合に変換されるので比較できます。

・文字列定数

・埋込み変数（既定文字集合）

・？パラメタ

パターン文字列中の特殊文字には，＿（下線），%（パーセント），及びエスケープ文字があります。パターン文字列中の特殊文字のうち＿と%の意味を次の表に示します。

表2‒5　パターン文字列中での特殊文字の意味（XLIKE述語）

特殊文字

項目指定のデータ型

特殊文字の意味

特殊文字の表現方法

＿（下線）

文字列データ

既定文字集合※1

任意の1文字

半角文字の_（下線）

EBCDIK※1

UTF16

各国文字列データ

全角文字の＿（下線）

混在文字列データ

半角文字の_（下線）

%（パーセント）

文字列データ

既定文字集合※1

任意の長さ（0文字以上）の任意の文字列

半角文字の%（パーセント）

EBCDIK※1

UTF16

各国文字列データ※2

全角文字の％（パーセント）

混在文字列データ

半角文字の%（パーセント）

注※1

すべての文字，又はデータ値を1バイト文字として扱います。

注※2

すべての文字，又はデータ値を2バイト文字として扱います。

パターン文字列データの比較時に，大文字と小文字の区別をしない文字を次に示します。

・'A'〜'Z'と'a'〜'z'

・'ア'〜'オ'，'ヤ'，'ユ'，'ヨ'，'ツ'と'ァ'〜'ォ'，'ャ'，'ュ'，'ョ'，'ッ'

・'-'（ハイフン）と'ー'（長音）

・'あ'〜'お'，'や'，'ゆ'，'よ'，'つ'と'ぁ'〜'ぉ'，'ゃ'，'ゅ'，'ょ'，'っ'

　（各国文字及び混在文字）

パターン文字列中に%を含まない場合，列のデータとパターン文字列の長さが異なる場合は，この述語は真になりません。

値式で指定した文字列とパターン文字列が，可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の場合は，文字列データとパターン文字列データとの比較のほかに文字列長も比較します。

パターン文字列として埋込み変数，SQL変数，又はSQLパラメタを指定する場合，次のことに注意してください。パターン文字列を固定長の埋込み変数，SQL変数，又はSQLパラメタにした場合に変数の長さより短いパターン文字列を設定すると，変数の後ろに空白が入ったり，残っていた不当文字が値として設定されたりしてしまう場合があります。このようなパターン文字列で検索すると，後ろに空白，又は不当文字と同じ値がないデータは検索されません。したがって，固定長の変数をパターン文字列として使用する場合は，後ろにすべて%を設定する必要があります。

パターン文字列の例

XLIKE述語の代表的なパターン文字列の例を次の表に示します。

表2‒6　XLIKE述語の代表的なパターン文字列の例

項　目

パターン文字列

意　味

例

パターン文字列

パターンの一致する文字列

前方一致

nnn%

文字列の先頭部分がnnnです。

'ACT%'

ACT，Actor，ActionなどACT※1で始まる文字列

後方一致

%nnn

文字列の最後の部分がnnnです。

'%ING'

Ing，Being，HAVINGなどING※2で終わる文字列

任意一致

%nnn%

文字列中の任意の部分にnnnを含みます。

'%or%'

OR，More，CoLorなどor※3を含む文字列

完全一致

nnn

文字列がnnnと同じです。

'MAX'

MAX，max，mAx※4などの文字列

部分一致

_…_nnn_…_

文字列中の特定の部分がnnnと同じで，ほかの部分には任意の文字があります。

'_I_'

Bit，HIT，Kitなど3文字で2文字目がIの文字列

その他

nnn%mmm

文字列の先頭部分がnnnで，最後の部分がmmmです。

'O%N'

on，Own，ORIGINなどOかoで始まりNかnで終わる文字列

%nnn%mmm%

文字列中の任意の部分にnnnを含み，その部分より後の任意の部分にmmmを含みます。

'%O%N%'

ON，one，DowN，CountなどOかoを含み，その部分より後にNかnを含む文字列

nnn_…_mmm%

先頭部分がnnnで始まり，後方にmmmがある文字列です。

'CO_ _ECT%'

correct，Connector，

CONNECTIONなど

CO※5で始まり5文字目から7文字目がECT※6の文字列

注1

nnn，mmmは，%，_を含まない任意の文字列

注2

空白も比較対象の文字として扱うため，後方に空白のあるデータと比較した場合，結果は偽になります。

注3

各国文字列中での特殊文字（%，＿）は，各国文字の「%」，「＿」を使用します。

注※1

ACT，ACt，AcT，Act，aCT，aCt，acT，actのどれかの文字列

注※2

ING，INg，Ing，InG，iNG，iNg，inG，ingのどれかの文字列

注※3

OR，Or，oR，orのどれかの文字列

注※4

MAX，MAx，Max，MaX，mAX，mAx，maX，maxのどれかの文字列

注※5

CO，Co，cO，coのどれかの文字列

注※6

ECT，ECt，Ect，EcT，eCT，eCt，ecT，ectのどれかの文字列

エスケープ文字

パターン文字列中に ＿（下線）や %（パーセント）を記述すると，無条件に特殊文字とみなされ，通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は，エスケープ文字を指定します。キーワードESCAPEの後に，任意の1文字（エスケープ文字）を指定しておくと，パターン文字列中に記述したエスケープ文字の直後の特殊文字を通常の文字として扱えます。

（例1）

'5%'，'25%'など，文字列中に'5%'を含む文字列の場合

  '%5?%%' ESCAPE '?'

（例2）

'SQLPRINT_REC'など，文字列の最後が'PRINT_REC'となる文字列の場合

  '%PRINT@_REC' ESCAPE '@'

エスケープ文字に指定できる文字を次に示します。

項目のデータ型

指定できる文字

文字データ（CHAR，VARCHAR）

既定文字集合

任意の1文字（1バイト文字）※1

EBCDIK

UTF16

任意の1文字※2

混在文字データ（MCHAR，MVARCHAR）

任意の1文字※2

各国文字データ（NCHAR，NVARCHAR）

任意の1文字（2バイト文字）※3

注

エスケープ文字の次には，必ず特殊文字を指定してください。

注※1

すべての文字，又はデータ値を1バイト文字として扱います。

注※2

文字でないデータ値の場合は，その文字コードの最小の長さ（UTF16の場合は長さ2，UTF8，SJISなどの場合は長さ1）の文字として扱います。

注※3

すべての文字，又はデータ値を2バイト文字として扱います。

留意事項

XLIKEの左辺の値式で使用する列の定義長は，255バイト以下（CHAR，VARCHAR，MCHAR，及びMVARCHAR），又は127文字以下（NCHAR，及びNVARCHAR）の方が性能が良くなります。

CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合，そのマルチバイト文字は1バイトずつ評価されます。したがって，パターン文字列中に指定した1バイト文字の文字コードが，マルチバイト文字の文字コードに含まれる場合，XLIKE述語の結果は真となります。

（例）

sjisの文字コードでセットアップし，表T1にCHAR型の列C1があり，列C1中に「ア」という行がある状態で，次の問合せを実行します。

SELECT C1 FROM T1 WHERE C1 XLIKE '%A%' ;

「ア」は，文字コードを16進数で表すと8341となります。パターン文字列中の「A」は，文字コードを16進数で表すと41となります。したがって，マルチバイト文字である「ア」の文字コードの中に，1バイト文字「A」の文字コードを含んでいるため，XLIKE述語の結果は真となります。

(6)　SIMILAR述語

形式

　値式 〔NOT〕 SIMILAR TO パターン文字列 〔ESCAPE エスケープ文字〕

述語が真となる場合

指定した値式の値がパターン文字列の表すパターンと一致する行に対して，SIMILAR述語は真になります。NOTを指定した場合は，パターン文字列の表すパターンと一致しない行に対して，述語は真になります。ただし，パターン文字列の長さが0の場合，値式の長さが0のときにSIMILAR述語は真になります。

規則

（値式）

値式には，文字列のパターン比較の対象となる値式を指定します。ただし，？パラメタ，及び埋込み変数の値指定だけの値式は指定できません。

値式及びパターン文字列に指定できるデータ型は，文字列データ，各国文字列データ，混在文字列データ，又は定義長が32,000バイト以下のBINARYです。

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，SIMILAR述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，SIMILAR述語は真となります。SIMILAR述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定の場合，そのSIMILAR述語は不定になります。SIMILAR述語が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないとSIMILAR述語は不定になります。

（パターン文字列）

パターン文字列には，値式を指定します。

値式に繰返し列は指定できません。

値式のデータ型とパターン文字列のデータ型の組み合わせを，次の表に示します。

値式のデータ型

パターン文字列，又はエスケープ文字のデータ型

文字列データ

各国文字列

データ

混在文字列

データ

バイナリ

データ

既定文字集合

EBCDIK

UTF16

文字列データ

既定文字集合

○

×

×

×

○

×

EBCDIK

△※3

○

×

×

UTF16

△※3

×

○

各国文字列データ

△※１

×

×

○

×

×

混在文字列データ

○

×

×

×

○

×

バイナリデータ

△※２

×

×

×

×

○

（凡例）

○：指定できます。

△：制限付きで指定できます。

×：指定できません。

注※1

パターン文字列には文字列定数だけ指定できます。この場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。なお，特殊文字を指定する場合は，必ず全角文字で指定してください。

注※2

16進文字列定数だけ指定できます。

注※3

文字列定数，埋込み変数，又は？パラメタだけ指定できます。

値式，パターン文字列，エスケープ文字列の文字集合は，同じにしてください。ただし，パターン文字列，エスケープ文字列が次に示す場合は，値式の文字集合に変換されるので比較できます。

・文字列定数

・埋込み変数（既定文字集合）

・？パラメタ

パターン文字列に指定する正規表現の形式を次に示します。

正規表現 ：：＝ 正規項 ｜ 正規表現 垂直棒 正規表現
正規項 ：：＝ 正規因子｜ 正規項 正規因子
正規因子 ：：＝   正規一次子
               ｜ 正規一次子 *
               ｜ 正規一次子 +
               ｜ 正規一次子 ?
               ｜ 正規一次子 繰返し因子
繰返し因子 ：：＝ 左波括弧 下限値 ［ 上限指定 ］ 右波括弧
上限指定 ：：＝ コンマ ［ 上限値 ］
正規一次子 ：：＝   文字指定子
                 ｜ %
                 ｜ 正規文字集合
                 ｜ 正規文字集合識別子指定
                 ｜ 左括弧 正規表現 右括弧
文字指定子 ：：＝   エスケープされない文字
                 ｜ エスケープされた文字
正規文字集合 ：：＝   _
                   ｜ 左角括弧 文字列挙… 右角括弧
                   ｜ 左角括弧 ^ 文字列挙… 右角括弧
文字列挙 ：：＝   文字指定子
               ｜ 文字指定子 負符号 文字指定子
               ｜ 正規文字集合識別子指定
正規文字集合識別子指定 ：：＝ 左角括弧 コロン 正規文字集合識別子 コロン 右角括弧

パターン文字列に指定する正規表現の構文規則を次に示します。

・正規文字集合識別子には次のどれかを指定します。

　'ALPHA'，'UPPER'，'LOWER'，'DIGIT'，'ALNUM'，'SPACE'，'WHITESPACE'

・エスケープされない文字には，特殊文字を除く任意の1文字を指定します。特殊文字を次に示します。

特殊文字

バイナリデータで指定するコード

文字集合なし

文字集合あり

EBCDIK

UTF16

_（下線文字）

X'5F'

X'6D'

U+005F

%（パーセント）

X'25'

X'6C'

U+0025

*（アスタリスク）

X'2A'

X'5C'

U+002A

+（正符号）

X'2B'

X'4E

U+002B

?（疑問符）

X'3F'

X'6F'

U+003F

｜（垂直棒）

X'7C'

X'4F'

U+007C

(（左括弧）

X'28'

X'4D'

U+0028

)（右括弧）

X'29'

X'5D'

U+0029

{（左波括弧）

X'7B'

X'C0'

U+007B

}（右波括弧）

X'7D'

X'D0'

U+007D

[（左角括弧）

X'5B'

X'4A'

U+005B

]（右角括弧）

X'5D'

X'5A'

U+005D

エスケープ文字

ESCAPEに指定した値

-（負符号）※

X'2D'

X'60'

U+002D

:（コロン）※

X'3A'

X'7A'

U+003A

^（サーカムフレックス）※

X'5E'

X'5F'

U+005E

注※　文字列挙中でだけ特殊文字として扱います。

・エスケープされた文字には，特殊文字そのものを指定したい場合に，エスケープ文字に続けてエスケープする特殊文字を指定します。

・下限値と上限値には，0≦下限値≦上限値≦256を満たす整数を指定します。

パターン文字列に指定する正規表現の各指定の意味を，次の表に示します。

表2‒7　正規表現の各指定の意味

正規表現の指定

意味

文字指定子

文字指定子で指定された文字（長さ1の文字列）を意味します。

_（下線文字）

長さが1の任意の文字を意味します。

%（パーセント）

長さが0以上の任意の文字列を意味します。

正規一次子*

直前の正規一次子の，0回以上の繰り返しを意味します。

正規一次子+

直前の正規一次子の，1回以上の繰り返しを意味します。

正規一次子?

直前の正規一次子の，0回又は1回の繰り返しを意味します。

正規表現｜正規表現

｜の左右に指定した正規表現のうちのどちらかを意味します。

(正規表現)

( )内で指定した正規表現のグループ化を意味します。

正規表現を使用する際に，正規表現であることを明確にする場合に使用します。主に「｜」を使用するときに利用します。

正規一次子{n}

正規一次子{n,m}

正規一次子{n,}

直前の正規一次子の繰り返しを意味します。繰り返し回数の指定方法と意味を次に示します。

｛n｝ ：直前の正規表現の，ｎ回の繰り返し

｛n,m｝：直前の正規表現の，ｎ回以上ｍ回以下の繰り返し

｛n,｝ ：直前の正規表現の，ｎ回以上の繰り返し

[文字列挙…]

列挙された文字のうちの任意の文字を意味します。

[^文字列挙…]

列挙された文字を除く任意の文字を意味します。

文字指定子1-文字指定子2

文字列挙中に指定した場合，文字指定子1が示す文字から文字指定子2が示す文字までの任意の文字（文字コードによる範囲）を意味します。

[:ALPHA:]

任意の英大文字（¥，@，#は含まない），又は英小文字

[:UPPER:]

任意の英大文字（¥，@，#は含まない）

[:LOWER:]

任意の英小文字

[:DIGIT:]

任意の数字

[:ALNUM:]

任意の英大文字（¥，@，#は含まない），英小文字，又は数字

[:SPACE:]

半角の空白文字（ただし，値式が各国文字列データの場合は，全角の空白文字）

[:WHITESPACE:]

次の表に示す文字コードの文字のうち，任意の1文字（文字コード種別によって[:WHITESPACE:]が意味する文字は異なる）

[:WHITESPACE:]に含まれる文字の文字コードを次の表に示します。

Unicode(UTF-8)

シフトJIS漢字

EUC日本語漢字，

EUC中国語漢字

中国語漢字(GB18030)

LANG-C

Unicode規格で定められた文字の名前

既定文字集合

UTF16

既定文字集合

EBCDIK

X'09'

U+0009

X'09'

X'05'

X'09'

X'09'

X'09'

Horizontal Tabulation

X'0A'

U+000A

X'0A'

X'15'

X'0A'

X'0A'

X'0A'

Line Feed

X'0B

U+000B

X'0B

X'0B'

X'0B

X'0B

X'0B

Vertical Tabulation

X'0C'

U+000C

X'0C'

X'0C'

X'0C'

X'0C'

X'0C'

Form Feed

X'0D'

U+000D

X'0D'

X'0D'

X'0D'

X'0D'

X'0D'

Carriage Return

X'20'

U+0020

X'20'

X'40'

X'20'

X'20'

X'20'

Space

X’C285’

U+0085

−

−

−

X'81308135'

−

Next Line※

X’C2A0’

U+00A0

−

−

−

X'81308432'

−

No-Break Space※

X’E19A80’

U+1680

−

−

−

X'8134AC34'

−

Ogham Space Mark※

X’E28080’

U+2000

−

−

−

X'8136A336'

−

En Quad※

X’E28081’

U+2001

−

−

−

X'8136A337'

−

Em Quad※

X’E28082’

U+2002

−

−

−

X'8136A338'

−

En Space※

X’E28083’

U+2003

−

−

−

X'8136A339'

−

Em Space※

X’E28084’

U+2004

−

−

−

X'8136A430'

−

Three-Per-Em Space※

X’E28085’

U+2005

−

−

−

X'8136A431'

−

Four-Per-Em Space※

X’E28086’

U+2006

−

−

−

X'8136A432'

−

Six-Per-Em Space※

X’E28087’

U+2007

−

−

−

X'8136A433'

−

Figure Space※

X’E28088’

U+2008

−

−

−

X'8136A434'

−

Punctuation Space※

X’E28089’

U+2009

−

−

−

X'8136A435'

−

Thin Space※

X’E2808A’

U+200A

−

−

−

X'8136A436'

−

Hair Space※

X’E280A8’

U+2028

−

−

−

X'8136A635'

−

Line Separator※

X’E280A9’

U+2029

−

−

−

X'8136A636'

−

Paragraph Separator※

X’E280AF’

U+202F

−

−

−

X'8136A732'

−

Narrow No-Break Space※

X’E38080’

U+3000

0x8140

−

X’A1A1’

X’A1A1’

−

Ideographic Space※

（凡例）

−：該当しません。

注※

値式が文字列型の場合は，[:WHITESPACE:]に含まれません。

正規文字集合識別子指定はバイナリデータでは指定できません。

パターン文字列として埋込み変数，SQL変数，又はSQLパラメタを指定する場合，次のことに注意してください。

パターン文字列を固定長の埋込み変数，SQL変数，又はSQLパラメタにした場合に，変数の長さより短いパターン文字列を設定すると，変数の後ろに空白が入ったり，残っていた不当文字が値として設定されてしまうことがあります。このようなパターン文字列で検索すると，後ろに空白，又は不当文字と同じ値がないデータは検索されません。したがって，固定長の変数をパターン文字列として使用する場合は，後ろにすべて%を設定してください。

（例1）

変数にパターン文字列として'AB%'，及び'AB%%'を設定した場合，文字列データが'ABCD'のときの比較結果を次に示します。

変数のデータ型

パターン文字列

文字列データ

比較結果

可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）

'AB%'

'ABCD'

一致します。

'AB%%'

'ABCD'

一致します。

固定長文字列（4バイト）

'AB%△'

'ABCD'

一致しません。

'AB%%'

'ABCD'

一致します。

（例2）

変数にパターン文字列としてX'52454425'を設定した場合，バイナリデータが52454452554dのときの比較を次に示します。

変数のデータ型

パターン文字列

バイナリデータ

比較結果

BINARY型

X'52454425'

52454452554d

一致します。

X'5245442525'

52454452554d

一致します。

不正なパターン文字列

パターン文字列が不正（KFPA11424-Eメッセージを出力）となる条件を次に示します。

関連する項目

条件

不正なパターン文字列の例

正規一次子*

正規一次子+

正規一次子?

* , + , ?の直前の正規一次子が指定されていない。

'(*)'，'(+)'，'(?)'

正規表現｜正規表現

｜の前後のどちらかに正規表現が指定されていない。

'a｜'，'(a｜)'，'(a｜｜b)'

(正規表現)

()内に正規表現が指定されていない。

'()'

(と)が対応していない。

'(abc'，'abc)'

正規一次子{n}

正規一次子{n,m}

正規一次子{n,}

繰返し因子の直前の正規一次子が指定されていない。

'{4}'

繰返し因子の繰り返し回数の指定が不正。

'a{-1}'，'a{4,2}'

{と}が対応していない。

'a{4'，'a4}'

[文字列挙…]

[^文字列挙…]

文字列挙にエスケープされていない特殊文字を含んでいる。ただし，正規文字集合識別指定は指定できる。

'[a%c]'

-の前後の文字指定が不正。

'[-]'，'[c-a]'，'[a--]'

[]内に文字列挙の指定がない。

'[]'，'[^]'

[と]が対応していない。

'[a-c'，'a-c]'

エスケープ文字

パターン文字列の最後の文字がエスケープ文字である。

'abc¥'（エスケープ文字として'¥'を指定した場合）

正規文字集合識別指定

正規文字集合識別子が不正である。

'[:INVALID:]'

パターン文字列の例

SIMILAR述語の代表的なパターン文字列の例を次の表に示します。

表2‒8　SIMILAR述語の代表的なパターン文字列の例

項　目

パターン文字列

意　味

例

パターン文字列

パターンの一致する文字列

前方一致

nnn%

文字列の先頭部分がnnnです。

'ACT%'

ACT，ACTOR，ACTIONなどACTで始まる文字列

後方一致※1

%nnn

文字列の最後の部分がnnnです。

'%ING'

ING，BEING，HAVINGなどINGで終わる文字列

任意一致

%nnn%

文字列中の任意の部分にnnnを含みます。

N'%日%'

日，日立，昨日，本日中など日を含む文字列※2

完全一致

nnn

文字列がnnnと同じです。

'EQUAL'

EQUAL

部分一致

_…_nnn_…_

文字列中の特定の部分がnnnと同じで，ほかの部分には任意の文字があります。

'_I_'

BIT，HIT，KITなど3文字で2文字目がIの文字列

1回以上の繰り返し

mmm[0-9]+

又は

mmm[:DIGIT:]+

文字列の先頭部分がmmmで，その後ろが数値です。

'KFPA11[0-9]+-E '

又は

'KFPA11[:DIGIT :]+-E''

KFPA11104-E,KFPA11901-EなどKFPA11で始まり7文字目から数値で数値の後が-Eの文字列

幾つかの文字の選択

mmm(n|o)

又は

mmm[no]

文字列の先頭部分がmmmで，i文字目がn又はoです（iは任意の数字）。

'KFPA%-(W｜E)'

又は

'KFPA%-[WE]'

KFPA20008-W,KFPA11901-EなどKFPAで始まり最後の2文字が-W又は-Eの文字列

0回以上，１回以下の繰り返し

nnno?mmm

文字列の先頭部分がnnn，最後の部分がmmmでその間にoがある又はないです。

'OW?N'

ON，OWNなどOで始まりNで終わる文字列の間にWがある文字列とない文字列

0回以上の繰り返し

nnno*mmm

文字列の先頭部分がnnn，最後の部分がmmmでその間にoが０回以上繰り返します。

10*1

11，101，1001など最初の文字が１でそれ以降に0が0回以上繰り返され最後に1の文字列

n回の繰り返し

mmm{n}

文字列の先頭部分がmmmでn回繰り返します。

[1-9]0{3}

1000，2000，3000など最初の文字が1〜9でそれ以降0が3回繰り返される文字列

その他

nnn%mmm

文字列の先頭部分がnnnで，最後の部分がmmmです。

'O%N'

ON，OWN，ORIGINなどOで始まりNで終わる文字列

%nnn%mmm%

文字列中の任意の部分にnnnを含み，その部分から後の任意の部分にmmmを含みます。

'%O%N%'

ON，ONE，DOWN，COUNTなどOを含み，その部分より後にNを含む文字列

nnn_…_mmm%

先頭部分がnnnで始まり，後方にmmmがある文字列です。

'CO_ _ECT%'

CORRECT，

CONNECTOR，

CONNECTIONなどCOで始まり5文字目から7文字目がECTの文字列

注

nnn，mmmは，特殊文字を含まない任意の文字列

注※1

空白も比較対象の文字として扱うため，後方に空白のあるデータと比較した場合，結果は偽になります。

注※2

各国文字列中での特殊文字は，各国文字に合わせた特殊文字を使用します。

（エスケープ文字）

パターン文字列中の特殊文字は通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は，エスケープ文字を指定します。キーワードESCAPEの後に，任意の1文字（エスケープ文字）を指定しておくと，パターン文字列中に記述したエスケープ文字の直後の特殊文字を，通常の文字として扱えます。エスケープ文字には，文字定数，？パラメタ，埋込み変数，SQL変数名，SQLパラメタ名を指定できます。

（例1）

'5%'，'25%'など，文字列中に'5%'を含む文字列の場合

  '%5¥%%' ESCAPE '¥'

（例2）

'SQLPRINT_REC'など，文字列の最後が'PRINT_REC'となる文字列の場合

  '%PRINT¥_REC' ESCAPE '¥'

（例3）

X'48695244425f'など，バイナリ列中にX'48695244425f'を含む16進文字列の場合

  X'4869524442ee5f' ESCAPE X'ee'

エスケープ文字に指定できる文字を次に示します。

項目のデータ型

指定できる文字

文字データ（CHAR，VARCHAR）

既定文字集合

任意の1文字（1バイト文字）※1

EBCDIK

UTF16

任意の1文字※2

混在文字データ（MCHAR，MVARCHAR）

任意の1文字※2

各国文字データ（NCHAR，NVARCHAR）

任意の1文字（2バイト文字）※3

バイナリデータ（BINARY）

任意の1バイトの値

注

エスケープ文字の次には，必ず特殊文字を指定してください。

注※1

すべての文字，又はデータ値を1バイト文字として扱います。

注※2

文字でないデータ値の場合は，その文字コードの最小の長さ（UTF16の場合は長さ2，UTF8，SJISなどの場合は長さ1）の文字として扱います。

注※3

すべての文字，又はデータ値を2バイト文字として扱います。

留意事項

SIMILARの左辺の値式で使用する列の定義長は，255バイト以下（CHAR，VARCHAR，MCHAR，MVARCHAR，及びBINARY）又は，127文字以下（NCHAR，及びNVARCHAR）の方が性能が良くなります。

CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合，そのマルチバイト文字は1バイトずつ評価されます。したがって，パターン文字列中に指定した1バイト文字の文字コードが，マルチバイト文字の文字コードに含まれる場合，SIMILAR述語の結果は真となります。

（例）

sjisの文字コードでセットアップし，表T1にCHAR型の列C1があり，列C1中に「ア」という行がある状態で，次の問合せを実行します。

SELECT C1 FROM T1 WHERE C1 SIMILAR TO '%A%' ;

「ア」は，文字コードを16進数で表すと8341となります。パターン文字列中の「A」は，文字コードを16進数で表すと41となります。したがって，マルチバイト文字である「ア」の文字コードの中に，1バイト文字「A」の文字コードを含んでいるため，SIMILAR述語の結果は真となります。

パターン文字列が極端に長い場合や，特殊文字{}を連続して指定した場合，検索性能が劣化したり，メモリ使用量が増大したりすることがあります。

(7)　BETWEEN述語

形式

　行値構成子1 〔NOT〕 BETWEEN 行値構成子2 AND 行値構成子3

述語が真となる場合

次の条件を満足する行に対して，BETWEEN述語は真になります。

行値構成子2 ≦ 行値構成子 1 ≦ 行値構成子3

NOTを指定した場合は，条件を満足しない行に対して，この述語は真になります。

規則

（行値構成子1）

値指定だけの行値構成子要素は指定できません。

繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，BETWEEN述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，BETWEEN述語は真となります。BETWEEN述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，そのBETWEEN述語は不定になります。BETWEEN述語が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないとBETWEEN述語は不定になります。

（行値構成子2及び行値構成子3）

繰返し列を指定できません。

（共通）

各行値構成子中で，同じ位置にある行値構成子要素を対応値とします。対応値のデータ型は，それぞれ変換できるデータ型にしてください。ただし，行値構成子1に各国文字データを指定し，行値構成子2，又は行値構成子3の対応値に文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。

行値構成子1，行値構成子2及び行値構成子3には，次のデータ型の値を指定できません。

BLOB

最大長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

行値構成子1，行値構成子2及び行値構成子3は，結果の列数を同じにしてください。

(8)　限定述語

形式

　行値構成子｛＝｜＜＞｜^＝｜!＝｜＜｜＜＝｜＞｜＞＝｝
　　　　｛｛ANY｜SOME｝｜ALL｝
　　〈表副問合せ〉
　　（〔副問合せ実行方式のSQL最適化指定〕
　　　SELECT〔｛ALL｜DISTINCT｝〕｛選択式｜＊｝
　　　　〈表 式〉
　　　　FROM 表参照〔，表参照〕…
　　　　　〔WHERE 探索条件〕
　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　〔HAVING 探索条件〕）

述語が真となる場合

ANY，又はSOMEを指定した場合，表副問合せの結果の任意の行が一つでも行値構成子との比較条件を満たしていれば，限定述語の結果は真になります。

ALLを指定した場合，表副問合せの結果のすべての行が行値構成子との比較条件を満たしているか，又は表副問合せの結果が空集合であれば，限定述語の結果は真になります。

規則

演算結果のデータ型が，次のデータ型となる値を指定できません。

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

行値構成子の結果がナル値である行に対して，この述語は不定になります。

表副問合せについては，「副問合せ」を参照してください。

限定述語のSOME指定とANY指定のどちらを指定しても処理は同じです。

限定述語は，IN述語と同じ意味を表すものがあります。同じ意味を表す述語を次に示します。

限定述語

IN述語

行値構成子 ＝ ANY 表副問合せ

又は

行値構成子 ＝ SOME 表副問合せ

行値構成子 IN 表副問合せ

行値構成子 ＜＞ ALL 表副問合せ

行値構成子 NOT IN 表副問合せ

ANY，又はSOMEを指定した限定述語の結果を次の表に示します。表副問合せの結果の任意の行が一つでも条件を満たしていれば真になります。すべての行の比較結果がすべて偽であるか，又は表副問合せの結果が空集合であれば偽になります。どちらでもなければ不定になります。

表2‒9　ANY，又はSOMEを指定した限定述語の結果

副問合せの各行に対する比較結果

限定述語の結果（ANY又はSOME）

真の行あり

真

真の行なし

不定あり

不定

不定なし

偽

空集合

偽

ALLを指定した限定述語の結果を次の表に示します。表副問合せの結果のすべての行の比較結果が真であるか，又は表副問合せの結果が空集合であれば真になります。任意の行が一つでも偽であれば偽になります。どちらでもなければ不定になります。

表2‒10　ALLを指定した限定述語の結果

副問合せの各行に対する比較結果

限定述語の結果（ALL）

偽の行あり

偽

偽の行なし

不定あり

不定

不定なし

真

空集合

真

次に示す箇所には，限定述語は指定できません。

IF文の探索条件

WHILE文の探索条件

CREATE TRIGGERのWHEN探索条件（トリガ動作条件）

行値構成子要素に繰返し列を指定する場合は，添字を指定してください。繰返し列を添字付きで指定して，その要素が条件を満たしている場合，限定述語は真となります。

繰返し列の添字としてANYを指定できます。ANYを指定した場合は，その列の少なくとも一つの要素が条件を満たしていれば，限定述語は真となります。限定述語が真でなく，その列の少なくとも一つの要素に対して指定した条件が不定ならば，その限定述語は不定になります。限定述語が真又は不定でない場合，偽となります。

繰返し列を添字付きで指定した場合，その要素がないと限定述語は不定になります。

限定述語の左辺に指定した行値構成子の結果の列数と，表副問合せの結果の列数は同じにしてください。

留意事項

限定述語を指定した場合，HiRDBが作業表を作成することがあります。このとき，作業表の行長によっては，限定述語の処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(9)　EXISTS述語

形式

　EXISTS
　　〈表副問合せ〉
　　（〔副問合せ実行方式のSQL最適化指定〕
　　　SELECT〔｛ALL｜DISTINCT｝〕｛選択式｜＊｝
　　　　〈表 式〉
　　　　FROM 表参照〔，表参照〕…
　　　　　〔WHERE 探索条件〕
　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　〔HAVING 探索条件〕）

述語が真となる場合

表副問合せの結果が空集合でなければ，EXISTS述語の結果は真になります。

規則

表副問合せについては，「副問合せ」を参照してください。

EXISTS述語は，表副問合せの結果が空集合でないかどうかをテストする述語です。

EXISTS述語の結果を次の表に示します。表副問合せの結果が1行以上であれば真になります。空集合であれば偽になります。

表2‒11　EXISTS述語の結果

副問合せの結果，問合せ条件に合った行の数

EXIST述語の結果

1行以上

真

０行

偽

次に示す箇所には，EXISTS述語は指定できません。

IF文の探索条件

WHILE文の探索条件

CREATE TRIGGERのWHEN探索条件（トリガ動作条件）

(10)　論理述語

形式

　値式 IS 〔NOT〕 ｛TRUE｜FALSE｜UNKNOWN｝

述語が真となる場合

値式の論理値が，指定した真（TRUE），偽（FALSE），又は不定（UNKNOWN）と一致する場合，論理述語は真になります。NOTを指定した場合は，値式の論理値が，指定した真（TRUE），偽（FALSE），又は不定（UNKNOWN）と一致しない場合に真となります。

規則

論理述語を評価した場合の述語の結果を次の表に示します。NOTを指定した場合は，表中の各論理値が反転します。

表2‒12　論理述語を評価した場合の述語の結果

値式の論理値

IS TRUE

IS FALSE

IS UNKNOWN

真

真

偽

偽

偽

偽

真

偽

不定

偽

偽

真

値式には，次のデータ型の値を指定できます。

BOOLEAN

論理値が不定であることと，論理値がナル値であることは等価です。

(11)　構造化繰返し述語

形式

　ARRAY（列指定〔，列指定〕…）［ANY］（探索条件）

述語が真となる場合

ARRAY（列指定〔，列指定〕…）に指定した繰返し列を，添字が同じ要素の組とした複数項目の繰り返しとみなし，そのどれかの要素が探索条件を満たす場合，構造化繰返し述語は真となります。

規則

ARRAY（列指定〔，列指定〕…）

列指定には，構造化する繰返し列を指定します。

列指定は，一つのインデクス構成列にすべて含まれるようにしてください。

列指定に次に示す列は指定できません。

・異なる表の列

・異なる表から導出した列

ただし，異なる表には，実表が同じで相関名が異なるものも含みます。

列指定は，外への参照をする列を指定できません。

列指定は，同じ列を2回以上指定できません。

列指定は，最大64個指定できます。

探索条件

探索条件を指定します。ただし，構造化繰返し述語についての次の規則があります。

探索条件には，次のものを指定できません。

・添字付きの列指定

・ARRAY（列指定〔，列指定〕…）で指定した繰返し列以外の列

・システム定義スカラ関数，関数呼出し，及びIS_USER_CONTAINED_IN_HDS_GROUPを含む述語

・構造化繰返し述語

・XMLEXISTS述語

・列指定を含まない述語

・副問合せ

NULL述語を指定した場合，その列に要素がないときは，NULL述語は不定になります。指定した要素がナル値ならばNULL述語は真になります。

共通

構造化繰返し述語を含む探索条件は，NOTで否定できません。

IF文，WHILE文の探索条件に，構造化繰返し述語は指定できません。

HAVING句に，構造化繰返し述語は指定できません。

CASE式の探索条件に，構造化繰返し述語は指定できません。

構造化繰返し述語を含んでいて，かつオペランドの探索条件に次に示す列（外への参照をする列を除く）があるORは指定できません。

・異なる表の列

・異なる表から導出した列

ただし，異なる表には，実表が同じで相関名が異なるものも含みます。

ビュー定義の導出問合せ式中の探索条件には指定できません。

外結合の結合表を含む問合せ指定のON 探索条件に構造化繰返し述語を指定する場合，列指定には内表の列を指定してください。

外結合の結合表を含む問合せ指定のWHERE句に構造化繰返し述語を指定する場合，列指定には外結合の最も外側の表の列を指定してください。

使用例

成績表から，数学の成績が85点以上の氏名を求めます。なお，成績表は科目名，成績が要素10の繰返し列となっています。

  SELECT 氏名 FROM 成績表
      WHERE ARRAY(科目名,成績)[ANY](科目名='数学' AND 成績>=85)

(12)　XMLEXISTS述語

HiRDB XML Extensionと連携することで使用できる述語です。

詳細は，「XMLEXISTS述語」を参照してください。

2.8　行値構成子

2.8.1　行値構成子の形式と規則

(1)　機能

行，又は順序付けられた列の並びを指定します。

(2)　形式

　行値構成子：：＝｛ 行値構成子要素
　　　　　　　　　　｜（行値構成子要素 〔，行値構成子要素〕 …）
　　　　　　　　　　｜行副問合せ｝
　行値構成子要素：：＝値式

(3)　規則

行値構成子に指定できる行値構成子要素の数は，最大255個です。

行値構成子の結果の列は，次のデータ型を指定できません。

BLOB

32,001バイト以上のBINARY

抽象データ型

BOOLEAN

行値構成子要素を2個以上指定する場合で，行値構成子要素に繰返し列を指定したとき，添字にANYを指定できません。

行副問合せについては，「副問合せ」を参照してください。

2.9　値式，値指定，及び項目指定

2.9.1　値式，値指定，及び項目指定の形式と規則

(1)　機能

SQL中に値を指定する場合，次の形式で値を指定できます。

(2)　形式

　値式：：＝｛〔＋｜−〕一次子｜値式｛＋｜−｜＊｜／｝〔｛＋｜−｝〕一次子
　　　　　　　｜値式 ＊ 一次子｜値式 ／ 一次子｜値式 ‖ 一次子｝
　一次子：：＝｛（値式）｜項目指定｜符号なし値指定｜集合関数｜ウィンドウ関数｜スカラ関数
　　　　　　　　｜CASE式｜CAST指定｜ラベル付き間隔｜関数呼出し
　　　　　　　　｜スカラ副問合せ｜NEXT VALUE式｝
　値指定：：＝｛定数｜?パラメタ｜：埋込み変数〔：標識変数〕
　　　　　　　　｜USER｜CURRENT_USER｜CURRENT_DATE｜CURRENT_TIME
　　　　　　　　｜CURRENT_TIMESTAMP〔(p)〕
　　　　　　　　｜CURRENT DATE｜CURRENT TIME
　　　　　　　　｜CURRENT TIMESTAMP〔(p)〕
　　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　｜SQLCODE｜SQLCOUNT｜SQLCODE_OF_LAST_CONDITION｜SQLERRM_OF_LAST_CONDITION｝
　符号なし値指定：：＝
　　　　　　　｛符号なし数定数｜一般定数｜?パラメタ｜：埋込み変数〔：標識変数〕
　　　　　　　　｜USER｜CURRENT_USER｜CURRENT_DATE｜CURRENT_TIME
　　　　　　　　｜CURRENT_TIMESTAMP〔(p)〕
　　　　　　　　｜CURRENT DATE｜CURRENT TIME
　　　　　　　　｜CURRENT TIMESTAMP〔(p)〕
　　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　｜SQLCODE｜SQLCOUNT｜SQLCODE_OF_LAST_CONDITION｜SQLERRM_OF_LAST_CONDITION｝
　定数：：＝｛数定数｜一般定数｝
　一般定数：：＝｛文字列定数｜16進文字列定数
　　　　　　　　　｜各国文字列定数｜混在文字列定数｝
　項目指定：：＝｛列指定
　　　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　　｜コンポネント指定｝

(3)　共通規則

値式中で指定できる演算のうち，四則演算，日付演算，時刻演算，連結演算，CASE式，CAST指定，ウィンドウ関数，スカラ関数，及びNEXT VALUE式を総称して，スカラ演算といいます。

値式は，比較述語，比較値，BETWEEN述語，IN述語，LIKE述語，XLIKE述語，限定述語，論理述語，コンポネント指定，関数呼出し，列指定，更新値，一次子，集合関数，又はスカラ演算で指定します。

スカラ演算の評価順序を次に示します。

1. 括弧内

2. ＊又は／

3. ＋，−，又は‖

ただし，評価順序の同じスカラ演算が値式中に複数ある場合は，左から右に評価されます。

スカラ演算のネストの最大数は，255です。スカラ演算のネストの数は，演算子＋，−，＊，／，又は‖の評価順序を表す括弧を省略しないで指定した場合の括弧のネスト数です。なお，ネスト数はスカラ関数の種類によって次のようになります。

スカラ関数SUBSTR，VARCHAR_FORMAT，TIMESTAMP_FORMAT，DATE（日時書式を指定したとき），TIME（日時書式を指定したとき），及びTIMESTAMP（機能3.のとき）を指定した場合は2となります。

スカラ関数VALUEは引数の値式の数＋1となります。

そのほかのスカラ関数は1となります。

また，単純CASE式，及び探索CASE式はWHENの数，CASE略式のCOALESCEは引数の値式の数＋1，CASE略式のNULLIFは2としてそれぞれ数えます。

名前付き導出表の列をオペランドとするスカラ演算を指定して，その列がスカラ演算で導出され，かつその名前付き導出表が内部導出表を作成しない場合，名前付き導出表の列を導出する，スカラ演算をオペランドとするスカラ演算を指定することと等価となり，スカラ演算の最大ネスト数を超えることがあります。

値式中にスカラ演算と関数呼出しを指定する場合，スカラ演算のネスト数と関数呼出しのネスト数の合計は，最大255です。

指定したデータがナル値の場合は，四則演算，日付演算，時刻演算，又は連結演算の結果もナル値になります。

四則演算，日付演算，又は時刻演算の除算で，第2演算項の値に0を指定した場合，エラーになります。

演算途中でオーバフローが発生した場合は，エラーになります。値式については，「四則演算」，「日付演算」，「時刻演算」，及び「連結演算」を参照してください。

SQLパラメタ名は，手続き定義の中でそのSQL手続きのSQLパラメタを参照するために使用できます。

SQL変数名は，手続き定義又は関数定義の中の複合文中で，その複合文中で宣言したSQL変数を参照するために使用できます。

同じ名前の列，SQL変数，又はSQLパラメタがあるとき，それらの名前は表指定，文ラベル，又は〔認可識別子.〕ルーチン識別子で修飾して指定します。修飾しないか，又は修飾子が同じ場合には，それらの名前の有効範囲の狭い順に優先されて識別されます。すなわち，列，SQL変数，SQLパラメタの順に優先されます。列名として有効であるときは，列として識別されます。列としては無効で，SQL変数として有効であるときは，SQL変数として識別されます。列，及びSQL変数としては無効で，SQLパラメタとして有効であるときは，SQLパラメタとして識別されます。列，SQL変数，及びSQLパラメタとして無効であるときは，文法上エラーとなります。

ただし，ハンドラ宣言中は，そのハンドラ宣言の外側の文ラベル，又は〔認可識別子.〕ルーチン識別子を継承しません。したがって，ハンドラ宣言中でSQL変数又はSQLパラメタを，文ラベル又は〔認可識別子.〕ルーチン識別子で修飾した場合，該当するハンドラ宣言中に宣言した文ラベルだけ有効となります。列，SQL変数，及びSQLパラメタの有効範囲の例を次に示します。INTEGER型の列Y及びZがある表T1を定義しているものとします。

〔説明〕

1.範囲Cで定義されたSQL変数「X」に10が代入されます。

2.範囲Bで定義されたSQL変数「Z」に10が代入されます。

3.範囲Cで定義されたSQL変数「X」に10が代入されます。

4.エラー（該当するハンドラ宣言中に有効な「Z」がない）となります。

5.エラー（ハンドラ宣言中のため，「PPP」は継承しない）となります。

6.SQLパラメタ「Y」に10が代入されます。

7.エラー（ハンドラ宣言中のため，「AAA」は継承しない）となります。

8.エラー（ハンドラ宣言中のため，「PPP」は継承しない）となります。

9.範囲Bで定義されたSQL変数「X」に，表T1の列「Y」の値が代入されます。また，1行SELECT文中のWHERE句中に指定している「Y」，及び「Z」は，表T1の列「Y」，及び「Z」が使用されます。

10.範囲Eで定義されたSQL変数「X」に10が代入されます。

11.範囲Eで定義されたSQL変数「Y」に10が代入されます。

12.範囲Eで定義されたSQL変数「X」に10が代入されます。

13.範囲Eで定義されたSQL変数「Y」に10が代入されます。

14.SQLパラメタ「Y」に10が代入されます。

SQL手続き文中を除く，ルーチン制御SQL中だけで使用できる値指定は次のとおりです。括弧内は，それぞれのデータ型を示します。

SQLCODE（INTEGER）

SQLCODE_OF_LAST_CONDITION（INTEGER）

SQLCOUNT（INTEGER）

SQLERRM_OF_LAST_CONDITION（VARCHAR(254)）

SQLCODE及びSQLCOUNTは，ルーチン制御SQLを除く直前のSQL手続き文を実行した結果のリターンコードが100であることの判定や，更新行数の参照に使用します。

SQLCODE_OF_LAST_CONDITION又はSQLERRM_OF_LAST_CONDITIONは，ルーチン制御SQLを除くSQL手続き文を実行した結果のリターンコードが0以外になった最後のリターンコード及びメッセージを，例外ハンドラ中で参照する場合に使用します。

添字のない繰返し列は，CASE式の探索条件に直接指定した，繰返し列を除くスカラ演算に指定できません。

添字ANYは，CASE式の探索条件に指定した，繰返し列を除くスカラ演算に指定できません。

スカラ副問合せについては，「副問合せ」を参照してください。

2.10　四則演算

2.10.1　四則演算の形式と規則

(1)　四則演算の種類と機能

SQLの値式中に四則演算を使用した検索ができます。四則演算の種類と機能を次の表に示します。

表2‒13　四則演算の種類と機能

四則演算

意味

機能

＋

（単項演算）

正符号

符号を反転しません。

（2項演算）

加算

第1演算項に第2演算項を加えます。

−

（単項演算）

負符号

符号を反転します。

（2項演算）

減算

第1演算項から第2演算項を減らします。

＊

（2項演算）

乗算

第1演算項に第2演算項を掛けます。

／

（2項演算）

除算

第1演算項を第2演算項で割ります。

(2)　四則演算結果のデータ型

第1演算項データ型が，SMALLINT，INTEGER，DECIMAL，SMALLFLT，及びFLOATの場合の，四則演算（2項演算）の演算項のデータ型と演算結果のデータ型の関係を次の表に示します。

表2‒14　四則演算（2項演算）の演算項のデータ型と演算結果のデータ型の関係

第1演算項データ型

第2演算項データ型

SMALLINT

INTEGER

DECIMAL

SMALLFLT

FLOAT

SMALLINT

INTEGER

INTEGER

DECIMAL

SMALLFLT

FLOAT

INTEGER

INTEGER

INTEGER

DECIMAL

FLOAT

FLOAT

DECIMAL

DECIMAL

DECIMAL

DECIMAL

FLOAT

FLOAT

SMALLFLT

SMALLFLT

FLOAT

FLOAT

SMALLFLT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

FLOAT

第1演算項データ型が，CHAR，VARCHAR，MCHAR，及びMVARCHARの場合，又は第1演算項データ型がSMALLINT，INTEGER，DECIMAL，SMALLFLT，及びFLOATの場合で，第2演算項データ型が，CHAR，VARCHAR，MCHAR，及びMVARCHARのときの，四則演算（2項演算）の演算項のデータ型と演算結果のデータ型の関係について説明します。

文字データはその値の文字列表現によって次の数データ型に変換されます。演算結果のデータ型は変換後の数データ型を用いて，表「四則演算（2項演算）の演算項のデータ型と演算結果のデータ型の関係」によって決定します。

整数の文字列表現は，INTEGER型に変換されます。

10進数の文字列表現は，DECIMAL型に変換されます。

浮動小数点数の文字列表現は，FLOAT型に変換されます。

四則演算は，既に示したデータ型で演算されます。単項演算の場合の演算結果のデータ型は，演算項のデータ型と同じです。四則演算の結果のデータ型が，DECIMALの場合の結果の精度と位取りを次の表に示します。

表2‒15　四則演算の結果のデータ型がDECIMALの場合の結果の精度と位取り

四則演算結果のデータ型

精度と位取り

加減算の場合

乗算の場合

除算の場合

DECIMAL（p，s）

p＝1＋max（p1−s1，p2−s2）＋s

s＝max（s1，s2）

p＝p1＋p2

s＝s1＋s2

P＝max_prec

s＝max（0，max_prec−（（p1−s1）＋s2））

DECIMAL（p'，s'）

（p＞max_precの場合）

p'＝max_prec

s'＝max（s1，s2）

該当しません。

注1

第1演算項のデータ型：DECIMAL（p1，s1）

第2演算項のデータ型：DECIMAL（p2，s2）

注2

max_precはDECIMAL型の精度の最大値です。max_precについて，次の表に示します。なお，pd_sql_dec_op_maxprecオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

表2‒16　DECIMAL型の精度の最大値

システム共通定義pd_sql_dec_op_maxprecオペランドの値

第1演算項の精度p1と第2演算項の精度p2

max_precの値

29

p1≦29かつp2≦29

29

p1＞29又はp2＞29

38

38

任意

38

注3

INTEGERは，DECIMAL（10，0）として扱われます。

SMALLINTは，DECIMAL（5，0）として扱われます。

(3)　規則

四則演算を使用する場合の規則については，次に示す規則と，「値式，値指定，及び項目指定」の共通規則を参照してください。

四則演算は，数データに対して実行します。文字データを指定した場合，文字データを数データに変換してから四則演算を実行します。

次の結果が文字データとなる値式は四則演算に指定できません。

USER

SQLERRM_OF_LAST_CONDITION

文字データを含む四則演算を次の場所に指定する場合，文字データとして指定できるのは文字列定数，又は混在文字列定数だけです。

選択式

集合関数の引数

ユーザ定義関数（システム定義スカラ関数を含む）の引数

GROUP BY句

分割列に対するVALUES句の値式

新値相関名で参照するINSERT文のVALUES句，又はUPDATE文のSET句の値式

旧値相関名で参照するUPDATE文SET句の値式

四則演算子（＋，−，＊，／）の両側に埋込み変数，又は?パラメタだけの値式は指定できません。

異なるデータ型の四則演算をネストさせる場合には，途中の演算結果に注意する必要があります。

演算項中にウィンドウ関数は指定できません。

演算項中に予備列は指定できません。

(4)　留意事項

次に示す四則演算の規則は，オーバフローエラー抑止が設定されている場合は，エラーになりません。

除算で第2演算項の値に0を指定した場合は，エラーになります。

計算途中でオーバフローが発生した場合は，エラーになります。

なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

DECIMALの除算で，被除数の整数部のけた数（p1−s1）と，除数の小数部のけた数（s2）の合計がmax_prec以上の場合（（p1−s1）＋s2≧max_prec），除算の結果の位取りは0となります。小数点以下のけたを求めたい場合，除算前にスカラ関数DECIMALを使用して，被除数の精度（p1），又は除数の位取り（s2）を小さくしてください。

（参考）

表「四則演算の結果のデータ型がDECIMALの場合の結果の精度と位取り」から，次の式が求められます。

p1＝max_prec−s＋s1−s2

s2＝max_prec−s＋s1−p1

（例）

システム共通定義のpd_sql_dec_op_maxprecオペランドの値が29の場合，表T1の列C1（DECIMAL（12，2））及び列C2（DECIMAL（12，2））のそれぞれの合計値（SUM）の除算を求めると，DEC（29，2）とDEC（29，2）による除算となり，その結果はDEC（29，0）となります。小数点以下2けたまで求めたい場合は，スカラ関数DECIMALを使用して，被除数の精度を小さくします。

SELECT DEC(SUM(C1),27,2)/SUM(C2) FROM T1

四則演算と連結演算の混在する場合，結果のデータ型は演算順序，各演算の結果によって決まります。

（例）

図2‒5　結果のデータ型

2.11　日付演算

2.11.1　日付演算の形式と規則

(1)　機能

SQL中に日付演算を指定すれば，日付，又は日間隔データの演算を使用した検索・更新ができます。

日付同士の減算，日付の日間隔の加減算，日間隔同士の加減算，及び日間隔に対する整数の乗除算ができます。

(2)　演算できるデータ

日付データ，又は日間隔データと日付演算ができる値を次の表に示します。

表2‒17　日付演算できるデータ

演算の種類

日付演算できる値

日付データ

日間隔データ

加算

日間隔データ

（INTERVAL YEAR TO DAY）

日間隔を10進数表現した定数

ラベル付き間隔

（YEAR〔S〕，MONTH〔S〕，DAY〔S〕）

日付データ（DATE）

日付を既定の文字列表現で指定した定数

日間隔データ

（INTERVAL YEAR TO DAY）

日間隔を10進数表現した定数

減算

日付データ（DATE）

日付を既定の文字列表現で指定した定数

日間隔データ

（INTERVAL YEAR TO DAY）

日間隔を10進数表現した定数

ラベル付き間隔

（YEAR〔S〕，MONTH〔S〕，DAY〔S〕）

日間隔データ

（INTERVAL YEAR TO DAY）

日間隔を10進数表現した定数

乗算，除算

指定できません。

整数データ（INTEGER，SMALLINT）

単項演算

日付データ，及びラベル付き間隔には，指定できません。

(3)　ラベル付き間隔

ラベル付き間隔は，日付演算をする場合に，数値とそれに続く間隔キーワードで特定の時間単位を表します。ラベル付き間隔は，日付データに対する日間隔データの加減算の第2演算項にだけ指定できます。

(4)　形式

　（値式）｛YEAR〔S〕｜MONTH〔S〕｜DAY〔S〕｝

(5)　説明

値式に指定できるものを次に示します。

整数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，整数（SMALLINT，INTEGER）にしてください。

YEAR〔S〕，MONTH〔S〕，DAY〔S〕は，それぞれ年，月，日の単位を表し，語尾のSは指定しなくてもかまいません。指定例を次に示します。

（例）

1か年：1 YEAR

11か月：11 MONTHS

100か日：100 DAYS

値式に指定できる値の範囲を次に示します。

YEAR〔S〕：−9998〜9998

MONTH〔S〕：−199987〜119987

DAY〔S〕：−3652058〜3652058

(6)　日付演算の形式と結果のデータ型

日付演算の形式と結果のデータ型の関係を次の表に示します。

表2‒18　日付演算の形式と結果のデータ型の関係

演算の形式

結果のデータ型

日付データ − 日付データ

日間隔データ型

日付データ｛＋｜−｝｛日間隔データ｜ラベル付き間隔｝

日付データ型

日間隔データ ＋ 日付データ

日付データ型

日間隔データ｛＋｜−｝日間隔データ

日間隔データ型

日間隔データ｛＊｜／｝整数データ

日間隔データ型

注

日付データ，又は日間隔データとの日付演算には，埋込み変数，標識変数，及び?パラメタは指定できません。

(7)　日付演算の規則

日付演算をする場合は，次に示す規則，及び「値式，値指定，及び項目指定」の共通規則に従ってください。

(a)　日付データ同士を減算する場合の規則

結果のデータ型は，年数，月数，及び日数を表す日間隔データ型になります。

演算式を（日付1−日付2）としたときの結果は，次の規則に従い計算します。

日付1≧日付2の場合

結果＝日付1−日付2

日付1＜日付2の場合

結果＝−（日付2−日付1）※

日付1の日≧日付2の日の場合

結果の日＝日付1の日−日付2の日

日付1の日＜日付2の日の場合

結果の日＝日付1の日−日付2の日＋日付2の月の最終日

日付2の月＝日付2の月＋1

日付1の月≧日付2の月の場合

結果の月＝日付1の月−日付2の月

日付1の月＜日付2の月の場合

結果の月＝日付1の月−日付2の月＋12

日付2の年＝日付2の年＋1

結果の年＝日付1の年−日付2の年

注※

減算結果は，日付2−日付1の結果に負符号を付けた値になります。

（例）

DATE（'1995-10-15'）-DATE（'1989-12-16'）の減算結果を求める場合

(b)　計算手順の説明

(8)　日付データと日間隔データとを加減算する場合の規則

結果のデータ型は，日付データ型になります。

演算の結果の範囲は，0001年01月01日〜9999年12月31日の間にしてください。

日間隔データ（ラベル付き間隔でない）の場合，年，月，日の順に演算します。

年，月の演算の結果が，存在しない日付（小の月の31日，及びうるう年以外の年の2月29日）になった場合の結果は，その月の最終日に修正※されます。存在しない日付が発生し，日付が修正された場合は，SQLWARNAに'W'が設定されます。

日の演算の結果がその月の最終日を超えたり，初日（1日）を下回った場合の結果は，それぞれ年，月のけた上げ，けた下げをします。

注※

任意の月の最終日から数か月後が，必ずその月の最終日になるわけではありません。ある日付に任意の月数を加算した後，その結果の日付から同じ月数を引いても，必ず元の日付になるとは限らないので注意してください。

（例）

(9)　日間隔データ同士の加減算及び日間隔データの整数データによる乗除算の場合の規則

結果のデータ型は，日間隔データ型になります。

日数について，演算の結果が，00〜99の範囲外であれば，SQLWARNCに'W'が設定されます。また，この時の演算結果の日数には，00未満の場合は00が，99より大きい場合は99が設定されます。

除算の結果が小数点以下となる場合，小数点以下は切り捨てられます。

(10)　留意事項

次に示す日付演算の規則で，オーバフローエラー抑止が設定されている場合，エラーになりません。

日付データ型のオーバフロー

日間隔データ型のオーバフロー

ラベル付き間隔のオーバフロー

なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

2.12　時刻演算

2.12.1　時刻演算の形式と規則

(1)　機能

SQL中に時刻演算を指定すれば，時刻，又は時間隔データの演算を使用した検索・更新ができます。

時刻同士の減算，時刻に対する時間隔の加減算，時間隔同士の加減算，及び時間隔に対する整数の乗除算ができます。

(2)　演算できるデータ

時刻データ，又は時間隔データと時刻演算ができる値を次の表に示します。

表2‒19　時刻演算ができる値

演算の種類

時刻演算できる値

時刻データ

時間隔データ

加算

時間隔データ

（INTERVAL HOUR TO SECOND）

時間隔を10進数表現した定数

ラベル付き間隔

（HOUR〔S〕，MINUTE〔S〕，SECOND〔S〕）

時刻データ（TIME）

時刻を既定の文字列表現で指定した定数

時間隔データ

（INTERVAL HOUR TO SECOND）

時間隔を10進数表現した定数

減算

時刻データ（TIME）

時刻を既定の文字列表現で指定した定数

時間隔データ

（INTERVAL HOUR TO SECOND）

時間隔を10進数表現した定数

ラベル付き間隔

（HOUR〔S〕，MINUTE〔S〕，SECOND〔S〕）

時間隔データ

（INTERVAL HOUR TO SECOND）

時間隔を10進数表現した定数

乗算，除算

指定できません。

整数データ（INTEGER，SMALLINT）

単項演算

時刻データ，及びラベル付き間隔には，指定できません。

(3)　ラベル付き間隔

ラベル付き間隔は，時刻演算をする場合に，数値とそれに続く間隔キーワードで特定の時間単位を表します。ラベル付き間隔は，時刻データに対する時間隔データの加減算の第2演算項にだけ指定できます。

(4)　形式

　（値式）｛HOUR〔S〕｜MINUTE〔S〕｜SECOND〔S〕｝

(5)　説明

値式に指定できるものを次に示します。

整数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，整数（SMALLINT，INTEGER）にしてください。

HOUR〔S〕，MINUTE〔S〕，SECOND〔S〕は，それぞれ時間，分，秒の単位を表し，語尾のSは指定してもしなくてもかまいません。指定例を次に示します。

（例）

1時間：1 HOUR

23分：23 MINUTES

100秒：100 SECONDS

値式に指定できる値の範囲を次に示します。

HOUR〔S〕：−23〜23

MINUTE〔S〕：−1439〜1439

SECOND〔S〕：−86399〜86399

(6)　時刻演算の形式と結果のデータ型

時刻演算の形式と結果のデータ型の関係を次の表に示します。

表2‒20　時刻演算の形式と結果のデータ型の関係

演算の形式

結果のデータ型

時刻データ − 時刻データ

時間隔データ型

時刻データ｛＋｜−｝｛時間隔データ｜ラベル付き間隔｝

時刻データ型

時間隔データ ＋ 時刻データ

時刻データ型

時間隔データ｛＋｜−｝時間隔データ

時間隔データ型

時間隔データ｛＊｜／｝整数データ

時間隔データ型

注

時刻データ，又は時間隔データとの日付演算には，埋込み変数，標識変数，及び?パラメタは指定できません。

(7)　時刻演算の規則

時刻演算をする場合は，次に示す規則，及び「値式，値指定，及び項目指定」の共通規則に従います。

(a)　時刻データ同士を減算する場合の規則

結果のデータ型は，時，分，秒を表す時間隔データ型になります。

時刻1又は時刻2の秒が60秒以上の場合，演算する前に59秒に修正されます。

演算式を（時刻1−時刻2）としたときの結果は，次の規則に従い計算します。

時刻1≧時刻2の場合

結果＝時刻1−時刻2

時刻1＜時刻2の場合

結果＝−（時刻2−時刻1）

時刻1の秒≧時刻2の秒の場合

結果の秒＝時刻1の秒−時刻2の秒

時刻1の秒＜時刻2の秒の場合

結果の秒＝時刻1の秒−時刻2の秒＋60

時刻2の分＝時刻2の分＋1

時刻1の分≧時刻2の分の場合

結果の分＝時刻1の分−時刻2の分

時刻1の分＜時刻2の分の場合

結果の分＝時刻1の分−時刻2の分＋60

時刻2の時＝時刻2の時＋1

結果の時＝時刻1の時−時刻2の時

（例）TIME（'13:10:15'）-TIME（'11:50:59'）の減算結果を求める場合

(b)　計算手順の説明

(8)　時刻データと時間隔データとを加減算する場合の規則

結果のデータ型は，時刻データ型になります。

演算の結果の範囲は，0時0分0秒〜23時59分59秒の間にしてください。

時間隔データ（ラベル付き間隔以外）の場合，時，分，秒の順に演算します。

うるう秒を含む時刻データの場合，演算結果は次のようになります。

秒が60秒以上の場合，演算する前に59秒に修正されます。

（例）

'12:34:60' + 1 MINUTEの演算結果は'12:35:59'

'12:34:60' + 1 SECONDの演算結果は'12:35:00'

演算結果には，うるう秒を含みません。

(9)　時間隔データ同士の加減算及び時間隔データの整数データによる乗除算の場合の規則

結果のデータ型は，時間隔データ型になります。

演算結果の範囲は，−99時間59分59秒間〜99時間59分59秒間にしてください。

分，秒が60を超える場合は，それぞれ時，分にけた上げをします。

除算は，時，分，秒を秒に通算した形に変換し，結果の小数点以下は切り捨てられます。

(10)　留意事項

次に示す時刻演算の規則で，オーバフローエラー抑止が設定されている場合は，エラーになりません。

時刻データ型のオーバフロー

時間隔データ型のオーバフロー

ラベル付き間隔のオーバフロー

なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

2.13　連結演算

2.13.1　連結演算の形式と規則

(1)　機能

値式中に連結演算を指定すると，複数のデータ列（文字列又はバイナリ列）を指定した順に連結して一つのデータ列にします。

BLOB型，又は最大長が32,001バイト以上のBINARY型の連結演算は，UPDATE文のSET句の更新値にだけ指定できます。BLOB型，又は定義長が32,001バイト以上のBINARY型の連結演算については，「4.36　UPDATE文　形式1（データ更新）」の「連結演算を使用してBLOB型，又は定義長が32,001バイト以上のBINARY型の列を更新する場合の規則」を参照してください。形式は，文字列データの連結演算と同じです。

文字列データ，及び最大長が32,000バイト以下のBINARY型データの連結演算について，連結できるデータ型と演算結果のデータ型を次の表に示します。

表2‒21　連結できるデータ型と演算結果のデータ型（1/2）

第1演算項のデータ型

第2演算項のデータ型

文字データ

各国文字データ

混在文字データ

バイナリデータ

CHAR

VARCHAR

NCHAR

NVARCHAR

MCHAR

MVARCHAR

BINARY

文字データ

CHAR

CHAR※１

VARCHAR

×

×

MCHAR※１

MVARCHAR

×

VARCHAR

VARCHAR

VARCHAR

×

×

MVARCHAR

MVARCHAR

BINARY※２

各国文字データ

NCHAR

×

×

NCHAR※１

NVARCHAR

×

×

×

NVARCHAR

×

×

NVARCHAR

NVARCHAR

×

×

×

混在文字データ

MCHAR

MCHAR※１

MVARCHAR

×

×

MCHAR※１

MVARCHAR

×

MVARCHAR

MVARCHAR

MVARCHAR

×

×

MVARCHAR

MVARCHAR

×

バイナリデータ

BINARY

×

BINARY※２

×

×

×

×

BINARY

数データ※3※4

INTEGER，SMALLINT，及びDECIMAL

VARCHAR

VARCHAR

×

×

MVARCHAR

MVARCHAR

×

FLOAT，及びSMALLFLT

CHAR※１

VARCHAR

×

×

MCHAR※１

MVARCHAR

×

（凡例）

×：指定できません。

注※1

連結後の長さがCHAR，NCHAR，又はMCHARの最大長を超える場合，VARCHAR，NVARCHAR，又はMVARCHARになります。

注※2

BINARY型には，16進文字列定数だけ演算項に指定できます。

注※3

数データは次のように変換されます。

INTEGER型の数データは，VARCHAR(11)の文字データに変換されます。

SMALLINT型の数データは，VARCHAR(6)の文字データに変換されます。

DECIMAL(p,0)型の数データは，VARCHAR(p＋1)の文字データに変換されます。

DECIMAL(p,s)型の数データは，VARCHAR(p＋2)の文字データに変換されます。

FLOAT型又はSMALLFLT型の数データは，CHAR(23)の文字データに変換されます。

注※4

数データを連結する場合，数データは次のように変換されます。

数データと文字データの連結の場合，数データは文字データの文字集合に変換されます。

数データと混在文字データの連結の場合，数データは混在文字データに変換されます。

数データと数データの連結の場合，数データは既定文字集合に変換されます。

表2‒22　連結できるデータ型と演算結果のデータ型（2/2）

第1演算項のデータ型

第2演算項のデータ型

数データ※2※3

INTEGER，SMALLINT，及びDECIMAL

FLOAT，及びSMALLFLT

文字データ

CHAR

VARCHAR

CHAR※１

VARCHAR

VARCHAR

VARCHAR

各国文字データ

NCHAR

×

×

NVARCHAR

×

×

混在文字データ

MCHAR

MVARCHAR

MCHAR※１

MVARCHAR

MVARCHAR

MVARCHAR

バイナリデータ

BINARY

×

×

数データ※2

INTEGER，SMALLINT，及びDECIMAL

VARCHAR

VARCHAR

FLOAT，及びSMALLFLT

VARCHAR

CHAR※１

（凡例）

×：指定できません。

注※1

表「連結できるデータ型と演算結果のデータ型（1/2）」の注※1を参照してください。

注※2

表「連結できるデータ型と演算結果のデータ型（1/2）」の注※3を参照してください。

注※3

表「連結できるデータ型と演算結果のデータ型（1/2）」の注※4を参照してください。

演算結果のデータ長を次の表に示します。

表2‒23　連結演算の結果のデータ長

演算結果のデータ型

データ長（可変長データの場合，最大長）

CHAR(n)

n＝n1＋n2（ただし，n＞255の場合，結果のデータ型はVARCHAR）

VARCHAR(n)

n＝n1＋n2（ただし，n＞32,000の場合はエラー）

NCHAR(n)

n＝n1＋n2（ただし，n＞127の場合，結果のデータ型はNVARCHAR）

NVARCHAR(n)

n＝n1＋n2（ただし，n＞16,000の場合はエラー）

MCHAR(n)

n＝n1＋n2（ただし，n＞255の場合，結果のデータ型はMVARCHAR）

MVARCHAR(n)

n＝n1＋n2（ただし，n＞32,000の場合はエラー）

BINARY(n)

n＝n1＋n2（ただし，n＞32,000の場合，UPDATE文のSET句以外ではエラー）

（凡例）

n1：第1演算項のデータ長

n2：第2演算項のデータ長

注1

nは，演算結果のデータ型がCHAR，VARCHAR，MCHAR，MVARCHAR，及びBINARYの場合はバイト数を，NCHAR，及びNVARCHARの場合は文字数を示します。

注2

第1演算項，又は第2演算項が長さ0の文字列定数（各国，及び混在を含む）の場合，n1，又はn2を0としてください。ただし，すべての連結演算の結果データ長が0の場合，nは1になります。

(2)　形式

　値式||一次子

(3)　規則

文字列データの連結演算をする場合は，「値式，値指定，及び項目指定」の共通規則にも従ってください。

連結演算の演算項に，埋込み変数，又は?パラメタを直接指定できません。

連結演算の演算項に，予備列を指定できません。

演算結果は，一次子，又は値式の非ナル値制約の有無に関係なく，ナル値を許します。

連結演算の結果のデータ長（最大長）が可変長データの最大長を超えた場合はエラーになります。

連結演算の結果のデータ型がBINARY型の場合，結果のデータ長（最大長）が32,000バイトを超えるときは，UPDATE文のSET句以外ではエラーになります。

文字集合が異なる場合，文字データ同士の連結として連結できません。ただし，次に示す値式は，連結相手の文字集合に変換して連結できます。

文字列定数

2.14　集合関数

2.14.1　集合関数の形式と規則

(1)　機能

集合関数をSQL中に指定すれば，平均値，合計値，最大値，最小値，及び行数の算出，並びにXML型の値の結合ができます。

XMLAGG集合関数の詳細については，「XMLAGG」を参照してください。

集合関数の機能を次の表に示します。

表2‒24　集合関数の機能

項 目

集合関数

AVG

SUM

MAX

MIN

COUNT

COUNT_FLOAT

XMLAGG

機能

平均値の算出

合計値の算出

最大値の算出

最小値の算出

行数の算出

行数の算出

XML型の値の結合

ナル値の扱い

無視

無視

無視

無視

無視※１

無視※１

無視

DISTINCT指定の意味

指定した値式の中で，値が重複する行を除いた後の平均値

指定した値式の中で，値が重複する行を除いた後の合計値

指定しても意味がない

指定しても意味がない

指定した値式の中で，値が重複する行を除いた行数

指定した値式の中で，値が重複する行を除いた行数

指定できません

適用対象が0件※３，又はナル値だけの集合の場合の関数値

ナル値

ナル値

ナル値

ナル値

0

0

ナル値

引数中での繰返し列の指定可否※２

指定できません

指定できません

指定できます

指定できます

指定できません

指定できません

指定できません

注※1

集合関数では，基本的にナル値を無視しますが，COUNT（＊）及びCOUNT_FLOAT（＊）の場合はナル値に関係なく，条件を満足するすべての行数を算出します。

注※2

集合関数MAX及びMINについては，FLAT指定を記述することで，引数に繰返し列を指定できます。繰返し列を指定した場合，集合関数MAX及びMINは適用対象である行中すべての要素から，最大値又は最小値を算出します。なお，列全体の値がナル値（要素数が0の繰返し列）の場合は，算出の対象外となります。

注※3

GROUP BY句又はHAVING句の指定がある場合，行数が0のグループの算出結果は出力しません。

列のデータ型と集合関数の値のデータ型の関係を次の表に示します。

表2‒25　列のデータ型と集合関数の値のデータ型の関係

集合関数の引数の

データ型

AVG

SUM

MAX及びMIN

COUNT

COUNT_FLOAT

XMLAGG

INTEGER

INTEGER

INTEGER

INTEGER

INTEGER

FLOAT

×

SMALLINT

INTEGER

INTEGER

SMALLINT

INTEGER

FLOAT

×

DECIMAL（p，s）

DECIMAL（max_prec※3，max_prec※3−p＋s）

DECIMAL（max_prec※3，s）

DECIMAL（p，s）

INTEGER

FLOAT

×

FLOAT

FLOAT

FLOAT

FLOAT

INTEGER

FLOAT

×

SMALLFLT

SMALLFLT

SMALLFLT

SMALLFLT

INTEGER

FLOAT

×

INTERVAL YEAR TO DAY

×

×

INTERVAL YEAR TO DAY

INTEGER

FLOAT

×

INTERVAL HOUR TO SECOND

×

×

INTERVAL HOUR TO SECOND

INTEGER

FLOAT

×

CHAR(n)

×

×

CHAR(n) ※１

INTEGER

FLOAT

×

VARCHAR(n)

×

×

VARCHAR(n) ※１

INTEGER

FLOAT

×

NCHAR(n)

×

×

NCHAR(n)

INTEGER

FLOAT

×

NVARCHAR(n)

×

×

NVARCHAR(n)

INTEGER

FLOAT

×

MCHAR(n)

×

×

MCHAR(n)

INTEGER

FLOAT

×

MVARCHAR(n)

×

×

MVARCHAR(n)

INTEGER

FLOAT

×

DATE

×

×

DATE

INTEGER

FLOAT

×

TIME

×

×

TIME

INTEGER

FLOAT

×

TIMESTAMP

×

×

TIMESTAMP

INTEGER

FLOAT

×

BINARY(n)※2

×

×

BINARY(n)

INTEGER

FLOAT

×

BLOB(n)

×

×

×

×

×

×

BOOLEAN

×

×

×

×

×

×

XML

×

×

×

×

×

XML

抽象データ型（XML型を除く）

×

×

×

×

×

×

（凡例）

×：使用できません。

注※1

結果の文字集合は集合関数の引数に指定した値式の文字集合になります。

注※2

nは32,000以下にしてください。

注※3

max_precはDECIMAL型の精度の最大値です。次の表に，max_precの値について示します。なお，pd_sql_dec_op_maxprecオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

表2‒26　DECIMAL型の精度の最大値

システム共通定義pd_sql_dec_op_maxprecオペランドの値

集合関数の引数の精度p

max_precの値

29

p≦29

29

p＞29

38

38

任意

38

(2)　形式

　集合関数：：＝｛COUNT（＊）｜COUNT_FLOAT（＊）｜ALL集合関数｜DISTINCT集合関数｜XMLAGG集合関数｝
　ALL集合関数：：＝｛AVG｜SUM｜MAX｜MIN｜COUNT｜COUNT_FLOAT｝（〔ALL〕｛値式｜FLAT指定｝）
　DISTINCT集合関数：：＝｛AVG｜SUM｜MAX｜MIN｜COUNT｜COUNT_FLOAT｝（DISTINCT ｛値式｜FLAT指定｝）
　FLAT指定：：＝FLAT（列指定）

XMLAGG集合関数の形式については，「XMLAGG」を参照してください。

(3)　副問合せを使用しない場合の規則

GROUP BY句，WHERE句，又はFROM句のうち，最後に指定された句の結果として得られる各グループが，集合関数の入力になります。ただし，GROUP BY句を指定しない場合，WHERE句，又はFROM句の結果がグループ化列（GROUP BY句で指定した値式）を持たない一つのグループになります。また，集合関数の演算結果はグループごとに得られます。

集合関数は，SELECT句，及びHAVING句に指定できます。

GROUP BY句，HAVING句，又は集合関数を指定した場合，SELECT句，及びHAVING句中の列指定は，次のどちらかにしてください。

グループ化列（GROUP BY句で指定した値式）

集合関数の引数中に指定

SELECT DISTINCTを指定した場合，DISTINCT集合関数は指定できません。

(4)　副問合せを使用する場合の規則

集合関数を副問合せ中に指定した場合，集合関数の入力対象になる集合を次に示します。

集合関数は，問合せ指定（副問合せの括弧内の指定も含む）ごとに指定できます。その問合せ指定ごとに集合関数の入力対象の集合が決まります。

COUNT（＊）又はCOUNT_FLOAT（＊）の入力対象になる集合は，COUNT（＊）又はCOUNT_FLOAT（＊）を直接含む問合せ指定で決まります。そのほかの集合関数の入力対象になる集合は，その引数中で参照する表をFROM句で指定した問合せ指定で決まります。

問合せ指定中のGROUP BY句，WHERE句，又はFROM句のうち，最後に指定された句の結果として得られる各グループが集合関数の入力になります。

ただし，GROUP BY句を指定しないと，WHERE句，又はFROM句の結果が，グループ化列（GROUP BY句で指定した値式）を持たない一つのグループになります。また，集合関数の演算結果は，グループごとに得られます。

ある問合せ指定Qに対する集合関数は，その問合せ指定QのSELECT句，又はHAVING句中にだけ指定できます。そのHAVING句の副問合せ中のFROM句中のON探索条件，WHERE句，及びHAVING句にも，問合せ指定Qの表の列を引数として参照（外への参照）すると問合せ指定Qに対する集合関数を指定できます。

問合せ指定中でGROUP BY句，若しくはHAVING句を指定する場合，又はSELECT句に集合関数を指定する場合，その問合せ指定のSELECT句，及びHAVING句中の列指定は次に示す条件が必要です。

SELECT句中の列指定の場合

その問合せ指定中のFROM句の表を参照している。

グループ化列である，又は集合関数の引数中に指定している。

HAVING句中の列指定の場合

その問合せ指定中のFROM句の表を参照しているか，又は外側の問合せ指定中のFROM句の表を参照（外側への参照）している。

その問合せ指定中のFROM句の表を参照している場合で，グループ化列，又は集合関数の引数中に指定している。

問合せ指定中にSELECT DISTINCTを指定すると，その問合せ指定に対するDISTINCT指定の集合関数は指定できません。DISTINCT指定の集合関数をDISTINCT集合関数といいます。

副問合せ中で集合関数の引数に，外への参照する列を含む演算は指定できません。

(5)　共通規則

集合関数は，SET句，IF文，WHILE文，SET文，RETURN文，WRITE LINE文，ADD句，及びGROUP BY句に指定できません。

集合関数の引数中に，埋込み変数，及び?パラメタは指定できません。

ただし，XMLAGG集合関数の値式にXMLQUERY関数を指定した場合，そのXMLQUERY関数のXML問合せ変数中の値式には埋込み変数又は？パラメタを指定できます。

集合関数の引数中には，列指定（予備列を除く）を含む値式を指定してください。

集合関数の引数中に，集合関数及びウィンドウ関数は指定できません。

文字列データの大小関係は，集合関数の引数に指定した値式の文字集合で使用する文字コードに従います。

各国文字列データの大小関係は，使用する各国文字コード（シフトJISコード，EUC日本語漢字コード，又はEUC中国語漢字コード）に従います。

混在文字列データの大小関係は，ASCIIコードと使用する各国文字コード（シフトJISコード，EUC日本語漢字コード，EUC中国語漢字コード，中国語漢字コード（GB18030），又はUnicode（UTF-8））に従います。

平均値（AVG）は，有効数字以下が切り捨てられます。

計算途中でオーバフローが発生した場合はエラーになります。ただし，オーバフローエラー抑止が設定されている場合は，エラーにはなりません。オーバフローエラー抑止が設定されている場合，対象になる集合関数を次に示します。

AVG

SUM

COUNT

COUNT_FLOAT

なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

COUNT_FLOATの値が2の53乗（16けた）以上になると，値は丸められます。

集合関数の引数中にコンポネント指定は指定できません。

集合関数の引数中に繰返し列を指定する場合，次の規則に従ってください。

繰返し列は，FLAT指定を記述した集合関数MAX又はMINだけ指定できます。

FLAT指定に記述する列指定は，添字のない繰返し列だけ指定できます。

GROUP BY句に列指定以外の値式を指定した問合せ指定には，FLAT指定を記述した集合関数は指定できません。

問合せ指定ごとにDISTINCT集合関数は二つ以上指定できません。

ただし，次の場合には，DISTINCT集合関数を二つ以上指定できます。

集合関数MAX及びMINには，異なる値式を指定できます。

集合関数AVG，SUM，COUNT及びCOUNT_FLOATには，同じ形式で記述した値式を指定できます。

集合関数の引数に指定する値式中に，副問合せは指定できません。

(6)　使用例

在庫表（ZAIKO）のすべての商品の在庫量（ZSURYO）の平均を求めます。

  SELECT AVG(ZSURYO) FROM ZAIKO

在庫表（ZAIKO）の商品名（SNAME）がスカートの行の在庫量（ZSURYO）の合計を求めます。

  SELECT N'スカート',SUM(ZSURYO)
      FROM ZAIKO
      WHERE SNAME = N'スカート'

在庫表（ZAIKO）から単価（TANKA）と在庫量（ZSURYO）の積（金額）の合計を求めます。

  SELECT SUM(TANKA * ZSURYO)
      FROM ZAIKO

在庫表（ZAIKO）から在庫量（ZSURYO）の最大値，最小値，及び件数の合計を求めます。

  SELECT COUNT(*),MAX(ZSURYO),MIN(ZSURYO)
      FROM ZAIKO

次の競技結果表から，種目コードが'0001'の種目の最高点（最大値）及び最低点（最小値）を求めます。なお，得点列は要素数3の繰返し列です。

2.15　ウィンドウ関数

2.15.1　ウィンドウ関数の形式と規則

(1)　機能

ウィンドウ関数に関連づけられたウィンドウ指定のウィンドウ枠を対象にして，結果を求める関数です。ウィンドウ関数の機能を，次の表に示します。

ウィンドウ枠には，行の集合のどの部分を集計対象とするかを指定します。ウィンドウ指定として（）だけをサポートしているバージョンでは，ウィンドウ枠はWHERE句，又はFROM句の結果として導出される表のすべての範囲を示します。

表2‒27　ウィンドウ関数の機能

ウィンドウ関数の種別

内容

COUNT(*)

ウィンドウ枠に対する入力行数を求める。

(2)　形式

　ウィンドウ関数：：＝COUNT(*)
　　　　　　　　　　　OVER　ウィンドウ指定
　ウィンドウ指定：：＝（）

(3)　オペランド

ウィンドウ関数：：＝COUNT(*)

　　　　　　　　　　　OVER　ウィンドウ指定

ウィンドウ指定：：＝（）

ウィンドウ関数についての規則を示します。

ウィンドウ関数は，選択式中に指定できます。

ウィンドウ関数COUNT(*) OVER()の結果のデータ型はINTEGER型になります。

計算途中でオーバフローが発生した場合はエラーになります。ただし，オーバフローエラー抑止が設定されている場合はエラーになりません。なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

ウィンドウ関数は，次に示す箇所には指定できません。

・INSERT文の問合せ式本体

・副問合せ

・導出表

・ビュー定義の導出問合せ式

・WITH句中の導出問合せ式

集合演算対象となる問合せ指定，導出問合せ式，及び問合せ式本体に指定できません。

ウィンドウ関数を指定した場合，GROUP BY句，及びHAVING句は指定できません。

選択式にウィンドウ関数を指定する場合，ウィンドウ関数以外の選択式を一つ以上指定してください。

スカラ演算中にウィンドウ関数は指定できません。

ウィンドウ関数を指定した場合，選択式に集合関数を指定できません。

(4)　留意事項

関数の入力が空集合の場合，集合関数COUNT(*)は0を出力しますが，ウィンドウ関数COUNT(*) OVER()を指定した場合は，検索結果行そのものが出力されません。

(5)　使用例

ウィンドウ関数の使用例を次に示します。ここで使用する表の構成は次のとおりです。

得点表（TOKUTEN）から得点（TEN）の高い順に，番号（ID），得点（TEN）及び総数を求める。

    SELECT "ID", "TEN", COUNT(*) OVER() AS "SOUSU"
      FROM "TOKUTEN" ORDER BY "TEN" DESC

2.16　スカラ関数

データ型の変数，データの部分抽出，値の変換などをSQLの問合せ式中の選択式，又は探索条件で指定します。

スカラ関数には，次の3種類があります。

システム組込みスカラ関数

システム組込みスカラ関数は，スカラ関数が指定できる箇所に指定できます。

システム定義スカラ関数

システム定義スカラ関数は，関数呼出しが指定できる箇所に指定できます。

システム定義スカラ関数には，追加で定義できる関数（拡張システム定義スカラ関数）があります。データベースの初期設定時には定義されないで，pdextfuncコマンドを実行することで定義され，指定できるようになる関数です。pdextfuncコマンドについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

プラグイン定義スカラ関数

プラグイン定義スカラ関数は，関数呼出しが指定できる箇所に指定できます。

スカラ関数の一覧を次の表に示します。

表2‒28　スカラ関数の一覧

分　類

スカラ関数

機　能

スカラ関数の種別

変換関数

INTEGER

数データを整数データに変換します。

組込み

DECIMAL

数データを10進数データに変換します。

組込み

FLOAT

数データを浮動小数点データに変換します。

組込み

DIGITS

整数，10進数，日間隔データ，又は時間隔データの数字の部分を抽出して，文字列表現に変換します。

組込み

NUMEDIT

数値を編集して，文字列表現に変換します。

定義

STRTONUM

数値の文字列表現を，数データ型に変換します。

定義

CHARACTER

日付データ，時刻データ，又は時刻印データを，文字列表現に変換します。

組込み

VARCHAR_FORMAT

日付データ，時刻データ，及び時刻印データを，指定した書式の文字列表現に変換します。

組込み

DATE

指定した書式の日付の文字列表現を，日付データに変換します。

西暦1年1月1日からの通算日数をそれが示す日付データに変換します。

組込み

DAYS

日付データ，又は時刻印データを西暦1年1月1日からの通算日数に変換します。

組込み

TIME

指定した書式の時刻の文字表現を，時刻データに変換します。

組込み

TIMESTAMP

時刻印の既定の文字列表現を，時刻印データに変換します。西暦1年1月1日からの通算日数を，それが示す時刻印データに変換します。日付データと時刻データから，それらを組み合わせた時刻印データに変換します。

組込み

TIMESTAMP_FORMAT

指定した書式に従った時刻印の文字列表現を，時刻印データに変換します。

組込み

MIDNIGHTSECONDS

深夜0時から，指定した時刻までの秒数を求めます。

定義

HEX

値式を16進文字列表現に変換します。

組込み

ASCII

文字をアスキーコードに変換します。

定義

CHR

アスキーコードを文字に変換します。

定義

RADIANS

角度を，度数からラジアンに変換します。

定義

DEGREES

角度を，ラジアンから度数に変換します。

定義

CAST指定

値式のデータを，指定したデータ型に変換します。

CAST指定については，「CAST指定」を参照してください。

該当しません

抽出関数

YEAR

日付データ，時刻印データ，又は日間隔データから年の部分を抽出します。

組込み

MONTH

日付データ，時刻印データ，又は日間隔データから月の部分を抽出します。

組込み

DAY

日付データ，時刻印データ，又は日間隔データから日の部分を抽出します。

組込み

HOUR

時刻データ，時刻印データ，又は時間隔データから時間の部分を抽出します。

組込み

MINUTE

時刻データ，時刻印データ，又は時間隔データから分の部分を抽出します。

組込み

SECOND

時刻データ，時刻印データ，又は時間隔データから秒の部分を抽出します。

組込み

数学関数

ABS

値式の絶対値を返します。

組込み

MOD

剰余を返します。

組込み

CEIL

その数値以上の最小の整数を求めます。

定義

FLOOR

その数値以下の最大の整数を求めます。

定義

TRUNC

数値の，指定したけた未満を切り捨てます。

定義

ROUND

切り上げと切り捨ての境界値を指定して，指定したけたに数値を丸めます。又は，四捨五入します。

定義

SIGN

数値の符号を1（正），0，−1（負）で求めます。

定義

SQRT

数値の平方根を求めます。

定義

POWER

数値の累乗を求めます。

定義

EXP

自然対数の底の累乗を求めます。

定義

LN

自然対数を求めます。

定義

LOG10

常用対数を求めます。

定義

SIN

ラジアンで指定した角度の正弦（三角関数）を求めます。

定義

COS

ラジアンで指定した角度の余弦（三角関数）を求めます。

定義

TAN

ラジアンで指定した角度の正接（三角関数）を求めます。

定義

ASIN

指定した数値の逆正弦（三角関数）をラジアンで求めます。

定義

ACOS

指定した数値の逆余弦（三角関数）をラジアンで求めます。

定義

ATAN

指定した数値の逆正接（三角関数）をラジアンで求めます。

定義

ATAN2

点（x，y）の逆正接（三角関数）をラジアンで求めます。

定義

SINH

双曲線正弦を求めます。

定義

COSH

双曲線余弦を求めます。

定義

TANH

双曲線正接を求めます。

定義

PI

円周率πを求めます。

定義

文字列操作関数

SUBSTR

データ列（文字列又はバイナリ列）中の指定した位置から，指定した文字数又は長さの部分データ列を求めます。

組込み

LEFTSTR

文字列中の先頭から，指定した文字数の部分文字列を求めます。

定義

RIGHTSTR

文字列中の最後から，指定した文字数の部分文字列を求めます。

定義

UPPER

文字列データ中の英小文字を英大文字に変換します。

組込み

LOWER

文字列データ中の英大文字を英小文字に変換します。

組込み

TRIM

左，右，又は左右から，空白又は指定した文字を繰り返し削除します。

組込み

TRANSL

（TRANSL_LONG）

文字列中の指定した文字を，対応するほかの文字に文字変換します。

定義

LTRIM

左から，空白又は指定した文字を繰り返し削除します。

定義

RTRIM

右から，空白又は指定した文字を繰り返し削除します。

定義

LTRIMSTR

左から，指定した文字列を繰り返し削除します。

定義

RTRIMSTR

右から，指定した文字列を繰り返し削除します。

定義

REPLACE

（REPLACE_LONG）

文字列中の部分文字列を，ほかの文字列に繰り返し置き換えます。

定義

INSERTSTR

（INSERTSTR_LONG）

指定した位置から，指定した文字数の部分文字列を文字列中から削除して，その位置に別の文字列を挿入します。

定義

POSSTR

文字列中に，指定した位置以降にn回数目に出現する，指定した部分文字列の文字位置を求めます。

定義

REVERSESTR

左右を反転した文字列を求めます。

定義

POSITION

データ列（文字列又はバイナリ列）中に，指定した位置以降に最初に出現する，指定した部分データ列の位置を求めます。

組込み

日付操作関数

NEXT_DAY

指定した日付の次の，指定した曜日の日付を求めます。

定義

LAST_DAY

指定した日付の，年月の最終日を求めます。

定義

DAYOFWEEK

指定した日付の曜日が，その週の何日目かを求めます。

定義

DAYOFYEAR

指定した日付が，その年の何日目かを求めます。

定義

DAYNAME

指定した日付の曜日を，英語で求めます。

定義

WEEK

指定した日付が，その年の第何週目かを求めます。

定義

WEEKOFMONTH

指定した日付が，その月の第何週目かを求めます。

定義

MONTHNAME

指定した日付の月の，英語名を求めます。

定義

ROUNDMONTH

切り上げの最小の日を指定し，日付の日を端数として，年月に丸めた日付を求めます。

定義

TRUNCYEAR

年度の最初の月日を指定して，その年度の最初の日付を求めます。

定義

QUARTER

年度の最初の月日を指定して，それが第何四半期かを求めます。

定義

HALF

年度の最初の月日を指定して，それが上期か下期かを求めます。

定義

CENTURY

指定した日付の世紀を求めます。

定義

MONTHS_BETWEEN

日付間の月数を，実数で求めます。

定義

YEARS_BETWEEN

日付間の年数を，実数で求めます。

定義

日時操作関数

DATE_TIME

日付データと時刻データとを連結して，時刻印の既定の文字列表現に変換します。

定義

INTERVAL_DATETIMES

既定の文字列表現の時刻印間の，日時間隔を求めます。

定義

ADD_INTERVAL

既定の文字列表現の時刻印に，日時間隔を加算します。

定義

検査関数

ISDIGITS

文字列中のすべての文字が，数字かどうかを検査します。

定義

IS_DBLBYTES

文字列中のすべての文字が，全角文字かどうかを検査します。

定義

IS_SNGLBYTES

文字列中のすべての文字が，半角文字かどうかを検査します。

定義

XML型値操作関数

XMLQUERY

XQueryを評価し，評価結果のXML型の値を生成します。

プラグイン

XMLSERIALIZE

XML型の値からVARCHAR型又はBINARY型の値を生成します。

プラグイン

XMLPARSE

XML文書からXML型の値を生成します。

プラグイン

そのほかの関数

LENGTH

値式のデータの長さを求めます。

組込み

VALUE

値式の並びの中からナル値でない最初の値式を抽出します。

組込み

NVL

ナル値をナル値でない値に変換します。

拡張定義

GREATEST

引数中の最大値を求めます。

定義

LEAST

引数中の最小値を求めます。

定義

BIT_AND_TEST

指定した引数同士のビットごとの論理積を求め，結果を真偽で返します。

組込み

CASE式

条件付けられた値を指定します。

CASE式については，「CASE式」を参照してください。

該当しません

（凡例）

組込み：システム組込みスカラ関数

定義：システム定義スカラ関数

拡張定義：拡張システム定義スカラ関数

プラグイン：プラグイン定義スカラ関数

2.16.1　システム組込みスカラ関数

ここでは，システム組込みスカラ関数の文法について説明します。

日付データ，時刻データ，時刻印データ，及び数データへのシステム組込みスカラ関数の実行例を次の図に示します。

図2‒6　日付データ，時刻データ，時刻印データ，及び数データへのシステム組込みスカラ関数の実行例

システム組込みスカラ関数に関係する規則を次に示します。

埋込み変数，及び?パラメタを単独で値式には指定できません。ただし，四則演算などの値式（単項演算子式を除く）中には指定できます。

繰返し列を引数の値式として指定する場合，添字を指定してください。ただし，添字としてANYは指定できません。

予備列は引数中に指定できません。

(1)　ABS

(a)　機能

値式の絶対値を返します。

(b)　形式

　ABS（値式）

(c)　規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は数データ型，日間隔データ，又は時間隔データにしてください。

結果のデータ型は，値式のデータ型になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

結果は値式の絶対値で表現できる値にしてください。表現できない値を指定するとオーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(2)　BIT_AND_TEST

(a)　機能

値式1と値式2の間でビットごとの論理積を求め，論理積の結果のビットのどれかが1の場合にBOOLEAN値（TRUE）を返します。

(b)　形式

　BIT_AND_TEST（値式1，値式2）

(c)　規則

値式1及び値式2に指定できるものを次に示します。

定数

USER値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

埋込み変数，又は?パラメタ

関数呼出し

スカラ副問合せ

値式1及び値式2のデータ型は，文字データ型（CHAR又はVARCHAR），又は最大長が32,000バイト以下のBINARYにしてください。値式1と値式2に指定できるデータ型の組み合わせを次の表に示します。

表2‒29　値式1と値式2に指定できるデータ型の組み合わせ（システム組込みスカラ関数BIT_AND_TEST）

値式1のデータ型

値式2のデータ型

文字データ

（CHAR及びVARCHAR）

バイナリデータ

（BINARY）

文字データ（CHAR及びVARCHAR）

○

×※

バイナリデータ（BINARY）

×※

○

（凡例）

○：指定できます。

×：指定できません。

注※

文字データの値式として，16進文字列定数だけ指定できます。

値式1及び値式2の両方に，埋込み変数，又は?パラメタだけの値式は指定できません。

一方の値式が埋込み変数，又は?パラメタの場合，埋込み変数，又は?パラメタのデータ型はもう一方の値式のデータ型が文字データのときはVARCHARを想定し，もう一方の値式のデータ型がバイナリデータのときはBINARYを想定します。また，データ長はもう一方の値式のデータ長を想定します。

値式1と値式2が両方とも文字列データ型の場合，値式1と値式2の文字集合は同じにしてください。ただし，値式1と値式2のどちらかが次に示す値式である場合，対応する値式の文字集合に変換します。

文字列定数

埋込み変数（既定文字集合）

?パラメタ

値式1と値式2のデータ長が異なる場合，短い方のデータの右側にX'00'を埋めて，文字列長を同じにしてから，ビットごとの論理積を求めます。

結果のデータ型は，BOOLEAN型になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式1又は値式2のどちらかがナル値であれば，結果もナル値になります。

値式1と値式2の間でビットごとの論理積を求め，論理積の結果のビットのどれかが1の場合はTRUEとなり，そうでない場合は結果はFALSEとなります。

値式1及び値式2の両方が長さ0の文字列の場合，結果はFALSEになります。

(d)　留意事項

BIT_AND_TESTは，次の箇所に指定できます。

探索条件中の論理述語の値式

戻り値データ型がBOOLEAN型のCREATE FUNCTION中のRETURN文

(e)　使用例

表T1の列（データ型：VARCHAR(2)）で，C1にビットがあるかどうかを調べます。

    SELECT * FROM T1
        WHERE BIT_AND_TEST(C1,X'FFFF') IS TRUE

(3)　CHARACTER

(a)　機能

日付データ，時刻データ，又は時刻印データを，文字列表現に変換します。

(b)　形式

　CHAR〔ACTER〕（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

日付データ型の列，時刻データ型の列，及び時刻印データ型の列

列指定

コンポネント指定

SQL変数又はSQLパラメタ

演算結果が日付データ型となる日付演算

演算結果が時刻データ型となる時刻演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），時刻データ型（TIME），又は時刻印データ型（TIMESTAMP）にしてください。

結果のデータ型を次に示します。

値式が日付データ型の場合：

CHAR(10)

値式が時刻データ型の場合：

CHAR(8)

値式が時刻印データ型の場合：

CHAR(19)，CHAR(22)，CHAR(24)，又はCHAR(26)

結果の値は，値式のデータ型の，既定の文字列表現となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

結果の文字集合は，既定の文字集合となります。

(d)　使用例

表T1のC1列（データ型：CHAR）のうち，6か月より以前の日付を現在（1995-02-06）の日付に更新します。

  UPDATE T1
      SET C1=CHAR(CURRENT_DATE)
      WHERE CHAR(CURRENT_DATE - 6 MONTHS) > C1

表T2のC1列（データ型：CHAR）のうち，0時0分0秒のものを現在（14:24:45）の時刻に更新します。

  UPDATE T2
      SET C1=CHAR(CURRENT_TIME)
      WHERE C1='00:00:00'

(4)　DATE

(a)　機能

指定した書式の日付の文字列表現を，日付データに変換します。

西暦1年1月1日からの通算日数を，日付データに変換します。

(b)　形式

機能1.の形式

　DATE（値式〔，日時書式〕）

機能2.の形式

　DATE（値式）

(c)　機能1.の規則

値式に指定できるものを次に示します。

日付の文字列表現の定数

CURRENT_DATE値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

演算結果が日付データ型となる日付演算

連結演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式は，次のデータ型にしてください。

日時書式を指定した場合

・定義長が8〜255バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が16〜510バイトの文字データ型。

・混在文字データ型（MCHAR，MVARCHAR）

日時書式を指定しない場合

・定義長が10バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が20バイトの文字データ型（CHAR，VARCHAR）。

・日付データ型（DATE）

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式は，日時書式で指定した書式の，日付の文字列表現にしてください。日時書式を省略した場合は，日付の既定の文字列表現にしてください。

(例)

日時書式'YYYY/MM/DD'の場合→'1995/06/30'

日時書式を省略した場合→'1995-06-30'

値式が日付データ型の場合，結果はその日付になります。

日時書式については，「日時書式の指定」を参照してください。

日時書式を指定した場合，値式と日時書式の文字集合は同じにしてください。ただし，日時書式が次に示す値式である場合，値式の文字集合に変換します。

文字列定数

(d)　機能2.の規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，整数（INTEGER）にしてください。また，四則演算，集合関数，又はCASE式を指定したときは，演算の結果を整数のデータ型にする必要があります。

値式の範囲は，1〜3652059の間にしてください。

結果は西暦1年1月1日から，（指定した数値−1）日後の日付になります。

（例）　値式が35の場合：西暦1年2月4日

(e)　共通規則

結果のデータ型は，日付データ型（DATE）になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式，又は日時書式がナル値であれば，結果もナル値になります。

(f)　使用例

スカラ関数CHARACTERの使用例と同様の処理を，スカラ関数DATEを用いて処理します。

    UPDATE T1
        SET C1=CHAR(CURRENT_DATE)
        WHERE CURRENT_DATE - 6 MONTHS > DATE(C1)

表T2のC1列（データ型：CHAR）の日付の，既定の文字列表現以外の書式（'DD/MON/YYYY'）で表現した文字列から，日付データを取得します。

    SELECT DATE(C1,'DD/MON/YYYY') FROM T2

(5)　DAY

(a)　機能

日付データ，時刻印データ，又は日間隔データから日の部分だけを抽出します。

(b)　形式

　DAY（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_DATE値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

日付演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），時刻印データ型（TIMESTAMP），又は日間隔データ型（INTERVAL YEAR TO DAY）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が日付データ型，又は時刻印データ型であれば，結果は1〜31になります。

値式が日間隔データ型であれば，結果は-99〜99になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：日付データ型）のうち，現在と同じ日付の行をすべて検索します。

    SELECT * FROM T1
        WHERE DAY(C1)=DAY(CURRENT_DATE)

(6)　DAYS

(a)　機能

日付データ，又は時刻印データを，西暦1年1月1日からの通算日数に変換します。

(b)　形式

　DAYS（値式）

(c)　規則

値式に指定できるものを次に示します。

日付の既定の文字列表現の定数

CURRENT_DATE値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

演算結果が日付データ型となる日付演算

演算結果が，日付の既定の文字列表現の定数となる連結演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），又は時刻印データ型（TIMESTAMP）にしてください。

結果のデータ型は，整数（INTEGER）にしてください。

結果は，西暦1年1月1日から指定した値式の日付を含めた日までの通算の日数になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列の値から，現在（1995-06-30）までの日数を求めます。

    SELECT DAYS(CURRENT_DATE) - DAYS(C1)
        FROM T1

(7)　DECIMAL

(a)　機能

数データを10進数データに変換します。

(b)　形式

　DEC〔IMAL〕 （値式〔，精度〔，位取り〕〕）

(c)　規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型として指定できるものを次に示します。

数データ型

精度は，1〜38の整数にしてください。精度の指定を省略した場合の仮定値は，指定した値式のデータ型によって異なります。省略時に仮定される精度を次の表に示します。

表2‒30　スカラ関数DECIMALの精度の省略値

データ型

精度（けた）

INTEGER

10

SMALLINT

5

DECIMAL

15

FLOAT

システム共通定義のpd_sql_dec_op_maxprecが29の場合※：29

システム共通定義のpd_sql_dec_op_maxprecが38の場合※：38

SMALLFLT

注※

システム共通定義のpd_sql_dec_op_maxprecオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

位取りは，0〜精度に指定した値の範囲で指定します。また，位取りは，整数，又は整数の文字列表現にしてください。位取りを省略すると，0が仮定されます。

結果のデータ型を次の表に示します。

表2‒31　スカラ関数DECIMALの結果のデータ型

データ型

結果の精度

結果の位取り

DECIMAL

引数で指定した精度。省略した場合は，表「スカラ関数DECIMALの精度の省略値」に示すとおりです。

引数で指定した位取り。省略した場合は0になります。

値式の整数部は，指定した，精度及び位取りで表現できる値にしてください。精度を超えると，オーバフローエラーになります。

結果の値で，指定した位取りよりも下のけたの数値は切り捨てられます。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

システム共通定義のpd_sql_dec_op_maxprecが29の場合，表T1のC1列（データ型：DECIMAL（10，0））をC2列（データ型：INTEGER）で除算した結果は10進数データDEC（29，19）になりますが，不要なけたを削除してDEC（4，2）にするためにスカラ関数DECIMALを使用して変換します。

    SELECT DECIMAL(C1/C2, 4, 2)
        FROM T1

(8)　DIGITS

(a)　機能

整数，10進数，日間隔データ，又は時間隔データの数字の部分を抽出して文字列表現に変換します。

(b)　形式

　DIGITS（値式）

(c)　規則

値式に指定できるものを次に示します。

整数定数，又は10進数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

演算結果が日間隔データ型となる日付演算

演算結果が時間隔データ型となる時刻演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，次に示すどれかにしてください。

整数（INTEGER，SMALLINT）

固定小数点数（DECIMAL）

日間隔データ型（INTERVAL YEAR TO DAY）

時間隔データ型（INTERVAL HOUR TO SECOND）

結果のデータ型は，固定長文字列（CHAR）になります。

結果のデータ長は，値式のデータ型によって異なります。結果のデータ長を次の表に示します。

表2‒32　スカラ関数DIGITSの結果のデータ長

データ長

結果のデータ長

INTEGER

10

SMALLINT

5

DECIMAL（p，s）

p

INTERVAL YEAR TO DAY

8

INTERVAL HOUR TO SECOND

6

（凡例）

p：精度

s：位取り

結果は値式の絶対値の文字列表現になり，符号，及び小数点は含みません。また，実際の値のけた数が小さい場合，先頭に'0'が設定されます。

（例）変換前のデータ型がDECIMAL（4，1）の場合

15. → '0150'

−12.4→ '0124'

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

結果の文字集合は，既定の文字集合になります。

(d)　使用例

表T3のC1列（データ型：CHAR）の値と，C2列（データ型：DECIMAL）の値が，等しいデータを検索します。

    SELECT * FROM T3
        WHERE C1 = DIGITS(C2)

(9)　FLOAT

(a)　機能

数データを，浮動小数点データに変換します。

(b)　形式

　FLOAT（値式）

(c)　規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型として指定できるものを次に示します。

数データ型

結果のデータ型は，倍精度浮動小数点数（FLOAT）になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：INTEGER）をC2列（データ型：INTEGER）で除算した結果を浮動小数点データで取得するために，除算をする前にスカラ関数FLOATを使用してどちらかのオペランドをFLOAT型に変換します。

    SELECT FLOAT(C1)/C2 FROM T1

(10)　HEX

(a)　機能

値式を16進文字列表現に変換します。

(b)　形式

　HEX（値式）

(c)　規則

システム内部で表現されている値式の形式を，16進文字列表現に変換します。内部表現形式と実行結果の例を次の表に示します。

表2‒33　スカラ関数HEXの内部表現形式と実行結果の例

値　式

内部の表現形式

HEX（値式）

'#AB12'

データ型：CHAR（5）

23｜41｜42｜31｜32

'2341423132'

1234

データ型：INTEGER

Windowsの場合：D2｜04｜00｜00

UNIXの場合：00｜00｜04｜D2

Windowsの場合：'D2040000'

UNIXの場合：'000004D2'

1234.

データ型：DECIMAL（4，0）

01｜23｜4C

'01234C'

値式に指定できるものを次に示します。

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

日付演算

時刻演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式に指定できるデータ型と結果のデータ型，及びデータ長の関係を次の表に示します。

表2‒34　スカラ関数HEXの値式のデータ型と結果のデータ型，及びデータ長の関係

値　式

実行結果

データ型

定義長

実長

データ型

定義長

実長

CHAR(n)

1≦n＜128

−

CHAR

n＊2

−

128≦n≦16,000

−

VARCHAR

n＊2

n＊2

NCHAR(n)

1≦n＜ 64

−

CHAR

n＊4

−

64≦n≦8,000

−

VARCHAR

n＊4

n＊4

MCHAR(n)

1≦n＜128

−

CHAR

n＊2

−

128≦n≦16,000

−

VARCHAR

n＊2

n＊2

VARCHAR(n)

1≦n≦16,000

〔r〕

VARCHAR

n＊2

r＊2

NVARCHAR(n)

1≦n≦8,000

〔r〕

VARCHAR

n＊4

r＊4

MVARCHAR(n)

1≦n≦16,000

〔r〕

VARCHAR

n＊2

r＊2

INTEGER

−

−

CHAR

8

−

SMALLINT

−

−

CHAR

4

−

DECIMAL（P,S）

1≦P≦38

0≦S≦38

S≦P

−

CHAR

（↓P/2↓＋1）＊2

−

FLOAT

−

−

CHAR

16

−

SMALLFLT

−

−

CHAR

8

−

DATE

−

−

CHAR

8

−

TIME

−

−

CHAR

6

−

TIMESTAMP(p)

p=0,2,4,又は6

−

CHAR

（7＋p/2）＊2

−

INTERVAL YEAR TO DAY

−

−

CHAR

10

−

INTERVAL HOUR TO SECOND

−

−

CHAR

8

−

BINARY(n)

1≦n≦16,000

〔r〕

VARCHAR

n＊2

r＊2

（凡例）

P：精度

S：位取り

p：小数秒精度

−：該当しません。

注

値式に長さ0の文字列定数（各国，及び混在を含む）だけが指定された場合，実行結果の定義長は1になります。

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式の演算結果が次に示すデータ型の場合は指定できません。

最大長が16,001バイト以上のCHAR，VARCHAR，MCHAR，及びMVARCHAR

最大長が8,001文字以上のNCHAR，及びNVARCHAR

BLOB

最大長が16,001バイト以上のBINARY

BOOLEAN

埋込み変数，及び?パラメタを含む値式は指定できません。

値式中の演算項，又は関数の引数が定数だけの場合，結果の長さが256バイト以上は指定できません。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

Windows版の場合，結果の値（DECIMAL型を除いた数データ）はリトルエンディアンの内部表現となります。具体的には，INTEGER型の1234の内部表現は"D2 04 00 00"となり，実行結果は"D2040000"となります。

UNIX版の場合，結果の値はサーバのプラットフォームの内部表現に依存します。例えば，Intel系CPUで動作するLinuxの場合，DECIMAL型を除いた数データはリトルエンディアンの内部表現となります。具体的には，INTEGER型の1234の内部表現は"D2 04 00 00"となり，実行結果は"D2040000"となります。

結果のデータ型が文字データとなる場合，結果の文字集合は既定文字集合になります。

(11)　HOUR

(a)　機能

時刻データ，時刻印データ，又は時間隔データから時間の部分だけを抽出します。

(b)　形式

　HOUR（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

時刻演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，時刻データ型（TIME），時刻印データ型（TIMESTAMP），又は時間隔データ型（INTERVAL HOUR TO SECOND）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が時刻データ型，又は時刻印データ型であれば，結果は0〜23になります。

値式が時間隔データ型であれば，結果は−99〜99になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：時刻データ型）のうち，現在と同じ時間の行をすべて検索します。

  SELECT * FROM T1
      WHERE HOUR (C1) = HOUR(CURRENT_TIME)

(12)　INTEGER

(a)　機能

数データを，整数に変換します。

(b)　形式

　INT〔EGER〕（値式）

(c)　規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型として指定できるものを次に示します。

数データ型

結果のデータ型は，整数（INTEGER）になります。

結果は，INTEGERで表現できる値にしてください。

結果の値で，小数点以下の数値は切り捨てられます。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：DECIMAL（4，3））のうち，小数部分だけを取得します。

    SELECT C1 - INTEGER(C1) FROM T1

(13)　LENGTH

(a)　機能

値式のデータの長さを求めます。

(b)　形式

　LENGTH（｛値式｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝）

(c)　規則

値式に指定できるものを次に示します。

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

日付演算

時刻演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

：埋込み変数〔：標識変数〕 AS データ型 （データ型はBLOB型，又はBINARY型だけ）

？ AS データ型 （データ型はBLOB型，又はBINARY型だけ）

値式には，次のデータ型は指定できません。

BOOLEAN

抽象データ型

値式に埋込み変数，又は？パラメタを指定する場合は，AS句でそのデータ型を指定してください。埋込み変数又は？パラメタに与えるデータの実長（位置付け子の場合は位置付け子に割り当てられたデータの実長）がAS句で指定したデータ型の最大長より大きい場合はエラーとなります。

結果のデータ型は，整数（INTEGER）になります。

値式のデータ型によって，実行結果が異なります。値式のデータ型による実行結果を次の表に示します。

表2‒35　スカラ関数LENGTHの値式のデータ型による実行結果

値式のデータ型

実行結果

固定長文字データ

既定文字集合の場合，定義長のバイト数

既定文字集合以外の場合，定義長のその文字集合での文字数

可変長文字データ

既定文字集合の場合，実際のデータのバイト数

既定文字集合以外の場合，実際のデータのその文字集合での文字数

固定長各国文字データ

定義長の文字数

可変長各国文字データ

実際のデータの文字数

固定長混在文字データ

実際のデータの文字数

可変長混在文字データ

実際のデータの文字数

数データ

定義長のバイト数

ただし，DECIMALは，（↓精度で指定したけた数/2↓＋1）になります。

詳細については，「データ型」を参照してください。

日付，時刻，時刻印データ

定義長のバイト数

日間隔，時間隔データ

詳細については，「データ型」を参照してください。

長大データ

実際のデータのバイト数

バイナリデータ

実際のデータのバイト数

値式が文字データ型の場合，空白も1文字として数えます。

値式が定数の場合，HiRDBで解釈されたデータ型に従って処理されます。詳細については，「定数」を参照してください。

値式がUSER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，又はCURRENT_TIMESTAMP値関数の場合，HiRDBで解釈されたデータ型に従って処理されます。詳細については，「USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，及びCURRENT_TIMESTAMP値関数」を参照してください。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(14)　LOWER

(a)　機能

文字データ，各国文字データ，又は混在文字データ中の英大文字を英小文字に変換します。

(b)　形式

　LOWER（値式）

(c)　規則

値式に指定できるものを次に示します。

定数

USER値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式に，NULL，埋込み変数，及び?パラメタは指定できません。

値式のデータ型は，文字データ型（CHAR，VARCHAR），各国文字データ型（NCHAR，NVARCHAR），又は混在文字データ型（MCHAR，MVARCHAR）にしてください。

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

結果のデータ型，及びデータ長は，値式のデータ型，及びデータ長と同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

結果の文字集合は，引数に指定した値式の文字集合となります。

(15)　MINUTE

(a)　機能

時刻データ，時刻印データ，又は時間隔データから，分の部分だけを抽出します。

(b)　形式

　MINUTE（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

時刻演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，時刻データ型（TIME），時刻印データ型（TIMESTAMP），又は時間隔データ型（INTERVAL HOUR TO SECOND）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が時刻データ型，又は時刻印データ型であれば，結果は0〜59になります。

値式が時間隔データ型であれば，結果は-59〜59になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC2列（データ型：時刻データ型）とC3列（データ型：時刻データ型）の差が，30分以内のデータを検索します。

    SELECT C1 FROM T1
        WHERE MINUTE(C3-C2) <= 30

(16)　MOD

(a)　機能

剰余を返します。

(b)　形式

　MOD（値式1，値式2）

(c)　規則

値式1，及び値式2に指定できるものを次に示します。

整数定数，又は10進数定数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式1には被除数を，値式2には除数を指定します。

値式1，又は値式2のデータ型は，次に示すどちらかにしてください。

整数（INTEGER，SMALLINT）

固定小数点数（DECIMAL）

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式1，又は値式2がナル値であれば，結果もナル値になります。

値式1，又は値式2に小数部を含む場合，結果の値にも小数部を含みます。

結果の符号は，値式1の符号と同じになります。

値式2が0の場合，エラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

次の式が成立する場合，計算途中でオーバフローが発生するため，オーバフローエラーになります。

　（p1−s1）＋s2＞max_prec

　　p1：値式1の値の実行的な精度

　　s1：値式1の値の実行的な位取り

　　p2：値式2の値の実行的な精度

　　s2：値式2の値の実行的な位取り

　　max_prec：精度の最大値です。精度の最大値max_precを次の表に示します。

表2‒36　精度の最大値max_prec

システム共通定義pd_sql_dec_op_maxprecオペランドの値※

p1とp2

max_precの値

29

p1≦29かつp2≦29

29

p1＞29又はp2＞29

38

38

任意

38

注※

システム共通定義のpd_sql_dec_op_maxprecオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

結果のデータ型と値式1，及び値式2のデータ型の関係を次の表に示します。

表2‒37　結果のデータ型と値式1，及び値式2のデータ型の関係

値式1のデータ型

値式2のデータ型

SMALLINT

INTEGER

DECIMAL

SMALLINT

SMALLINT

INTEGER

DECIMAL

INTEGER

SMALLINT

INTEGER

DECIMAL

DECIMAL（p，0）

SMALLINT

INTEGER

DECIMAL

DECIMAL（p，s）

（s ＞ 0）

DECIMAL

DECIMAL

DECIMAL

結果のデータ型がDECIMALの場合の結果の精度と位取りを次の表に示します。

表2‒38　結果のデータ型がDECIMALの場合の結果の精度と位取り

剰余結果の精度と位取り

精度と位取り

精度（p）

p＝MIN（p2−s2＋s，max_prec）

位取り（s）

s＝MAX（s1，s2）

注1

値式1のデータ型：DECIMAL（p1，s1）

値式2のデータ型：DECIMAL（p2，s2）

注2

INTEGERは，DECIMAL（10，0）として扱われます。

SMALLINTは，DECIMAL（5，0）として扱われます。

注3

max_precは，精度の最大値で，表「精度の最大値max_prec」のようになります。

(17)　MONTH

(a)　機能

日付データ，時刻印データ，又は日間隔データから月の部分だけを抽出します。

(b)　形式

　MONTH（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_DATE値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

日付演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），時刻印データ型（TIMESTAMP），又は日間隔データ型（INTERVAL YEAR TO DAY）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が日付データ型，又は時刻印データ型であれば，結果は1〜12になります。

値式が日間隔データ型であれば，結果は−11〜11になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のうち，当月（9月）でない行をすべて削除します。

    DELETE FROM T1
        WHERE MONTH(C1) < > MONTH(CURRENT_DATE)

(18)　POSITION

(a)　機能

データ列（文字列又はバイナリ列）中で，部分データ列に最初に一致する部分の開始位置を求めます。

(b)　形式

　POSITION（値式1 IN 値式2〔 FROM 値式3〕）

(c)　規則

値式1には検索する部分データ列を指定します。値式2には検索対象のデータ列を指定します。値式1，及び値式2に指定できるものを次に示します。ただし，値式1及び値式2のデータ型の組み合わせによって指定できるものが異なります。指定できるものの組み合わせは規則2．を参照してください。

定数(文字列，各国文字列，混在文字列，又は16進文字列)

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

：埋込み変数〔：標識変数〕 AS データ型 （データ型はBLOB型，又はBINARY型だけ）

? AS データ型 （データ型はBLOB型，又はBINARY型だけ）

値式1，及び値式2に指定できるデータ型の組み合わせを次の表に示します。

表2‒39　スカラ関数POSITIONの値式1及び値式2に指定できるデータ型の組み合わせ

値式1

値式2

文字列

データ型

各国文字列データ型

混在文字列データ型

BLOB型

最大長が32,000バイト以下のBINARY型

最大長が32,001バイト以上のBINARY型

文字列データ型

○※3,※5

×

○※4,※5

△※1,※6

△※1,※5

△※1,※6

各国文字列データ型

×

○※5

×

×

×

×

混在文字列データ型

○※4,※5

×

○※5

×

×

×

BLOB型

△※2,※7

×

×

○※6

○※7

○※6

最大長が32,000バイト以下のBINARY型

△※2,※5

×

×

○※6

○※5

○※6

最大長が32,001バイト以上のBINARY型

△※2,※7

×

×

○※6

○※7

○※6

（凡例）

○：指定できます。

△：制限付きで指定できます。

×：指定できません。

(表番号)：指定できる場合の，対応する項目の組み合わせ表

注※1

値式1が16進文字列定数の場合だけ指定できます。

注※2

値式2が16進文字列定数の場合だけ指定できます。

注※3

値式1と値式2が両方とも文字列データ型の場合，値式1と値式2の文字集合は同じにしてください。ただし，値式1が次に示す値式である場合，値式2の文字集合に変換します。

・文字列定数

注※4

文字列データ型の値式の文字集合が既定文字集合以外の場合は指定できません。

注※5

項目の組み合わせについては，表「スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式1，及び値式2が共に文字列データ型，各国文字列データ型，混在文字列データ型，又は最大長が32,000バイト以下のBINARY型の場合)」を参照してください。

注※6

項目の組み合わせについては，表「スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式2がBLOB型，又は最大長が32,001バイト以上のBINARY型の場合)」を参照してください。

注※7

項目の組み合わせについては，表「スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式1がBLOB型，又は最大長が32,001バイト以上のBINARY型，値式2が文字列データ型，又は最大長が32,000バイト以下のBINARY型の場合)」を参照してください。

値式1，及び値式2の指定できる項目の組み合わせを次に示します。

表2‒40　スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式1，及び値式2が共に文字列データ型，各国文字列データ型，混在文字列データ型，又は最大長が32,000バイト以下のBINARY型の場合)

値式1

値式2

定数

列指定

コンポネント指定

SQL変数，SQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

埋込み変数，？パラメタ※

定数

○

○

○

○

○

○

○

○

○

○

○

○

列指定

○

○

○

○

○

○

○

○

○

○

○

○

コンポネント指定

○

○

○

○

○

○

○

○

○

○

○

○

SQL変数，

SQLパラメタ

○

○

○

○

○

○

○

○

○

○

○

○

連結演算

○

○

○

○

○

○

○

○

○

○

○

○

集合関数

○

○

○

○

○

○

○

○

○

○

○

○

スカラ関数

○

○

○

○

○

○

○

○

○

○

○

○

CASE式

○

○

○

○

○

○

○

○

○

○

○

○

CAST指定

○

○

○

○

○

○

○

○

○

○

○

○

関数呼出し

○

○

○

○

○

○

○

○

○

○

○

○

埋込み変数，

？パラメタ※

○

○

○

○

○

○

○

○

○

○

○

○

(凡例)

○：指定できます。

注※

埋込み変数，？パラメタはBINARY型の場合だけ指定できます。

表2‒41　スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式2がBLOB型，又は最大長が32,001バイト以上のBINARY型の場合)

値式1

値式2

定数

列指定

コンポネント指定

SQL変数，SQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

埋込み変数，？パラメタ

定数※

×

○

×

○

×

×

×

×

×

×

×

○

列指定

×

×

×

×

×

×

×

×

×

×

×

×

コンポネント指定

×

×

×

×

×

×

×

×

×

×

×

×

SQL変数，

SQLパラメタ

×

○

×

○

×

×

×

×

×

×

×

○

連結演算

×

×

×

×

×

×

×

×

×

×

×

×

集合関数

×

×

×

×

×

×

×

×

×

×

×

×

スカラ関数

×

×

×

×

×

×

×

×

×

×

×

×

CASE式

×

×

×

×

×

×

×

×

×

×

×

×

CAST指定

×

×

×

×

×

×

×

×

×

×

×

×

関数呼出し

×

×

×

×

×

×

×

×

×

×

×

×

埋込み変数，

？パラメタ

×

○

×

○

×

×

×

×

×

×

×

○

(凡例)

○：指定できます。

×：指定できません。

注※

定数は文字列データ型（16進文字列定数）の場合だけ指定できます。

表2‒42　スカラ関数POSITIONの値式1及び値式2に指定できる項目の組み合わせ(値式1がBLOB型，又は最大長が32,001バイト以上のBINARY型，値式2が文字列データ型，又は最大長が32,000バイト以下のBINARY型の場合)

値式1

値式2

定数

列指定

コンポネント指定

SQL変数，SQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

埋込み変数，？パラメタ※

定数

×

×

×

×

×

×

×

×

×

×

×

×

列指定

×

×

×

×

×

×

×

×

×

×

×

×

コンポネント指定

×

×

×

×

×

×

×

×

×

×

×

×

SQL変数，

SQLパラメタ

○

○

○

○

○

○

○

○

○

○

○

○

連結演算

×

×

×

×

×

×

×

×

×

×

×

×

集合関数

×

×

×

×

×

×

×

×

×

×

×

×

スカラ関数

×

×

×

×

×

×

×

×

×

×

×

×

CASE式

×

×

×

×

×

×

×

×

×

×

×

×

CAST指定

×

×

×

×

×

×

×

×

×

×

×

×

関数呼出し

×

×

×

×

×

×

×

×

×

×

×

×

埋込み変数，

？パラメタ

○

○

○

○

○

○

○

○

○

○

○

○

(凡例)

○：指定できます。

×：指定できません。

注※

埋込み変数，？パラメタはBINARY型の場合だけ指定できます。

値式1及び値式2に埋込み変数，又は？パラメタを指定する場合は，AS句でそのデータ型を指定してください。埋込み変数又は？パラメタに与えるデータの実長（位置付け子の場合は位置付け子に割り当てられたデータの実長）がAS句で指定したデータ型の最大長より大きい場合はエラーとなります。

値式3は検索開始位置を指定します。次に，値式2と値式3の単位と値の範囲の関係を示します。

値式2が，文字集合が既定文字集合の文字列データ型，BLOB型，又はBINARY型の場合

値式3はバイト単位で指定します。値式3の値は次の範囲にしてください。

・値式2のデータ型が，文字集合が既定文字集合の文字列データ型の場合は，1≦（値式3）≦（値式2の最大長）

・値式2のデータ型がBLOB型又はBINARY型の場合は，1≦（値式3）

値式2が，各国文字列データ型又は混在文字列データ型の場合

値式3は文字単位で指定します。値式3の値は1≦（値式3）≦（値式2の最大長）の範囲にしてください。なお，混在文字列データ型の場合，値式2の最大長の単位はバイトです。

値式2が，文字集合が既定文字集合以外の文字列データ型の場合

値式3は文字単位で指定します。値式3の値は1≦（値式3）≦（値式2の最大長）÷cの範囲にしてください。cの値は，その文字集合の文字の最小バイト数で，EBCDIKの場合は1，UTF16の場合は2となります。なお，値式2の最大長の単位はバイトです。

値式3を省略した場合，検索開始位置は1を仮定します。

値式3に指定できるものを次に示します。

符号なし整数定数

列指定

コンポネント指定

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

SQL変数又はSQLパラメタ

埋込み変数又は？パラメタ

ただし，値式1，又は値式2がBLOB型，又は最大長が32,001バイト以上のBINARY型の場合，値式3には次のものが指定できます。

符号なし整数定数

SQL変数又はSQLパラメタ

埋込み変数又は？パラメタ

値式3のデータ型は，整数（INTEGER，SMALLINT）にしてください。

結果のデータ型は，整数（INTEGER）になります。

結果は値式2が，文字集合が既定文字集合の文字列データ型，BLOB型，又はBINARY型の場合はバイト単位，文字集合が既定文字集合以外の文字列データ型，各国文字列データ型又は混在文字列データ型の場合は文字単位の位置となります。

値式1の実長が0の場合，結果は値式3の値になります。ただし，値式3を省略した場合は1になります。

値式1の実長が0より大きく，値式3が値式2の実長より大きい値の場合，結果は0になります。

値式1の部分データ列が値式2のデータ列中の検索開始位置以降に出現しない場合は，結果は0になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式1，値式2，又は値式3がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：CHAR）の6バイト目以降に，最初に'TIME:'が出現する位置を検索します。

    SELECT POSITION('TIME:' IN C1 FROM 6) FROM T1

(19)　SECOND

(a)　機能

時刻データ，時刻印データ，又は時間隔データから，秒の部分だけを抽出します。

(b)　形式

　SECOND（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

時刻演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，時刻データ型（TIME），時刻印データ型（TIMESTAMP），又は時間隔データ型（INTERVAL HOUR TO SECOND）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が時刻データ型，又は時刻印データ型であれば，結果は0〜59になります。また，うるう秒を含んだ時刻データ又は時刻印データであれば，結果は0〜61になります。なお，うるう秒を含んだ時刻データ又は時刻印データを指定する方法については，マニュアル「HiRDB Version 9 システム定義」のpd_leap_secondオペランドの説明を参照してください。

値式が時間隔データ型であれば，結果は−59〜59になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC1列（データ型：時刻データ型）のうち，最も早い時刻と最も遅い時刻の差を秒単位で取得します。

    SELECT MINUTE(MAX(C1)-MIN(C1))
            *60+SECOND(MAX(C1)
            -MIN(C1))
        FROM T1

(20)　SUBSTR

(a)　機能

文字列データ，各国文字列データ，混在文字列データ，又はバイナリデータの一部を抽出します。

(b)　形式

　SUBSTR（値式1，値式2〔，値式3〕）

(c)　規則

値式1には，処理対象となるデータ列（文字列又はバイナリ列）を指定します。値式1に指定できるものを次に示します。ただし，値式1のデータ型によって指定できるものが異なります。

定数（文字列，各国文字列，又は混在文字列）

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

：埋込み変数〔：標識変数〕 AS データ型 （データ型はBLOB型，又はBINARY型だけ）

? AS データ型 （データ型はBLOB型，又はBINARY型だけ）

各データ型で指定できるものを次の表に示します。

表2‒43　スカラ関数SUBSTRの値式1のデータ型による指定できる項目

項目

値式1のデータ型

文字列データ型，

各国文字列データ型，

混在文字列データ型

最大長が32,000バイト以下のBINARY型

BLOB型，

最大長が32,001バイト以上のBINARY型

定数

○

×

×

列指定

○

○

○

コンポネント指定

○

○

×

SQL変数

SQLパラメタ

○

○

○

連結演算

集合関数

スカラ関数

CASE式

CAST指定

○

○

×

関数呼出し

○

○

○

スカラ副問合せ

○

○

×

埋込み変数

？パラメタ

×

○

○

(凡例)

○：指定できます。

×：指定できません。

値式1のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列データ型（CHAR，VARCHAR）

各国文字列データ型（NCHAR，NVARCHAR）

混在文字列データ型（MCHAR，MVARCHAR）

BLOB型，又はBINARY型

値式1に埋込み変数又は？パラメタを指定する場合は，AS句でそのデータ型を指定してください。埋込み変数又は？パラメタに与えるデータの実長（位置付け子の場合は位置付け子に割り当てられたデータの実長）がAS句で指定したデータ型の最大長より大きい場合はエラーとなります。

値式2には，取り出す部分データ列の開始位置を正の整数で指定します。次に，値式1と値式2の単位と値の範囲の関係を示します。

値式1が，文字集合が既定文字集合の文字列データ型，BLOB型，又はBINARY型の場合

値式2はバイト単位で指定します。値式2の値は次の範囲にしてください。

・値式1のデータ型が，文字集合が既定文字集合の文字列データ型の場合は，1≦（値式2）≦（値式1の最大長）

・値式1のデータ型がBLOB型又はBINARY型の場合は，1≦（値式2）

値式1が，各国文字列データ型又は混在文字列データ型の場合

値式2は文字単位で指定します。値式2の値は1≦（値式2）≦（値式1の最大長）の範囲にしてください。なお，混在文字列データ型の場合，値式1の最大長の単位はバイトです。

値式1が，文字集合が既定文字集合以外の文字列データ型の場合

値式2は文字単位で指定します。値式2の値は1≦（値式2）≦（値式1の最大長）÷cの範囲にしてください。cの値は，その文字集合の文字の最小バイト数で，EBCDIKの場合は1，UTF16の場合は2です。なお，値式1の最大長の単位はバイトです。

値式3には，取り出す部分データ列の長さを正の整数で指定します。次に，値式1と値式3の単位と値の範囲の関係を示します。

値式1が，文字集合が既定文字集合の文字列データ型，BLOB型，又はBINARY型の場合

値式3はバイト単位で指定します。値式3の値は次の範囲にしてください。

・値式1のデータ型が，文字集合が既定文字集合の文字列データ型の場合は，0≦（値式3）≦（値式1の最大長）−（値式2）＋1

・値式1のデータ型がBLOB型又はBINARY型の場合は，0≦（値式3）

値式1が，各国文字列データ型又は混在文字列データ型の場合

値式3は文字単位で指定します。値式3の値は0≦（値式3）≦（値式1の最大長）−（値式2）＋1の範囲にしてください。なお，混在文字列データ型の場合，値式1の最大長の単位はバイトです。

値式1が，文字集合が既定文字集合以外の文字列データ型の場合

値式3は文字単位で指定します。値式3の値は0≦（値式3）≦（値式1の最大長）÷c−（値式2）＋1の範囲にしてください。cの値は，その文字集合の文字の最小バイト数で，EBCDIKの場合は1，UTF16の場合は2です。なお，値式1の最大長の単位はバイトです。

値式3には定数の0は指定できません。

値式2，及び値式3に指定できるものを次に示します。

符号なし整数定数

列指定

コンポネント指定

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

SQL変数又はSQLパラメタ

埋込み変数又は？パラメタ

スカラ副問合せ

ただし，値式1がBLOB型，又は最大長が32,001バイト以上のBINARY型の場合，値式2及び値式3には次のものが指定できます。

符号なし整数定数

SQL変数又はSQLパラメタ

埋込み変数又は？パラメタ

値式2，及び値式3のデータ型は，整数（INTEGER，SMALLINT）にしてください。

値式2が，値式1の実長より大きい値の場合，結果はナル値（結果の長さは0）になります。

結果のデータの長さが0の場合，その結果はナル値になります。

値式3を省略した場合，値式1が固定長データのときは，値式2の開始位置から定義長の最後の文字まで取り出します。また，値式1が可変長データの場合は，値式2の開始位置から実長の最後の文字まで取り出します。

値式1がBLOB型で値式3を省略しない場合，指定した範囲のデータ列の中で実データの含まれていない部分があるときは，実データの含まれている部分だけを取り出します。

結果の値は，非ナル値制約なし（ナル値を許します）になります。

値式1，値式2，値式3のどれかがナル値であれば，結果もナル値になります。

結果のデータ型と長さを次の表に示します。

スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合の文字列型，各国文字型，混在文字型，BLOB型又はバイナリ型で，値式3を指定した場合）

スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合の文字列型，各国文字型，混在文字型，BLOB型又はバイナリ型で，値式3を省略した場合）

スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合以外の文字列型で，値式3を指定した場合）

スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合以外の文字列型で，値式3を省略した場合）

表2‒44　スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合の文字列型，各国文字型，混在文字型，BLOB型又はバイナリ型で，値式3を指定した場合）

部分列を抽出する文字列（値式1）のデータ型

実長

長さL（値式3）

定数（文字列）

定数以外

L₁≦255

L₁≧256

CHAR(n)

−

CHAR（L）

VARCHAR（L）〔L〕

VARCHAR(n)〔L〕

VARCHAR(n)

〔r〕

NCHAR(n)

−

NCHAR（L）

NVARCHAR（L）〔L〕

NVARCHAR(n)〔L〕

NVARCHAR(n)

〔r〕

MCHAR(n)

−

MCHAR（L₁）

MVARCHAR（L₁）〔L₂〕

MVARCHAR(n)〔L₂〕

MVARCHAR(n)

〔r〕

BLOB(n)

〔r〕

BLOB（L）〔k₅〕

BLOB（L）〔k₅〕

BLOB（n）〔k₅〕

BINARY(n)

〔r〕

BINARY(L)〔k5〕

BINARY(L)〔k₅〕

BINARY(n)〔k₅〕

（凡例）

〔 〕：実長を示します。

L₁：

文字列データ型の場合，値式3の長さL（バイト単位）

各国文字列データ型の場合，値式3の長さL（文字単位）×2

混在文字列データ型の場合，min（値式3の長さL（文字単位）×c，n）

L₂：

抽出したL文字の部分文字列のバイト数（L≦L₂≦L₁）

n：

処理対象となるデータ列（値式1）の定義長

文字列データ型，混在文字列データ型，及びBLOB型の場合はバイト単位

各国文字列データ型の場合は文字単位

k₅：

min（L，r−S＋1）

ｃ：

1文字を表現する最大バイト数

次の表に，文字コードごとの最大バイト数を示します。

pdntenv及びpdsetupで指定する

文字コード種別

最大バイト数（byte）

sjis

2

ujis

2

chinese

2

chinese-gb18030

4

lang-c

2

utf-8※

3〜6

utf-8_ivs※

3〜10

注※

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合は次の指定に従います。

システム共通定義pd_substr_length

クライアント環境定義PDSUBSTRLEN

SQLコンパイルオプションSUBSTR LENGTH

−：

該当しません。

注

値式1が可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の場合，取り出そうとする文字列中で実データの含まれていない部分には，空白が設定されます。

（例）

VARCHAR（8）〔5〕の文字列1に対して，SUBSTR（文字列1，3，5）を実行すると，取り出す文字列の右側2文字には空白が設定されます。

なお，値式1がBLOB型又はBINARY型で値式3を省略しない場合，指定した範囲のバイナリ列の中で，実データが含まれていない部分があるときは，実データの含まれている部分だけを取り出します。空白は設定されません。

（例）

BLOB(1024)〔512〕のバイナリデータ1に対して，SUBSTR（バイナリデータ1，101，600）を実行すると，バイナリデータ1の101バイト目から512バイト目までが結果となります。

表2‒45　スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合の文字列型，各国文字型，混在文字型，BLOB型又はバイナリ型で，値式3を省略した場合）

部分列を抽出する文字列（値式1）のデータ型

実長

開始位置S（値式2）

定 数（文字列）

定数以外

値式1が固定長

値式1が可変長

k₀≦255

k₀≧256

CHAR(n)

−

CHAR（k₁）

VARCHAR(n)〔k₁〕

−

VARCHAR(n)〔k₁〕

VARCHAR(n)

〔r〕

−

−

VARCHAR(n)〔k₂〕

VARCHAR(n)〔k₂〕

NCHAR(n)

−

NCHAR（k₁）

NVARCHAR(n)〔k₁〕

−

NVARCHAR(n)〔k₁〕

NVARCHAR(n)

〔r〕

−

−

NVARCHAR(n)〔k₂〕

NVARCHAR(n)〔k₂〕

MCHAR(n)

−

MCHAR（k₁）

MVARCHAR(n)〔k₃〕

−

MVARCHAR(n)〔k₃〕

MVARCHAR(n)

〔r〕

−

−

MVARCHAR(n)〔k₄〕

MVARCHAR(n)〔k₄〕

BLOB(n)

〔r〕

BLOB(n)〔k₂〕

BLOB(n)〔k₂〕

BINARY(n)

〔r〕

BINARY(n)〔k₂〕

BINARY(n)〔k₂〕

（凡例）

〔 〕：実長を示します。

n：

文字列データ型の場合は，バイト単位

混在文字列データ型の場合は，バイト単位

各国文字列データ型の場合は，文字単位

k₀：

文字列データ型，又は混在文字列データ型の場合，n−S＋1

各国文字列データ型の場合，（n−S＋１）×２

k₁：

n−S＋１

k₂：

max（r−S＋１，0）

k₃：

S文字目からnバイト目までの部分文字列のバイト数

max（n−（S−1）×c，0）≦k 3≦n−S＋１

k₄：

S文字目からrバイト目までの部分文字列のバイト数

max（r−（S−1）×c，0））≦k 4≦max（r−S＋１，0）

ｃ：

１文字を表現する最大バイト数

詳細については，「スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合の文字列型，各国文字型，混在文字型，BLOB型又はバイナリ型で，値式3を指定した場合）」の，凡例のcを参照してください。

−：

該当しません。

注

値式1が可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）で値式3を省略すると，k 2又はk 4が0であれば結果はナル値になります。

表2‒46　スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合以外の文字列型で，値式3を指定した場合）

部分列を抽出する文字列（値式1）のデータ型

実長

長さL（値式3）

定数（文字列）

定数以外

L₁≦255

L₁≧256

CHAR(n)

−

CHAR（L₁）

VARCHAR（L₁）〔L₂〕

VARCHAR(n)〔L₂〕

VARCHAR(n)

−

（凡例）

〔 〕：実長を示します。

L₁：

min（値式3の長さL×c，n）

L₂：

抽出したL文字の部分文字列のバイト数（L≦L₂≦L₁）

c：

値式結果の文字集合がEBCDIKの場合は1，UTF16の場合は4

n：

処理対象となるデータ列（値式1）の定義長（バイト単位）

−：

該当しません。

注

値式1が可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の場合，取り出そうとする文字列中で実データの含まれていない部分には，その文字集合の空白が設定されます。

表2‒47　スカラ関数SUBSTRの結果のデータ型と長さ（値式1のデータ型が既定文字集合以外の文字列型で，値式3を省略した場合）

部分列を抽出する文字列（値式1）のデータ型

実長

開始位置S（値式2）

定 数（文字列）

定数以外

値式1が固定長

値式1が可変長

k₀≦255

k₀≧256

CHAR(n)

−

CHAR（k₀）

VARCHAR(n)〔k₁〕

−

VARCHAR(n)〔k₁〕

VARCHAR(n)

〔r〕

−

−

VARCHAR(n)〔k₂〕

VARCHAR(n)〔k₂〕

（凡例）

〔 〕：実長を示します。

n：

処理対象となるデータ列（値式1）の定義長（バイト単位）

k₀：

n−(S−1) ×c₁

k₁：

Sバイト目からnバイト目までの部分列のバイト数max（n−（S−1）×c₂，0）≦k₁≦（n−(S−1) ×c₁）

k₂：

Sバイト目からrバイト目までの部分列のバイト数max（r−（S−1）×c₂，0）≦k₂≦max（r−(S−1)×c₁，0）

c₁：

１文字を表現する最小バイト数

値式結果の文字集合がEBCDIKの場合は1，UTF16の場合は2

c₂：

１文字を表現する最大バイト数

値式結果の文字集合がEBCDIKの場合は1，UTF16の場合は4

−：

該当しません。

注

値式1が可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）で値式3を省略すると，k₂が0であれば結果はナル値になります。

(d)　使用例

表T1のC1列（データ型：CHAR）のうち，入社年度（C1列の2文字目から2文字分）が'95年の行を検索します。

    SELECT C1 FROM T1
        WHERE SUBSTR(C1,2,2) = '95'

(21)　TIME

(a)　機能

指定した書式の時刻の文字列表現を，時刻データに変換します。

(b)　形式

　TIME（値式〔，日時書式〕）

(c)　規則

値式に指定できるものを次に示します。

時刻の文字列表現の定数

CURRENT_TIME値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

演算結果が時刻データとなる時刻演算

連結演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式は，次のデータ型にしてください。

日時書式を指定した場合

・定義長が6〜255の文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が12〜510の文字データ型（CHAR，VARCHAR）。

・混在文字データ型（MCHAR，MVARCHAR）

日時書式を指定しない場合

・定義長が8バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が16バイトの文字データ型（CHAR，VARCHAR）。

・時刻データ型（TIME）

値式は，日時書式で指定した書式の，時刻の文字列表現にしてください。日時値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式は，日時書式で指定した書式の，時刻の文字列表現にしてください。日時書式を省略した場合は，時刻の既定の文字列表現にしてください。

(例)

日時書式'HH-MI-SS'の場合→'13-45-17'

日時書式を省略した場合→'13:45:17'

値式が時刻データ型の場合，結果はその時刻になります。

日時書式については，「日時書式の指定」を参照してください。

結果のデータ型は，時刻データ型（TIME）になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式，又は日時書式がナル値であれば，結果もナル値になります。

日時書式を指定した場合，値式と日時書式の文字集合は同じにしてください。ただし，日時書式が次に示す値式である場合，値式の文字集合に変換します。

文字列定数

(d)　使用例

表T1のC1列（データ型：CHAR）のうち，最も早い時刻と最も遅い時刻の差を取得します。

    SELECT MAX(TIME(C1))-MIN(TIME(C1))
        FROM T1

表T2のC1列（データ型：CHAR）の，時刻の既定の文字列表現以外の書式（'HHMISS'）で表現した文字列から，時刻データを取得します。

    SELECT TIME(C1,'HHMISS') FROM T2

(22)　TIMESTAMP

(a)　機能

時刻印の既定の文字列表現を，時刻印データに変換します。

西暦1年1月1日からの通算日数を，それが示す時刻印データに変換します。

日付データと時刻データから，それらを組み合わせた時刻印データに変換します。

(b)　形式

機能1.の形式

　TIMESTAMP（値式）

機能2.の形式

　TIMESTAMP（値式）

機能3.の形式

　TIMESTAMP（値式1，値式2）

(c)　機能1.の規則

値式に指定できるものを次に示します。

時刻印の，既定の文字列表現の定数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

指定できるデータ型を次に示します。

定義長が19〜26バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が38〜52バイトの文字データ型（CHAR，VARCHAR）。

時刻印データ型（TIMESTAMP）

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式に文字データ型を指定する場合は，時刻印の既定の文字列表現にしてください。

値式が時刻印データ型の場合，結果はその時刻印になります。

結果のデータ型は，時刻印データ型（TIMESTAMP）になり，次の小数秒精度になります。

値式が文字データ型の場合は，値式の時刻印の既定の文字列表現に従う小数秒精度となります。

値式が時刻印データの場合は，その時刻印データの小数秒精度となります。

(d)　機能2.の規則

値式に指定できるものを次に示します。

数定数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，整数（INTEGER）にしてください。また，四則演算，スカラ関数，CASE式，CAST指定，関数呼出し，又は集合関数を指定した場合，演算の結果を整数のデータ型にする必要があります。

値式の範囲は，1〜3,652,059にしてください。

結果は，西暦1年1月1日から，（指定した数値−1）日後の時刻印になります。また，結果の時刻部分は0時0分0秒になります。

(例)

値式が35の場合→西暦1年2月4日0時0分0秒

(e)　機能3.の規則

値式1に指定できるものを次に示します。

日付の既定の文字列表現の定数

CURRENT_DATE値関数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

演算結果が日付データ型となる日付演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式1に指定できるデータ型を次に示します。

定義長が10バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が20バイトの文字データ型（CHAR，VARCHAR）。

日付データ型（DATE）

値式1のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式1は，日付の既定の文字列表現にしてください。

(例)

'1995-06-30'

値式2に指定できるものを次に示します。

時刻の既定の文字列表現の定数

CURRENT_TIME値関数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

演算結果が時刻データとなる時刻演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式2に指定できるデータ型を次に示します。

定義長が8バイトの文字データ型（CHAR，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が16バイトの文字データ型（CHAR，VARCHAR）。

時刻データ型（TIME）

値式2のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式2は，時刻の既定の文字列表現にしてください。

(例)

'13:45:17'

値式1と値式2に指定する文字集合は同じにしてください。ただし，値式１と値式2のどちらかが次に示す値式の場合，対応する値式の文字集合に変換します。

文字列定数

(f)　共通規則

結果のデータ型は，時刻印データ型（TIMESTAMP）になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

(g)　使用例

表T1のC1列（データ型：時刻印データ型）のうち，指定した時刻印以降のデータを検索します。

  SELECT C1 FROM T1
      WHERE C1 >= TIMESTAMP('2000-01-01 00:00:00.00')

表T1のC1列（データ型：数データ型）を時刻印データに変換して，表T2のC1列（データ型：時刻印データ型）に挿入します。

  INSERT INTO T2(C1) SELECT TIMESTAMP(C1) FROM T1

表T1のC1列（データ型：日付データ型）と，表T1のC2列（データ型：時刻データ型）とを組み合わせたデータを，表T2のC1列（データ型：時刻印データ型）に挿入します。

  INSERT INTO T2(C1) SELECT TIMESTAMP(C1,C2) FROM T1

(23)　TIMESTAMP_FORMAT

(a)　機能

指定した日時書式に従った時刻印の文字列表現を，時刻印データに変換します。

(b)　形式

　TIMESTAMP_FORMAT （値式，日時書式）

(c)　規則

値式に指定できるものを次に示します。

時刻印の文字列表現の定数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式は次のデータ型にしてください。

定義長が14〜255バイトの文字データ型（CHARACTER，VARCHAR）。ただし，文字集合がUTF16の場合は，定義長が28〜510バイトの文字データ型（CHARACTER，VARCHAR）。

混在文字データ型（MCHAR，MVARCHAR）

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

値式は，日時書式で指定した書式の，時刻印の文字列表現にしてください。

(例)

日時書式'YYYY/MM/DD HH-MI-SS.NNNN'の場合

→'2002/06/30 10-45-30.1523'

日時書式については，「日時書式の指定」を参照してください。

結果のデータ型は時刻印データ型（TIMESTAMP）となります。また，小数秒精度は6になります。

値式と日時書式に指定する文字集合は同じにしてください。ただし，日時書式が次の場合，対応する値式の文字集合に変換します。

文字列定数

(d)　共通規則

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式，又は日時書式がナル値であれば，結果もナル値になります。

(e)　使用例

表T1のC1列（データ型：CHAR）の，時刻印の既定の文字列表現以外の書式('DD/MON/YYYY HH-MI-SS NNNN')で表現した文字列から，時刻印データを取得します。

  SELECT TIMESTAMP_FORMAT(C1,'DD/MON/YYYY HH-MI-SS NNNN') FROM T1

(24)　TRIM

(a)　機能

TRIMもとに指定した文字列から，TRIM文字に指定した文字を取り除きます。TRIM文字で指定した文字以外が現れるまで繰り返し実行されます。

TRIM指定にLEADINGを指定した場合は左側から，TRAILINGを指定した場合は右側から，BOTHを指定又は指定を省略した場合は左右から取り除きます。

(b)　形式

　TRIM（〔〔TRIM指定〕〔TRIM文字〕 FROM 〕TRIMもと）
　　TRIM指定：：＝｛LEADING｜TRAILING｜BOTH｝

(c)　規則

TRIM文字，及びTRIMもとに指定できるものを次に示します。

定数（文字列，各国文字列，混在文字列，又は16進文字列）

USER値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

FROM句を指定する場合は，TRIM指定若しくはTRIM文字，又は両方を指定してください。

TRIM文字を省略すると，文字列型，各国文字列型，及び混在文字列型の場合は結果のデータ型に応じた空白文字が仮定されます。BINARY型の場合は，X'00'が仮定されます。

TRIM文字及びTRIMもとに指定できるデータ型の組み合わせを次の表に示します。

表2‒48　TRIM文字及びTRIMもとに指定できるデータ型の組み合わせ

TRIMもと

TRIM文字

CHAR又はVARCHAR

NCHAR又は

NVARCHAR

MCHAR又は

MVARCHAR

最大長が32,000バイト以下のBINARY

既定

EBCDIK

UTF16

CHAR又は

VARCHAR

既定

○

×

×

×

△※2

△※4

EBCDIK

△※1

○

×

×

×

×

UTF16

△※1

×

○

×

×

×

NCHAR又はNVARCHAR

×

×

×

○

×

×

MCHAR又はMVARCHAR

○※5

×

×

×

○

×

最大長が32,000バイト以下のBINARY

△※3

×

×

×

×

○

（凡例）

○：指定できます。

△：制限付きで指定できます。

×：指定できません。

注※1

TRIM文字が文字列定数又は16進文字列定数の場合だけ指定できます。

注※2

TRIM文字が1バイト文字1文字の場合だけ指定できます。

注※3

TRIM文字が16進文字列定数の場合だけ指定できます。

注※4

TRIMもとが16進文字列定数の場合だけ指定できます。

注※5

TRIM文字をMCHAR，又はMVARCHARとして扱います。

結果のデータ型を次の表に示します。

表2‒49　システム組込みスカラ関数TRIMの結果のデータ型

TRIMもとのデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

BINARY(n)

BINARY(n)

結果のデータ型が文字列型の場合，TRIMもとの文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。TRIM文字又はTRIMもとの値式がナル値であれば，結果もナル値になります。

TRIM文字の値の長さは，文字データ型，混在文字データ型，及び各国文字データ型の場合，文字単位の長さが1になるように指定してください。BINARY型の場合は1バイトになるように指定してください。

(d)　使用例

TRIMの使用例を次に示します。

  TRIM(LEADING 'a' FROM 'aaaadata base')   ==> 'data base'
  TRIM(TRAILING 'a' FROM 'data baseaaaaaaa')   ==> 'data base'
  TRIM(BOTH 'a' FROM 'aaaaadata baseaaaaaaa')   ==> 'data base'
  TRIM('a' FROM 'aaaaadata baseaaaaaaa')   ==> 'data base'
  TRIM('    data base    ')              ==> 'data base'

(25)　UPPER

(a)　機能

文字データ，各国文字データ，又は混在文字データ中の英小文字を英大文字に変換します。

(b)　形式

　UPPER（値式）

(c)　規則

値式に指定できるものを次に示します。

定数

USER値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

連結演算

集合関数

スカラ関数（HEX，LOWER，SUBSTR，UPPER）

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式に，NULL，埋込み変数，及び?パラメタは指定できません。

値式のデータ型は，文字データ型（CHAR，VARCHAR），各国文字データ型（NCHAR，NVARCHAR），又は混在文字データ型（MCHAR，MVARCHAR）にしてください。

値式のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合は任意です。

結果のデータ型，及びデータ長は，値式のデータ型，及びデータ長と同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式がナル値であれば，結果もナル値になります。

結果の文字集合は，引数に指定した値式の文字集合となります。

(26)　VALUE

(a)　機能

値式の並びの中からナル値でない最初の値式の示す値を抽出します。

(b)　形式

　VALUE（値式〔，値式〕…）

(c)　規則

値式に指定できるものを次に示します。

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

四則演算

日付演算

時刻演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

?パラメタ，又は埋込み変数

関数呼出し

スカラ副問合せ

値式の数は255個以内で指定します。

値式の演算結果が次に示すデータ型の場合は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

値式に，NULLは指定できません。

最初の値式に，?パラメタ，及び埋込み変数は単独（単項演算式に指定した場合も含む）で指定できません。

値式のデータ型は，それぞれ比較できるデータ型にしてください。

（例）

値式の一つのデータ型がCHARの場合，ほかの値式もCHARにしてください。

比較できるデータ型については，「データ型」を参照してください。

ただし，次に示すデータは比較できません。

日付データと日付データの文字列表現

時刻データと時刻データの文字列表現

時刻印データと時刻印データの文字列表現

日間隔データと日間隔データの10進数表現

時間隔データと時間隔データの10進数表現

バイナリデータと16進文字列定数

VALUEの一つ以上の値式が，?パラメタ，又は埋込み変数の場合，?パラメタ，又は埋込み変数のデータ型として最初の値式のデータ型を想定します。

値式の並びは左から右に順に評価され，ナル値でない最初の値が結果になります。

結果のデータ型，及びデータ長は，集合演算（UNION ALL，又はEXCEPT ALL）の結果のデータ型，及びデータ長と同じになります。詳細については，「問合せ式」を参照してください。

結果の値は，非ナル値制約なし（ナル値を許します）になります。すべての値式がナル値であれば，結果もナル値になります。

値式が文字データ型の場合，値式の文字集合はすべて同じにしてください。ただし，二つ目以降の引数に指定した値式が次に示す値式である場合，先頭の引数で指定した値式の文字集合に変換されます。

文字列定数

埋込み変数（既定文字集合）

?パラメタ

結果のデータ型が文字データ型となる場合，先頭の引数で指定した値式の文字集合が結果の文字集合となります。

(d)　使用例

表T5の列C2からナル値を抽出して，0を設定します。

    SELECT VALUE(C1,C2,C3,0)
        FROM T5

(27)　VARCHAR_FORMAT

(a)　機能

日付データ，時刻データ，又は時刻印データを指定した日時書式に従って，文字列表現に変換します。

(b)　形式

　VARCHAR_FORMAT （値式，日時書式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数又はSQLパラメタ

演算結果が日付データ型となる日付演算

演算結果が時刻データ型となる時刻演算

集合関数

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），時刻データ型（TIME），又は時刻印データ型（TIMESTAMP）にしてください。

日時書式については，「日時書式の指定」を参照してください。

結果のデータ型を次に示します。

日時書式が文字データ型（CHAR又はVARCHAR）の場合：

VARCHAR(n)

日時書式が混在文字データ型（MCHAR又はMVARCHAR）の場合：

MVARCHAR(n)

定義長nは次の値となります。

・値式を定数以外で指定し，かつ日時書式を定数で指定した場合は，指定した書式に従って変換できる文字列の最大長となります。

・値式を定数で指定し，かつ日時書式を定数で指定した場合は，書式に従って変換した後の文字列長となります。

・日時書式を定数以外で指定した場合は，日時書式のデータ型の定義長＋15となります。ただし，日時書式のデータ型が，文字集合がUTF16の文字データ型の場合，日時書式のデータ型の定義長＋30となります。

結果の値は，値式のデータ型の，既定の文字列表現になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。値式，又は日時書式がナル値であれば，結果もナル値になります。

結果の文字集合は，引数に指定した日時書式の文字集合となります。

(d)　使用例

表T1のC1列（データ型：DATE）から，指定した日時書式（'DD/MON/YYYY'）で表現した文字列で結果を取得します。

  SELECT VARCHAR_FORMAT(C1,'DD/MON/YYYY') FROM T1

(28)　YEAR

(a)　機能

日付データ，時刻印データ，又は日間隔データから，年の部分だけを抽出します。

(b)　形式

　YEAR（値式）

(c)　規則

値式に指定できるものを次に示します。

CURRENT_DATE値関数

CURRENT_TIMESTAMP値関数

列指定

コンポネント指定

SQL変数，又はSQLパラメタ

日付演算

集合関数（MAX，MIN）

スカラ関数

CASE式

CAST指定

関数呼出し

スカラ副問合せ

値式のデータ型は，日付データ型（DATE），時刻印データ型（TIMESTAMP），又は日間隔データ型（INTERVAL YEAR TO DAY）にしてください。

結果のデータ型は，整数（INTEGER）になります。

値式が日付データ型，又は時刻印データ型であれば，結果は1〜9999になります。

値式が日間隔データ型であれば，結果は−9999〜9999になります。結果が0以外の場合，値式の符号と結果の符号は同じになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。すべての値式がナル値であれば，結果もナル値になります。

(d)　使用例

表T1のC2列（データ型：INTEGER）の値が221140のC1列（データ型：日付データ型）の年度を取得します。ただし，C1列は年度末を表すため，表示の際は1年前の年を出力します。

    SELECT SUBSTR(DIGITS(YEAR(C1)-1),7,4),N'年度' FROM T1
        WHERE C2=221140

2.16.2　システム定義スカラ関数

ここでは，システム定義スカラ関数の文法について説明します。

なお，システム定義スカラ関数を使用する場合は，事前に必要となる作業及び規則がありますので注意してください。

事前に必要となる作業

システム定義スカラ関数を使用する場合，pdinit又はpdmodでデータディクショナリLOB用RDエリアを作成しておく必要があります。pdinit及びpdmodについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

拡張システム定義スカラ関数を使用する場合は，あらかじめpdextfuncコマンドで関数を定義してください。

拡張システム定義スカラ関数を使用する場合，ディクショナリ表に行が追加されるため，データディクショナリ用RDエリアの容量，及びシステムログ量が増加します。増加する容量は，あらかじめ見積もっておいてください。容量の見積もりについては，マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「データディクショナリ用RDエリアの容量の見積もり」及び「拡張システム定義スカラ関数の定義時に出力されるシステムログ量」を参照してください。なお，不要になった拡張システム定義スカラ関数は，pdextfuncコマンドで削除できます。そうすることで，データディクショナリ用RDエリアの空き容量を増やせます。

規則

繰返し列を引数の値式として指定する場合，添字を指定してください。ただし，添字としてANYは指定できません。

予備列は引数中に指定できません。

埋込み変数又は？パラメタを，単独で値式に指定する場合は，AS データ型を必ず指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。

システム定義スカラ関数を指定して導出した，名前付き導出表に対する問合せでは，ホールダブルカーソルを使用できません。

システム定義スカラ関数は，ビュー定義中の導出問合せ式には指定できません。

(1)　ACOS

(a)　機能

引数の逆余弦である角度を，0〜πの範囲（ラジアン単位）で返します。

(b)　形式

　〔MASTER.〕ACOS（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数値が定義されていない値を引数に指定すると，定義域エラー（domain error occurs）になります。

(2)　ADD_INTERVAL

(a)　機能

引数1で指定した既定の文字列表現（'YYYY-MM-DD hh:mm:ss'）の時刻印に，引数2で指定した10進数表現（±YYYYMMDDhhmmss.）の日時間隔を加算した，時刻印の既定の文字列表現を返します。

(b)　形式

　〔MASTER.〕ADD_INTERVAL（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

10進数定数又は整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は文字データ型（CHAR又はVARCHAR）にしてください。また，値の長さは19バイト以下にしてください。

引数1のデータ型が文字データ型（CHAR，VARCHAR）の場合，そのデータ型の文字集合はUTF16以外にしてください。引数1に，文字集合がUTF16の文字データ型を指定する場合，CAST指定を用いて既定文字集合の文字データ型に変換してください。

引数2のデータ型はDECIMAL，INTEGER，又はSMALLINTにしてください。また，14けた以下の整数値を指定してください。なお，小数点以下を指定しても無視されます。

結果のデータ型はCHAR(19)になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

関数の結果の文字集合は，引数1の文字集合となります。

引数1の値には，有効な時刻印の既定の文字列表現（'YYYY-MM-DD hh:mm:ss'）を指定してください。時刻印の既定の文字列表現には，小数秒を指定しないでください。

引数2の値式には，日時間隔の10進数表現（±YYYYMMDDhhmmss.）を指定してください。

YYYY：年数

MM：月数

DD：日数

hh：時数

mm：分数

ss：秒数

引数2の値が正の場合，引数1の時刻印への日時間隔（YYYYMMDDhhmmss.）の加算になります。引数2の値が負の場合，引数1の時刻印への日時間隔（YYYYMMDDhhmmss.）の減算になります。

日時間隔の加減算は，年，月，日，時，分，秒の順に演算します。年又は月の演算結果が存在しない日付（小の月の31日，及びうるう年以外の年の2月29日）になった場合の結果は，その月の最終日に修正されます。

なお，任意の月の最終日から数か月後が，必ずその月の最終日になるわけではありません。また，ある日付に任意の月数を加算した後，その結果の日付から同じ月数を引いても，必ず元の日付になるとは限らないので注意してください。

同じ月数を引いても，必ず元の日付になるとは限らないので注意してください。

時刻印の既定の文字列表現でうるう秒を指定した場合，演算結果は次のようになります。

分以上の演算で，結果の秒が60秒以上になった場合は，59秒に修正されます。

秒の演算では，60秒を1分，61秒を1分1秒として演算します。

関数の結果には，うるう秒を含みません。

関数の結果が，0001年01月01日00時00分00秒〜9999年12月31日23時59分59秒の範囲でない場合，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の演算結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

関数の結果は，時刻印の既定の文字列表現になります。

(d)　使用例

ADD_INTERVALの使用例を次に示します。

  ADD_INTERVAL('1999-12-31 23:59:59',10000000001.)
    ==> '2001-01-01 00:00:00'

  ADD_INTERVAL('2001-01-01 00:00:00',-10000000001.)
    ==> '1999-12-31 23:59:59'

  ADD_INTERVAL('1956-06-07 03:15:30',400313115450.)
    ==> '1996-09-20 15:10:20'

  ADD_INTERVAL('1998-12-31 13:59:59',10200030405.)
    ==> '2000-02-29 17:04:04'

  ADD_INTERVAL('2000-02-29 17:04:04',-10200030405.)
    ==> '1998-12-28 13:59:59'

  ADD_INTERVAL('2000-03-05 17:04:60',100.)
    ==> '2000-03-05 17:05:59'
    システム共通定義 pd_leap_secondが Yの場合です。

  ADD_INTERVAL('2000-03-05 17:04:60',-60.)
    ==> '2000-03-05 17:04:00'
    システム共通定義 pd_leap_secondがYの場合です。

  ADD_INTERVAL(CAST(CURRENT_TIMESTAMP AS CHAR(19)),-100000000.)
    ==> '2008-09-29 10:17:48'
    CURRENT TIMESTAMPが，2008年10月29日10時17分48秒の場合です。

(3)　ASCII

(a)　機能

引数で指定した文字列の，最初の文字のASCIIコードを整数値で返します。

(b)　形式

　〔MASTER.〕ASCII（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は文字データ型（CHAR又はVARCHAR）にしてください。

引数のデータ型の文字集合は既定文字集合にしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

引数の値の長さが0バイトの場合，結果はナル値になります。

(d)　使用例

ASCIIの使用例を次に示します。

  ASCII('ABC')       ==> 65
  CHR(ASCII('ABC'))  ==> 'A'

(4)　ASIN

(a)　機能

引数の逆正弦である角度を，−π/2〜π/2の範囲（ラジアン単位）で返します。

(b)　形式

　〔MASTER.〕ASIN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数，又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数値が定義されていない値を引数に指定すると，定義域エラー（domain error occurs）になります。

(5)　ATAN

(a)　機能

引数の逆正接である角度を，−π/2〜π/2の範囲（ラジアン単位）で返します。

(b)　形式

　〔MASTER.〕ATAN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(6)　ATAN2

(a)　機能

x/yの逆正接である角度を，−π〜πの範囲（ラジアン単位）で返します。なお，xは引数1とし，yは引数2とします。

(b)　形式

　〔MASTER.〕ATAN2（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

(7)　CEIL

(a)　機能

引数の値以上の，最小の整数値を返します。

(b)　形式

　〔MASTER.〕CEIL（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型を次の表に示します。

表2‒50　システム定義スカラ関数CEILの結果のデータ型

引数のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p,s)

DECIMAL(p,s)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(8)　CENTURY

(a)　機能

引数で指定された日付の世紀を返します。

(b)　形式

　〔MASTER.〕CENTURY（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

CENTURYの使用例を次に示します。

  CENTURY(DATE('1900-12-31'))    ==> 19
  CENTURY(DATE('1901-01-01'))    ==> 20
  CENTURY(DATE('1999-12-31'))    ==> 20
  CENTURY(DATE('2000-12-31'))    ==> 20
  CENTURY(DATE('2001-01-01'))    ==> 21

(9)　CHR

(a)　機能

引数で指定した整数値が示す，ASCIIコードの文字を返します。引数の値が0〜255の範囲外の値ならば，ナル値を返します。

(b)　形式

　〔MASTER.〕CHR（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はCHAR(1)になります。

結果の文字集合は既定の文字集合になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

CHRの使用例を次に示します。

  CHR(65)           ==> 'A'
  ASCII(CHR(65))    ==> 65

(10)　COS

(a)　機能

ラジアンで角度を指定した，引数の余弦（三角関数COS）を返します。

(b)　形式

　〔MASTER.〕COS（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(11)　COSH

(a)　機能

引数の双曲線余弦を返します。

(b)　形式

　〔MASTER.〕COSH（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(12)　DATE_TIME

(a)　機能

引数1で指定したDATE型の日付と，引数2で指定したTIME型の時刻とを，時刻印の既定の文字列表現('YYYY-MM-DD hh:mm:ss')に変換して返します。

(b)　形式

　〔MASTER.〕DATE_TIME（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

CURRENT_TIME値関数

列指定

SQL変数又はSQLパラメタ

時刻演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型はDATEにしてください。引数2のデータ型はTIMEにしてください。

結果のデータ型はCHAR(19)になります。

結果の文字集合は，既定の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

DATE_TIME（日時，時刻）の結果である時刻印の既定の文字列表現は，日付の既定の文字列表現，1文字の空白，及び時刻の既定の文字列表現を連結した値になります。

CHAR(日付) || ' ' || CHAR(時刻)

(d)　使用例

DATE_TIMEの使用例を次に示します。

  DATE_TIME(DATE('1999-12-31'), TIME('23:59:59'))
    ==> '1999-12-31 23:59:59'
  DATE_TIME(CURRENT_DATE, CURRENT_TIME)
    ==> '1999-07-27 11:05:20'

(13)　DAYNAME

(a)　機能

引数で指定した日付の，曜日を示す文字列（'Sunday'，'Monday'などの英語の文字列）を返します。

(b)　形式

　〔MASTER.〕DAYNAME（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はVARCHAR(18)になります。

結果の文字集合は，既定の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

DAYNAMEの使用例を次に示します。

  DAYNAME(DATE('1999-06-06'))    ==> 'Sunday'
  DAYNAME(DATE('1999-06-07'))    ==> 'Monday'
  DAYNAME(DATE('1999-06-08'))    ==> 'Tuesday'
  DAYNAME(DATE('1999-06-09'))    ==> 'Wednesday'
  DAYNAME(DATE('1999-06-10'))    ==> 'Thursday'
  DAYNAME(DATE('1999-06-11'))    ==> 'Friday'
  DAYNAME(DATE('1999-06-12'))    ==> 'Saturday'

(14)　DAYOFWEEK

(a)　機能

引数で指定した日付の，曜日を示す1〜7の整数値（その週の第何日目かを示す値）を返します。なお，週の最初の日は日曜日とし，1は日曜日を示します。

(b)　形式

　〔MASTER.〕DAYOFWEEK（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

DAYOFWEEKの使用例を次に示します。

  DAYOFWEEK(DATE('1999-06-06'))    ==> 1
  DAYOFWEEK(DATE('1999-06-07'))    ==> 2
  DAYOFWEEK(DATE('1999-06-08'))    ==> 3
  DAYOFWEEK(DATE('1999-06-11'))    ==> 6
  DAYOFWEEK(DATE('1999-06-12'))    ==> 7
    なお， '1999-06-06' は，日曜日です。

(15)　DAYOFYEAR

(a)　機能

引数で指定した日付が，その年の第何日目かを示す1〜366の整数値を返します。

(b)　形式

　〔MASTER.〕DAYOFYEAR（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

DAYOFYEARの使用例を次に示します。

  DAYOFYEAR(DATE('1999-01-01'))    ==>   1
  DAYOFYEAR(DATE('1999-02-28'))    ==>  59
  DAYOFYEAR(DATE('1999-06-07'))    ==> 158
  DAYOFYEAR(DATE('1999-12-31'))    ==> 365
  DAYOFYEAR(DATE('2000-12-31'))    ==> 366

(16)　DEGREES

(a)　機能

引数で指定した角度を，ラジアンから度数に変換します。

(b)　形式

　〔MASTER.〕DEGREES（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(17)　EXP

(a)　機能

自然対数の底の累乗を求めます。

(b)　形式

　〔MASTER.〕EXP（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(18)　FLOOR

(a)　機能

引数の値以下の，最大の整数を返します。

(b)　形式

　〔MASTER.〕FLOOR（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型を次の表に示します。

表2‒51　システム定義スカラ関数FLOORの結果のデータ型

引数のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p, s)

DECIMAL(p, s)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(19)　GREATEST

(a)　機能

すべての引数中の最大値を返します。

(b)　形式

　〔MASTER.〕GREATEST（引数，引数〔，引数〕）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

引数の数は最大3個です。

値式に指定できるものを次に示します。

定数

USER値関数，CURRENT_DATE値関数，又はCURRENT_TIME値関数

列指定

SQL変数又はSQLパラメタ

四則演算，日付演算，時刻演算，又は連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒52　システム定義スカラ関数GREATEST（引数3を省略する場合）の引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

○

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

DATE

DATE

○

TIME

TIME

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

表2‒53　システム定義スカラ関数 GREATEST（引数3を指定する場合）の引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

引数3のデータ型

指定可否

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

○

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

DATE

DATE

DATE

○

TIME

TIME

TIME

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数に指定した値式のデータ型が文字データ型の場合，値式の文字集合はすべて同じにしてください。

結果のデータ型を次の表に示します。

表2‒54　システム定義スカラ関数GREATESTの結果のデータ型

引数のデータ型

結果のデータ型

INTEGER又はSMALLINT

INTEGER

DECIMAL〔,INTEGER又はSMALLINT〕

DECIMAL※１

FLOAT,SMALLFLT〔,DECIMAL,INTEGER,又はSMALLINT〕

FLOAT

CHAR又はVARCHAR

VARCHAR※２

MCHAR又はMVARCHAR

MVARCHAR※２

NCHAR又はNVARCHAR

NVARCHAR※２

DATE

DATE

TIME

TIME

注※1

精度と位取りを次に示します。pi及びsiを，それぞれi番目の引数の精度及び位取りとします。

精度＝max(p1-s1, p2-s2,…)＋max(s1, s2,…)

位取り＝max(s1, s2,…)

結果の精度が38を超えた場合はエラーになります。

また，INTEGERはDECIMAL(10,0)，SMALLINTはDECIMAL(5,0)として扱われます。

注※2

最大長を次に示します。niをi番目の引数の最大長（固定長のデータ型の場合は定義長）とします。

最大長＝max(n1, n2,…)

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

結果のデータ型が文字データ型となる場合，結果の文字集合は引数に指定した値式の文字集合となります。

(20)　HALF

(a)　機能

引数2で指定した月，及び引数3で指定した日を各年度の開始月日として，引数1で指定された日付が上期か下期かを1〜2の整数で返します。

(b)　形式

　〔MASTER.〕HALF（引数1〔，引数2〔，引数3〕〕）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2及び引数3の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型はDATEにしてください。引数2及び引数3のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

引数2を省略すると，1を仮定します。引数2に指定できる値の範囲は，1〜12です。

引数3を省略すると，1を仮定します。引数3に指定できる値の範囲は，引数2の値が2の場合は，1〜29です。それ以外の場合は，1〜（引数2で指定した月の最終日）です。

結果は，次の規則によって求められます。

引数1の日＜引数3の場合

月数＝引数1の月−引数2−1

引数1の月≧引数3の場合

月数＝引数1の月−引数2

月数＜0の場合

結果＝(月数＋12)÷2＋1

月数≧0の場合

結果＝月数÷2＋1

(d)　使用例

HALFの使用例を次に示します。

  HALF(DATE('1999-01-01'))          ==> 1
  HALF(DATE('1999-09-10'))          ==> 2
  HALF(DATE('1999-12-31'))          ==> 2
  HALF(DATE('1999-04-01'), 4)       ==> 1
  HALF(DATE('1999-09-10'), 4)       ==> 1
  HALF(DATE('1999-03-31'), 4)       ==> 2
  HALF(DATE('1999-03-21'), 3, 21)   ==> 1
  HALF(DATE('1999-09-20'), 3, 21)   ==> 1
  HALF(DATE('1999-03-20'), 3, 21)   ==> 2

(21)　INSERTSTR（INSERTSTR_LONG）

(a)　機能

引数1で指定した文字列に対して，引数2で指定した文字位置から引数3で指定した文字数の部分文字列を削除し，その位置に引数4で指定した文字列を挿入した文字列を返します。

(b)　形式

　〔MASTER.〕INSERTSTR（引数1，引数2，引数3，引数4）
　〔MASTER.〕INSERTSTR_LONG（引数1，引数2，引数3，引数4）

(c)　規則

引数1，引数2，引数3，及び引数4に指定できるものを次に示します。

値式〔AS データ型〕

引数1及び引数4の値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2及び引数3の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1及び引数4に指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒55　システム定義スカラ関数INSERTSTR，INSERTSTR_LONGの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数1及び引数4の両方に文字列型（CHAR又はVARCHAR)の値式を指定する場合，両方の引数の文字集合は同じにしてください。

引数4の値の最大長を次に示します。

表2‒56　システム定義スカラ関数INSERTSTRの引数4の最大長

引数1（及び引数4）のデータ型

引数4の最大長

CHAR

又は

VARCHAR

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR

127

表2‒57　システム定義スカラ関数INSERTSTR_LONGの引数4の最大長

引数1（及び引数4）のデータ型

引数4の最大長

CHAR又はVARCHAR

32000

MCHAR又はMVARCHAR

32000

NCHAR又はNVARCHAR

16000

引数2及び引数3のデータ型は，INTEGER又はSMALLINTにしてください。

引数3に0を指定すると，部分文字列は，削除されません。

結果のデータ型を次に示します。

表2‒58　システム定義スカラ関数INSERTSTRの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

表2‒59　システム定義スカラ関数INSERTSTR_LONGの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(32000)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(32000)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(16000)

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

結果のデータ型が文字データ型の場合，結果の文字集合は引数１の文字集合となります。

引数2及び引数3に指定できる値の範囲を次に示します。なお，mは引数2の値です。

表2‒60　システム定義スカラ関数INSERTSTRの引数2及び引数3の値の範囲

引数1のデータ型

引数2の値の範囲

引数3の値の範囲

CHAR(n)

又はVARCHAR(n)

既定文字集合，及び文字集合(UTF16以外)

1〜n

0〜（n＋1−m）

文字集合(UTF16)

1〜n／2

0〜（n／2＋1−m）

MCHAR(n)又はMVARCHAR(n)

1〜n

0〜（n＋1−m）

NCHAR(n)又はNVARCHAR(n)

1〜n

0〜（n＋1−m）

表2‒61　システム定義スカラ関数INSERTSTR_LONGの引数2及び引数3の値の範囲

引数1のデータ型

引数2の値の範囲

引数3の値の範囲

CHAR(n)

又はVARCHAR(n)

既定文字集合，及び文字集合(UTF16以外)

1〜32000

0〜（32001−m）

文字集合(UTF16)

1〜16000

0〜（16001−m）

MCHAR(n)又はMVARCHAR(n)

1〜32000

0〜（32001−m）

NCHAR(n)又はNVARCHAR(n)

1〜16000

0〜（16001−m）

引数1で指定した文字列の長さ（文字数）が，引数2で指定した文字位置mよりも短い場合は，文字数が（m−1）になるまで引数１の文字集合の空白（引数1のデータ型がNCHAR又はNVARCHARの場合は全角空白）が埋められ，どの部分文字列も削除されません。

引数1で指定した文字列の長さ（文字数）がm以上で，（m−1＋nd）未満の場合は，文字位置mから最後の文字までが削除されます。なお，ndは引数3で指定した文字数とします。

結果の長さは，結果のデータ型の最大長を超えないようにしてください。結果の長さが引数1の長さより長くなる場合は，INSERTSTR_LONGを使用してください。

(d)　使用例

INSERTSTR，INSERTSTR_LONGの使用例を次に示します。

  INSERTSTR('data warehouse system', 6, 9, 'base')
    ==> 'data base system'
  INSERTSTR_LONG('data system', 6, 0, 'warehouse ')
    ==> 'data warehouse system'
  INSERTSTR('data base management system', 11, 11, '')
    ==> 'data base system'
    引数4に指定しているのは，長さ0の文字列です。

  INSERTSTR_LONG('data base system', 31, 0, '')
    ==> 'data base system              '
    なお，結果の値には，'system'の後に14文字の空白を含みます。

(22)　INTERVAL_DATETIMES

(a)　機能

引数で指定した二つの既定の文字列表現（'YYYY-MM-DD hh:mm:ss'）の，時刻印の間の日時間隔を，10進数表現（±YYYYMMDDhhmmss.）で返します。引数1の時刻印＜引数2の時刻印の場合，結果は負の値になります。

(b)　形式

　〔MASTER.〕INTERVAL_DATETIMES（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1及び引数2のデータ型は，文字列型（CHAR又はVARCHAR）にしてください。

引数1及び引数2の値式に指定する値式の文字集合は同じにしてください。また，文字集合はUTF16以外にしてください。引数1及び引数2に文字集合がUTF16の文字データ型を指定する場合，CAST指定を用いて既定文字集合の文字データ型に変換してください。

結果のデータ型はDECIMAL(14)になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数1及び引数2の値には，有効な時刻印の既定の文字列表現（'YYYY-MM-DD hh:mm:ss'）を指定してください。時刻印の既定の文字列表現には，小数秒を指定してないでください。

INTERVAL_DATETIMES（時刻印1，時刻印2）の結果は，次の規則に従い計算されます。

時刻印1＜時刻印2の場合

結果＝−INTERVAL_DATETIMES（時刻印2 ，時刻印1）

時刻印1≧時刻印2の場合

・時刻印1の秒≧時刻印2の秒のとき

　結果の秒＝時刻印1の秒−時刻印2の秒

・時刻印1の秒＜時刻印2の秒のとき

　結果の秒＝時刻印1の秒−時刻印2の秒＋60

　時刻印2の分＝時刻印2の分＋1

・時刻印1の分≧時刻印2の分のとき

　結果の分＝時刻印1の分−時刻印2の分

・時刻印1の分＜時刻印2の分のとき

　結果の分＝時刻印1の分−時刻印2の分＋60

　時刻印2の時＝時刻印2の時＋1

・時刻印1の時≧時刻印2の時のとき

　結果の時＝時刻印1の時−時刻印2の時

・時刻印1の時＜時刻印2の時のとき

　結果の時＝時刻印1の時−時刻印2の時＋24

　時刻印2の日＝時刻印2の日＋1

・時刻印1の日≧時刻印2の日のとき

　結果の日＝時刻印1の日−時刻印2の日

・時刻印1の日＜時刻印2の日のとき

　結果の日＝時刻印1の日−時刻印2の日＋時刻印2の月の最終日

　時刻印2の月＝時刻印2の月＋1

・時刻印1の月≧時刻印2の月のとき

　結果の月＝時刻印1の月−時刻印2の月

・時刻印1の月＜時刻印2の月のとき

　結果の月＝時刻印1の月−時刻印2の月＋12

　時刻印2の年＝時刻印2の年＋1

　結果の年＝時刻印1の年−時刻印2の年

結果＝（結果の年×10000000000＋結果の月×100000000

　　　＋結果の日×1000000＋結果の時×10000＋結果の分×100

　　　＋結果の秒)

(d)　使用例

INTERVAL_DATETIMESの使用例を次に示します。

  INTERVAL_DATETIMES('2001-01-01 00:00:00', '1999-12-31 23:59:59')
    ==>    10000000001.
  INTERVAL_DATETIMES('1999-12-31 23:59:59', '2001-01-01 00:00:00')
    ==>   -10000000001.
  INTERVAL_DATETIMES('1996-09-20 15:10:20', '1956-06-07 03:15:30')
    ==>   400313115450.
  NUMEDIT(INTERVAL_DATETIMES('1996-09-20 15:10:20',
                             '1956-06-07 03:15:30'),
          '<9990" years "90" months "90" days "90" hours "
           90" minutes "90" seconds"')
    ==>   '40 years 3 months 13 days 11 hours 54 minutes 50 seconds'

(23)　ISDIGITS

(a)　機能

引数の文字列が数字だけかどうかを，BOOLEAN値で返します。

(b)　形式

　〔MASTER.〕ISDIGITS（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数又は混在文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は，文字列型（CHAR又はVARCHAR），又は混在文字列型（MCHAR又はMVARCHAR）にしてください。また，引数の値の長さは60バイト以下にしてください。

引数のデータ型が文字列型（CHAR又はVARCHAR）の場合，そのデータ型の文字集合はUTF16以外にしてください。引数に文字集合がUTF16の文字データ型を指定する場合，CAST指定を用いて既定文字集合の文字データ型に変換してください。

結果のデータ型はBOOLEANになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

引数に指定された文字列が数字（'0'〜'9'）だけならば，結果はTRUEになり，そうでなければ，結果はFALSEになります。

(d)　使用例

ISDIGITSの使用例を次に示します。

  ISDIGITS('1234567890')   ==> true
  ISDIGITS('123ABC')       ==> false
  ISDIGITS('')             ==> false

(24)　IS_DBLBYTES

(a)　機能

引数の文字列が全角文字だけどうかを，BOOLEAN値で返します。

(b)　形式

　〔MASTER.〕IS_DBLBYTES（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数又は混在文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は，文字列型（CHAR又はVARCHAR），又は混在文字列型（MCHAR又はMVARCHAR）にしてください。

引数のデータ型が文字列型（CHAR又はVARCHAR）の場合，そのデータ型の文字集合は既定文字集合にしてください。

結果のデータ型はBOOLEANになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

引数に指定された文字列が半角文字だけならば，結果はTRUEになり，そうでなければ，結果はFALSEになります。

(d)　使用例

IS_DBLBYTESの使用例を次に示します。

  IS_DBLBYTES(M'data base management system HiRDB')   ==>  false
  IS_DBLBYTES(M'データベース管理システムHiRDB')       ==>  false
  IS_DBLBYTES(M'データベース管理システム')             ==>  true

(25)　IS_SNGLBYTES

(a)　機能

引数の文字列が半角文字だけかどうかを，BOOLEAN値で返します。

(b)　形式

　〔MASTER.〕IS_SNGLBYTES（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数又は混在文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は，文字列型（CHAR又はVARCHAR），又は混在文字列型（MCHAR又はMVARCHAR）にしてください。

引数のデータ型が文字列型（CHAR又はVARCHAR）の場合，そのデータ型の文字集合は既定文字集合にしてください。

結果のデータ型はBOOLEANになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

引数に指定された文字列が半角文字だけならば，結果はTRUEになり，そうでなければ，結果はFALSEになります。

(d)　使用例

IS_SNGLBYTESの使用例を次に示します。

  IS_SNGLBYTES(M'data base management system HiRDB')   ==> true
  IS_SNGLBYTES(M'データベース管理システムHiRDB')       ==> false
  IS_SNGLBYTES(M'データベース管理システム')             ==> false

(26)　LAST_DAY

(a)　機能

引数で指定した日付の，年月の最後の日付を返します。

(b)　形式

　〔MASTER.〕LAST_DAY（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はDATEになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

LAST_DAYの使用例を次に示します。

  LAST_DAY(DATE('1999-01-01'))   ==> '1999-01-31'
  LAST_DAY(DATE('1999-02-16'))   ==> '1999-02-28'
  LAST_DAY(DATE('1999-06-10'))   ==> '1999-06-30'
  LAST_DAY(DATE('1999-12-25'))   ==> '1999-12-31'
  LAST_DAY(DATE('2000-02-03'))   ==> '2000-02-29'

(27)　LEAST

(a)　機能

すべての引数中の，最小値を返します。

(b)　形式

　〔MASTER.〕LEAST（引数，引数〔，引数〕）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

引数の数は，最大3個です。

値式に指定できるものを次に示します。

定数

USER値関数，CURRENT_DATE値関数，又はCURRENT_TIME値関数

列指定

SQL変数又はSQLパラメタ

四則演算，日付演算，時刻演算，又は連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒62　システム定義スカラ関数 LEAST（引数3を省略する場合）の引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

○

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

DATE

DATE

○

TIME

TIME

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

表2‒63　システム定義スカラ関数 LEAST（引数3を指定する場合）の引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

引数3のデータ型

指定可否

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

INTEGER，SMALLINT，DECIMAL，FLOAT，又はSMALLFLT

○

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

DATE

DATE

DATE

○

TIME

TIME

TIME

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数に指定した値式のデータ型が文字データ型の場合，値式の文字集合はすべて同じにしてください。

結果のデータ型を次の表に示します。

表2‒64　システム定義スカラ関数LEASTの結果のデータ型

引数のデータ型

結果のデータ型

INTEGER又はSMALLINT

INTEGER

DECIMAL〔,INTEGER又はSMALLINT〕

DECIMAL※１

FLOAT,SMALLFLT〔,DECIMAL,INTEGER,又はSMALLINT〕

FLOAT

CHAR又はVARCHAR

VARCHAR※２

MCHAR又はMVARCHAR

MVARCHAR※２

NCHAR又はNVARCHAR

NVARCHAR※２

DATE

DATE

TIME

TIME

注※1

精度と位取りを次に示します。pi及びsiを，それぞれi番目の引数の精度及び位取りとします。

精度＝max（p1−s1，p2−s2，…）＋max（s1，s2，…）

位取り＝max（s1，s2，…）

結果の精度が38を超えた場合はエラーになります。また，INTEGERはDECIMAL(10,0)，SMALLINTはDECIMAL(5,0)として扱われます。

注※2

最大長を次に示します。niをi番目の引数の最大長（固定長のデータ型の場合は定義長）とします。

最大長＝max（n1，n2，…）

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

結果のデータ型が文字列データ型の場合，引数の文字集合が結果の文字集合となります。

(28)　LEFTSTR

(a)　機能

引数1の文字列の先頭（最も左）から，引数2で指定された文字数の部分文字列を抽出します。

(b)　形式

　〔MASTER.〕LEFTSTR（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列データ型（CHAR，VARCHAR）

各国文字列データ型（NCHAR，NVARCHAR）

混在文字列データ型（MCHAR，MVARCHAR）

引数2のデータ型は，INTEGER又はSMALLINTにしてください。

引数2に指定できる値の範囲を次の表に示します。

表2‒65　システム定義スカラ関数LEFTSTRの引数2の値の範囲

引数1のデータ型

引数2の値の範囲

CHAR(n)

又は

VARCHAR(n)

既定文字集合，及び文字集合(UTF16以外)

0〜n

文字集合(UTF16)

0〜n／2

MCHAR(n)又はMVARCHAR(n)

0〜n

NCHAR(n)又はNVARCHAR(n)

0〜n

結果のデータ型を次の表に示します。

表2‒66　システム定義スカラ関数LEFTSTRの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数1の文字列の値の文字数が，引数2で指定した文字数よりも少ない場合，結果は引数1と同じ値になります。

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

(d)　使用例

LEFTSTRの使用例を次に示します。

  LEFTSTR('data base system', 9)    ==> 'data base'
  LEFTSTR('data system', 0)         ==> ''  (長さ0の文字列)

(29)　LN

(a)　機能

引数の自然対数を返します。

(b)　形式

　〔MASTER.〕LN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(30)　LOG10

(a)　機能

引数の常用対数を返します。

(b)　形式

　〔MASTER.〕LOG10（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(31)　LTRIM

(a)　機能

引数1の文字列の左から，引数2で指定された文字列を構成する文字を取り除きます。引数2で指定された文字列中の文字以外が現れるまで，繰り返し取り除きます。

(b)　形式

　〔MASTER.〕LTRIM（引数1〔，引数2〕）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列型（CHAR，VARCHAR）

各国文字列型（NCHAR，NVARCHAR）

混在文字列型（MCHAR，MVARCHAR）

引数2を指定する場合，指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒67　システム定義スカラ関数LTRIMの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数2の値の長さは，文字列データ型又は混在文字列データ型の場合は30バイト以下（文字集合がUTF16の文字データ型の場合は60バイト以下），各国文字列データ型の場合は30文字以下にしてください。

引数1及び引数2のデータ型が両方とも文字列型の場合，値式の文字集合は同じにしてください。

結果のデータ型を次の表に示します。

表2‒68　システム定義スカラ関数LTRIMの結果のデータ型

引数1（及び引数2）のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数2を省略した場合は，次に示す値を仮定します。

表2‒69　引数2を省略した場合の仮定値

引数1のデータ型

引数2を省略した場合の仮定値

CHAR(n)又はVARCHAR(n)

半角空白1文字からなる文字列

MCHAR(n)又はMVARCHAR(n)

半角空白と全角空白からなる文字列

NCHAR(n)又はNVARCHAR(n)

全角空白1文字からなる文字列

(d)　使用例

LTRIMの使用例を次に示します。

  LTRIM('abcabcabdata base', 'abc')   ==> 'data base'
  LTRIM('    data base')              ==> 'data base'

(32)　LTRIMSTR

(a)　機能

引数1の文字列の左から，引数2で指定された文字列と一致する部分文字列を，一致しなくなるまで繰り返し取り除きます。

(b)　形式

　〔MASTER.〕LTRIMSTR（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒70　システム定義スカラ関数LTRIMSTRの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数1及び引数2のデータ型が両方とも文字列型の場合，値式の文字集合は同じにしてください。

引数2の最大長を次の表に示します。

表2‒71　システム定義スカラ関数LTRIMSTRの引数2の最大長

引数1（及び引数2）のデータ型

引数2の最大長

CHAR

又は

VARCHAR

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR

127

結果のデータ型を次の表に示します。

表2‒72　システム定義スカラ関数LTRIMSTRの結果のデータ型

引数1（及び引数2）のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

(d)　使用例

LTRIMSTRの使用例を次に示します。

  LTRIMSTR('abcabcabdata base', 'abc')   ==> 'abdata base'

(33)　MIDNIGHTSECONDS

(a)　機能

引数で指定された時刻を，深夜0時からの秒数で返します。

(b)　形式

　〔MASTER.〕MIDNIGHTSECONDS（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_TIME値関数

列指定

SQL変数又はSQLパラメタ

時刻演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はTIMEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

結果は，次の計算式から求められます。

結果＝（（（引数の時×60）＋引数の分）×60）＋引数の秒

(d)　使用例

MIDNIGHTSECONDSの使用例を次に示します。

  MIDNIGHTSECONDS(TIME('23:59:59'))   ==> 86399
  MIDNIGHTSECONDS(TIME('14:14:14'))   ==> 51254

(34)　MONTHNAME

(a)　機能

引数で指定した日付の，月の名前を示す文字列（'January'，'February'などの英語の文字列）を返します。

(b)　形式

　〔MASTER.〕MONTHNAME（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はVARCHAR(18)になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

結果の文字集合は既定の文字集合となります。

(d)　使用例

MONTHNAMEの使用例を次に示します。

  MONTHNAME(DATE('1999-01-01'))   ==> 'January'
  MONTHNAME(DATE('1999-02-28'))   ==> 'February'
  MONTHNAME(DATE('1999-03-03'))   ==> 'March'
  MONTHNAME(DATE('1999-04-01'))   ==> 'April'
  MONTHNAME(DATE('1999-05-05'))   ==> 'May'
  MONTHNAME(DATE('1999-06-07'))   ==> 'June'
  MONTHNAME(DATE('1999-07-07'))   ==> 'July'
  MONTHNAME(DATE('1999-08-15'))   ==> 'August'
  MONTHNAME(DATE('1999-09-23'))   ==> 'September'
  MONTHNAME(DATE('1999-10-10'))   ==> 'October'
  MONTHNAME(DATE('1999-11-11'))   ==> 'November'
  MONTHNAME(DATE('1999-12-31'))   ==> 'December'

(35)　MONTHS_BETWEEN

(a)　機能

引数で指定した二つの日付間の月数を，実数（FLOAT型）で返します。

(b)　形式

　〔MASTER.〕MONTHS_BETWEEN（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1及び引数2のデータ型はDATEにしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

MONTHS_BETWEEN（日付1，日付2）の結果の月数は，次の規則に従い計算されます。

日付1＜日付2の場合

結果＝−MONTHS_BETWEEN（日付2，日付1）

日付1≧日付2の場合

mを0以上の整数とし，日付4≦日付1＜日付3を満たす（日付2＋mか月）の日付，及び（日付2＋（m＋1）か月）の日付を，それぞれ日付4及び日付3とします。

日付4と日付1の間の日数（DAYS（日付1）−DAYS（日付4）），及び日付4と日付3の間の日数（DAYS（日付3）−DAYS（日付4））を，それぞれd1及びd2とします。d2の値は，28，29，30，又は31のどれかになります。

結果の月数は，（m＋d1÷d2）か月になります。

これらの日付1，日付2，日付3，及び日付4の関係を次の図に示します。

図2‒7　日付1，日付2，日付3，及び日付4の関係（MONTHS_BETWEEN）

(d)　使用例

MONTHS_BETWEENの使用例を次に示します。

  MONTHS_BETWEEN(DATE('1999-07-10'), DATE('1999-06-10'))
    ==> 1
  MONTHS_BETWEEN(DATE('1999-07-11'), DATE('1999-06-10'))
    ==> 1.032258…
  MONTHS_BETWEEN(DATE('1999-06-11'), DATE('1999-05-10'))
    ==> 1.033333…
  MONTHS_BETWEEN(DATE('1999-02-11'), DATE('1999-01-10'))
    ==> 1.035714…
  MONTHS_BETWEEN(DATE('2000-02-11'), DATE('2000-01-10'))
    ==> 1.034482…
  MONTHS_BETWEEN(DATE('1999-09-09'), DATE('1999-06-10'))
    ==> 2.967741…
  MONTHS_BETWEEN(DATE('1999-06-10'), DATE('1999-09-09'))
    ==> -2.967741…

(36)　NEXT_DAY

(a)　機能

引数1で指定した日付よりも後で最も近い，引数2の整数で指定した曜日の日付を返します。

(b)　形式

　〔MASTER.〕NEXT_DAY（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型はDATEにしてください。引数2のデータ型はINTEGER又はSMALLINTにしてください。

結果のデータ型はDATEになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数2で指定した整数値の意味を次の表に示します。

表2‒73　曜日を表す引数2 の整数値の意味

引数2の整数値

意味（曜日）

1

日曜日（Sunday）

2

月曜日（Monday）

3

火曜日（Tuesday）

4

水曜日（Wednesday）

5

木曜日（Thursday）

6

金曜日（Friday）

7

土曜日（Saturday）

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(d)　使用例

NEXT_DAYの使用例を次に示します。

  NEXT_DAY(DATE('1999-06-10'), 1)   ==> '1999-06-13'
  NEXT_DAY(DATE('1999-06-10'), 4)   ==> '1999-06-16'
  NEXT_DAY(DATE('1999-06-10'), 5)   ==> '1999-06-17'
  NEXT_DAY(DATE('1999-06-10'), 6)   ==> '1999-06-11'
  NEXT_DAY(DATE('1999-06-10'), 7)   ==> '1999-06-12'
    なお，'1999-06-10'は木曜日です。

(37)　NUMEDIT

(a)　機能

引数1で指定した数値を，引数2で指定した形式の文字列表現に編集します。

(b)　形式

　〔MASTER.〕NUMEDIT（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は数データ型にしてください。

引数2のデータ型は文字列型（CHAR又はVARCHAR）にしてください。また，引数2の値の長さは250バイト以下にしてください。

引数2のデータ型の文字集合はUTF16以外にしてください。引数2に文字集合がUTF16の文字データ型を指定する場合，CAST指定を用いて既定文字集合の文字データ型に変換してください。

結果のデータ型はVARCHAR(255)になります。

結果の文字集合は，引数2の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数2の値は，次の形式で指定してください。

  〔"文字列"〕〔+〕
       ｛〔｛<|>｝〕｛9|0|,|"文字列"｝…〔.｛9|0|,|"文字列"｝…〕
         |｛E|e｝.整数 〔 "文字列" 〕｝

"文字列"

引用符で囲まれた文字列は，その文字列自身を表現します。

引用符で囲まれた文字列中で引用符そのものを指定する場合は，連続する二つの引用符で表現します。

＋

〔+〕は，符号の表現方法を指定します。

'＋'は，引数1が負の値ならばマイナス符号(−)，そうでなければプラス符号(＋)で表現します。

'＋'を省略すると，引数1が負の値ならば，マイナス符号(−)，そうでなければ，一つの空白文字で表現します。

｛＜｜＞｝

｛＜｜＞｝は，数値の文字表現の詰め込み方を指定します。

'＜'を指定すると，すべての空白文字を取り除き，文字表現を左にシフトします。

'＞'を指定すると，すべての空白文字を取り除き，文字表現を右にシフトし，左側に空白文字を埋めます。

'＜'，'＞'のどちらも指定しない場合，文字表現をシフトしません。

｛9｜0｜,｜"文字列"｝…〔.｛9｜0｜,｜"文字列"｝〕…

'9'，'0'は数値の一つのけたを表現し，引数1の数値に対応するけたを編集します。

'9'及び'0'の総個数は，編集後の数値の精度を示します。

'0'を指定すると，その'0'の編集結果は対応するけたの数字になります。

','を指定すると，その','の両側の編集結果が数字ならば，','の編集結果はそれ自身になり，そうでなければ一つの空白文字になります。

'.' は，小数点を表現します。

'.'より後の'9'及び'0'の総個数は，編集後の数値の位取りを示します。

'.'より前に'9'を指定すると，対応するけたが0で，その'9'が最初のけたである，又はその'9'の編集結果の左の編集結果が数字でない（ただし，コンマに対応するときは除く）の場合，その'9'の編集結果は一つの空白文字になります。そうでなければ，その'9'の編集結果は対応するけたの数字になります。

'.'より後に'9'を指定すると，対応するけたが0で，その'9'が最後のけたである，又はその'9'の編集結果の右の編集結果が数字でない（ただし，コンマに対応するときは除く）の場合，その'9'の編集結果は空（0個）の文字になります。そうでなければ，その'9'の編集結果は対応するけたの数字になります。

｛E｜e｝.整数

{E｜e}.整数は，浮動小数点数形式の書式で指定します。

編集結果は整数で指定された仮数の位取りを持つ，浮動小数点数形式になります。仮数の位取りは，30未満にしてください。

引数1の値が引数2で指定された形式で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

編集によって下位のけたが失われる場合，結果の値は丸められます。

(d)　使用例

NUMEDITの使用例を次に示します。

  NUMEDIT(1234567.89, '99,999,990.00"$"')   ==> '  1,234,567.89$'
  NUMEDIT(1000, '99,999,990.00"$"')         ==> '      1,000.00$'
  NUMEDIT(1234567.89, '" $"99,999,990.00')  ==> ' $  1,234,567.89'
  NUMEDIT(1000, '" $"99,999,990.00')        ==> ' $      1,000.00'
  NUMEDIT(1234567.89, '"$"+99,999,990,00')  ==> '$+ 1,234,567.89'
  NUMEDIT(-1000, '"$"+99,999,990.00')       ==> '$-     1,000.00'
  NUMEDIT(1234567.89, '"$">99,999,990.00')  ==> '  $1,234,567.89'
  NUMEDIT(1000, '"$">99,999,990.00')        ==> '      $1,000.00'
  NUMEDIT(1234567.89, '"$"<99,999,990.00')  ==> '$1,234,567.89'
  NUMEDIT(1000, '"$"<99,999,990.00')        ==> '$1,000.00'
  NUMEDIT(0.5, '"$"<99,999,990.00')         ==> '$0.50'
  NUMEDIT(1234567.89, '+E.10"$"')           ==> '+1.2345678900E+0.6$'
  NUMEDIT(1234567.89, '"$"+e.10')           ==> '$+1.2345678900e+0.6'

(38)　NVL

(a)　機能

ナル値をナル値でない値に変換します。

(b)　形式

　NVL（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

列指定

SQL変数，又はSQLパラメタ

四則演算

日付演算

時刻演算

連結演算

集合関数

スカラ関数

CASE式

CAST指定

埋込み変数，又は?パラメタ

関数呼出し

スカラ副問合せ

引数1，及び引数2の演算結果が次に示すデータ型の場合は指定できません。

LOB

BOOLEAN

抽象データ型

引数1，及び引数2に，NULLは指定できません。

引数1，及び引数2にバイナリデータを指定する場合は，実長が32,001バイト以上の値は指定できません。

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1，及び引数2のデータ型は，それぞれ比較できるデータ型にしてください。

比較できるデータ型については，「データ型」を参照してください。

ただし，次に示すデータは比較できません。

日付データと日付データの文字列表現

時刻データと時刻データの文字列表現

時刻印データと時刻印データの文字列表現

日間隔データと日間隔データの10進数表現

時間隔データと時間隔データの10進数表現

バイナリデータと16進文字列定数

結果の値は，引数1がナル値でない場合は引数1になり，引数1がナル値の場合は引数2になります。

結果のデータ型，及びデータ長は次のとおりです。

＜文字データ，各国文字データ，混在文字データの場合＞

結果のデータ型は，可変長データになります。

結果のデータ長は，一番長いデータ長を持つ引数のデータ長になります。

引数に文字データと混在文字データが含まれる場合の結果のデータ型は，混在文字データになります。

＜バイナリデータの場合＞

結果のデータ型は，バイナリデータになります。

結果のデータ長は，一番長いデータ長を持つ引数のデータ長になります。ただし，一番長いデータ長が32,001バイト以上の場合は，結果のデータ長は32,000バイトになります。

＜文字データ，各国文字データ，混在文字データ，バイナリデータ以外の場合＞

結果のデータ型，及びデータ長は，集合演算（UNION ALL，又はEXCEPT ALL）の結果のデータ型，及びデータ長と同じになります。詳細については，「問合せ式」を参照してください。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1及び引数2の両方ともナル値であれば，結果もナル値になります。

引数1，及び引数2が文字データ型の場合，文字集合は同じにしてください。

(d)　使用例

表T1のC1の値を取得する際，C1がナル値の場合は0を取得します。

  SELECT NVL(C1,0) FROM T1

(39)　PI

(a)　機能

円周率πの値を返します。

(b)　形式

　〔MASTER.〕PI（）

(c)　規則

結果のデータ型は，FLOAT型になります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。ただし，常に円周率の値が返されるため，ナル値が返されることはありません。

(d)　使用例

PIの使用例を次に示します。

  PI()   ==> 3.14159265358979323846

(40)　POSSTR

(a)　機能

引数1で指定した文字列中の，引数3で指定した文字位置以降に，引数2で指定した部分文字列が引数4で指定した回数（nd）以上出現した場合，その回数nd番目の部分文字列の開始位置を文字単位で返します。

(b)　形式

　〔MASTER.〕POSSTR（引数1，引数2〔，引数3〔，引数4〕〕）

(c)　規則

引数1，引数2，引数3，及び引数4に指定できるものを次に示します。

値式〔AS データ型〕

引数1及び引数2の値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数3及び引数4の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1及び引数2に指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒74　システム定義スカラ関数POSSTRの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数1及び引数2のデータ型が両方とも文字列データ型（CHAR又はVARCHAR）の場合，値式の文字集合は同じにしてください。

引数2の値の最大長を次の表に示します。

表2‒75　システム定義スカラ関数POSSTR の引数2の最大長

引数1（及び引数2）のデータ型

引数2の最大長

CHAR

又は

VARCHAR

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR

127

引数3及び引数4のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

引数3及び引数4に指定できる値の範囲を次の表に示します。

表2‒76　システム定義スカラ関数POSSTR の引数3及び引数4の値の範囲

引数1（及び引数2）のデータ型

引数3の値の範囲

引数4の値の範囲

CHAR(n)

又は

VARCHAR(n)

既定文字集合，及び文字集合(UTF16以外)

1〜n

1〜n

文字集合(UTF16)

1〜n／2

1〜n／2

MCHAR(n)又はMVARCHAR(n)

1〜n

1〜n

NCHAR(n)又はNVARCHAR(n)

1〜n

1〜n

引数3を省略すると，1が仮定されます。また，引数4を省略しても1が仮定されます。

引数2の文字列の長さ（文字数）が0の場合，結果は引数3の値になります。

引数2の文字列と一致する部分文字列が，引数1の文字列中の引数3の文字位置（m）以降に，引数4で指定した回数（nd）以上出現する場合，結果はm以上の値で，nd番目の部分文字列が開始する前の引数1の文字列内の文字数に1を加えた値になります。

なお，引数2の文字列と一致するこれらの部分文字列は，重ならないものとします。引数2の文字列と一致する部分文字列が，引数1の文字列中の引数3の文字位置（m）以降に，引数4で指定した回数（nd）以上出現しない場合，結果は0になります。

(d)　使用例

POSSTRの使用例を次に示します。

  POSSTR('data base system', 'a')        ==> 2
  POSSTR('data base system', '')         ==> 1 (引数2は長さ0の文字列)
  POSSTR('data base system', 'a', 5)     ==> 7
  POSSTR('data base system', 'st')       ==> 13
  POSSTR('data base system', 'a', 1, 3)  ==> 7
  POSSTR('data base system', 'manager')  ==> 0

(41)　POWER

(a)　機能

引数1の値のn乗を返します。なお，nは引数2の値とします。

(b)　形式

　〔MASTER.〕POWER（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型を次の表に示します。

表2‒77　システム定義スカラ関数POWERの結果のデータ型

引数1のデータ型

引数2のデータ型

SMALLINT又はINTEGER

DECIMAL(p,s)，SMALLFLT，又はFLOAT

SMALLINT又は

INTEGER

INTEGER

FLOAT

DECIMAL(p,s)，SMALLFLT，又はFLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数1に負の値を指定し，引数2に整数でない値を指定すると，定義域エラー（domain error occurs）になります。

引数1に値0を指定し，引数2に正でない値を指定すると，0除算（division by zero）になります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(42)　QUARTER

(a)　機能

引数2で指定した月，及び引数3で指定した日を各年度の開始の月日として，引数1で指定した日付が第何四半期かを示す1〜4の整数で返します。

(b)　形式

　〔MASTER.〕QUARTER（引数1〔，引数2〔，引数3〕〕）

(c)　規則

引数1，引数2，及び引数3に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2及び引数3の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型はDATEにしてください。

引数2及び引数3のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

引数2を省略すると，1が仮定されます。引数2に指定できる値の範囲は，1〜12です。

引数3を省略すると，1が仮定されます。引数3に指定できる値の範囲は，引数2の値が2の場合は，1〜29です。それ以外の場合は，1〜（引数2で指定した月の最終日）です。

結果は，次の規則によって求められます。

引数1の日＜引数3の場合

月数＝引数1の月−引数2−1

引数1の月≧引数3の場合

月数＝引数1の月−引数2

月数＜0の場合

結果＝（月数＋12）÷4＋1

月数≧0の場合

結果＝月数÷4＋1

(d)　使用例

QUARTERの使用例を次に示します。

  QUARTER(DATE('1999-01-01'))          ==> 1
  QUARTER(DATE('1999-09-10'))          ==> 3
  QUARTER(DATE('1999-12-31'))          ==> 4
  QUARTER(DATE('1999-04-01'), 4)       ==> 1
  QUARTER(DATE('1999-09-10'), 4)       ==> 2
  QUARTER(DATE('1999-03-31'), 4)       ==> 4
  QUARTER(DATE('1999-03-21'), 3, 21)   ==> 1
  QUARTER(DATE('1999-09-20'), 3, 21)   ==> 2
  QUARTER(DATE('1999-03-20'), 3, 21)   ==> 4

(43)　RADIANS

(a)　機能

引数で指定した角度を，度数からラジアンに変換します。

(b)　形式

　〔MASTER.〕RADIANS（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(44)　REPLACE（REPLACE_LONG）

(a)　機能

引数1の文字列中の，引数2の文字列と一致するすべての部分文字列を，引数3の文字列に置き換えます。

(b)　形式

　〔MASTER.〕REPLACE（引数1，引数2〔，引数3〕）
　〔MASTER.〕REPLACE_LONG（引数1，引数2，引数3）

(c)　規則

引数1，引数2，及び引数3に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒78　システム定義スカラ関数REPLACE（引数3を省略する場合）の引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

表2‒79　システム定義スカラ関数REPLACE（引数3を指定する場合），REPLACE_LONGの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

引数3のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数2及び引数3の値の最大長を次の表に示します。

表2‒80　システム定義スカラ関数REPLACE，REPLACE_LONGの引数2，引数3の最大長

引数1（及び引数2，引数3）のデータ型

引数2及び引数3の最大長

CHAR

又は

VARCHAR

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR

127

引数1，引数2，及び引数3のデータ型が文字列型（CHAR又はVARCHAR）の場合，引数に指定する値式の文字集合は同じにしてください。

引数3を省略すると，空の文字列を仮定し，引数1の文字列中から引数2の文字列と一致するすべての部分文字列を削除します。

結果のデータ型を次に示します。

表2‒81　システム定義スカラ関数REPLACEの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

表2‒82　システム定義スカラ関数REPLACE_LONGの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(32000)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(32000)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(16000)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

結果の長さは，結果のデータ型の最大長を超えないようにしてください。結果の長さが引数1の長さより長くなる場合は，REPLACE_LONGを使用してください。

(d)　使用例

REPLACEの使用例を次に示します。

  REPLACE('a big dog and a small dog', 'dog', 'cat')
    ==> 'a big cat and a small cat'
  REPLACE('a big dog and a small dog', 'big ')
    ==> 'a dog and a small dog'

(45)　REVERSESTR

(a)　機能

引数で指定した文字列中の，左右を反転した文字列を返します。

(b)　形式

　〔MASTER.〕REVERSESTR（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列型（CHAR，VARCHAR）

各国文字列型（NCHAR，NVARCHAR）

混在文字列型（MCHAR，MVARCHAR）

結果のデータ型を次の表に示します。

表2‒83　システム定義スカラ関数REVERSESTRの結果のデータ型

引数のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

REVERSESTRの使用例を次に示します。

  REVERSESTR('data base')       ==> 'esab atad'
  REVERSESTR('esab atad')       ==> 'data base'
  REVERSESTR('   esab atad')    ==> 'data base   '

(46)　RIGHTSTR

(a)　機能

引数1の文字列の最後（最も右）から，引数2で指定した文字数の部分文字列を抽出します。

(b)　形式

　〔MASTER.〕RIGHTSTR（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列型（CHAR，VARCHAR）

各国文字列型（NCHAR，NVARCHAR）

混在文字列型（MCHAR，MVARCHAR）

引数2のデータ型は，INTEGER又はSMALLINTにしてください。

引数2に指定できる値の範囲を次の表に示します。

表2‒84　システム定義スカラ関数RIGHTSTRの引数2の値の範囲

引数1のデータ型

引数2の値の範囲

CHAR(n)

又は

VARCHAR(n)

既定文字集合，及び文字集合(UTF16以外)

0〜n

文字集合(UTF16)

0〜n／2

MCHAR(n)又はMVARCHAR(n)

0〜n

NCHAR(n)又はNVARCHAR(n)

0〜n

結果のデータ型を次の表に示します。

表2‒85　システム定義スカラ関数RIGHTSTRの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数1の文字列の値の文字数が，引数2で指定した文字数よりも少ない場合，結果は引数1と同じ値になります。

(d)　使用例

RIGHTSTRの使用例を次に示します。

  RIGHTSTR('data base system', 6)    ==> 'system'
  RIGHTSTR('data system', 0)         ==> ''    (長さ0の文字列)

(47)　ROUND

(a)　機能

引数1の値の，小数点以下nけたより後のけた（10の-n乗未満のけた）を丸めます。なお，nは引数2の値とします。

引数3を指定すると，引数1の10の-n-1乗の位の値が，引数3の値以上ならば切り上げ，そうでなければ切り捨てます。

(b)　形式

　〔MASTER.〕ROUND（引数1〔，引数2〔，引数3〕〕）

(c)　規則

引数1，引数2，及び引数3に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は数データ型にしてください。引数2及び引数3のデータ型は，INTEGER又はSMALLINTにしてください。

引数2を省略すると0が仮定されます。引数2に指定できる値の範囲を次の表に示します。

表2‒86　システム定義スカラ関数ROUNDの引数2に指定できる値の範囲

結果のデータ型

引数2に指定できる値の範囲

INTEGER

−9〜0

DECIMAL(p, s)

−(p−s−1)〜s

FLOAT

・HP-UX（32ビットモードの場合）の場合

−307〜307

・HP-UX（64ビットモードの場合），AIX，Linux及びWindowsの場合

−307〜323

結果のデータ型を次の表に示します。

表2‒87　システム定義スカラ関数ROUNDの結果のデータ型

引数1のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p, s)

DECIMAL(p, s)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1，引数2，又は引数3の値式がナル値であれば，結果もナル値になります。

引数3を省略すると，5が仮定されます。引数3に指定できる値の範囲は，1〜9です。引数1の10の−n−1乗の位の値が引数3の値以上ならば，切り上げ，そうでなければ切り捨てます。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(48)　ROUNDMONTH

(a)　機能

引数1で指定された日付を，その日付の日の部分を端数として丸めた日付を返します。

20日締めで年月を求める場合などに利用できます。

(b)　形式

　〔MASTER.〕ROUNDMONTH（引数1〔，引数2〕）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型はDATEにしてください。引数2のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はDATEになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数2を省略すると，16が仮定されます。引数2に指定できる値の範囲は，1〜32です。

結果は，次の規則によって求められます。

引数1の日＜引数2の場合

結果の年＝引数1の年

結果の月＝引数1の月

結果の日＝1

引数1の日≧引数2の場合

・引数1の月＜12の場合

　結果の年＝引数1の年

　結果の月＝引数1の月＋1

　結果の日＝1

・引数1の月＝12の場合

　結果の年＝引数1の年＋1

　結果の月＝1

　結果の日＝1

関数の結果が，0001年01月01日〜9999年12月31日の範囲でないならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(d)　使用例

ROUNDMONTHの使用例を次に示します。

  ROUNDMONTH(DATE('1999-08-15'))       ==> '1999-08-01'
  ROUNDMONTH(DATE('1999-08-16'))       ==> '1999-09-01'
  ROUNDMONTH(DATE('1999-09-20'), 21)   ==> '1999-09-01'
  ROUNDMONTH(DATE('1999-09-21'), 21)   ==> '1999-10-01'
  ROUNDMONTH(DATE('1999-12-21'), 21)   ==> '2000-01-01'
  ROUNDMONTH(DATE('1999-03-31'), 32)   ==> '1999-03-01'
  ROUNDMONTH(DATE('2000-02-29'), 29)   ==> '2000-03-01'
  ROUNDMONTH(DATE('2000-03-31'), 29)   ==> '2000-04-01'
  ROUNDMONTH(DATE('9999-12-31'), 26)   ==> オーバフロー

(49)　RTRIM

(a)　機能

引数1の文字列の右から，引数2で指定された文字列を構成する文字を取り除きます。引数2で指定された文字列中の文字以外が現れるまで，繰り返し取り除きます。

(b)　形式

　〔MASTER.〕RTRIM（引数1〔，引数2〕）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は，次のどれかを指定してください。

任意の文字集合の文字列型（CHAR，VARCHAR）

各国文字列型（NCHAR，NVARCHAR）

混在文字列型（MCHAR，MVARCHAR）

引数2を指定する場合，指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒88　システム定義スカラ関数RTRIMの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数1及び引数2のデータ型が両方とも文字列型（CHAR又はVARCHAR）の場合，引数に指定する値式の文字集合は同じにしてください。

引数2の値の長さは，文字列型又は混在文字列型の場合は30バイト以下（文字集合がUTF16の文字データ型の場合は60バイト以下），各国文字列型の場合は30文字以下にしてください。

結果のデータ型を次の表に示します。

表2‒89　システム定義スカラ関数RTRIMの結果のデータ型

引数1（及び引数2）のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

引数2を省略した場合は，次に示す値を仮定します。

表2‒90　引数2を省略した場合の仮定値

引数1のデータ型

引数2を省略した場合の仮定値

CHAR(n)又はVARCHAR(n)

半角空白1文字からなる文字列

MCHAR(n)又はMVARCHAR(n)

半角空白と全角空白からなる文字列

NCHAR(n)又はNVARCHAR(n)

全角空白1文字からなる文字列

(d)　使用例

RTRIMの使用例を次に示します。

  RTRIM('data basebcabcabc', 'abc')   ==> 'data base'
  RTRIM('data base    ')              ==> 'data base'

(50)　RTRIMSTR

(a)　機能

引数1の文字列の右から，引数2で指定された文字列と一致する部分文字列を，一致しなくなるまで繰り返し取り除きます。

(b)　形式

　〔MASTER.〕RTRIMSTR（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒91　システム定義スカラ関数RTRIMSTRの引数のデータ型の組み合わせ

引数1のデータ型

引数2のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

引数1及び引数2のデータ型が両方とも文字列型（CHAR又はVARCHAR）の場合，引数に指定する値式の文字集合は同じにしてください。

引数2の最大長を次の表に示します。

表2‒92　システム定義スカラ関数RTRIMSTRの引数2の最大長

引数1（及び引数2）のデータ型

引数2の最大長

CHAR

又は

VARCHAR

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR

127

結果のデータ型を次の表に示します。

表2‒93　システム定義スカラ関数RTRIMSTRの結果のデータ型

引数1（及び引数2）のデータ型

引数2の最大長

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

(d)　使用例

RTRIMSTRの使用例を次に示します。

  RTRIMSTR('data basebcabcabc', 'abc')   ==> 'data basebc'

(51)　SIGN

(a)　機能

引数の符号（引数が正の値ならば＋1，負の値ならば−1，0ならば0）を返します。

(b)　形式

　〔MASTER.〕SIGN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型を次の表に示します。

表2‒94　システム定義スカラ関数SIGNの結果のデータ型

引数1のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p,s)

DECIMAL(1,0)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(52)　SIN

(a)　機能

ラジアンで角度を指定した引数の，正弦（三角関数SIN）を返します。

(b)　形式

　〔MASTER.〕SIN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(53)　SINH

(a)　機能

引数の双曲線正弦を返します。

(b)　形式

　〔MASTER.〕SINH（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(54)　SQRT

(a)　機能

引数の値の平方根を返します。

(b)　形式

　〔MASTER.〕SQRT（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

引数に負の値を指定すると，定義域エラー（domain error occurs）になります。

(55)　STRTONUM

(a)　機能

引数1で指定した数値の文字列表現を，数データ型に変換します。引数2のデータ型がINTEGER又はSMALLINTの場合はINTEGERに，DECIMALの場合は同じ精度・位取りのDECIMALに，FLOAT又はSMALLFLTの場合はFLOATに変換します。

(b)　形式

　〔MASTER.〕STRTONUM（引数1，引数2）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

文字列定数

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2の値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は，文字列型（CHAR又はVARCHAR）にしてください。また，引数1の文字列の長さは，255バイト以下にしてください。

引数1のデータ型の文字集合はUTF16以外にしてください。引数1に文字集合がUTF16の文字データ型を指定する場合，CAST指定を用いて既定文字集合の文字データ型に変換してください。

引数2のデータ型は，数データ型にしてください。

結果のデータ型を次の表に示します。

表2‒95　システム定義スカラ関数STRTONUMの結果のデータ型

引数2のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p,s)

DECIMAL(p,s)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1の値式がナル値であれば，結果もナル値になります。引数2の値は，結果に影響しません。

引数1の文字列の値は，次の形式で指定してください。

引数2のデータ型がINTEGERの場合

〔空白文字…〕〔+｜-〕〔空白文字…〕数字…〔空白文字…〕

引数2のデータ型がDECIMALの場合

〔空白文字…〕〔+｜-〕〔空白文字…〕

　｛数字…〔.〔数字…〕〕｜.数字…｝〔空白文字…〕

引数2のデータ型がFLOATの場合

〔空白文字…〕〔+｜-〕〔空白文字…〕

　｛数字…〔.〔数字…〕〕｜.数字…｝

　〔｛E｜e｝〔+｜-〕数字…〕〔空白文字…〕

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

引数2のデータ型がDECIMAL型の場合，データ型の変換で下位のけたがなくなるときは，結果の値は丸められます。

(d)　使用例

STRTONUMの使用例を次に示します。

・引数2がINTEGERの場合
  STRTONUM(' -  1234567  ', 0)
    ==> -1234567 (INTEGER型)
  STRTONUM('  + 1234567890123  ', 0)
    ==> オーバフロー
  STRTONUM('  1234567.89  ', 9)
    ==> INTEGERへの変換の，STRTONUM関数の引数1の値が正しくない

・引数2がDECIMALの場合
  STRTONUM(' -1234567  ', 123456789012. )
    ==> -1234567 (DECIMAL(12,0)型)
  STRTONUM('  1234567.89  ', 9999999999.999)
    ==> 1234567.89 (DECIMAL(13,3)型)
  STRTONUM('  1234567.89  ', 99999.999)
    ==> オーバフロー
  STRTONUM('  1.23456789E6 ', 9999999999.999)
    ==> DECIMALへの変換の，STRTONUM関数の引数1の値が正しくない

・引数2がFLOATの場合
  STRTONUM('  1234567.89  ', 1e0)
    ==> 1.23456789E6 (FLOAT型)
  STRTONUM('  -1234567890123  ', 0e0)
    ==> -1.234567890123E12 (FLOAT型)
  STRTONUM('  1.23456789E6 ', 1E1)
    ==> 1.23456789E6 (FLOAT型)
  STRTONUM('  1.0E310  ', 9E9)
    ==> オーバフロー

(56)　TAN

(a)　機能

ラジアンで角度を指定した引数の，正接（三角関数TAN）を返します。

(b)　形式

　〔MASTER.〕TAN（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(57)　TANH

(a)　機能

引数の双曲線正接を返します。

(b)　形式

　〔MASTER.〕TANH（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型は数データ型にしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

関数の結果が，結果のデータ型で表現できない値ならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(58)　TRANSL（TRANSL_LONG）

(a)　機能

引数2で指定した文字列中のどれかの文字が，引数1で指定した文字列中に含まれる場合，それらの文字を引数3で指定した文字列中の対応する文字に変換した文字列を返します。

引数2の文字列中のi番目の文字が，引数3のi番目の文字に対応します。引数3の文字列の文字数が引数2の文字列の文字数より少ない場合，引数3の文字列として，引数3の文字列に引数4の文字を繰り返し埋めた文字列が仮定されます。

(b)　形式

　〔MASTER.〕TRANSL（引数1，引数2，引数3〔，引数4〕）
　〔MASTER.〕TRANSL_LONG（引数1，引数2，引数3〔，引数4〕）

(c)　規則

引数1，引数2，引数3，及び引数4に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

文字列定数，混在文字列定数，又は各国文字列定数（TRANSL_LONGの場合は混在文字列定数だけ指定できます）

列指定

SQL変数又はSQLパラメタ

連結演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数3の文字列の文字数が，引数2の文字列の文字数よりも少ない場合は，引数3の文字列として，引数3の文字列に引数4の文字を繰り返し埋めた文字列が仮定されます。

引数4には，1文字だけ指定してください。引数4を省略すると引数１の文字集合の空白文字（引数1のデータ型がNCHAR又はNVARCHARの場合は全角空白）が仮定されます。

TRANSLに指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒96　システム定義スカラ関数TRANSLの引数のデータ型の組み合わせ（引数4を省略する場合）

引数1のデータ型

引数2のデータ型

引数3のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

表2‒97　システム定義スカラ関数TRANSLの引数のデータ型の組み合わせ（引数4を指定する場合）

引数1のデータ型

引数2のデータ型

引数3のデータ型

引数4のデータ型

指定可否

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

CHAR，又はVARCHAR

○

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

NCHAR，又はNVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

TRANSL_LONGに指定できる引数のデータ型の組み合わせを次の表に示します。

表2‒98　システム定義スカラ関数TRANSL_LONGの引数のデータ型の組み合わせ（引数4を省略する場合）

引数1のデータ型

引数2のデータ型

引数3のデータ型

指定可否

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

表2‒99　システム定義スカラ関数TRANSL_LONGの引数のデータ型の組み合わせ（引数4を指定する場合）

引数1のデータ型

引数2のデータ型

引数3のデータ型

引数4のデータ型

指定可否

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

MCHAR，又はMVARCHAR

○

上記以外のデータ型の組み合わせ

×

(凡例)

○：指定できます。

×：指定できません。

TRANSLの引数1，引数2，引数3，及び引数4のすべてのデータ型が文字列型（CHAR又はVARCHAR）の場合，引数に指定する値式の文字集合は同じにしてください。

引数2及び引数3の値の最大長を次の表に示します。

表2‒100　システム定義スカラ関数TRANSL，TRANSL_LONGの引数2，引数3の最大長

引数1のデータ型

引数2及び引数3の最大長

CHAR

又は

VARCHAR※

既定文字集合，及び文字集合(UTF16以外)

255

文字集合(UTF16)

510

MCHAR又はMVARCHAR

255

NCHAR又はNVARCHAR※

127

注※　TRANSL_LONGの場合は指定できません。

結果のデータ型を次に示します。

表2‒101　システム定義スカラ関数TRANSLの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

VARCHAR(n)

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(n)

NCHAR(n)又はNVARCHAR(n)

NVARCHAR(n)

表2‒102　システム定義スカラ関数TRANSL_LONGの結果のデータ型

引数1のデータ型

結果のデータ型

CHAR(n)又はVARCHAR(n)

指定できません

MCHAR(n)又はMVARCHAR(n)

MVARCHAR(32000)

NCHAR(n)又はNVARCHAR(n)

指定できません

結果のデータ型が文字列型の場合，引数1の文字集合が結果の文字集合となります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式のどれかがナル値であれば，結果もナル値になります。

(d)　使用例

TRANSL，TRANSL_LONGの使用例を次に示します。

  TRANSL('data base system', 'abcdefghijklmnopqrstuvwxyz',
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    ==> 'DATA BASE SYSTEM'  (英小文字から英大文字への文字変換)
  TRANSL('<data base> system', '[ ] { } ( ) < >', '')
    ==> ' data base  system'
        (引数3は長さ0の文字列で，括弧（'['，']'，'{'，'}'，'('，')'，
         '<'，'>'）から空白への文字変換)
  TRANSL('+12345.678', '+-012345678', 'SS', '9')
    ==> 'S99999.999'
  TRANSL (M'ｄａｔａ ｂａｓｅ ｓｙｓｔｅｍ',
          M'０１２３４５６７８９ａｂｃｄｅｆｇｈｉｊｋｌｍｎ
            ｏｐｑｒｓｔｕｖｗｘｙｚ',
          M'0123456789abcdefghijklmnopqrstuvwxyz')
    ==> M'data base system'  (全角文字の半角文字への文字変換)

  TRANSL_LONG(M'data base system',
              M'0123456789abcdefghijklmnopqrstuvwxyz',
              M'０１２３４５６７８９ａｂｃｄｅｆｇｈｉｊｋｌｍｎ
                ｏｐｑｒｓｔｕｖｗｘｙｚ')
    ==> M'ｄａｔａ ｂａｓｅ ｓｙｓｔｅｍ'
        (半角文字の全角文字への文字変換)
  TRANSL('+12345.678', '+012345678', '', 'S')
    ==> 'SSSSSS.SSS'
  TRANSL('2000-03-31 12:23:30', '-:', '/.')
    ==> '2000/03/31 12.23.30'

(59)　TRUNC

(a)　機能

引数1の値の，小数点数以下のnけたより後のけた（10の−n乗未満のけた）を切り捨てた値を返します。なお，nは引数2で指定した値とします。

(b)　形式

　〔MASTER.〕TRUNC（引数1〔，引数2〕）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型は数データ型にしてください。引数2のデータ型は，INTEGER又はSMALLINTにしてください。

引数2を省略すると，0が仮定されます。引数2に指定できる値の範囲を次の表に示します。

表2‒103　システム定義スカラ関数TRUNCの引数2に指定できる値の範囲

結果のデータ型

引数2に指定できる値の範囲

INTEGER

−9 〜 0

DECIMAL(p, s)

−(p-s-1) 〜 s

FLOAT

・HP-UX（32ビットモードの場合）の場合

−307〜307

・HP-UX（64ビットモードの場合），AIX，Linux及びWindowsの場合

−307〜323

結果のデータ型を次の表に示します。

表2‒104　システム定義スカラ関数TRUNCの結果のデータ型

引数1のデータ型

結果のデータ型

SMALLINT

INTEGER

INTEGER

INTEGER

DECIMAL(p,s)

DECIMAL(p,s)

SMALLFLT

FLOAT

FLOAT

FLOAT

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

(60)　TRUNCYEAR

(a)　機能

引数2で指定した月及び引数3で指定した日を，各年度の開始の月日として，引数1で指定された日付を含む年度の最初の日付を返します。

3月20日締めで年度を求める場合，3月締めで年度を求める場合などに利用できます。

(b)　形式

　〔MASTER.〕TRUNCYEAR（引数1〔，引数2〔，引数3〕〕）

(c)　規則

引数1，引数2，及び引数3に指定できるものを次に示します。

値式〔AS データ型〕

引数1の値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

引数2及び引数3の値式に指定できるものを次に示します。

整数定数

列指定

SQL変数又はSQLパラメタ

四則演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1のデータ型を，DATE型にしてください。

引数2及び引数3のデータ型は，INTEGER又はSMALLINTにしてください。

結果のデータ型はDATEになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。どれかの引数の値式がナル値であれば，結果もナル値になります。

引数2を省略すると，1が仮定されます。引数2に指定できる値の範囲は，1〜12です。

引数3を省略すると，1が仮定されます。引数3に指定できる値の範囲は，引数2の値が2の場合は1〜29です。それ以外の場合は，1〜（引数2で指定した月の最終日）です。

結果は，次の規則によって求められます。

引数1の月＜引数2，又は引数1の月＝引数2かつ引数1の日＜引数3の場合

結果の年＝引数1 の年 − 1

引数1の月＞引数2，又は引数1の月＝引数2かつ引数1の日≧引数3の場合

結果の年＝引数1の年

結果の年がうるう年でない場合で，引数2＝2かつ引数3＝29のとき

結果の月＝3

結果の日＝1

結果の年がうるう年の場合で，引数2が2でないとき，又は引数3が29でないとき

結果の月＝引数2

結果の日＝引数3

関数の結果が，0001年01月01日〜9999年12月31日の範囲でないならば，オーバフローエラーになります。なお，オーバフローエラー抑止が設定されている場合の結果については，「オーバフローエラー抑止が設定されている場合の演算結果」を参照してください。

(d)　使用例

TRUNCYEARの使用例を次に示します。

  TRUNCYEAR(DATE('1999-09-10'))         ==> '1999-01-01'
  TRUNCYEAR(DATE('1999-09-11'), 4)      ==> '1999-04-01'
  TRUNCYEAR(DATE('1999-03-31'), 4)      ==> '1998-04-01'
  TRUNCYEAR(DATE('1999-08-11'), 3, 21)  ==> '1999-03-21'
  TRUNCYEAR(DATE('1999-03-20'), 3, 21)  ==> '1998-03-21'
  TRUNCYEAR(DATE('2000-02-28'), 2, 29)  ==> '1999-03-01'
                                        ('1999-02-29'は存在しません)
  TRUNCYEAR(DATE('2000-03-20'), 2, 29)  ==> '2000-02-29'
  TRUNCYEAR(DATE('0001-03-20'), 4)      ==> オーバフロー

(61)　WEEK

(a)　機能

引数で指定された日付が，その年の第何週目かを1〜54の整数で返します。各週は，日曜日から始まるものとします。

(b)　形式

　〔MASTER.〕WEEK（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

WEEKの使用例を次に示します。

  WEEK(DATE('2000-01-01'))   ==> 1
  WEEK(DATE('2000-01-02'))   ==> 2
  WEEK(DATE('2000-02-29'))   ==> 10
  WEEK(DATE('2000-12-30'))   ==> 53
  WEEK(DATE('2000-12-31'))   ==> 54
    '2000-01-01'は土曜日で，'2000-12-31'は日曜日です。

(62)　WEEKOFMONTH

(a)　機能

引数で指定された日付が，その月の第何週目かを1〜6の整数で返します。各週は，日曜日から始まるものとします。

(b)　形式

　〔MASTER.〕WEEKOFMONTH（引数）

(c)　規則

引数に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数のデータ型はDATEにしてください。

結果のデータ型はINTEGERになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数の値式がナル値であれば，結果もナル値になります。

(d)　使用例

WEEKOFMONTHの使用例を次に示します。

  WEEKOFMONTH(DATE('2000-01-01'))   ==> 1
  WEEKOFMONTH(DATE('2000-01-02'))   ==> 2
  WEEKOFMONTH(DATE('2000-01-29'))   ==> 5
  WEEKOFMONTH(DATE('2000-01-30'))   ==> 6
    '2000-01-01'は土曜日で，'2000-01-30'は日曜日です。

(63)　YEARS_BETWEEN

(a)　機能

引数で指定した二つの日付間の年数を，実数（FLOAT型）で返します。

(b)　形式

　〔MASTER.〕YEARS_BETWEEN（引数1，引数2）

(c)　規則

引数1及び引数2に指定できるものを次に示します。

値式〔AS データ型〕

値式に指定できるものを次に示します。

CURRENT_DATE値関数

列指定

SQL変数又はSQLパラメタ

日付演算

集合関数

スカラ関数

関数呼出し

CASE式

CAST指定

埋込み変数又は？パラメタ

スカラ副問合せ

値式に埋込み変数又は？パラメタだけを指定する場合は，必ずAS データ型を指定してください。AS データ型を指定した場合，埋込み変数又は？パラメタ以外は指定できません。AS データ型を指定すると，AS句で指定したデータ型のパラメタを持つ関数が呼び出されます。

引数1及び引数2のデータ型は，DATEにしてください。

結果のデータ型はFLOATになります。

結果の値は，非ナル値制約なし（ナル値を許します）になります。引数1又は引数2の値式がナル値であれば，結果もナル値になります。

YEARS_BETWEEN（日付1，日付2）の結果の月数は，次の規則に従って計算されます。

日付1＜日付2の場合

結果＝−YEARS_BETWEEN（日付2，日付1）

日付1≧日付2の場合

yを0以上の整数とし，日付4≦日付1＜日付3を満たす（日付2＋y年）の日付，及び（日付2＋（y＋1）年）の日付を，それぞれ日付4及び日付3とします。

日付4と日付1の間の日数（DAYS（日付1）−DAYS（日付4）），及び日付4と日付3の間の日数（DAYS（日付3）−DAYS（日付4））を，それぞれd1及びd2とします。d2の値は，365又は366のどちらかになります。

結果の年数は，（y＋d1÷d2）年になります。

日付1，日付2，日付3，及び日付4の関係を次の図に示します。

図2‒8　日付1，日付2，日付3，及び日付4の関係（YEARS_BETWEEN）

(d)　使用例

YEARS_BETWEENの使用例を次に示します。

  YEARS_BETWEEN(DATE('2000-06-10'),DATE('1999-06-10'))==>   1
  YEARS_BETWEEN(DATE('2000-06-11'),DATE('1999-06-10'))==>   1.002739...
  YEARS_BETWEEN(DATE('1999-06-11'),DATE('1998-06-10'))==>   1.002732...
  YEARS_BETWEEN(DATE('2014-09-09'),DATE('1999-06-10'))==>  15.249315...
  YEARS_BETWEEN(DATE('1999-06-10'),DATE('2014-09-09'))==> -15.249315...

2.16.3　プラグイン定義スカラ関数

(1)　XMLQUERY

HiRDB XML Extensionと連携することで使用できるスカラ関数です。

詳細は，「XMLQUERY」を参照してください。

(2)　XMLSERIALIZE

HiRDB XML Extensionと連携することで使用できるスカラ関数です。

詳細は，「XMLSERIALIZE」を参照してください。

(3)　XMLPARSE

HiRDB XML Extensionと連携することで使用できるスカラ関数です。

詳細は，「XMLPARSE」を参照してください。

2.17　CASE式

2.17.1　CASE式の形式と規則

(1)　機能

条件付けられた値を指定します。

(2)　形式

　CASE式：：＝｛探索CASE式｜単純CASE式｜CASE略式｝
　探索CASE式：：＝CASE
　　　　　　　　　　｛WHEN 探索条件 THEN｛値式｜NULL｝｝…
　　　　　　　　　　〔ELSE｛値式｜NULL｝〕
　　　　　　　　　　END
　単純CASE式：：＝CASE 値式
　　　　　　　　　　｛WHEN 値式 THEN｛値式｜NULL｝｝…
　　　　　　　　　　〔ELSE ｛値式｜NULL｝〕
　　　　　　　　　　END
　CASE略式：：＝｛NULLIF（値式，値式）｜COALESCE（値式〔，値式〕…）｝

(3)　規則

一つのCASE式中でWHENは255個まで指定できます。

CASE式の幾つかの探索条件が真であれば，CASE式の値はCASE式のデータ型に変換された，探索条件が真となる最初のWHENの結果の値となります。

CASE式のどの探索条件も真でなければCASE式の値はCASE式のデータ型に変換された，想定されるか，又は指定されるELSEの結果の値となります。

探索条件については「探索条件」を参照してください。

CASE式の結果のデータ型，及びデータ長は，集合演算のデータ型，及びデータ長と同じです。

CASE式の結果のデータ型は，非ナル値制約なし（ナル値を許す）になります。

CASE式の結果のデータ型が文字データ型の場合，結果の文字集合は次の表に示すとおりになります。

表2‒105　CASE式の結果の文字集合

CASE式

結果の文字集合

探索CASE式

先頭のTHENに指定した値式の文字集合

単純CASE式

先頭のTHENに指定した値式の文字集合

CASE略式

NULLIF

最初の値式の文字集合

COALESCE

最初の値式の文字集合

COALESCEの場合，値式の並びは左から右に順に評価され，ナル値でない最初の値が結果になります。

CASE中の少なくとも一つのTHENは，値式を指定してください。

CASE，THEN，及びELSEの値式に，?パラメタ，及び埋込み変数を単独（単項演算式に指定した場合も含む）で指定できません。

ELSEが指定されていない場合は，ELSE NULLが仮定されます。

CASE 値式，WHEN 値式，NULLIF及びCOALESCEの値式には，次に示すデータ型の値を指定できません。

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

THEN及びELSEの値式には，次に示すデータ型の値を指定できません。

BLOB

定義長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

THEN及びELSEに指定した値式が文字データ型の場合，値式の文字集合はすべて同じにしてください。ただし，二つ目以降のTHEN，又はELSEに指定した値式が次に示す値式の場合，先頭のTHENに指定した値式の文字集合に変換されます。

文字列定数

単純CASE式は，WHENの値式であるV1とCASEの値式であるV2を，V2＝V1の型で探索条件に指定した探索CASE式と同じです。

単純CASE指定中の最初のWHENの値式，COALESCEの最初の値式，又はNULLIFの両方の値式に，?パラメタ，及び埋込み変数は単独（単項演算式に指定した場合も含む）で指定できません。

単純CASE式の一つ以上のWHENの値式が?パラメタ，又は埋込み変数の場合，?パラメタ，又は埋込み変数のデータ型は，最初のWHENの値式のデータ型を仮定します。

NULLIFの一つの値式が?パラメタ，又は埋込み変数の場合，?パラメタ，又は埋込み変数のデータ型は，もう一方の値式のデータ型を仮定します。

COALESCEの一つ以上の値式が?パラメタ，又は埋込み変数の場合，?パラメタ，又は埋込み変数のデータ型は，最初の値式のデータ型を仮定します。

COALESCEの値式は255個まで指定できます。

NULLIF（V1，V2）は，次に示すのCASE式と同じです。

CASE WHEN V1＝V2 THEN NULL ELSE V1 END

COALESCE（V1，V2）は，次に示すスカラ関数VALUE，又はCASE式と同じです。

VALUE（V1，V2）

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

nが三つ以上のCOALESCE（V1，V2，…，Vn）は，次に示すスカラ関数VALUE，又はCASE式と同じです。

VALUE（V1，V2，…，Vn）

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE（V2，…，Vn） END

探索CASE式，単純CASE式のTHEN，及びELSEの値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし，次に示すデータは比較できません。

日付データと日付データの文字列表現

時刻データと時刻データの文字列表現

時刻印データと時刻印データの文字列表現

日間隔データと日間隔データの10進数表現

時間隔データと時間隔データの10進数表現

バイナリデータと16進文字列定数

単純CASE式の場合，WHENの値式のデータ型とCASEの値式のデータ型は比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし，次に示すデータは比較できません。

日付データと日付データの文字列表現

時刻データと時刻データの文字列表現

時刻印データと時刻印データの文字列表現

日間隔データと日間隔データの10進数表現

時間隔データと時間隔データの10進数表現

バイナリデータと16進文字列定数

単純CASE式でCASE値式とWHENの値式が文字列型の場合，CASE値式とWHENの値式の文字集合は同じにしてください。ただし，WHENの値式が次に示す値式である場合，CASE値式の文字集合に変換して比較を行います。

文字列定数

NULLIF，COALESCEの場合，値式のデータ型はそれぞれ比較できるデータ型にしてください。比較できるデータ型については「データ型」を参照してください。ただし，次に示すデータは比較できません。

日付データと日付データの文字列表現

時刻データと時刻データの文字列表現

時刻印データと時刻印データの文字列表現

日間隔データと日間隔データの10進数表現

時間隔データと時間隔データの10進数表現

バイナリデータと16進文字列定数

NULLIFで，値式が両方とも文字列データ型の場合，二つの値式の文字集合は同じにしてください。ただし，値式のどちらかが次に示す値式である場合，もう一方の値式の文字集合に変換します。

文字列定数

COALESCEで，値式が両方とも文字列データ型の場合，二つの値式の文字集合は同じにしてください。ただし，二番目の値式が次に示す値式である場合，一番目の値式の文字集合に変換します。

文字列定数

繰返し列は，添字を指定すればCASE式中に指定できます。また，CASE式の探索条件の繰返し列には添字としてANYを指定でき，IS NULL述語には添字なし繰返し列を指定できます（指定できる箇所は，探索条件と同じです）。ただし，選択式に指定したCASE式中の繰返し列には，添字としてANYは指定できません。

予備列は指定できません。

ウィンドウ関数は指定できません。

(4)　使用例

(a)　探索CASE式の場合

表T1のうち，C1列が'AA'のものを'AAA'，C1列が'BB'のものを'BBB'に更新します。

    UPDATE T1 SET C1 =
        CASE WHEN C1='AA' THEN 'AAA' WHEN C1='BB' THEN 'BBB' ELSE C1 END

(b)　単純CASE式の場合

表T1のうち，C1列が'AA'のものを'AAA'，C1列が'BB'のものを'BBB'に更新します。

    UPDATE T1 SET C1 =
        CASE C1 WHEN 'AA' THEN 'AAA' WHEN 'BB' THEN 'BBB' ELSE C1 END

(c)　CASE略式（COALESCE）の場合

表T1の列C1，C2，C3の順で，ナル値でない列を抽出します。すべてがナル値の場合，結果として0が設定されます。

    SELECT COALESCE(C1,C2,C3,0)FROM T1

(d)　CASE略式（NULLIF）の場合

表T1の列C1，C2の値等しい場合，結果としてナル値を返します。列C1，C2の値が等しくない場合，列C1を抽出します。

    SELECT NULLIF(C1,C2) FROM T1

2.18　オーバフローエラー抑止が設定されている場合の演算結果

システム定義のpd_overflow_suppressでオーバフローエラー抑止が設定されている場合は，次に示すような場合でもエラーとしないで，オーバフローが発生した演算の結果をナル値として処理を続行します。

除算で第2演算項の値に0を指定した場合

計算途中でオーバフローが発生した場合

オーバフローエラー抑止の対象を次に示します。

数値型のオーバフロー

0除算エラー

日付データ型のオーバフロー

時刻データ型のオーバフロー

日間隔データ型のオーバフロー

時間隔データ型のオーバフロー

ラベル付き間隔のオーバフロー

集合関数SUM，COUNT，COUNT_FLOAT，AVGのオーバフロー

ウィンドウ関数のオーバフロー

スカラ関数のオーバフロー（オーバフローエラー抑止の対象となるスカラ関数を次の表に示します）

表2‒106　オーバフローエラー抑止の対象となるスカラ関数

分類

スカラ関数

スカラ関数の種別

変換関数

DEGREES

システム定義スカラ関数

NUMEDIT

STRTONUM

数学関数

ABS

システム組込みスカラ関数

MOD

CEIL

システム定義スカラ関数

COSH

EXP

FLOOR

POWER

ROUND

SINH

TAN

TANH

TRUNCYEAR

日付操作

ADD_INTERVAL

NEXT_DAY

ROUNDMONTH

ただし，オーバフロー抑止が設定されていても，次の場合はエラーになるので注意してください。

UAP中で標識変数を指定しないでデータを受け取ろうとした場合

非ナル値制約のある列に対して，オーバフロー抑止によって設定されたナル値で，更新，又は挿入しようとした場合

オーバフローが発生した場合，SQL連絡領域のSQLWARNBに'W'が設定されるので，SQLWARNBを参照してオーバフローの発生の有無を確認できます。

オーバフローエラー抑止が設定されている場合の処理の例を，次に示す管理表（KANRI）を使用して説明します。

2.18.1　探索条件でオーバフローが発生した場合の例

管理表（KANRI）から単価（TANKA）と数量（SURYO）の積が15,000,000より大きい値を検索します。

(1)　SQL

    SELECT GNO,TANKA,SURYO
        FROM KANRI
        WHERE TANKA * SURYO > 15000000

(2)　検索結果

オーバフローエラー抑止が設定されていない場合，品番（GNO）がB-300の行で単価と数量の積（TANKA＊SURYO）でオーバフローが発生し，そこで処理は打ち切られます。

オーバフローエラー抑止が設定されている場合でも，品番（GNO）がB-300の行で単価と数量の積（TANKA＊SURYO）でオーバフローが発生しますが，そこで処理は続行します。

ただし，オーバフローが発生した演算の結果はナル値になり，条件を満たさない（不定になります）ため，その行は検索されません。

2.18.2　更新値でオーバフローが発生した場合の例

管理表（KANRI）から単価（TANKA）と数量（SURYO）の積（TANKA＊SURYO）の値で合計（GOUKEI）を更新します。

(1)　SQL

      UPDATE KANRI
          SET GOUKEI = TANKA * SURYO

(2)　更新結果（オーバフローエラー抑止設定時）

オーバフローエラー抑止が設定されていない場合は，品番（GNO）がB-300の行で単価と数量の積（TANKA＊SURYO）でオーバフローが発生し，そこで処理は打ち切られます。

オーバフローエラー抑止が設定されている場合でも，品番（GNO）がB-300の行で単価と数量の積（TANKA＊SURYO）でオーバフローは発生するが，そこで処理は続行します。

ただし，オーバフローが発生した演算の結果はナル値になり，合計列（GOUKEI）はナル値に更新されます。オーバフローエラー抑止が設定されているときに，表の更新などをする場合は，ナル値で表が更新されるため注意してください。

2.19　排他オプション

2.19.1　排他オプションの形式と規則

(1)　機能

データ検索時の排他制御について指定します。

排他オプションは，カーソル宣言，FOR文のカーソル指定，1行SELECT文，及び動的SELECT文中に指定します。

(2)　形式

　排他オプション：：＝〔｛WITH｛SHARE｜EXCLUSIVE｝LOCK
　　　　　　　　　　　　　｜WITHOUT LOCK 〔｛WAIT｜NOWAIT｝〕｝〕
　　　　　　　　　　　〔｛WITH ROLLBACK｜NO WAIT｝〕

(3)　オペランド

〔｛WITH｛SHARE｜EXCLUSIVE｝LOCK

　　｜WITHOUT LOCK 〔｛WAIT｜NOWAIT｝〕｝〕

このオペランドを省略すると，WITH SHARE LOCKが仮定されます。

ただし，カーソル宣言，又は動的SELECT文でFOR UPDATE句を指定した場合，又はそのカーソルを使用した行の更新，削除をする場合，WITH EXCLUSIVE LOCKが仮定されます。

WITH SHARE LOCK

一度検索したデータの内容を，トランザクション終了までほかのユーザが参照することは許すが，更新することは許さない（共用モード）場合に指定します。

WITH EXCLUSIVE LOCK

一度検索したデータの内容を，トランザクション終了までほかのユーザが参照する（WITHOUT LOCK NOWAITによる参照は除く）ことも，更新することも許さない（排他モード）場合に指定します。

WITH EXCLUSIVE LOCKを指定した場合，問合せ指定のFROM句に指定した表に対してだけ有効です。

WITH EXCLUSIVE LOCKを指定しても，インデクスのキー値には，共用モードの排他を参照時だけにかけ，参照終了時に排他を解除するので，ほかのユーザは同じインデクスを使用できます。ただし，検索に用いているインデクスをほかのユーザが更新している場合，待ちが生じることがあります。トランザクションが終了するまでほかのユーザの処理を待たせるためには，LOCK文を使用します。

WITHOUT LOCK WAIT

一度検索したデータの内容を，トランザクション終了まで排他制御する必要がない場合に指定します。WITHOUT LOCK 〔WAIT〕を指定したSQL文の検索では，参照済みの排他資源（行又はページ）の排他は解除されます。

WITHOUT LOCK 〔WAIT〕を指定すると，トランザクションの終了を待たないで行の検索処理完了を契機に排他を解除するので，排他資源を小さくできます。また，同時実行性も向上します。ただし，同じトランザクション内で同じ行を2度検索しても同じデータを受け取れない場合があるので注意してください。

WITHOUT LOCK NOWAIT

ほかのユーザが更新中（又は排他オプションを指定中）のデータでも更新の完了（又はトランザクションの終了）を待たないで参照し，一度検索したデータの内容をトランザクション終了まで排他制御する必要がない場合に指定します。ただし，検索対象表が共用表であり，ほかのユーザによって排他モードでLOCK文が実行されている場合は，排他解除待ちとなり参照できません。

また，論理ファイルを参照する場合を除き，WITHOUT LOCK NOWAITを指定したSQL文の検索では，ほかのトランザクションが表や行にEXモードで排他を掛けているときでも，排他なしと同じ状態として参照できます。ただし，pdload及びpdrorgでアクセス中の表は参照できません。

WITHOUT LOCK NOWAITを指定した場合，同じトランザクション内で同じ行を2度検索しても同じデータを受け取れない場合があるので注意してください。さらに，更新したユーザがそのトランザクションを取り消すと，更新中の表を検索したときにデータベースにないデータを受け取ったことになるので注意してください。

カーソル宣言中，又は動的SELECT文中でWITHOUT LOCK NOWAITを指定する場合，そのカーソル宣言，又は動的SELECT文でFOR UPDATE句は指定できません。また，そのカーソルを使用したUPDATE，又はDELETEも実行できません。

〔｛WITH ROLLBACK｜NO WAIT｝〕

このオペランドを省略すると，検索するデータがほかのユーザによって使用されているとき，その使用中のユーザのトランザクションが終了するまで待ち状態（WITHOUT LOCK NOWAITを除く）になります。

WITH ROLLBACK

検索の対象になるデータがほかのユーザに使用されているとき，トランザクションを取り消して無効にする場合に指定します（エラーとなったSQLより前に実行したSQLは，ロールバックされます）。

NO WAIT

検索の対象になるデータがほかのユーザに使用されているとき，検索をエラー（排他エラー）とし，トランザクションを取り消さない場合に指定します（エラーとなったSQLより前に実行したSQLはロールバックされません）。

この場合，指定したSQLで掛けた排他は解除されません。カーソルは閉じられないので，UAP中でCLOSE文を実行してカーソルを閉じてください。

ただし，次に示す箇所で排他エラーが発生した場合，NO WAITを指定した場合でも，トランザクションを取り消して，無効にします。

副問合せで検索の対象になる表

FROM句の導出表で検索の対象になる表

GROUP BY句に値式を指定した問合せで，検索の対象となる表

「内部導出表」となる条件のうちの，どれかを満たす問合せで，検索の対象になる表

内部導出表については，「内部導出表」を参照してください。

(4)　留意事項

WITHOUT LOCK NOWAITとWITHOUT LOCK NO WAITとでは，意味が異なるので指定を誤らないように注意してください。

(5)　指定例（SELECT文中で排他オプションを指定した場合）

SELECT SCODE FROM ZAIKO
   WHERE SNAME = N'ブラウス'
   WITH SHARE LOCK
   WITH ROLLBACK

2.20　関数呼出し

2.20.1　関数呼出しの形式と規則

(1)　機能

指定した関数を呼び出します。

(2)　形式

　関数呼出し：：＝〔認可識別子.〕ルーチン識別子（〔引数〔,引数〕…〕）
　引数：：＝値式 〔AS データ型〕

(3)　オペランド

認可識別子

呼び出す関数の認可識別子を指定します。

パブリック関数を呼び出す場合は，認可識別子にPUBLICを指定します。

ルーチン識別子

呼び出す関数のルーチン識別子を指定します。

引数：：＝値式 〔AS データ型〕

値式

呼び出す関数のパラメタに対する値式を指定します。

AS データ型

呼び出す関数のパラメタに対する？パラメタ，又は埋込み変数の既定義型を指定します。

(4)　共通規則

引数は，指定した順序でパラメタと対応します。

引数のデータ型は，対応するパラメタのデータ型と互換性がなければなりません。互換性があるデータ型については，「変換（代入，比較）できるデータ型」を参照してください。ただし，次の組み合わせの場合は互換性がありません。

文字集合が異なる文字データ

文字データと混在文字データ

日間隔データと日間隔を10進数で表現した定数

日間隔データとDECIMAL（8，0）に対応する埋込み変数

時間隔データと時間隔を10進数で表現した定数

時間隔データとDECIMAL（6，0）に対応する埋込み変数

日付データと日付を文字列で表現した定数

日付データとCHAR（10）に対応する埋込み変数

日付データと文字集合がUTF16のCHAR（20）に対応する埋込み変数

日付データと，長さが10バイト以上のCHAR，又はVARCHARの埋込み変数

日付データと，長さが20バイト以上で長さが2の倍数のCHAR，又はVARCHARの文字集合がUTF16の埋込み変数

時刻データと時刻を文字列で表現した定数

時刻データとDECIMAL（6，0）に対応する埋込み変数

時刻データと，長さが8バイト以上のCHAR，又はVARCHARの埋込み変数

時刻データと，長さが16バイト以上で長さが2の倍数のCHAR，又はVARCHARの文字集合がUTF16の埋込み変数

時刻印データと時刻印を文字列で表現した定数

時刻印データの小数秒精度が0の場合は19バイト以上，2以上の場合は22バイト以上のCHAR又はVARCHARの埋込み変数

時刻印データの小数秒精度が0の場合は38バイト以上で長さが2の倍数，2以上の場合は44バイト以上で長さが2の倍数のCHAR又はVARCHARの文字集合がUTF16の埋込み変数

BINARY型と16進文字列定数

さらに，引数のデータ型はパラメタのデータ型と優先度が同じか，又はより優先度が高いデータ型でなければなりません。データ型の優先度については，表「既定義型の優先度」及び表「抽象データ型の優先度」を参照してください。

値式に？パラメタ又は埋込み変数だけを指定する場合は，AS データ型を必ず指定して，値式のデータ型を決定してください。

AS データ型を指定した場合，値式には？パラメタ又は埋込み変数以外は指定できません。

値式に？パラメタ，又は埋込み変数を用いた単項演算は指定できません。

引数に繰返し列を指定した場合，添字を指定してください。ただし，添字としてANYは指定できません。

値式に？パラメタ，埋込み変数だけを指定した場合，その？パラメタ，埋込み変数は単純構造にしてください。

値式に予備列は指定できません。

関数呼出しのネスト数は，最大255です。関数呼出しのネスト数は，"ルーチン識別子（"の括弧のネスト数です。

引数には，結果のデータ型がBLOB，又は最大長が32,001バイト以上のBINARY型となるスカラ関数SUBSTRを，単独の値式として指定できません。

ウィンドウ関数は指定できません。

(5)　留意事項

認可識別子を省略した場合の仮定値については，「スキーマパス」を参照してください。

(6)　呼び出す関数の決定規則と結果のデータ型

認可識別子，ルーチン識別子，引数の数が一致し，引数のデータ型に抽象データ型を含まないで，かつ引数の順序に対応してパラメタのデータ型が完全一致する場合は，この関数を呼び出します。また，この場合の関数の結果のデータ型は，呼び出す関数のRETURNS句のデータ型になります。

認可識別子，ルーチン識別子，引数の数のどれかが一致しない関数の場合は，この関数は呼び出しの対象とはなりません。

呼び出す関数の決定規則を，次の表に示します。

表2‒107　関数呼出しの指定内容と，呼び出す関数の決定規則

関数呼出しの指定内容

呼び出す関数の決定規則

認可識別子，ルーチン識別子，引数の数が一致する

引数の数が0

認可識別子，ルーチン識別子，引数のデータ型が一致する関数を呼び出す

引数に抽象データ型を含まない

引数の順序に対応したパラメタのデータ型が完全に一致※

引数の順序に対応したパラメタのデータ型が一致しない

下記の「・抽象データ型を含まない場合」の決定規則に従う

引数に抽象データ型を含む

下記の「・抽象データ型を含む場合」の決定規則に従う

認可識別子，ルーチン識別子，引数の数が一致しない

呼び出し可能な関数が存在しないため，SQL文解析時にエラーとなる

注※

引数のデータ型が文字列型の場合，「データ型が一致する」とは，文字集合も一致することをいいます。

抽象データ型を含まない場合

左側の引数から順番に各引数の既定義型を基準として，基準と優先度が同じか又はより優先度が低いデータ型の中で最も優先度の高い既定義型をパラメタに持つ関数を呼び出します。既定義型の優先度を次の表に示します。また，この場合，呼び出す関数がSQL解析時に一意に決まるので，関数の結果のデータ型は呼び出す関数のRETURNS句のデータ型となります。

表2‒108　既定義型の優先度

各引数のデータ型

優先度

数データ

SMALLINT→INTEGER→DECIMAL→SMALLFLT→FLOAT

文字データ

CHAR→VARCHAR

各国文字データ

NCHAR→NVARCHAR

混在文字データ

MCHAR→MVARCHAR

長大データ，及びバイナリデータ

BINARY→BLOB

（凡例）

A→B：AがBより優先度が高いことを示します。

抽象データ型を含む場合

抽象データ型を含む場合，次の順番で呼び出す関数を決定します。

基本となる関数の決定

基本となる関数の決定方法は，左側の引数から順番に各引数のデータ型を基準として，基準と優先度が同じか又はより優先度が低いデータ型の中で最も優先度の高いデータ型をパラメタに持つ関数を，基本となる関数とします。データ型が既定義型の場合は，表「既定義型の優先度」の優先度に準じます。データ型が抽象データ型の場合は，次に示す表の優先度に準じます。

表2‒109　抽象データ型の優先度

各引数のデータ型

優先度

抽象データ型

同じデータ型→スーパタイプ※

（凡例）

A→B：AがBより優先度が高いことを示します。

注※

抽象データ型定義中のUNDER句で直接指定するスーパタイプの方が，そのほかのスーパタイプよりも優先度が高くなります。

候補となる関数の決定

引数が抽象データ型の場合，引数のデータとして取り得る実際の値のデータ型は，引数の定義の抽象データ型と同じデータ型又はサブタイプとなります。そのため，基本となる関数のほかに，引数の抽象データ型と同じデータ型又はサブタイプの抽象データ型を対応するパラメタに持つすべての関数が候補となる関数となります。

候補となる関数が，基本となる関数一つだけの場合，その関数が呼び出す関数となります。関数の結果のデータ型は，呼び出す関数のRETURNS句のデータ型になります。

RETURNS句のデータ型を用いた候補となる関数の絞り込み

抽象データ型の引数を含む場合，基本となる関数のRETURNS句のデータ型と，基本となる関数以外の候補となる関数のRETURNS句のデータ型の互換性のチェックをします。RETURNS句のデータ型が互換性のない関数の場合，候補となる関数ではなくなります。

互換性のチェックの後，残った候補となる関数のRETURNS句のデータ型を基に，関数の結果のデータ型を決定します。

互換性のチェックの後，残った候補となる関数のRETURNS句のデータ型が抽象データ型の場合は，基本となる関数のRETURNS句の抽象データ型が結果のデータ型になります。

互換性のチェックの後，残った候補となる関数の中にRETURNS句のデータ型が32,001バイト以上のBINARY型又はBLOB型の関数を含む場合は，次の規則に従います。

結果のデータ長は，一番長いデータ長となります。

BINARY型とBLOB型が混在する場合は，BLOB型になります。

その他の場合，結果のデータ型及びデータ長は，集合演算（UNION ALL，又はEXCEPT ALL）の結果のデータ型及びデータ長と同じになります。詳細については，「問合せ式」を参照してください。

SQL文実行時の関数の決定

2及び3で関数が一意に決まらない場合，SQL文実行時に，抽象データ型の引数の実際のデータ型によって，候補となる関数の中から呼び出す関数を一つに決定します。左側の引数より順番に，各引数の実際の値がナル値以外の場合はその値のデータ型を基準として，ナル値の場合はその引数のデータ型を基準とし，その基準のデータ型と同じか又はより優先度が低いデータ型の中で最も優先度の高いデータ型をパラメタとして持つ関数を候補となる関数の中から一つ決定し，呼び出す関数とします。

（例）　抽象データ型を含む場合の呼び出し関数の決定

A，B，Cを抽象データ型とし，CをＢのスーパタイプ，BをAのスーパタイプとします（抽象データ型の優先度：A→B→C）。

（例1）

＜前提条件＞

表定義

CREATE TABLE T1(C1 C)

関数定義

f(A)，f(B)，f(C)

SQL文

SELECT f(C1) FROM T1

＜結果＞

基本となる関数

f(C)

関数呼出しがf(C1)の場合の候補となる関数

f(A),f(B),f(C)

呼び出し関数

SQL文実行時に呼び出す関数を次に示します。

T1.C1の実際の値

呼び出し関数

A型

f(A)

B型

f(B)

C型

f(C)

NULL値

f(C)

（例2）

＜前提条件＞

表定義

CREATE TABLE T1(C1 C,C2 B)

関数定義

f(A,A)，f(A,B)，f(A,C)，f(B,A)，f(B,C)，f(C,A)，f(C,B)，f(C,C)

SQL文

SELECT f(C1,C2) FROM T1

＜結果＞

基本となる関数

f(C,B)

関数呼出しがf(C1,C2)の場合の候補となる関数

f(A,A),f(A,B),f(A,C),f(B,A),f(B,C),f(C,A),f(C,B)

呼び出し関数

SQL文実行時に呼び出す関数を次に示します。

T1.C1の実際の値

T1.C2の実際の値

呼び出し関数

A型

A型

f(A,A)

B型

f(A,B)

NULL値

f(A,B)

B型

A型

f(B,A)

B型

f(B,C)

NULL値

f(B,C)

C型

A型

f(C,A)

B型

f(C,B)

NULL値

f(C,B)

NULL値

A型

f(C,A)

B型

f(C,B)

NULL値

f(C,B)

2.21　内部導出表

ビュー表，又はWITH句の問合せ名を，名前付きの導出表といいます。

名前付きの導出表を問合せ指定に指定する場合，その名前付きの導出表に対して，内部的に作業表を作成する場合があります。この作業表を作成する名前付きの導出表を内部導出表といいます。

2.21.1　内部導出表の条件

(1)〜(10)に示す名前付きの導出表を，問合せ指定のFROM句に指定した場合，内部導出表を作成する条件は，次のようになります。

(1)　SELECT DISTINCTを指定して導出する名前付きの導出表の場合

名前付きの導出表が副問合せ中に含まれる。又は，名前付きの導出表をFROM句に指定した問合せ指定が次のどれかを直接含んでいる。

GROUP BY句，HAVING句，又は集合関数

SELECT DISTINCT

表の結合（コンマの結合を指定している場合を含む）

選択式に列指定以外の値式を指定している

選択式にスカラ副問合せを指定している

選択式にFROM句に指定したビュー表の全列を１回ずつ指定していない

ORDER BY句

NEXT VALUE式

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

（例）

「SELECT DISTINCT C1,C2 FROM T1」によって導出されている名前付きの導出表V1（ビュー表），Q1（WITH句の問合せ名）をFROM句に指定する場合，次に示す記述をするとV1に対して内部導出表を作成します。

例1：
SELECT * FROM T2 WHERE EXISTS(SELECT * FROM V1)

例2：
SELECT VC1,VC2 FROM V1 GROUP BY VC1,VC2

例3：
WITH Q1(QC1,QC2) AS (SELECT DISTINCT C1,C2 FROM T1)
    SELECT DISTINCT * FROM Q1

例4：
SELECT X.VC1,Y.C1 FROM V1 X,T2 Y WHERE X.VC1=Y.C2

例5：
SELECT V1.VC1,T2.C2 FROM V1 LEFT JOIN T2 ON T2.C2=V1.VC2

例6：
WITH Q1(QC1,QC2) AS (SELECT DISTINCT C1,C2 FROM T1)
    SELECT QC1+100,CURRENT_DATE FROM Q1

例7：
SELECT VC1,(SELECT C1 FROM T2) FROM V1

例8：
SELECT VC1 FROM V1

例9：
SELECT VC1,VC2 FROM V1 ORDER BY 1

例10：
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1,VC1,VC2 FROM V1

(2)　GROUP BY句，HAVING句，又は集合関数を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が，次のどれかを直接含んでいる。

GROUP BY句，HAVING句，又は集合関数

表の結合（コンマの結合を指定している場合を含む）

ウィンドウ関数

NEXT VALUE式

（例）

「SELECT C1,C2 FROM T1 GROUP BY C1,C2」によって導出されている名前付きの導出表V1（ビュー表），Q1（WITH句の問合せ名）及び「SELECT MAX(C1),C2 FROM T1 GROUP BY C2 HAVING C2<100」によって導出されている名前付きの導出表V2（ビュー表）をFROM句に指定する場合，次に示す記述をするとV1，V2，Q2に対して内部導出表を作成します。

例1：
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1
  GROUP BY C1,C2) SELECT AVG(QC1),QC2 FROM Q1
    GROUP BY QC2

例2：
SELECT V1.VC1,V2.VC1 FROM V1,V2 WHERE V1.VC1=V2.VC1

例3：
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1
  GROUP BY C1,C2)
  SELECT Q1.QC1,V1.VC1 FROM Q1 INNER JOIN V1 ON V1.VC2=Q1.QC2

例4：
SELECT COUNT(*) OVER(),C1 FROM V1

例5：
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1,VC1,VC2 FROM V1

(3)　選択式に列指定以外の値式を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が，次のどれかを直接含んでいる。

GROUP BY句，HAVING句，又は集合関数※

ウィンドウ関数

外結合，内結合，又は交差結合

注※

グループ分け高速化機能が有効な場合を除きます。ただし，選択式にコンポネント指定を指定して導出する名前付き導出表については，グループ分け高速化機能を適用しません。グループ分け高速化機能については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

（例）

「SELECT C1+100,C2｜｜C2 FROM T1」によって導出されている名前付きの導出表 V1（ビュー表），Q1（WITH句の問合せ名）をFROM句に指定する場合，次に示す記述をするとV1，Q1に対して内部導出表を作成します。

例1：
SELECT AVG(VC1),VC2 FROM V1 GROUP BY VC2

例2：
SELECT * FROM V1 LEFT JOIN T2 ON T2.C2=V1.VC2

例3：
WITH Q1(QC1,QC2) AS (SELECT C1+100,C2||C2 FROM T1)
  SELECT QC1,QC2 FROM Q1 GROUP BY QC1,QC2 HAVING QC1<=100

例4：
SELECT COUNT(*) OVER(),VC1 FROM V1

(4)　DISTINCT指定の集合関数を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が，次のどれかを直接含んでいる。

SELECT DISTINCT

GROUP BY句，HAVING句，又は集合関数

表の結合（コンマの結合を指定している場合を含む）

ウィンドウ関数

NEXT VALUE式

（例）

「SELECT AVG(DISTINCT C1) FROM T1」によって導出されている名前付きの導出表V1（ビュー表）をFROM句に指定する場合，次に示す記述をするとV1に対して内部導出表を作成します。

SELECT DISTINCT VC1 FROM V1
WITH Q1(C1) AS (SELECT AVG(DISTINCT C1) FROM T1)
  SELECT COUNT(*) OVER(),C1 FROM Q1

(5)　表の結合を指定して導出する名前付きの導出表の場合

名前付きの導出表が，外結合，内結合，又は交差結合の表参照に指定されている。

（例）

「SELECT T1.C1,T2.C1 FROM T1,T2」で導出されている名前付きの導出表V1（ビュー表），Q1（WITH句の問合せ名）をFROM句に指定する場合，次に示す記述をするとV1，Q1に対して内部導出表を作成します。

例1：
SELECT V1.* FROM V1 LEFT JOIN T3 ON T3.C1=V1.VC1

例2：
WITH Q1(QC1,QC2) AS (SELECT T1.C1,T2.C1 FROM T1,T2)
  SELECT * FROM Q1 INNER JOIN T3 ON Q1.QC1=T3.C1

(6)　外結合，内結合，又は交差結合を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が，表の結合を直接含んでいる。

（例）

「SELECT T1.C1,T2.C1 FROM T1 LEFT JOIN T2 ON T1.C2=T2.C2」で導出されている名前付きの導出表V1（ビュー表），Q1（問合せ名）をFROM句に指定する場合，次に示す記述をするとV1，Q1に対して内部導出表を作成します。

例1：
SELECT V1.VC1,T3.C1 FROM V1 LEFT JOIN T3 ON T3.C2=V1.VC2

例2：
WITH Q1(QC1,QC2) AS (SELECT T1.C1,T2.C1 FROM T1 LEFT JOIN T2
  ON T1.C2=T2.C2) SELECT Q1.QC1 FROM Q1 INNER JOIN T3 ON T3.C2=Q1.QC2

(7)　選択式に副問合せを含む値式を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が，次のどれかを直接含んでいる。

SELECT DISTINCT

GROUP BY句，HAVING句，又は集合関数

表の結合（コンマの結合を指定している場合を含む）

選択式に列指定以外の値式を指定している

選択式にスカラ副問合せを指定している

副問合せを含む値式から導出した同じ列を，2回以上指定している

副問合せを含む値式から導出した列を，外への参照をする列として指定している

バージョン07-02より前に定義したビュー表

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

（例）

「SELECT (SELECT C1 FROM T2),C1 FROM T1」によって導出されている名前付きの導出表V1（ビュー表），Q1（導出問合せ名）をFROM句に指定する場合，次に示す記述をすると，V1，Q1に対して内部導出表を作成します。

例1：
SELECT VC1,VC2 FROM V1 WHERE VC1>0

例2：
WITH Q1(QC1,QC2) AS (SELECT (SELECT C1 FROM T2),C1 FROM T1)
  SELECT QC1,QC2 FROM Q1 WHERE QC1>0

(8)　集合演算によって導出する名前付きの導出表の場合

次のどれかの条件を満たす。

集合演算の演算項のどれかに，次に示すどれかを直接含む。

内部導出表の問合せ

導出表を指定した問合せ

集合演算の演算項のどれかと，名前付きの導出表に対する問合せが，(1)〜(7)に示したどれかの条件を満たす。

UNION ALL以外を含む集合演算か，UNION ALLだけを含む集合演算かどうかによって(9)又は(10)の条件を満たす。

（例）

「SELECT (SELECT C1 FROM T2),C2 FROM T1 UNION SELECT C1,C2 FROM T3」によって導出されている名前付きの導出表V1（ビュー表），Q1（導出問合せ名）をFROM句に指定する場合，V1，Q1に対する問合せでは内部導出表を作成します。

例1：
SELECT * FROM V1

例2：
WITH Q1(QC1,QC2) AS (
  SELECT (SELECT C1 FROM T2),C2 FROM T1 UNION SELECT C1,C2 FROM T3)
  SELECT * FROM Q1

(9)　UNION ALL以外を含む集合演算によって導出する名前付きの導出表の場合

次のどれかを満たす。

名前付きの導出表をFROM句に指定した問合せ指定が，次のどれかを直接含む。

GROUP BY句，HAVING句，又は集合関数

SELECT DISTINCT

表の結合（コンマの結合を指定している場合を含む）

WHERE句

副問合せ

選択式に列指定以外の値式

名前付きの導出表の全列を，選択式に１回ずつ指定していない

NEXT VALUE式

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

選択項目にない列をソート項目として指定

「集合演算によって導出する名前付きの導出表の場合」の条件を満たす。

（例）

「SELECT C1,C2 FROM T1 UNION SELECT C1,C2 FROM T2」によって導出されている名前付きの導出表V1（ビュー表），Q1（問合せ名）をFROM句に指定する場合，次に示す記述をすると，V1，Q1に対して内部導出表を作成します。

例1：
SELECT C1,C2 FROM V1 GROUP BY C1,C2

例2：
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 UNION SELECT C1,C2 FROM T2)
  SELECT QC1,QC2 FROM Q1,T3 WHERE QC1=T3.C1

例3：
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1, VC1, VC2 FROM V1

(10)　UNION ALLだけの集合演算によって導出する名前付きの導出表の場合

次のどれかを満たす。

名前付きの導出をFROM句に指定した問合せ指定が，次に示すどれかを直接含む。

GROUP BY句，HAVING句，集合関数

ウィンドウ関数

WHERE句，副問合せ（ただし(1)の問合せが，副問合せ，集合演算の演算項，INSERT文の問合せ式本体のどれかに含まれる場合だけ）

関数呼出し

システム定義スカラ関数

コンポネント指定

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

選択項目にない列をソート項目として指定

集合演算によって導出した名前付きの導出表を，FROM句に指定した副問合せ

導出表を指定した副問合せ

GROUP BY句に列指定以外の値式を指定した副問合せ

次のどれかを指定した副問合せ

・関数呼出し

・システム定義スカラ関数

・コンポネント指定

選択式に指定したSQL変数，SQLパラメタ，関数呼出しのうち，データ型が次に示すどれかとなるもの

BLOB型

32001バイト以上のBINARY型

抽象データ型

BOOLEAN型

名前付きの導出表を表の結合に指定した問合せ指定に，次のどれかを指定している。

名前付きの導出表を指定した表参照に交差結合を指定している

名前付きの導出表を指定した表参照に右外結合，左外結合の両方を指定している

名前付きの導出表を，左外結合の一番左側の外表以外の表参照に指定している

名前付きの導出表を，右外結合の一番右側の外表以外の表参照に指定している

名前付きの導出表を指定したFROM句に，コンマの結合を指定している（すなわち，その名前付き導出表を指定した結合表以外に，別の表参照を指定している）

副問合せ又は導出表を指定している

問合せ指定が，副問合せ又は集合演算の演算項に含まれる

名前付きの導出表を導出する集合演算項に，次のどれかを含む

・表の結合

・GROUP BY句，HAVING句，又は集合関数

・SELECT DISTINCT

・選択式に列指定以外の値式

・内部導出表を生成する問合せ

・導出表を指定した問合せ

名前付きの導出表のほかに，集合演算を指定して導出した名前付きの導出表を指定している

名前付きの導出表を指定した結合表の表参照に，次のどれかを指定している

・表の結合を指定して導出した名前付きの導出表

・GROUP BY句，HAVING句，又は集合関数を指定して導出した名前付きの導出表

・SELECT DISTINCTを指定して導出した名前付きの導出表

・選択式に列指定以外の値式を指定して導出した名前付きの導出表

・内部導出表を生成する問合せを指定して導出した名前付きの導出表

・導出表を指定して導出した名前付きの導出表

・副問合せを指定して導出した名前付きの導出表

次に示す式によって得られる表の総数が，65を超える

表の総数＝（名前付き導出表を導出する表の延べ数）

　　　　＋（名前付き導出表を導出する集合演算の数＋1）

　　　　×（外結合の右側に指定する表の延べ数）

　　　　＋（名前付き導出表を指定した問合せ以外にも問合せを指定している場合，その問合せに指定した表の延べ数）

「集合演算によって導出する名前付きの導出表の場合」の条件を満たす。

（例）

「SELECT C1,C2 FROM T1 UNION ALL SELECT C1,C2 FROM T2」によって導出されている名前付きの導出表V1（ビュー表），Q1（問合せ名）をFROM句に指定する場合，次に示す記述をすると，V1，Q1に対して内部導出表を作成します。

例1：
SELECT C1,C2 FROM V1 GROUP BY C1,C2

例2：
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 UNION ALL SELECT C1,C2 FROM T2)
  SELECT QC1,QC2 FROM Q1,T3 WHERE QC1=T3.C1

例3：
SELECT * FROM T1 WHERE EXISTS(SELECT * FROM V1 WHERE V1.C1=T1.C1)

例4：
INSERT INTO T3 SELECT * FROM V1 WHERE C1>'C001'

2.22　WRITE指定

2.22.1　WRITE指定の形式と規則

(1)　機能

BLOBデータをシングルサーバ，又はフロントエンドサーバのユニットのファイルに出力し，出力したユニットのIPアドレスとファイル名を返却します。

(2)　形式

　WRITE（出力BLOB値，ファイル接頭辞，ファイル出力オプション）

(3)　オペランド

出力BLOB値

出力BLOB値には，次の項目を指定できます。なお，出力BLOB値はBLOB型にしてください。

列指定

コンポネント指定

関数呼出し

結果のデータ型がBLOBとなるスカラ関数SUBSTR

出力BLOB値についての規則を次に示します。

出力BLOB値に指定した関数呼出しの引数，又はスカラ関数SUBSTRの第2引数，第3引数には，埋込み変数及び？パラメタを指定できます。

出力BLOB値にBLOB列を指定した場合，そのBLOB列を選択式に単独で指定，又はほかのWRITE指定の出力BLOB値に指定できません。

指定できない例を次に示します。

SELECT WRITE(C1,…),C1 FROM …
SELECT WRITE(C1,…),WRITE(C1,…) … FROM …

FOR READ ONLY句を指定した場合，出力BLOB値には列指定だけ指定できます。

出力BLOB値に指定した関数呼出し，又はスカラ関数SUBSTRの引数中には，副問合せを指定できません。

ファイル接頭辞

ファイル接頭辞には，HiRDBが組み立てるファイル名の先頭部分を指定します。ファイル接頭辞はVARCHAR型で，かつ222バイト以内で指定してください。

ファイル接頭辞には，次の項目を指定できます。

定数（文字列）

埋込み変数又は？パラメタ

ファイル接頭辞についての規則を次に示します。

ファイル接頭辞は，接続しているシングルサーバ，又はフロントエンドサーバのユニットで有効なディレクトリを含む絶対パス名で指定してください。また，ファイルの利用者は，そのディレクトリに対して，すべての操作ができる権限（アクセス権の種類：フルコントロール）をHiRDB管理者から与えられていなければなりません。UNIX版の場合は，読み取り，書き込み，及びディレクトリ内のサーチ権限をHiRDB管理者から与えられていなければなりません。

ファイル接頭辞に指定するファイルセパレータは，HiRDBサーバがUNIXの場合は/を，Windowsの場合は¥を指定してください。また，ファイル名に指定できる文字は，HiRDBサーバのプラットフォームの規則に従います。ただし，pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，utf-8_ivs，又はchinese-gb18030を指定した場合は，ASCIIコードの範囲で指定してください。

ファイル接頭辞に埋込み変数，又は？パラメタだけを指定する場合，その埋込み変数，又は？パラメタは単純構造にしてください。

ファイル接頭辞の文字集合は既定文字集合にしてください。

ファイル出力オプション

ファイル出力オプションには，ファイル出力のモードを指定します。ファイル出力オプションは数データ型で指定してください（DESCRIBE INPUT文実行時にはINTEGER型を返却します）。

ファイル出力オプションには，次の項目を指定できます。

数定数

埋込み変数，又は？パラメタ

また，指定できる値を次に示します。

機能

値

再作成（ファイルがある場合は上書きします）

0

追加書き（ファイルがある場合は終端に追加します）

1

上書き禁止（ファイルがある場合はエラーとします）

2

非同期出力（OSに対して非同期出力を要求します）

4

注

非同期出力は，再作成，追加書き，及び上書き禁止と組み合わせて指定できます。組み合わせる場合は，ほかの指定値と論理和をとった値を指定してください。また，非同期出力を指定しない場合は，OSに対して同期出力（即書き）を要求します。

ファイル出力オプションに埋込み変数，又は？パラメタだけを指定する場合，その埋込み変数，？パラメタは単純構造にしてください。

(4)　WRITE指定の結果についての規則

WRITE指定の結果は，非ナル値制約なし（ナル値を許す）のVARCHAR型，定義長は255バイト，文字集合は既定文字集合となります。

WRITE指定の結果は，次のような形式になります。

IPアドレス：ファイル接頭辞−列番号−行カウンタ
　　　　　　←−−−−　ファイル名　−−−−→

注　IPアドレスとファイル接頭辞の間には，コロン（：）が付きます。また，ファイル接頭辞，列番号，行カウンタの間には，それぞれハイフン（−）が付きます。

［説明］

IPアドレス：

クライアントの接続先のシングルサーバ，又はフロントエンドサーバのユニットのIPアドレスを返却します。IPアドレスは，XXX.XXX.XXX.XXXの形式で，7〜15バイトの長さになります（XXXは0〜255の数値文字）。

ファイル接頭辞：

WRITE指定の第2引数に指定したファイル接頭辞を返却します。

列番号：

導出表の指定位置を示す番号を返却します。列番号は，1から始まり，先頭を0パディングした5けたの数値文字列となります。

行カウンタ：

検索した行数に対応した，昇順の番号を返却します。行カウンタは，1から始まり，先頭を0パディングした10けたの数値文字列となります。2,147,483,646行を超えると，1に戻ります。

WRITE指定を使用できないクライアントから検索をした場合，IPアドレスは設定されないで，コロンから始まる文字列を返却します。

出力BLOB値，ファイル接頭辞，及びファイル出力オプションのどれかがナル値の場合，結果もナル値になります。また，埋込み変数へのナル値の既定値設定機能を使用している場合は，IPアドレスだけを返却します。

通常の文字データの検索と同様に，WRITE指定の結果を受け取る埋込み変数が結果の長さよりも短い場合は，あふれた分を切り捨てて，実際の長さを標識変数に設定します。ただし，切り捨てる処理では，埋込み変数の長さはIPアドレスの最大長分を除いた（埋込み変数長−15）バイトとして処理するため，IPアドレスを付けた長さでは，埋込み変数に格納できる場合でも切り捨てが発生することがあります。

WRITE指定の結果を受け取る埋込み変数が15バイト未満の場合，エラーとなります。

(5)　出力するBLOBデータのファイルについての規則

出力BLOB値に指定したBLOBデータを，シングルサーバ，又はフロントエンドサーバのユニットのファイルに出力します。

WRITE指定の結果がナル値の場合，ファイルを作成しません。

WRITE指定のBLOBデータの実長が0バイトの場合は，0バイトの大きさのファイルを作成します。

出力したファイルは，BLOBデータだけを含む形式となります。実長の長さ情報は含みません。

UNIX版の場合，作成したファイルの所有者，及びモードは次のようになります。

所有者　：HiRDB管理者

グループ：HiRDB管理者と同じグループ

モード　：rw-rw-rw-

検索結果の列数よりその検索結果を受け取る埋込み変数の指定数が少なく，かつWRITE指定の結果を受け取る埋込み変数がない場合は，ファイルを作成しません。

(6)　共通規則

WRITE指定は，最も外側の問合せ指定の選択式に単独で指定できます。

ORDER BY指定時のソートのキーになる項目には，WRITE指定は指定できません。

WITH句中の導出問合せ式では，選択式にWRITE指定は指定できません。

集合演算をする場合，対象となる導出表の列にWRITE指定は指定できません。

副問合せ（FROM句の導出表も含む）中の選択式には，WRITE指定は指定できません。

ビュー定義の導出問合せ式の選択式には，WRITE指定は指定できません。

INSERT文の問合せ指定の選択式には，WRITE指定は指定できません。

ルーチン中のSQL手続き文の問合せ指定では，WRITE指定は指定できません。

(7)　留意事項

作成したファイルの削除は，ユーザが行ってください。検索結果としてUAPにファイル名を返却した後，HiRDBは作成したファイルの操作（読み書き）はしませんが，次の点を留意する必要があります。

FETCH直後に削除する場合，同じカーソル検索の直前のFETCH結果とBLOB値が同じときは，同じファイル名を返却してファイルを再作成しないことがあります。この場合，直前のファイル名を記憶しておいて，ファイル名が変わったときに削除するような制御が必要となります。

カーソルクローズ後に削除する場合，無条件に削除できます。

トランザクション解決後は，無条件に削除できます。

障害，又はロールバックが発生しても，HiRDBは作成したファイルを削除しません。

通常，SQLエラーが発生した場合，該当するSQLで作成したファイルは削除されます。しかし，HiRDBサーバ内のファイル出力処理が完了した後にエラーが発生した場合は，ファイルを削除しないことがあります。例えば，HiRDBサーバからHiRDBクライアントへの結果返却の通信エラーなどがあります。

配列を使用したFETCH機能を使用している場合は，1回のFETCHで配列用要素数分のファイルが作成されるので，ディスク容量に留意してください。

ブロック転送機能を使用している場合は，最初のFETCHでブロック転送行数分のファイルを作成し，以降ブロック転送行数分のFETCH終了後の次のFETCHのたびにブロック転送行数分のファイル作成を繰り返すので，ディスク容量に留意してください。

ファイルを削除しないでいると，ディスク容量などOSの資源を圧迫することになるので注意してください。

ほかのトランザクションやカーソル検索とファイル名が重複すると，ファイルを互いに破壊する可能性があるので注意してください。例えば，トランザクションごと，カーソルごとにファイル接頭辞のディレクトリ名やファイル名を変えて，名前が重複しないようにすることをお勧めします。

WRITE指定の結果の文字列で切り捨てが発生した場合，完全なファイル名を取得できませんが，ファイルは作成するため，ディスク容量を圧迫しないように注意してください。

ファイル出力オプションに非同期出力を指定すると，OSに対して同期出力（即書き）を指定しないでBLOBデータファイルへ出力します。そのため，HiRDB内のファイル出力処理が終了しても，出力デバイスの高負荷などによってOSによるファイル出力処理が完結しないことがあります。その結果，クライアント側にファイル名が返却されても，タイミングによってはファイルが作成されていない場合や，作成が途中の状態になる場合があります。

ファイル出力オプションに非同期出力を指定しない場合は，上記のような状態は回避できますが，入出力のオーバヘッドが応答時間に大きく影響することに注意してください。

(8)　使用例

BLOBデータのファイル出力機能を使用した検索例を次に示します。

(a)　BLOB列を検索する場合

表T1から，列C1，C2を検索します。このとき，C1のBLOBデータをファイル出力し，そのファイル名を取得します。

(b)　BLOB属性の抽象データ型を検索する場合

表T2から，CONTAINS()が真となるADT1列を検索します。このとき，列値をEXTRACTS()の引数に渡した結果のBLOB値をファイルに出力し，ファイル名を取得します。なお，この例は全件ヒットした場合を示しています。

2.23　GET_JAVA_STORED_ROUTINE_SOURCE指定

2.23.1　GET_JAVA_STORED_ROUTINE_SOURCE指定の形式と規則

(1)　機能

JARファイルから，Javaクラスのソースファイルを抽出します。

なお，JavaルーチンはHP-UX，AIX，Linux，及びWindowsのHiRDBで使用できます。HP-UX，及びAIXの場合は，POSIXライブラリ版のHiRDBをセットアップ（pdsetupコマンドを実行）していないとき，又はPOSIXライブラリ版のHiRDBから非POSIXライブラリ版のHiRDBに再セットアップしたときは，Javaルーチンを使用できません。pdsetupコマンドについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

(2)　形式

　GET_JAVA_STORED_ROUTINE_SOURCE（クラス名，JARファイル名〔，ソースファイル最大長〕）

(3)　オペランド

クラス名

クラス名は，255バイト以下の文字列で指定してください。形式を次に示します。

'〔パッケージ名.〕クラス識別子'

クラス名には，255バイト以下のVARCHAR型の値式を指定できます。

クラス名に，？パラメタ又は埋込み変数だけを指定した場合，その？パラメタ又は埋込み変数は単純構造にしてください。

文字集合は既定文字集合にしてください。

JARファイル名

JARファイル名は255バイト以下の文字列で指定してください。

また，JARファイル名には，255バイト以下のVARCHAR型の値式を指定できます。

JARファイル名は，パス名で指定しないでください。

JARファイル名に？パラメタ又は埋込み変数だけを指定した場合，その？パラメタ又は埋込み変数は単純構造にしてください。

文字集合は既定文字集合にしてください。

ソースファイル最大長

抽出するソースファイルの最大長（バイト数）を整数定数で指定します。

指定できる範囲は，1〜2,147,483,647です。ナル値は指定できません。また，省略した場合は2,147,483,647が仮定されます。

(4)　GET_JAVA_STORED_ROUTINE_SOURCE指定の結果についての規則

GET_JAVA_STORED_ROUTINE_SOURCE指定の結果は，非ナル値制約なし（ナル値を許します）のBLOB型，定義長はソースファイル最大長で指定した長さとなります。

GET_JAVA_STORED_ROUTINE_SOURCE指定の結果は，JARファイルから取り出したファイルの内容（ソースファイル最大長で指定した値を超える内容は切り捨て）となります。

次のどれかの条件を満たす場合，GET_JAVA_STORED_ROUTINE_SOURCE指定の結果はナル値になります。

引数のうち，どれかがナル値の場合

指定したJARファイルがインストールされていない場合

JARファイル中に指定したクラスに対応するソースファイルがない場合

(5)　共通規則

GET_JAVA_STORED_ROUTINE_SOURCE指定は，次の箇所で指定できます。

最も外側の問合せ指定の選択式に単独で指定

最も外側の問合せ指定の選択式にスカラ関数LENGTHの引数に指定

ORDER BY句を指定した場合，ソートのキーになる項目にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

WITH句中の導出問合せ式では，選択式にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

集合演算をする場合，対象となる導出表の列にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

副問合せ（FROM句の導出表も含む）中の選択式にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

ビュー定義の導出問合せ式の選択式にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

INSERT文の問合せ指定の選択式にGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

GET_JAVA_STORED_ROUTINE_SOURCE指定は，クラス名からパッケージ名を除いたクラス識別子だけを参照します。したがって，JARファイル中に同じクラス識別子のソースファイルが複数ある場合，GET_JAVA_STORED_ROUTINE_SOURCE指定の結果は複数のソースファイルが連結された形式になります。

GET_JAVA_STORED_ROUTINE_SOURCE指定は，指定したクラス識別子の末尾に'.java'を付けた文字列をJavaクラスのソースファイルとみなします。

GET_JAVA_STORED_ROUTINE_SOURCE指定でソースファイルを取り出すためには，JARファイル中にソースファイルがなければなりません。JARファイルの作成方法については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(6)　留意事項

GET_JAVA_STORED_ROUTINE_SOURCE指定は，HiRDBに組み込まれたJARファイルを対象にします。

GET_JAVA_STORED_ROUTINE_SOURCE指定を含んだSQL文を実行するためには，Java環境がインストールされていなければなりません。

クラス名，JARファイル名に余分な空白文字を含めないでください。

(7)　使用例

スキーマ（USER1）に登録されているJavaルーチン（JAVAROUTINE）のソースファイルの内容を抽出します。

  SELECT GET_JAVA_STORED_ROUTINE_SOURCE(CLASS_NAME,JAR_NAME)
    FROM MASTER.SQL_ROUTINES
      WHERE ROUTINE_SCHEMA='USER1' AND ROUTINE_NAME='JAVAROUTINE'

2.24　SQL最適化指定

機能

SQL文の検索効率を向上させるための最適化を，SQL文に指定できます。

SQL最適化指定は，次の項目に対して指定できます。

使用インデクス

結合方式

副問合せ実行方式

共通規則

SQL最適化指定を指定しても，指定が有効にならない場合があります。SQL最適化指定が有効かどうかについては，アクセスパス表示ユティリティで確認できます。アクセスパス表示ユティリティについては，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

SQL最適化指定の前後を，「/*>>」と「<<*/」で囲むことができます。囲む場合は，SQL最適化指定ごとに囲んでください。「/*>>」と「<<*/」で囲んだ場合，注釈にはなりません。「/*>>」と「<<*/」で囲んで指定すると，他DBMSとの共通APなどでの互換性確保に有効となります。

SQL最適化指定は，SQL最適化オプション及びSQL拡張最適化オプションよりも優先されます。SQL最適化オプション及びSQL拡張最適化オプションについては，「ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）」，「ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）」，「ALTER TRIGGER（トリガのSQLオブジェクトの再作成）」，「CREATE 〔PUBLIC〕PROCEDURE（手続き定義，パブリック手続き定義）」，又は「CREATE TRIGGER（トリガ定義）」を参照してください。

留意事項

結合方式のSQL最適化指定でBY NESTを指定した場合，その結合の内表に対しての使用インデクスのSQL最適化指定に，ネストループジョインに使用できないインデクス又はインデクス利用の抑止を指定したときは，使用インデクスのSQL最適化指定が無効となります。

「/*>>」と「<<*/」で囲んだSQL最適化指定を，更に「/*>>」と「<<*/」で囲むことはできません。

2.24.1　使用インデクスのSQL最適化指定

(1)　機能

使用インデクスのSQL最適化指定では，表に対する検索で使用するインデクスの指定，又はインデクス利用の抑止（テーブルスキャン）を指定できます。

(2)　形式

　使用インデクスのSQL最適化指定：：＝
　　　　　｛WITH INDEX （インデクス指定〔，インデクス指定〕…）｜WITHOUT INDEX｝

　インデクス指定：：＝｛〔認可識別子.〕インデクス識別子｜PRIMARY KEY
　　　　　　　　　　　　｜CLUSTER KEY｜PRIMARY CLUSTER KEY｝

(3)　オペランド

WITH INDEX （インデクス指定〔，インデクス指定〕…）

使用するインデクスを指定します。複数指定した場合は，複数インデクス利用となります。

WITHOUT INDEX

インデクス利用を抑止します（テーブルスキャン）。

｛〔認可識別子.〕インデクス識別子｜PRIMARY KEY｜CLUSTER KEY｜PRIMARY CLUSTER KEY｝

認可識別子

インデクスを持つユーザの認可識別子を指定します。省略した場合については，「名前の修飾」を参照してください。

インデクス識別子

使用するインデクスの名称を指定します。

PRIMARY KEY

表定義時に主キー（又は主キーで，かつクラスタキー）を指定して，定義したインデクスを使用する場合に指定します。主キー及びクラスタキーについては，「CREATE TABLE（表定義）」を参照してください。

CLUSTER KEY

表定義時にクラスタキー（又は主キーで，かつクラスタキー）を指定して，定義したインデクスを使用する場合に指定します。

PRIMARY CLUSTER KEY

表定義時に主キーで，かつクラスタキーを指定して，定義したインデクスを使用する場合に指定します。

(4)　規則

内部導出表となる名前付きの導出表に対しては指定できません。内部導出表については，「内部導出表」を参照してください。

2表以上の結合，又は集合演算で導出された名前付きの導出表に対しては指定できません。

使用インデクスのSQL最適化指定を指定して導出された名前付きの導出表に対して，更に使用インデクスのSQL最適化指定を指定した場合，後の指定が有効となり，導出問合せ式の指定は無効となります。

(5)　留意事項

インデクスを利用した検索については，マニュアル「HiRDB Version 9 UAP開発ガイド」の検索方式を参照してください。なお，使用するインデクスは，アクセスパス表示ユティリティで確認できます。

2.24.2　結合方式のSQL最適化指定

(1)　機能

結合方式のSQL最適化指定では，結合表に対して結合方式を指定できます。

(2)　形式

　結合方式のSQL最適化指定：：＝BY｛NEST｜HASH｜MERGE｝

(3)　オペランド

｛NEST｜HASH｜MERGE｝

NEST

結合方式をネストループジョインにする場合に指定します。

内表が実表，又は実表を基にした名前付きの導出表の場合はネストループジョインになります。

HASH

結合方式をハッシュジョインにする場合に指定します。

MERGE

結合方式をマージジョインにする場合に指定します。

(4)　規則

HASHを指定する場合，SQL拡張最適化オプションに「ハッシュジョイン，副問合せのハッシュ実行」を指定するときと同様の準備をする必要があります。ハッシュジョイン，副問合せのハッシュ実行を適用する場合の準備については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　留意事項

結合方式については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。なお，結合方式は，アクセスパス表示ユティリティで確認できます。

2.24.3　副問合せ実行方式のSQL最適化指定

(1)　機能

副問合せ実行方式のSQL最適化指定では，述語中の副問合せに対して副問合せ実行方式を指定できます。

(2)　形式

　副問合せ実行方式のSQL最適化指定：：＝｛HASH｜NO HASH｝

(3)　オペランド

｛HASH｜NO HASH｝

HASH

副問合せの実行方式を，ハッシュ実行にする場合に指定します。

NO HASH

副問合せの実行方式を，ハッシュ実行以外にする場合に指定します。

(4)　規則

副問合せ実行方式のSQL最適化指定は，述語中の副問合せに指定してください。

HASHを指定する場合，SQL拡張最適化オプションに「ハッシュジョイン，副問合せのハッシュ実行」を指定するときと同様の準備をする必要があります。ハッシュジョイン，副問合せのハッシュ実行を適用する場合の準備については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　留意事項

副問合せの実行方式については，マニュアル「HiRDB Version 9 UAP開発ガイド」の外への参照のない副問合せの実行方式，又は外への参照のある副問合せの実行方式を参照してください。なお，副問合せの実行方式は，アクセスパス表示ユティリティで確認できます。

2.24.4　SQL最適化指定の例

SQL最適化指定の使用例を次に示します。

SELECT文中に，使用インデクスのSQL最適化指定を指定します。このとき，在庫表（ZAIKO）の検索に，インデクス（IDX1）を使用します。

SELECT SNAME FROM ZAIKO WITH INDEX (IDX1)
  WHERE TANKA <= 500

SELECT文中に，使用インデクスのSQL最適化指定を指定します。このとき，在庫表（ZAIKO）の検索に，複数のインデクス（IDX1，IDX2）を使用します。

SELECT SNAME FROM ZAIKO WITH INDEX (IDX1,IDX2)
  WHERE TANKA <= 500 OR ZSURYO > 100

SELECT文中に，使用インデクスのSQL最適化指定を指定します。このとき，在庫表（ZAIKO）定義時に，PRIMARY KEYを指定して定義されたインデクスを使用します。

SELECT SNAME FROM ZAIKO WITH INDEX (PRIMARY KEY)
  WHERE TANKA <= 500

SELECT文中に，使用インデクスのSQL最適化指定を指定します。このとき，在庫表（ZAIKO）の検索に，インデクス利用を抑止（テーブルスキャン）します。

SELECT SNAME FROM ZAIKO WITHOUT INDEX
  WHERE TANKA <= 500

SELECT文中に，結合方式のSQL最適化指定を指定します。このとき，内結合の結合方式を，ネストループジョインにします。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO INNER JOIN BY NEST JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

SELECT文中に，結合方式のSQL最適化指定を指定します。このとき，外結合の結合方式を，ハッシュジョインにします。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO LEFT OUTER JOIN BY HASH JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

SELECT文中に，結合方式のSQL最適化指定を指定します。このとき，内結合（INNER省略）の結合方式を，マージジョインにします。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO JOIN BY MERGE JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

SELECT文中に，副問合せ実行方式のSQL最適化指定を指定します。このとき，副問合せの実行方式を，ハッシュ実行にします。

SELECT SNAME FROM ZAIKO
  WHERE SCODE =ANY
    (HASH SELECT SCODE FROM JUTYU
       WHERE TCODE = '302S')

SELECT文中に，副問合せ実行方式のSQL最適化指定を指定します。このとき，副問合せの実行方式を，ハッシュ実行以外（この例では，作業表実行，又は作業表ATS実行となる）にします。

SELECT SNAME FROM ZAIKO
  WHERE SCODE =ANY
    (NO HASH SELECT SCODE FROM JUTYU
      WHERE TCODE = '302S')

使用インデクスのSQL最適化指定を，「/*>>」と「<<*/」で囲んで指定します。

SELECT SNAME FROM ZAIKO /*>> WITH INDEX (IDX1) <<*/
  WHERE TANKA <= 500

結合方式のSQL最適化指定を，「/*>>」と「<<*/」で囲んで指定します。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO INNER JOIN /*>> BY NEST <<*/ JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

副問合せ実行方式のSQL最適化指定を，「/*>>」と「<<*/」で囲んで指定します。

SELECT SNAME FROM ZAIKO
  WHERE SCODE =ANY
    (/*>> HASH <<*/ SELECT SCODE FROM JUTYU
      WHERE TCODE = '302S')

SELECT文中に，結合方式のSQL最適化指定と使用インデクスのSQL最適化指定を指定します。このとき，在庫表（ZAIKO）の検索にインデクス（IDX3）を使用し，内結合（INNER省略）の結合方式をハッシュジョインにします。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO WITH INDEX (IDX3) JOIN BY HASH JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

SELECT文中に，結合方式のSQL最適化指定と使用インデクスのSQL最適化指定を，それぞれ「/*>>」と「<<*/」で囲んで指定します。このとき，在庫表（ZAIKO）の検索にインデクス(IDX3)を使用し，内結合（INNER省略）の結合方式をハッシュジョインにします。

SELECT ZAIKO.SCODE,ZAIKO.SNAME,JUTYU.TCODE
  FROM ZAIKO /*>> WITH INDEX (IDX3) <<*/ JOIN /*>> BY HASH <<*/ JUTYU
    ON ZAIKO.SCODE = JUTYU.SCODE

2.25　CAST指定

2.25.1　CAST指定の形式と規則

(1)　機能

値式のデータを，指定したデータ型に変換します。

(2)　形式

　CAST指定：：＝CAST（｛値式｜NULL｝ AS データ型）

(3)　規則

値式には，次のデータ型は指定できません。

BLOB

定義長が32,001バイト以上のBINARY

抽象データ型

AS データ型には，次のデータ型は指定できません。

BLOB

ただし，CAST(NULL AS BLOB)は指定できます。

長さが32,001バイト以上のBINARY

ただし，CAST(NULL AS BINARY(n))は指定できます。nは32,001以上のバイト数です。

BOOLEAN

抽象データ型

結果の値は，非ナル値制約なし（ナル値を許します）になります。

値式にNULLを指定するか，又は値式の結果がナル値の場合，結果の値はナル値になります。

実長0バイト，又は実長0文字のデータを値式に指定した場合，文字型への変換はデータ変換の規則に従います。文字型以外への変換では，エラーになります。

値式に埋込み変数又は?パラメタを単独で指定した場合，埋込み変数又は?パラメタのデータ型は，AS データ型に指定したデータ型が仮定されます。

値式に繰返し列を指定する場合，添字を指定してください。ただし，添字にANYは指定できません。

値式に予備列は指定できません。

AS データ型には，値式に指定するデータ型と型変換できるデータ型を指定してください。データ型の変換可否を次の表に示します。

表2‒110　値式の結果のデータ型とAS データ型との，データ型の変換可否（1/2）

値式の結果のデータ型

AS データ型

数データ

文字データ（文字集合）

各国文字データ

混在文字データ

真数

概数

INTEGER，SMALLINT，DECIMAL

FLOAT，SMALLFLT

CHAR，VARCHAR

NCHAR，NVARCHAR

MCHAR，MVARCHAR

DF

EK

U16

数データ

真数

INTEGER，SMALLINT，DECIMAL

○

○

○

○

○

×

○

概数

FLOAT，SMALLFLT

○

○

○

○

○

×

○

文字データ（文字集合）

CHAR，VARCHAR（DF）

○

○

○

○※２

○

×

○

CHAR，VARCHAR（EK）

○

○

○※２

○

×

×

×

CHAR，VARCHAR（U16）

○

○

○

×

○

×

○

各国文字データ

NCHAR，NVARCHAR

×

×

×

×

×

○

×

混在文字データ

MCHAR，MVARCHAR

○

○

○

×

○

×

○

論理データ

BOOLEAN

×

×

○

○

○

×

○

日付データ

DATE

×

×

○

※１

○

※１

○

※１

×

○※１

時刻データ

TIME

×

×

○

※１

○

※１

○

※１

×

○※１

時刻印データ

TIMESTAMP

×

×

○

※１

○

※１

○

※１

×

○※１

日間隔データ

INTERVAL YEAR TO DAY

○

×

×

×

×

×

×

時間隔データ

INTERVAL HOUR TO SECOND

○

×

×

×

×

×

×

バイナリデータ

BINARY

×

×

○

○

○

×

×

（凡例）

○：データ変換ができます。

×：データ変換ができません。

DF：既定文字集合

EK：EBCDIK

U16：UTF16

注※１

AS データ型に指定した長さが，次に示す長さ以上の場合は変換できます。

・値式の結果の文字集合がUTF16以外の場合

DATEの場合：

　　10バイト

TIMEの場合：

　　8バイト

TIMESTAMP(p)の場合：

　　p=0のときは19バイト（ピリオドは付きません）

　　p>0のときは20+↓(p+1)/2↓×2バイト

・値式の結果の文字集合がUTF16の場合

DATEの場合：

　　20バイト

TIMEの場合：

　　16バイト

TIMESTAMP(p)の場合：

　　p=0のときは38バイト（ピリオドは付きません）

　　p>0のときは40+↓(p+1)/2↓×4バイト

ASデータ型に指定した長さが，上記の長さより短い場合は変換できません。

固定長の文字データ型に変換する場合で，ASデータ型に指定した長さが上記の長さより長い場合は，左詰めにして，末尾をその文字集合の空白で埋めます。

注※２

既定文字集合のSJISコードをJIS8コードの1バイトコードとみなして，JIS8コードとEBCDIKコードとの間の変換を行います。

文字コード変換規則については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

表2‒111　値式の結果のデータ型とAS データ型との，データ型の変換可否（2/2）

値式の結果のデータ型

AS データ型

日付データ

時刻データ

時刻印データ

日間隔データ

時間隔データ

バイナリデータ

DATE

TIME

TIMESTAMP

INTERVAL YEAR TO DAY

INTERVAL HOUR TO SECOND

BINARY

数データ

真数

INTEGER，SMALLINT，DECIMAL

×

×

×

○

○

×

概数

FLOAT，SMALLFLT

×

×

×

×

×

×

文字データ

CHAR，VARCHAR（DF）

○

○

○

×

×

○

CHAR，VARCHAR（EK）

○

○

○

×

×

○

CHAR，VARCHAR（U16）

○

○

○

×

×

○

各国文字データ

NCHAR，NVARCHAR

×

×

×

×

×

×

混在文字データ

MCHAR，MVARCHAR

○

○

○

×

×

×

論理データ

BOOLEAN

×

×

×

×

×

×

日付データ

DATE

○

×

○

×

×

×

時刻データ

TIME

×

○

○

×

×

×

時刻印データ

TIMESTAMP

○

○

○

×

×

×

日間隔データ

INTERVAL YEAR TO DAY

×

×

×

○

○

×

時間隔データ

INTERVAL HOUR TO SECOND

×

×

×

○

○

×

バイナリデータ

BINARY

×

×

×

×

×

○

（凡例）

○：データ変換ができます。

×：データ変換ができません。

DF：既定文字集合

EK：EBCDIK

U16：UTF16

ウィンドウ関数は指定できません。

(4)　結果のデータ型ごとの変換規則

(a)　数データ

値式の結果が数データの場合

変換対象のデータ型で，上位有効けたを失ってはなりません。

値式の結果が文字列，及び混在文字列の場合

データの前後の半角空白を取り除いた結果が，数定数の文字列表現でなければなりません。数定数の文字列表現を数値に変換した後，値式の結果が数データの規則に従います。

値式の結果が日間隔データ，及び時間隔データの場合

結果のデータ型（DECIMAL）の精度及び位取りが次の表の場合，日間隔データ，又は時間隔データの10進数形式に変換します。

表2‒112　日間隔データ，及び時間隔データから数値データへの変換規則

値式の結果のデータ型

AS データ型に指定した長さ

INTERVAL YEAR TO DAY

精度8，位取り0

INTERVAL HOUR TO SECOND

精度6，位取り0

(b)　文字データ，及び混在文字データ

文字データ，及び混在文字データに変換する場合の変換規則を次の表に示します。

表2‒113　文字データ，及び混在文字データへの変換規則

値式の結果の長さと，AS データ型の長さの関係

値式の結果のデータ型

文字データ，及び混在文字データ

文字データ，及び混在文字データ以外

値式の結果の長さ＜AS データ型に指定した長さ

AS データ型に指定したデータ型が固定長の場合，左詰めにして末尾を空白（結果のデータ型の文字集合の空白）で埋めます。

値式の結果の長さ＝AS データ型に指定した長さ

正常に変換します。

値式の結果の長さ＞AS データ型に指定した長さ

左詰めにして末尾を切り捨てます。切り捨てる部分のデータに空白（結果のデータ型の文字集合の空白）以外の文字があれば，SQLWARN1領域に'W'を設定します。※

エラーになります。

注※

マルチバイト文字の途中で切り捨てが発生する場合，マルチバイト文字の一部分が結果の値として返されます。

値式の結果が真数（SMALLINT，INTEGER，及びDECIMAL）の場合

データを数定数に変換した結果，最短となる（先頭の0は取り除く）文字列が結果となります。

データが0未満の場合は，先頭に負符号（-）を付加します。

値式の結果が概数（SMALLFLT，及びFLOAT）の場合

データを数定数に変換した結果，最短となる文字列（先頭は0以外です。ただし，データが0の場合は0E0となります）が結果となります。

データが0未満の場合は，先頭に負符号（-）を付加します。

値式の結果が文字列，混在文字列の場合

値式の結果のデータ長が，AS データ型に指定した長さを超える場合，左詰めにして末尾を切り捨てます。切り捨てる部分のデータ中に空白（結果のデータ型の文字集合の空白）以外の文字が含まれていると，SQLWARN1領域に'W'が設定されます。

また，値式の結果が文字集合指定をした文字データの場合，値式のすべての文字をその文字集合の文字の並びとして変換します。

値式の結果が論理データの場合

値式の結果が真の場合は変換結果は'TRUE'，値式の結果が偽の場合は変換結果は'FALSE'，値式の結果が不定の場合は変換結果はナル値となります。

値式の結果が日付データ，時刻データ，及び時刻印データの場合

日付データ，時刻データ，及び時刻印データの規定の文字列表現に変換します。

値式の結果がバイナリデータの場合

値式の結果のデータ長が，結果のデータ型に指定したデータ長を超える場合，SQLWARN1領域に'W'が設定されます。

(c)　各国文字データ

値式の結果が各国文字列の場合

結果のデータ型が固定長で，値式のデータを各国文字列に変換した結果，AS データ型に指定した長さより短い場合は，文字コードに対応した全角空白で埋めます。

値式のデータを各国文字列に変換した結果，結果のデータ型に指定したデータ長を超える場合は，左詰めにして末尾を切り捨てます。切り捨てる部分のデータ中に文字コードに対応した全角空白以外の文字が含まれていると，SQLWARN1領域に'W'が設定されます。

(d)　日付データ，時刻データ，及び時刻印データ

値式の結果が文字列，及び混在文字列の場合

日付データ，時刻データ，及び時刻印データの，規定の文字列表現であれば変換できます。ただし，値式のデータの前後の空白（結果のデータ型の文字集合の空白）を取り除き，その結果の小数秒精度が0，2，4，及び6でない場合はエラーとなります。

値式の結果が日付データ，時刻データ，及び時刻印データの場合

次の表に示す組み合わせで変換できます。

表2‒114　日付データ，時刻データ，及び時刻印データの変換規則

値式の結果のデータ型

AS データ型

変換規則

DATE

DATE

変換しません。

TIMESTAMP(p2)

時刻部分を'00:00:00'として変換します。小数秒部は0で埋めます。

TIME

TIME

変換しません。

TIMESTAMP(p2)

日付部分をCURRENT_DATEに変換します。小数秒部は0で埋めます。

TIMESTAMP(p1)

DATE

日付部分を抽出して変換します。

TIME

時刻部分を抽出して変換します。

TIMESTAMP(p2)

変換しません。

ただし，p1>p2の場合は小数秒部を切り捨て，p1<p2の場合は小数秒部を0で埋めます。

(e)　日間隔データ，及び時間隔データ

値式の結果がDECIMALの場合

精度及び位取りが次の表の場合に，対応する日間隔データ，又は時間隔データに変換できます。

表2‒115　数データから日間隔データ，又は時間隔データへの変換規則

数データの形式

値式の結果のデータ型

精度8，位取り0

INTERVAL YEAR TO DAY

精度6，位取り0

INTERVAL HOUR TO SECOND

値式の結果が日間隔データ，及び時間隔データの場合

次の表に示す組み合わせで変換できます。

表2‒116　日間隔データ，及び時間隔データの変換規則

値式の結果のデータ型

AS データ型

変換規則

INTERVAL YEAR TO DAY

INTERVAL YEAR TO DAY

変換しません。

INTERVAL HOUR TO SECOND

日付部分を時刻部分に変換し，INTERVAL HOUR TO SECONDの値の範囲を超えなければ変換できます。超える場合はエラーとなります。

INTERVAL HOUR TO SECOND

INTERVAL YEAR TO DAY

時刻部分が24時間以上の場合に，日付部分に繰り上げます。24時間未満のデータは切り捨てます。

INTERVAL HOUR TO SECOND

変換しません。

(f)　バイナリデータ

値式の結果が文字列の場合

値式のデータをBINARYに変換した結果，AS データ型に指定した長さを超える場合，SQLWARN1領域に'W'が設定されます。

2.26　拡張文名

2.26.1　拡張文名の形式と規則

(1)　概要

拡張文名はPREPARE文に指定することで，PREPARE文によって前処理されたSQL文を識別します。また，次に示すSQL文に指定すると拡張文名が識別するSQL文に対する操作ができます。

DESCRIBE文

DESCRIBE TYPE文

ALLOCATE CURSOR文

EXECUTE文

DEALLOCATE PREPARE文

(2)　形式

　拡張文名：：＝有効範囲オプション ：埋込み変数
　有効範囲オプション：：＝GLOBAL

(3)　説明

有効範囲オプション

拡張文名の有効範囲を指定します。指定による有効範囲を次の表に示します。

表2‒117　有効範囲オプションの指定方法

指定

有効範囲

GLOBAL

現行SQLセッション内（HiRDB接続から切断まで）で有効になります。

：埋込み変数

SQL文識別子を値に持つ可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

(4)　規則

埋込み変数に設定する値は，SQL文識別子の指定方法に従ってください。SQL文識別子の指定方法は，「名前の指定」を参照してください。

同じ値を持つ有効な拡張文名は，同じ拡張文名として判別されます。

拡張文名の値がSQL文中に直接指定したSQL文識別子と同じ場合でも，それらは異なるSQL文を識別するものとして区別されます。

2.27　拡張カーソル名

2.27.1　拡張カーソル名の形式と規則

(1)　概要

拡張カーソル名はALLOCATE CURSOR文に指定することで，動的SELECT文，又は手続きから返却された結果集合の組に割り当てられたカーソルを識別します。また，次に示すSQL文に指定することで拡張カーソル名が識別するカーソルに対する操作ができます。

DESCRIBE CURSOR文

OPEN文

FETCH文

DELETE文（結果集合カーソルを識別する拡張カーソル名を除く）

UPDATE文（結果集合カーソルを識別する拡張カーソル名を除く）

CLOSE文

また，拡張カーソル名の値を次に示すSQL文に直接指定することで拡張カーソル名が識別するカーソルに対する操作ができます。

準備可能動的DELETE文：位置付け（結果集合カーソルを識別する拡張カーソル名の値を除く）

準備可能動的UPDATE文：位置付け（結果集合カーソルを識別する拡張カーソル名の値を除く）

(2)　形式

　拡張カーソル名：：＝ 有効範囲オプション ：埋込み変数
　有効範囲オプション：：＝GLOBAL

(3)　説明

有効範囲オプション

拡張文名の有効範囲を指定します。指定による有効範囲を次の表に示します。

表2‒118　有効範囲オプションの指定方法

指定

有効範囲

GLOBAL

現行SQLセッション内（HiRDB接続から切断まで）で有効となります。

：埋込み変数

カーソル名を値に持つ可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

(4)　規則

埋込み変数に設定する値は，カーソル名の指定方法に従ってください。カーソル名の指定方法は，「名前の指定」を参照してください。

同じ値を持つ拡張カーソル名は，同じ拡張カーソル名として判別されます。

ALLOCATE CURSOR文に指定する場合に，既に同じ値を持つ有効な拡張カーソル名がほかのカーソルを識別している場合はエラーとなります。

拡張カーソル名の値がSQL文中に直接指定したカーソル名と同じであっても，それらは異なるカーソルを識別するものとして区別します。ただし，準備可能動的UPDATE文：位置付け，及び準備可能動的DELETE文：位置付けに直接指定したカーソル名の場合だけ，その値を持つ拡張カーソル名と同じカーソルを識別します。

2.28　NEXT VALUE式

2.28.1　NEXT VALUE式の形式と規則

(1)　概要

順序数生成子が生成する値を返却します。

(2)　使用権限

FOR PUBLIC USAGEを指定して定義した順序数生成子には，すべてのユーザがアクセスできます。それ以外の順序数生成子には，所有者だけがアクセスできます。

(3)　形式

　NEXT VALUE式：：＝ NEXT VALUE FOR 〔認可識別子.〕順序数生成子識別子

(4)　説明

認可識別子

順序数生成子の所有者の認可識別子を指定します。

順序数生成子識別子

使用する順序数生成子の識別子を指定します。

(5)　構文規則

NEXT VALUE式の結果のデータ型は，指定した順序数生成子が生成する値のデータ型になります。

次の箇所には，副問合せを指定しないでNEXT VALUE式を指定できます。

INSERT文の問合せ指定の選択式

INSERT文の挿入値

UPDATE文の更新値

ただし，次に示す箇所には指定できません。

CASE式

スカラ関数VALUE中

GROUP BY句，HAVING句，又は集合関数を指定した問合せ指定

WINDOW関数を指定した問合せ指定

DISTINCTを含む問合せ指定

UNION ALL以外の集合演算の演算項となる問合せ指定

NEXT VALUE式の結果は非ナル値制約なし（ナル値を許す）となります。

(6)　共通規則

順序数生成子を定義した後で，最初にNEXT VALUE式を実行した場合は開始値が返却されます。

挿入値に指定された場合，INSERT文で挿入される1行ごとに，指定された順序数生成子が生成した値が挿入値となります。

更新値に指定された場合，UPDATE文で更新される1行ごとに，指定された順序数生成子が生成した値が更新値となります。

同一の行に対して同じ順序数生成子に対するNEXT VALUE式を複数指定した場合，それらのNEXT VALUE式はすべて同じ値を返却します。

(7)　留意事項

ロールバックが発生してトランザクションが無効となった場合でも，順序数生成子の値は元に戻りません。

NEXT VALUE式を指定したSQLの実行結果がエラーとなった場合でも，順序数生成子の値が更新されていることがあります。

(8)　使用例

商品ID（SID），商品名（SNAME），単価（TANKA）を持つ在庫表（ZAIKO）を定義します。

CREATE TABLE ZAIKO(
SID INTEGER,
SNAME NCHAR(8),
TANKA INTEGER)

商品IDを1000から9999まで発番する順序数生成子SEQ1を定義します。

CREATE SEQUENCE SEQ1
START WITH 1000
INCREMENT BY 1
MAXVALUE 9999

NO CYCLE

在庫表（ZAIKO）に新たな商品を登録します。

INSERT INTO ZAIKO VALUES(NEXT VALUE FOR SEQ1, N'ズボン', 1200)
INSERT INTO ZAIKO VALUES(NEXT VALUE FOR SEQ1, N'シャツ', 1000)
INSERT INTO ZAIKO VALUES(NEXT VALUE FOR SEQ1, N'セーター', 1500)

実行結果

在庫表（ZAIKO）の商品ID（SID）が"1001"の商品IDを新しい商品IDに更新します。

UPDATE ZAIKO SET SID = NEXT VALUE FOR SEQ1 WHERE SID = 1001

実行結果

3　定義系SQL

この章では，定義系SQLの構文形式，及び文法について説明します。

3.1　全般規定

3.1.1　定義系SQLの全般規定

(1)　定義系SQLの種類と機能

定義系SQLは，スキーマを定義・変更したり，表，インデクス，及び権限を定義・削除したりするときに使用するSQLです。

定義系SQLの種類と機能を次の表に示します。

表3‒1　定義系SQLの種類と機能

種　類

機　能

ALTER INDEX（インデクス定義変更）

インデクスの名称を変更します。

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

手続きのSQLオブジェクトを再作成します。

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

関数，手続き，及びトリガのSQLオブジェクトを再作成します。

ALTER TABLE（表定義変更）

表定義を変更します。

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

トリガのSQLオブジェクトを再作成します。

COMMENT（注釈付加）

表及び列に注釈を付けます。

CREATE AUDIT（監査対象イベントの定義）

監査証跡として記録する監査イベント，及びその対象を定義します。

CREATE CONNECTION SECURITY（CONNECT関連セキュリティ機能の定義）

CONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

CREATE FUNCTION（関数定義）

関数を定義します。

CREATE PUBLIC FUNCTION（パブリック関数定義）

パブリック関数を定義します。

CREATE INDEX　形式1（インデクス定義）

実表の列にインデクス（昇順，降順）を定義します。

CREATE INDEX　形式2（インデクス定義）

CREATE INDEX　形式3（部分構造インデクス定義）

CREATE PROCEDURE（手続き定義）

手続きを定義します。

CREATE PUBLIC PROCEDURE（パブリック手続き定義）

パブリック手続きを定義します。

CREATE SCHEMA（スキーマ定義）

スキーマを定義します。

CREATE SEQUENCE（順序数生成子定義）

順序数生成子を定義します。

CREATE TABLE（表定義）

実表を定義します。

CREATE TRIGGER（トリガ定義）

トリガを定義します。

CREATE TYPE（型定義）

抽象データ型を定義します。

CREATE VIEW（ビュー定義）

ビュー表を定義します。

CREATE PUBLIC VIEW（パブリックビュー定義）

パブリックビューを定義します。

DROP AUDIT（監査対象イベントの削除）

CREATE AUDITで定義した監査対象と内容が一致する定義を，監査対象から削除します。

DROP CONNECTION SECURITY（CONNECT関連セキュリティ機能の削除）

CONNECT関連セキュリティ機能に関するセキュリティ項目を削除します。

DROP DATA TYPE（ユーザ定義型削除）

ユーザ定義型を削除します。

DROP FUNCTION（関数削除）

関数を削除します。

DROP PUBLIC FUNCTION（パブリック関数削除）

パブリック関数を削除します

DROP INDEX（インデクス削除）

インデクスを削除します。

DROP PROCEDURE（手続き削除）

手続きを削除します。

DROP PUBLIC PROCEDURE（パブリック手続き削除）

パブリック手続きを削除します。

DROP SCHEMA（スキーマ削除）

スキーマを削除します。

DROP SEQUENCE（順序数生成子削除）

順序数生成子を削除します。

DROP TABLE（表削除）

実表を削除します。さらに，その実表に対するインデクス，注釈，アクセス権限及びビュー表も削除します。

DROP TRIGGER（トリガ削除）

トリガを削除します。

DROP VIEW（ビュー表の削除）

ビュー表を削除します。

DROP PUBLIC VIEW（パブリックビューの削除）

パブリックビューを削除します。

GRANT CONNECT（CONNECT権限定義）

ユーザにCONNECT権限を与えます。

GRANT DBA（DBA権限定義）

ユーザにDBA権限を与えます。

GRANT RDAREA（RDエリア利用権限定義）

ユーザにRDエリアの利用権限を与えます。

GRANT SCHEMA（スキーマ定義権限定義）

ユーザにスキーマ定義権限を与えます。

GRANT アクセス権限（アクセス権限定義）

ユーザにアクセス権限を与えます。

GRANT 形式2（監査人のパスワード変更）

監査人のパスワードを変更します。

REVOKE CONNECT（CONNECT権限削除）

ユーザに与えたCONNECT権限を取り消します。

REVOKE DBA（DBA権限削除）

ユーザに与えたDBA権限を取り消します。

REVOKE RDAREA（RDエリア利用権限削除）

ユーザに与えたRDエリアの利用権限を取り消します。

REVOKE SCHEMA（スキーマ定義権限削除）

ユーザに与えたスキーマ定義権限を取り消します。

REVOKE アクセス権限（アクセス権限削除）

ユーザに与えたアクセス権限を取り消します。

(2)　共通規則

定義系SQLが正常に実行された場合，処理完了と同時にCOMMITされます。

(3)　留意事項

定義系SQLは，OLTP下のX/Openに従ったUAPから指定できません。

3.2　ALTER INDEX（インデクス定義変更）

3.2.1　ALTER INDEXの形式と規則

(1)　機能

CREATE INDEXで定義したインデクスの名称を変更します。

(2)　使用権限

インデクスの所有者

自分が所有するインデクスだけ指定できます。

(3)　形式

　ALTER INDEX 〔認可識別子.〕インデクス識別子 インデクス定義変更動作

　　インデクス定義変更動作：：＝ インデクス名変更定義

　　インデクス名変更定義：：＝RENAME INDEX TO インデクス識別子 〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕インデクス識別子

認可識別子

定義を変更するインデクスの所有者の認可識別子を指定します。

インデクス識別子

定義を変更するインデクスの名称を指定します。

(b)　インデクス名変更定義：：＝RENAME INDEX TO インデクス識別子 〔WITH PROGRAM〕

インデクスの名称を変更する場合に指定します。

インデクス識別子

変更後のインデクスの名称を指定します。

インデクス識別子についての規則を次に示します。

CREATE INDEXで定義したB-treeインデクス，インデクス型を指定したインデクス，及び部分構造インデクスの名称を変更できます。

スキーマ内にあるインデクス，インデクス型を指定したインデクス，及び部分構造インデクスと同じ名称には変更できません。

一時インデクスの名称は指定できません。

WITH PROGRAM

インデクスの名称を変更するときに，そのインデクスを使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，そのインデクスを使用する手続き，及びトリガの有効なSQLオブジェクトがあると，そのインデクスの定義は変更できません。

(5)　留意事項

Java手続き中では定義系SQLが実行できますが，Java手続きを呼び出す手続きが，インデクスを使用するSQLを発行している場合，呼び出されたJava手続き内でそのインデクスに対しALTER INDEXを発行しているとALTER INDEXはエラーになります。

ALTER INDEXは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，無効となった手続き，及びトリガに関するSQL_ROUTINE_RESOURCES表，SQL_TRIGGER_USAGE表，SQL_TRIGGER_COLUMNS表，及びSQL_ROUTINE_PARAMS表の行は削除します。

ALTER INDEX対象のインデクスを使用しないで，そのインデクスを定義している表をアクセスしている手続き，又はトリガが存在する場合，ALTER INDEXを実行すると，該当する手続き，又はトリガのSQLオブジェクト中のインデクス情報は無効になります。この場合，インデクス情報が無効な手続きの呼び出しは実行できますが，実行するたびにリコンパイルされるため性能が劣化します。また，インデクス情報が無効となった手続きを呼び出す手続き，又はトリガは実行できなくなります。そのため，インデクス情報が無効となった手続き，及びトリガに対してALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，SQLオブジェクトを再作成する必要があります。なお，インデクス情報が無効かどうかはディクショナリ表SQL_ROUTINESのINDEX_VALID列を参照して確認できます。

データベース作成ユティリティ（pdload），及びデータベース再編成ユティリティ（pdrorg）を実行して，インデクス情報出力モードでインデクスを作成した場合，インデクスが作成される前にALTER INDEXを使用してインデクスの名称を変更すると，出力済みのインデクス情報ファイルではインデクスの一括作成ができなくなります。なお，誤って先にインデクスの名称を変更した場合は，ALTER INDEXでインデクスの名称を元に戻してからインデクスの一括作成を行い，その後で再度インデクスの名称を変更してください。

プラグインインデクスの遅延一括作成を行う場合，インデクスが作成される前にALTER INDEXを使用してプラグインインデクスの名称を変更すると，出力済みのインデクス情報ファイルではプラグインインデクスの一括作成ができなくなります。なお，誤って先にプラグインインデクスの名称を変更した場合は，プラグインインデクスの名称を元に戻してからプラグインインデクスの一括作成を行い，その後で再度プラグインインデクスの名称を変更してください。

未完状態のインデクス（EMPTY指定でCREATE INDEXした直後のインデクス）の名称をALTER INDEXで変更できます。

(6)　使用例

インデクス（IDX1）の名称を（IDX2）に変更します。

    ALTER INDEX IDX1 RENAME INDEX TO IDX2

3.3　ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

3.3.1　ALTER PROCEDUREの形式と規則

(1)　機能

SQL手続きのSQLオブジェクトを再作成します。また，Java手続きのコンパイルオプションを変更します。

(2)　使用権限

手続きの所有者

自分が所有する手続き（自分が定義したパブリック手続きを含む）のSQLオブジェクトを再作成できます。

AUTHORIZATION句には自分の認可識別子だけ指定できます。

ルーチン識別子には自分が所有する手続きだけ指定できます。

AUTHORIZATION句，及びルーチン識別子を両方省略した場合，エラーとなります。

DBA権限を持つユーザ

自分が所有する手続き（自分が定義したパブリック手続きを含む）と，他ユーザが所有する手続き（他ユーザが定義したパブリック手続きを含む）のSQLオブジェクトを再作成できます。

AUTHORIZATION句に自分，及び他ユーザの認可識別子を指定できます。

ルーチン識別子に自分，及び他ユーザが所有する手続きのルーチン識別子を指定できます。

AUTHORIZATION句，及びルーチン識別子を両方省略することでシステム内の全手続きを再作成できます。

(3)　形式

　ALTER PROCEDURE
　　　〔｛〔認可識別子.〕ルーチン識別子
　　　　　｜〔AUTHORIZATION 認可識別子〕
　　　　　　〔ALL｜INDEX USING〔認可識別子.〕表識別子〕｝〕
　　　〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕

　SQLコンパイルオプション：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　　　　　　　　　　　　　｜OPTIMIZE LEVEL SQL最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL最適化オプション〕…
　　　　　　　　　　　　　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL拡張最適化オプション〕…
　　　　　　　　　　　　　　　　｜SUBSTR LENGTH 文字の最大長 ｝

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

特定の手続きのSQLオブジェクトだけを再作成する場合に指定します。

指定された手続きのインデクス情報が有効か無効か，又はSQLオブジェクトが有効か無効かにかかわらず，必ずSQLオブジェクトを再作成します。

SQLコンパイルオプションの変更のために使用します。

認可識別子

SQLオブジェクトを再作成する手続きの所有者の認可識別子を指定します。

パブリック手続きのSQLオブジェクトを再作成する場合は，認可識別子にPUBLICを指定します。

ルーチン識別子

SQLオブジェクトを再作成する手続き名を指定します。

(b)　〔AUTHORIZATION 認可識別子〕

〔ALL｜INDEX USING〔認可識別子.〕表識別子〕

再作成する手続きを，手続きの所有者の認可識別子と，手続きの状態で指定します。

〔AUTHORIZATION 認可識別子〕

手続きの所有者の認可識別子を指定して，そのユーザが所有するすべての手続き（そのユーザが定義したパブリック手続きを含む）のSQLオブジェクトを再作成します。

このオペランドを省略した場合，システム内のすべての手続きのSQLオブジェクトを再作成します。

ただし，実際にSQLオブジェクトを再作成するかどうかは，ALL句，INDEX USING句の指定との組み合わせによって決まります。

認可識別子

SQLオブジェクトを再作成する手続きの所有者の認可識別子を指定します。

〔ALL｜INDEX USING〔認可識別子.〕表識別子〕

どの状態の手続きの，SQLオブジェクトを再作成するかを指定します。

ALL句，INDEX USING句のどちらも指定しなかった場合，SQLオブジェクトが無効な手続きだけを再作成します。

ALL

指定した手続きのSQLオブジェクトが有効か無効か，また，インデクス情報が有効か無効かにかかわらず，すべて再作成する場合に指定します。

INDEX USING〔認可識別子.〕表識別子

インデクス情報が無効な手続きのSQLオブジェクトだけを再作成します。

インデクスの追加又は削除をした場合に，手続きのSQLオブジェクト中のインデクス情報が無効となるため，インデクスを追加又は削除した実表の表識別子を指定して，その表を使用するSQLオブジェクトでインデクス情報が無効なすべての手続きのSQLオブジェクトを再作成します。

なお，手続きのSQLオブジェクト中のインデクス情報だけが無効な場合でも，その手続きを実行できますが，インデクス情報が有効な場合の方が性能は良くなります。

指定した実表又はビュー表を基表として定義したビュー表を使用している手続きについても，インデクス情報が無効ならばSQLオブジェクトを再作成します。

INDEX USING句を指定すると，インデクス情報だけが無効な手続きのSQLオブジェクトを再作成しますが，SQLオブジェクトが無効な手続きについては再作成しません。SQLオブジェクトが無効な手続きの再作成が必要な場合は，別途，INDEX USING句を省略するか，ALL指定でALTER PROCEDUREを発行してください。

〔認可識別子.〕表識別子

SQLオブジェクトを再作成する手続きが使用する実表又はビュー表の所有者の認可識別子と表識別子を指定します。

認可識別子を省略した場合，実行ユーザの認可識別子が仮定されます。

表識別子にパブリックビューを指定する場合は，認可識別子にPUBLICを指定してください。

(c)　SQLコンパイルオプション

：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　｜OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…
　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…
　　　　｜SUBSTR LENGTH 文字の最大長 ｝

SQLコンパイルオプションには，ISOLATION，OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL，SUBSTR LENGTHをそれぞれ1回しか指定できません。

〔ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕〕

SQLのデータ保証レベルを指定します。

データ保証レベル

データ保証レベルとは，トランザクションのどの時点までデータの内容を保証するかのレベルです。次に示すデータ保証レベルを指定できます。

0

データの内容を保証しない場合に指定します。

0レベルを指定すると，ほかのユーザが更新中のデータでも，更新完了を待たないで参照できます。ただし，参照する表が共用表の場合，ほかのユーザが排他モードでLOCK文を実行しているときには，排他解除待ちとなります。

1

検索処理の終了までデータの内容を保証したい場合に指定します。

1レベルを指定すると，検索処理が終了するまで（HiRDBがページ，又は行を見終わるまで）一度検索したデータをほかのユーザは更新できません。

2

トランザクションの終了まで一度検索したデータの内容を保証したい場合に指定します。

2レベルを指定すると，トランザクションが終了するまで一度検索したデータをほかのユーザは更新できません。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，又はALTER ROUTINEの実行時）に指定した値が仮定されます。

データ保証レベルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕

手続き中で，FOR UPDATE句を指定した（FOR UPDATEが仮定される場合を含む）カーソル又は問合せに対して，SQLコンパイルオプションで指定したデータ保証レベルに関係なく，常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。

このオペランドを省略した場合，EXCLUSIVEを仮定します。ただし，0904互換モードを適用している場合はCOMPATIBLEを仮定します。

バージョン09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略した手続きと同じ動作をさせたい場合は，COMPATIBLEを指定します。

このオペランドと，ISOLATIONデータ保証レベルの関係から決まるFOR UPDATEの排他オプションを次に示します。

ISOLATION データ保証レベル

FOR UPDATE EXCLUSVIE

FOR UPDATE COMPATIBLE

0

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

1

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

2

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

《クライアント環境定義との関係》

ALTER PROCEDUREに対して，PDISLLVL，PDFORUPDATEEXLOCKの指定は無効となります。

《SQLとの関係》

手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定するデータ保証レベル，FOR UPDATE EXCLUSIVE，及びFOR UPDATE COMPATIBLEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。

《システム定義との関係》

ALTER PROCEDUREに対して，pd_isolation_levelオぺランドの指定は無効となります。

〔OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。

SQL最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法がありますが，通常時は識別子で指定する方法をお勧めします。

省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，又はALTER ROUTINE）に採用した値が仮定されます。

識別子で指定する場合：

OPTIMIZE LEVEL "識別子"〔，"識別子"〕…

＜指定例＞

ネストループジョイン優先とグループ分け高速化処理を適用する場合

OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"

すべての最適化を適用しない場合

OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。ただし，同時に"NONE"以外の識別子を指定すると，"NONE"は無効になります。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

OPTIMIZE LEVEL 符号なし整数〔，符号なし整数〕…

＜指定例＞

複数のSQLオブジェクト作成，ANDの複数インデクス利用の抑止，及び複数インデクス利用の強制を適用する場合

符号なし整数をコンマで区切って指定する場合：

OPTIMIZE LEVEL 4,10,16

符号なし整数の和を指定する場合：

OPTIMIZE LEVEL 30

既に14（4+10）を指定していて，新たに16を追加する場合

OPTIMIZE LEVEL 14,16

すべての最適化を適用しない場合

OPTIMIZE LEVEL 0

＜規則＞

バージョン06-00より前のHiRDBから，バージョン06-00以降のHiRDBにバージョンアップする場合，バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は，バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。ただし，同時に0以外の識別子を指定すると，0は無効になります。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

複数の最適化方法を指定する場合，その符号なし整数の和を指定することもできます。ただし，同じ最適化方法の値は二つ以上足さないでください（足した結果が別の最適化方法とみなされることもあるため）。

複数の最適化方法の値を足して指定する場合，どの最適方法を指定しているのか分かりにくくなるため，コンマで区切って指定する方法をお勧めします。また，既に複数の最適化方法の値を足して指定している場合で，新たに別の最適化方法が必要になったときは，追加する値をコンマで区切って後ろに指定できます。

《システム定義との関係》

ALTER PROCEDUREに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

システム定義のpd_floatable_besオペランド，又はpd_non_floatable_besオペランドを指定している場合，「フロータブルサーバ対象拡大（データ取り出しバックエンドサーバ）」及び「フロータブルサーバ対象限定（データ取り出しバックエンドサーバ）」の指定は無効となります。

システム定義のpd_indexlock_modeオペランドにKEYを指定している場合（インデクスキー値排他の場合），「更新SQLの作業表作成抑止」の指定は無効になります。

《クライアント環境定義との関係》

ALTER PROCEDUREに対して，PDSQLOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL拡張最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。

SQL拡張最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法があります。

省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，又はALTER ROUTINE）に採用した値が仮定されます。

識別子で指定する場合：

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL 1,2

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL 0

＜規則＞

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

《システム定義との関係》

ALTER PROCEDUREに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

《クライアント環境定義との関係》

ALTER PROCEDUREに対して，PDADDITIONALOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

＜規則＞

バージョン08-00より前のHiRDBからバージョン08-00以降のHiRDBにバージョンアップする場合は，3を仮定します。文字の最大長を変更する必要がない場合は，バージョン08-00以降のHiRDBにバージョンアップしたときにこのオペランドを指定する必要はありません。

《システム定義との関係》

ALTER PROCEDUREに対して，システム定義のpd_substr_lengthオぺランドの指定は無効となります。pd_substr_lengthオぺランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

ALTER PROCEDUREに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効になります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，又はALTER ROUTINEの実行時）に指定した値が仮定されます。

(5)　共通規則

ALTER PROCEDUREでSQLコンパイルオプションを指定する場合，再作成する手続きの元のCREATE PROCEDUREにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

次の条件では，Java手続きからALTER PROCEDUREを実行できません。

実行中のSQLオブジェクトが再作成になる場合

(6)　留意事項

ALTER PROCEDUREは，OLTP下のX/Openに従ったUAPから指定できません。

複数の手続きのSQLオブジェクトを再作成する場合，手続きごとに自動的にCOMMIT文，又はROLLBACK文が実行されます。

ALTER PROCEDURE実行直後にGET DIAGNOSTICS文を実行すると，ALTER PROCEDUREの診断情報が取得できます。このとき，再作成が正常終了した手続きのSQLコードは0となります。

手続き中のSQL文のデータ保証レベル，SQL最適化オプション，SQL拡張最適化オプション，及び文字の最大長は，ルーチンの定義時，又は再作成時の指定で決まり，手続き呼出し時のシステム定義やクライアント環境定義の影響を受けません。

Java手続き及びJava関数はSQLオブジェクトが作成されないため，SQLオブジェクトの再作成はしません。SQLコンパイルオプションの更新だけできます。

ルーチン識別子には，トリガ動作手続きの識別子は指定できません。トリガのSQLオブジェクトを再作成するには，ALTER ROUTINE又はALTER TRIGGERを使用してください。

他ユーザが定義したパブリック手続きのSQLオブジェクトを再作成した場合も，そのSQLオブジェクトの定義者は変わりません。

(7)　使用例

ユーザ（USER1）の手続き（PROC1）をデータ保証レベル1で再作成します。

  ALTER PROCEDURE
      USER1.PROC1 ISOLATION 1

ユーザ（USER1）の表（T1）を参照するユーザ（USER1）の有効な手続きのSQLオブジェクトの中で，インデクス情報が無効となっている手続きを再作成します。

  ALTER PROCEDURE
      AUTHORIZATION USER1 INDEX USING USER1.T1

すべての手続きの中で，SQLオブジェクトが無効となっている手続きを再作成します。

  ALTER PROCEDURE

3.4　ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

3.4.1　ALTER ROUTINEの形式と規則

(1)　機能

SQL関数，SQL手続き，及びトリガのSQLオブジェクトを再作成します。また，Java関数及びJava手続きのコンパイルオプションを変更します。

(2)　使用権限

関数，手続き，及びトリガの所有者

自分が所有する関数，手続き（自分が定義したパブリック関数，パブリック手続きを含む），及びトリガのSQLオブジェクトを再作成できます。

AUTHORIZATION句には，自分の認可識別子だけ指定できます。

AUTHORIZATION句を省略した場合，エラーとなります。

DBA権限を持つユーザ

自分が所有する関数，手続き（自分が定義したパブリック関数，パブリック手続きを含む），及びトリガ，並びに他ユーザが所有する関数，手続き（他ユーザが定義したパブリック関数，パブリック手続きを含む），及びトリガのSQLオブジェクトを再作成できます。

AUTHORIZATION句には，自分及び他ユーザの認可識別子を指定できます。

AUTHORIZATION句を省略することで，システム内のすべての関数及び手続きのSQLオブジェクトを再作成できます。

(3)　形式

　ALTER ROUTINE〔〔AUTHORIZATION 認可識別子〕〔ALL〕〕
　　　〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕

　SQLコンパイルオプション：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　　　　　　　　　　　　　｜OPTIMIZE LEVEL SQL最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL最適化オプション〕…
　　　　　　　　　　　　　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL拡張最適化オプション〕…
　　　　　　　　　　　　　　　　｜SUBSTR LENGTH 文字の最大長 ｝

(4)　オペランド

(a)　〔AUTHORIZATION 認可識別子〕 〔ALL〕

再作成する関数，手続き，及びトリガを，所有者の認可識別子と，関数，手続き，及びトリガの状態で指定します。

AUTHORIZATION 認可識別子

関数，手続き，及びトリガの所有者（パブリック関数，パブリック手続きの定義者を含む）の認可識別子を指定して，そのユーザが所有するすべての関数，手続き，及びトリガのSQLオブジェクトを再作成します。このオペランドを省略した場合，システム内のすべての関数，手続き，及びトリガのSQLオブジェクトを再作成します。ただし，実際にSQLオブジェクトを再作成するかどうかは，ALL句の指定との組み合わせによって決まります。

認可識別子

再作成する関数，手続き，及びトリガの，所有者の認可識別子を指定します。

ALL

指定した関数，手続き，及びトリガのSQLオブジェクトが有効か無効かに関係なく，すべて再作成する場合に指定します。

このオペランドを省略した場合，SQLオブジェクトが無効な関数，手続き，及びトリガだけ再作成します。

(b)　SQLコンパイルオプション

：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　｜OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…
　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…
　　　　｜SUBSTR LENGTH 文字の最大長 ｝

SQLコンパイルオプションにはISOLATION，OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL，SUBSTR LENGTHをそれぞれ1回しか指定できません。

〔ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕〕

SQLのデータ保証レベルを指定します。

データ保証レベル

データ保証レベルとは，トランザクションのどの時点までデータの内容を保証するかのレベルです。次に示すデータ保証レベルを指定できます。

0

データの内容を保証しない場合に指定します。

0レベルを指定すると，ほかのユーザが更新中のデータでも，更新完了を待たないで参照できます。ただし，参照する表が共用表の場合，ほかのユーザが排他モードでLOCK文を実行しているときには，排他解除待ちとなります。

1

検索処理の終了までデータの内容を保証したい場合に指定します。

1レベルを指定すると，検索処理が終了するまで（HiRDBがページ，又は行を見終わるまで）一度検索したデータをほかのユーザは更新できません。

2

トランザクションの終了まで一度検索したデータの内容を保証したい場合に指定します。

2レベルを指定すると，トランザクションが終了するまで一度検索したデータをほかのユーザは更新できません。

〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕

手続き中で，FOR UPDATE句を指定した（FOR UPDATEが仮定される場合を含む）カーソル又は問合せに対して，SQLコンパイルオプションで指定したデータ保証レベルに関係なく，常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。

このオペランドを省略した場合，EXCLUSIVEを仮定します。ただし，0904互換モードを適用している場合はCOMPATIBLEを仮定します。

09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略した関数，手続き，及びトリガと同じ動作をさせたい場合はCOMPATIBLEを指定します。

このオペランドと，ISOLATIONデータ保証レベルの関係から決まるFOR UPDATEの排他オプションを次に示します。

ISOLATION データ保証レベル

FOR UPDATE EXCLUSVIE

FOR UPDATE COMPATIBLE

0

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

1

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

2

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

《クライアント環境定義との関係》

ALTER ROUTINEに対して，PDISLLVL，PDFORUPDATEEXLOCKの指定は無効となります。

《SQLとの関係》

手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定したデータ保証レベル，FOR UPDATE EXCLUSIVE，及びFOR UPDATE COMPATIBLEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。

《システム定義との関係》

ALTER ROUTINEに対して，pd_isolation_levelオペランドの指定は無効となります。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，CREATE TYPE，ALTER ROUTINE，CREATE TRIGGER，又はALTER TRIGGERの実行時）に指定した値が仮定されます。

データ保証レベルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。

SQL最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法がありますが，通常時は識別子で指定する方法をお勧めします。

省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，CREATE TYPE，ALTER ROUTINE，CREATE TRIGGER，又はALTER TRIGGER）に採用した値が仮定されます。

識別子で指定する場合：

OPTIMIZE LEVEL "識別子"〔，"識別子"〕…

＜指定例＞

ネストループジョイン優先とグループ分け高速化処理を適用する場合

OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"

すべての最適化を適用しない場合

OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。ただし，同時に"NONE"以外の識別子を指定すると，"NONE"は無効になります。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

OPTIMIZE LEVEL 符号なし整数〔，符号なし整数〕…

＜指定例＞

複数のSQLオブジェクト作成，ANDの複数インデクス利用の抑止，及び複数インデクス利用の強制を適用する場合

符号なし整数をコンマで区切って指定する場合：

OPTIMIZE LEVEL 4,10,16

符号なし整数の和を指定する場合：

OPTIMIZE LEVEL 30

既に14（4+10）を指定していて，新たに16を追加する場合

OPTIMIZE LEVEL 14,16

すべての最適化を適用しない場合

OPTIMIZE LEVEL 0

＜規則＞

バージョン06-00より前のHiRDBから，バージョン06-00以降のHiRDBにバージョンアップする場合，バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は，バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。ただし，同時に0以外の識別子を指定すると，0は無効になります。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

複数の最適化方法を指定する場合，その符号なし整数の和を指定することもできます。ただし，同じ最適化方法の値は二つ以上足さないでください（足した結果が別の最適化方法とみなされることもあるため）。

複数の最適化方法の値を足して指定する場合，どの最適方法を指定しているのか分かりにくくなるため，コンマで区切って指定する方法をお勧めします。また，既に複数の最適化方法の値を足して指定している場合で，新たに別の最適化方法が必要になったときは，追加する値をコンマで区切って後ろに指定できます。

《システム定義との関係》

ALTER ROUTINEに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

システム定義のpd_floatable_besオペランド，又はpd_non_floatable_besオペランドを指定している場合，「フロータブルサーバ対象拡大（データ取り出しバックエンドサーバ）」及び「フロータブルサーバ対象限定（データ取り出しバックエンドサーバ）」の指定は無効となります。

システム定義のpd_indexlock_modeオペランドにKEYを指定している場合（インデクスキー値排他の場合），「更新SQLの作業表作成抑止」の指定は無効になります。

《クライアント環境定義との関係》

ALTER ROUTINEに対して，PDSQLOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL拡張最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。

SQL拡張最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法があります。

省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，CREATE TYPE，ALTER ROUTINE，CREATE TRIGGER，又はALTER TRIGGER）に採用した値が仮定されます。

識別子で指定する場合：

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL 1,2

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL 0

＜規則＞

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

《システム定義との関係》

ALTER ROUTINEに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

《クライアント環境定義との関係》

ALTER PROCEDUREに対して，PDADDITIONALOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

＜規則＞

バージョン08-00より前のHiRDBからバージョン08-00以降のHiRDBにバージョンアップする場合は，3を仮定します。文字の最大長を変更する必要がない場合は，バージョン08-00以降のHiRDBにバージョンアップしたときにこのオペランドを指定する必要はありません。

《システム定義との関係》

ALTER ROUTINEに対して，システム定義のpd_substr_lengthオぺランドの指定は無効となります。pd_substr_lengthオぺランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

ALTER ROUTINEに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効になります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE PROCEDURE，ALTER PROCEDURE，CREATE FUNCTION，CREATE TYPE，ALTER ROUTINE，CREATE TRIGGER，又はALTER TRIGGERの実行時）に指定した値が仮定されます。

(5)　共通規則

ALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成するルーチンの元のCREATE PROCEDURE，CREATE FUNCTION，CREATE TYPE，又はCREATE TRIGGERにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

SQLコンパイルオプションの指定は手続き及びトリガに対してだけ有効となり，関数に対しては無効となります。

次の条件では，Java手続きからALTER ROUTINEを実行できません。

実行中のSQLオブジェクトが再作成になる場合

(6)　留意事項

ALTER ROUTINEは，OLTP下のX/Openに従ったUAPから指定できません。

複数の関数，手続き，及びトリガのSQLオブジェクトを再作成する場合，関数，手続き，及びトリガごとに自動的にCOMMIT文又はROLLBACK文が実行されます。

ALTER ROUTINE実行直後にGET DIAGNOSTICS文を実行すると，ALTER ROUTINEの診断情報を取得できます。このとき，再作成が正常終了した関数，手続き，及びトリガのSQLコードは0となります。

データ保証レベル，SQL最適化オプション，SQL拡張最適化オプション，及び文字の最大長は，ルーチン及びトリガの定義時，又は再作成時の指定で決まり，手続き呼出し時，関数呼出し時，及びトリガ動作実行時のシステム定義やクライアント環境定義の影響を受けません。

手続き及びトリガで使用している表（そのトリガを定義した表を除く）に対してインデクスの追加又は削除をした場合，手続き及びトリガのSQLオブジェクト中のインデクス情報が無効となります。この場合，このトリガは実行できません。また，手続き又はトリガからこの手続きを実行できないため，ALL指定でSQLオブジェクトを再作成してください。

Java手続き及びJava関数はSQLオブジェクトが作成されないため，SQLオブジェクトの再作成はしません。SQLコンパイルオプションの更新だけできます。

ネストするトリガがある場合，次のことに注意してください。

ネストするトリガの一部，又はすべてが無効状態となっている場合，1回のALTER ROUTINE実行ではすべてのトリガが有効にならないことがあります（ALTER ROUTINEはKFPA11528-Eエラーとなります）。この場合，ALTER ROUTINEが正常終了するまで，ALTER ROUTINEを繰り返し実行してください。

ネストするトリガがある場合，かつトリガ動作中の探索条件に関数を指定している場合は，次のことに注意してください。

この関数を削除した場合，ALTER ROUTINEが正常終了しても，トリガ実行時にKFPA11529-Eエラーとなることがあります。この場合，実行時エラーとなったトリガ又はルーチンを再作成（ALTER TRIGGER又はALTER PROCEDURE）して再実行してください。実行時エラーとなるトリガ又はルーチンは，関数を削除したトリガの呼び出し元のトリガ又はルーチンです。

ループするトリガがある場合，次のことに注意してください。

ループするトリガがすべて無効状態になっている場合，ALTER ROUTINEでの再作成はできません。この場合，ループするトリガ及びこれらのトリガを定義している表にあるすべてのトリガを削除し，再定義してください。

他ユーザが定義したパブリック関数，パブリック手続きのSQLオブジェクトを再作成した場合も，そのSQLオブジェクトの定義者は変わりません。

(7)　使用例

すべての関数，手続き，及びトリガの中で，SQLオブジェクトが無効となっている関数及び手続きを再作成します。

  ALTER ROUTINE

ユーザ（USER1）の関数，手続き，及びトリガをすべて再作成します。

  ALTER ROUTINE
      AUTHORIZATION USER1 ALL

3.5　ALTER TABLE（表定義変更）

3.5.1　ALTER TABLEの形式と規則

(1)　機能

表定義変更には，次に示す機能があります。

実表の最後に新しい列を追加します。

予備列から列を切り出し，新たな列を追加します。

ハッシュ関数によって横分割している実表に対して，表格納用RDエリアを追加します。

実表又は列の属性を変更します。

可変長データ型の最大長を大きくします。

文字データを混在文字データに変更します。

繰返し列の最大要素数を大きくします。

可変長文字データの格納方式を変更します。

列回復制約を変更します。

列の既定値を設定，変更，又は削除します。

既定値のない非ナル値制約の列を，既定値のある非ナル値制約の列に変更します。

更新可能列属性を変更します。

データの格納されていない実表のクラスタキーの一意性制約を変更します。

実表の最小排他リソース単位を変更します。

ハッシュ関数によって横分割している実表に対して，ハッシュ関数を変更します。

空き領域の再利用機能を適用又は解除します。

空き領域の再利用機能でのセグメント数上限を変更します。

改竄防止表に変更します。

データの格納されていない実表の列を削除します。

実表又は列の名称を変更します。

横分割している実表やマトリクス分割している実表の分割格納条件を変更します。

主キーを追加，又は削除します。

(2)　使用権限

実表の所有者

自分が所有する実表にだけ指定できます。

(3)　形式

ALTER TABLE 〔認可識別子.〕表識別子 表定義変更動作
表定義変更動作：：＝｛　列追加定義
　　　　　　　　　　　｜表制約定義追加
　　　　　　　　　　　｜RDエリア追加定義
　　　　　　　　　　　｜列属性変更定義
　　　　　　　　　　　｜列削除定義
　　　　　　　　　　　｜表制約定義削除
　　　　　　　　　　　｜表名変更定義
　　　　　　　　　　　｜列名変更定義
　　　　　　　　　　　｜分割格納条件変更定義 ｝

≪各項目の詳細≫

列追加定義：：＝
　  ADD 列名 データ型〔ARRAY ［最大要素数］〕
　　　　　　　　〔〔列回復制約1〕
　　　　　　　　　｛LOB列格納用RDエリア指定
　　　　　　　　　　｜マトリクス分割LOB列格納用RDエリア指定
　　　　　　　　　　｜抽象データ型定義内LOB格納用RDエリア指定
　　　　　　　　　　　〔プラグイン指定〕
　　　　　　　　　　｜マトリクス分割LOB属性格納用RDエリア指定
　　　　　　　　　　　〔プラグイン指定〕｝〕
　　　　　　　　〔圧縮指定〕
　　　　　　　　〔DEFAULT句〕
　　　　　　　　〔非ナル値制約〕
　　　　　　　　〔予備列定義〕
　　　　　　　　〔更新可能列属性〕
　　　　　　　　〔INTO 予備列名〕
　　　　　　　　〔WITH PROGRAM〕
　列回復制約1：：＝RECOVERY〔｛ALL｜PARTIAL｜NO｝〕
　LOB列格納用RDエリア指定：：＝
　　　　　　　　　IN ｛LOB列格納用RDエリア名
　　　　　　　　　　　 ｜（LOB列格納用RDエリア名）
　　　　　　　　　　　 ｜（（LOB列格納用RDエリア名）
　　　　　　　　　　　　　〔，（LOB列格納用RDエリア名）〕…）｝
　マトリクス分割LOB列格納用RDエリア指定：：＝2次元格納用RDエリア指定
　マトリクス分割LOB属性格納用RDエリア指定：：＝2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト
　　　　　　　　　　　　　　　　　〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）
　抽象データ型定義内LOB格納用RDエリア指定：：＝
　　　　ALLOCATE（属性名〔..属性名〕…
　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　 ｜（LOB属性格納用RDエリア名）
　　　　　　　　　｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝
　　　　　　〔，属性名〔..属性名〕…
　　　　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　　　　 ｜（LOB属性格納用RDエリア名）
　　　　　　　　　　　 ｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝〕…）
　圧縮指定：：＝ COMPRESSED 〔BY 圧縮分割サイズ〕
　圧縮分割サイズ：：＝ n〔｛K｜M｜G｝〕
　DEFAULT句：：＝DEFAULT 〔既定値〕
　既定値：：＝｛定数｜USER｜CURRENT_USER｜CURRENT_DATE｜CURRENT DATE
　　　　　　　　｜CURRENT_TIME｜CURRENT TIME
　　　　　　　　｜CURRENT_TIMESTAMP〔（小数秒精度）〕 〔USING BES〕
　　　　　　　　｜CURRENT TIMESTAMP〔（小数秒精度）〕〔USING BES〕
　　　　　　　　｜NULL｝
　非ナル値制約：：＝｛｛NULL｜NOT NULL〔WITH DEFAULT〕｝※1
　　　　　　　　　｜〔NOT NULL〕   WITH DEFAULT　※2｝
　予備列定義：：＝FOR RESERVED
　更新可能列属性：：＝UPDATE 〔ONLY FROM NULL〕
　予備列名：：＝列名
表制約定義追加：：＝
　　  ADD PRIMARY KEY（列名〔｛ASC｜DESC｝〕
　　　　　　　　　　　　　〔，列名〔｛ASC｜DESC｝〕…〕）
　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　　　〔インデクスオプション〔インデクスオプション〕…〕
　マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト
　　　　　　　　　　　　　　　　　　〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）
　インデクスオプション：：＝｛PCTFREE＝未使用領域の比率
　　　　　　　　　　　　　　｜UNBALANCED SPLIT
　　　　　　　　　　　　　　｜EMPTY｝
RDエリア追加定義：：＝
　　  ADD RDAREA 表格納用RDエリア名
　　　　　　〔FOR COLUMN 列名
　　　　　　　｛LOB列格納用RDエリア指定
　　　　　　　　｜抽象データ型定義内LOB格納用RDエリア指定｝
　　　　　　　〔，列名 ｛LOB列格納用RDエリア指定
　　　　　　　　　　　　 ｜抽象データ型定義内LOB格納用RDエリア指定｝〕…〕
　　　　　　〔FOR INDEX インデクス識別子 インデクス格納用RDエリア指定
　　　　　　　〔，インデクス識別子 インデクス格納用RDエリア指定〕…〕
　　　　　　〔FOR 〔PRIMARY〕 CLUSTER KEY インデクス格納用RDエリア指定〕
　　　　　　〔FOR PRIMARY KEY インデクス格納用RDエリア指定〕
　　　　　　〔WITH PROGRAM〕
　LOB列格納用RDエリア指定：：＝
　　　　　　　　　IN ｛LOB列格納用RDエリア名
　　　　　　　　　　　 ｜（LOB列格納用RDエリア名）
　　　　　　　　　　　 ｜（（LOB列格納用RDエリア名）
　　　　　　　　　　　　　〔，（LOB列格納用RDエリア名）〕…）｝
　抽象データ型定義内LOB格納用RDエリア指定：：＝
　　　　ALLOCATE（属性名〔..属性名〕…
　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　　｜（LOB属性格納用RDエリア名）
　　　　　　　　　｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝
　　　　　　〔，属性名〔..属性名〕…
　　　　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　　　　 ｜（LOB属性格納用RDエリア名）
　　　　　　　　　　　 ｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝〕…）
　インデクス格納用RDエリア指定：：＝
　　　　　　　　　IN｛インデクス格納用RDエリア名
　　　　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）｝
列属性変更定義：：＝
　　  CHANGE｛列名｛〔｛VARCHAR（データ長）
　　　　　　　　　　　　　｜NVARCHAR（データ長）
　　　　　　　　　　　　　｜MCHAR（｛＊｜データ長｝）
　　　　　　　　　　　　　｜MVARCHAR（｛＊｜データ長｝）｝
　　　　　　　　　　　　　　　〔ARRAY ［｛＊｜最大要素数｝］〕〕
　　　　　　　　　　　｜〔ARRAY ［最大要素数］〕
　　　　　　　　　　　｜BINARY（データ長）｝
　　　　　　　　　　　〔｛NO SPLIT｜SPLIT｝〕
　　　　　　　　　　　〔列回復制約２〕
　　　　　　　　　　　〔｛SET DEFAULT句｜DROP DEFAULT｝〕
　　　　　　　　　　　〔WITH DEFAULT〕
　　　　　　　　　　　〔更新可能列属性〕
　　　　　　　　｜CLUSTER KEY〔UNIQUE〕
　　　　　　　　｜LOCK｛ROW｜PAGE｝
　　　　　　　　｜HASHハッシュ関数名
　　　　　　　　｜SEGMENT REUSE
　　　　　　　　　　　　｛〔セグメント数〔｛K｜M｝〕〕｜NO｝
　　　　　　　　｜SEGMENT REUSE OPTION 再利用オプション値
　　　　　　　　｜INSERT ONLY
　　　　　　　　　〔WHILE ｛日間隔データ｜ラベル付き間隔｝ BY 列名〕｝
　　　　　　　〔WITH PROGRAM〕
　列回復制約２：：＝　RECOVERY｛ALL｜PARTIAL｜NO｝
列削除定義：：＝
　　  DROP 列名 〔WITH PROGRAM〕
表制約定義削除：：＝
　　  DROP PRIMARY KEY 〔WITH PROGRAM〕
表名変更定義：：＝
　　  RENAME TABLE TO 表識別子
　　　　　　　　〔WITH PROGRAM〕
列名変更定義：：＝
　　  RENAME COLUMN FROM 変更前列名 TO 変更後列名
　　　　　　　　〔WITH PROGRAM〕
分割格納条件変更定義：：＝
　　　CHANGE　RDAREA ｛横分割表変更指定｜マトリクス分割表変更指定｝
　　　　　〔LOB列格納用RDエリア変更指定〕
　　　　　〔インデクス格納用RDエリア変更指定
　　　　　　〔インデクス格納用RDエリア変更指定〕…〕
　　　　　〔クラスタキー格納用RDエリア変更指定〕
　　　　　〔主キー格納用RDエリア変更指定〕
　　　　　〔WITHOUT PURGE〕
　　　　　〔WITH PROGRAM〕
　横分割表変更指定：：＝
　　｛〔PARTITIONED〕変更前境界値リスト INTO 変更後境界値分割指定
　　　｜PARTITIONED CONDITION 変更前RDエリア情報リスト
　　　　　INTO 変更後格納条件分割指定｝
　マトリクス分割表変更指定：：＝
　　　　　　MULTIDIM（変更対象列名　変更前境界値リスト）
　　　　　　AT 変更後境界値リスト
　　　　　　INTO マトリクス分割表格納用RDエリア変更指定
　変更前境界値リスト：：＝境界値リスト
　変更後境界値リスト：：＝境界値リスト
　境界値リスト：：＝（（｛境界値｜MAX｝）〔，（｛境界値｜MAX｝）〕…）
　変更後境界値分割指定：：＝｛表格納用RDエリア名
　　　　　　　　　　　　　　　　｜（表格納用RDエリア名）
　　　　　　　　　　　　　　　　｜（〔（表格納用RDエリア名）境界値，〕
　　　　　　　　　　　　　　　　　　…（表格納用RDエリア名））｝
　変更前RDエリア情報リスト：：＝
　　　　　｛表格納用RDエリア名
　　　　　　　｜（表格納用RDエリア名）
　　　　　　　｜（（表格納用RDエリア名）
　　　　　　　　〔，（表格納用RDエリア名）〕…〔，OTHERS〕）
　　　　　　　｜OTHERS｝
　変更後格納条件分割指定：：＝｛表格納用RDエリア名
　　　　　　　　　　　　　　　　　｜（表格納用RDエリア名）
　　　　　　　　　　　　　　　　　｜（（表格納用RDエリア名）格納条件
　　　　　　　　　　　　　　　　　　　｛，（表格納用RDエリア名）格納条件
　　　　　　　　　　　　　　　　　　　　　〔〔，（表格納用RDエリア名）格納条件〕
　　　　　　　　　　　　　　　　　　　　　　…〕
　　　　　　　　　　　　　　　　　　　　　〔｛，（表格納用RDエリア名）
　　　　　　　　　　　　　　　　　　　　　　　｜，OTHERS｝〕）
　　　　　　　　　　　　　　　　　　　　｜，（表格納用RDエリア名））
　　　　　　　　　　　　　　　　　　　　｜，OTHERS）｝
　　　　　　　　　　　　　　　　｜OTHERS｝
　格納条件：：＝列名＝｛定数｜（定数〔，定数…〕）｝
　インデクス格納用RDエリア変更指定：：＝
　　　　　　FOR INDEX インデクス名
　　　　　　　　INTO 変更後インデクス格納用RDエリア名リスト
　変更後インデクス格納用RDエリア名リスト：：＝RDエリア名リスト
　RDエリア名リスト：：＝
　　　　　｛インデクス格納用RDエリア名
　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　〔，（インデクス格納用RDエリア名）〕…〔，OTHERS〕）
　　　　　　｜２次元格納用RDエリア指定
　　　　　　｜OTHERS｝
　主キー格納用RDエリア変更指定：：＝
　　　　　　FOR PRIMARY KEY
　　　　　　　　INTO 変更後インデクス格納用RDエリア名リスト
　クラスタキー格納用RDエリア変更指定：：＝
　　　　　　FOR 〔PRIMARY〕CLUSTER KEY
　　　　　　　　　　INTO 変更後インデクス格納用RDエリア名リスト
　LOB列格納用RDエリア変更指定：：＝
　　　FOR COLUMN 列名
　　　　｛LOB列格納用RDエリア変更リスト
　　　　　｜INTO マトリクス分割LOB列格納用RDエリア変更指定｝
　　　　　　〔，列名 ｛LOB列格納用RDエリア変更リスト
　　　　　　　　　　　｜INTOマトリクス分割LOB列格納用RDエリア変更指定｝〕
　　　　　　 〕…
　LOB列格納用RDエリア変更リスト：：＝
　　　　　　　　　INTO ｛LOB列格納用RDエリア名
　　　　　　　　　　　　 ｜（LOB列格納用RDエリア名）
　　　　　　　　　　　　 ｜（（LOB列格納用RDエリア名）
　　　　　　　　　　　　　　〔，（LOB列格納用RDエリア名）〕…〔，OTHERS〕）
　　　　　　　　　　　　 ｜OTHERS｝
　マトリクス分割表格納用RDエリア変更指定：：＝２次元格納用RDエリア指定
　マトリクス分割LOB列格納用RDエリア変更指定：：＝２次元格納用RDエリア指定
　　　２次元格納用RDエリア指定：：＝（マトリクス分割格納用RDエリアリスト
　　　　　　　　　　　　　　　　　　〔，マトリクス分割格納用RDエリアリスト〕…）
　　　マトリクス分割格納用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）

注※1　FIX表以外の表の列の場合

注※2　FIX表の列の場合

(4)　オペランド

(a)　〔認可識別子.〕表識別子

認可識別子

定義変更する実表の所有者の認可識別子を指定します。

表識別子

定義変更する実表の名称を指定します。

(b)　列追加定義

：：＝ADD 列名 データ型 〔ARRAY ［最大要素数］〕
　〔〔列回復制約１〕
　　｛LOB列格納用RDエリア指定
　　　｜マトリクス分割LOB列格納用RDエリア指定
　　　｜抽象データ型定義内LOB格納用RDエリア指定〔プラグイン指定〕
　　　｜マトリクス分割LOB属性格納用RDエリア指定〔プラグイン指定〕｝〕
　〔圧縮指定〕〔DEFAULT句〕〔非ナル値制約〕〔予備列定義〕
　〔更新可能列属性〕〔INTO 予備列名〕〔WITH PROGRAM〕

列名

次のどちらかの名称を指定します。

実表に追加する列の名称

予備列から切り出す列の名称

列名についての規則を次に示します。

＜実表に追加する列の規則＞

列を追加しようとする実表内で同じ列名は指定できません。

既に列が30,000個ある実表には，列は追加できません。

データが格納されているFIX表には，列は追加できません。

列を追加すると，既存の行の追加した列にはナル値が設定されます。ナル値の値の設定は，「UPDATE文　形式1（データ更新）」を参照してください。

予備列が存在する表に対して，列は追加できません。

＜予備列から切り出す列の規則＞

列を追加しようとする実表内で同じ列名は指定できません。

切り出した結果，列数が30,001個以上になる場合は，切り出し列を定義できません。

予備列すべてを切り出す場合を除き，予備列と同じ名称を指定できません。

データ型

次のどちらかのデータ型を指定します。

実表に追加する列のデータ型

予備列から切り出す列のデータ型

データ型についての規則を次に示します。

＜実表に追加する列のデータ型の規則＞

データ型にBLOBを指定する場合，LOB列格納用RDエリアを指定してください。

データ型に抽象データ型を指定する場合，LOB属性格納用RDエリア名を指定してください。ただし，スーパタイプでBLOBが定義されている抽象データ型は指定できません。

抽象データ型の認可識別子を省略した場合で，かつ仮定された認可識別子の抽象データ型がないときは，'MASTER'のスキーマ中に同一名称の抽象データ型があると，その抽象データ型を指定したものとします。

＜予備列から切り出す列のデータ型の規則＞

予備列の定義長を超える長さのデータ型を指定できません。

データ長については，「既定義型データ長一覧」を参照してください。

予備列の定義長と等しいデータ長のデータ型を指定した場合，予備列すべてが切り出され，予備列が存在しない表となります。その際，予備列に付けていた注釈も削除されます。

ARRAY ［最大要素数］

実表に追加する繰返し列の最大要素数を指定します。

ARRAY 最大要素数についての規則を次に示します。

最大要素数には，2〜30,000の符号なし整数を指定します。

ARRAY 最大要素数を省略した場合，繰返し列でないことを示します。

繰返し列は，次のデータ型には指定できません。

・BLOB

・BINARY

・抽象データ型

FIX表には指定できません。

繰返し列は，圧縮列に指定できません。

列回復制約1：：＝　RECOVERY〔｛ALL｜PARTIAL｜NO｝〕

データ型がBLOBの列，又はBLOB属性の抽象データ型の列を表に追加する場合，列を格納するLOB列格納用RDエリア，又は抽象データ型定義内LOB格納用RDエリアのデータベースの更新ログ取得方式を指定します。

なお，列回復制約は，データ型がBLOB又はBLOB属性の抽象データ型以外の列には指定できません。省略すると，更新前ログ取得モード(PARTIAL)が仮定されます。仮定値は，システム共通定義のpd_ddl_tbl_recoveryオペランドで変更できます。pd_ddl_tbl_recoveryオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

ALL

ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。ログ取得モードで運用すると，ロールバック，及びロールフォワードに必要なデータベースの更新ログを取得します。

PARTIAL

更新前ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。更新前ログ取得モードで運用すると，ロールバックに必要なデータベースの更新ログを取得します。

NO

ログレスモードでユーザLOB用RDエリアを運用するときに指定します。ログレスモードで運用すると，データベースの更新ログを取得しません。

指定するデータベースの更新ログ取得方式によって，UAPを実行するときの運用方法や，障害が発生したときのユーザLOB用RDエリアの回復方法が異なります。ログレスモードの運用については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

LOB列格納用RDエリア指定：：＝

IN ｛LOB列格納用RDエリア名

　　 ｜（LOB列格納用RDエリア名）

　　 ｜（（LOB列格納用RDエリア名）

　　　　〔，（LOB列格納用RDエリア名）〕…）｝

BLOB型の列を追加する場合，BLOB列のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB列格納用RDエリアについての規則を次に示します。

データ型にBLOBを指定した列は，LOB列格納用RDエリア名を必ず指定してください。BLOB以外のデータ型を指定した列には指定できません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

横分割表に列を追加する場合は，表定義で指定したユーザ用RDエリアと同じ数のユーザLOB用RDエリアを指定してください。その場合，同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが，同じ順番になるように指定してください。

境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表にLOB列を追加する場合は，表定義で指定した表格納用RDエリアと1対1に対応するようにLOB列格納用RDエリアを指定してください。また，表定義で指定している表格納用RDエリアに重複したRDエリアがある場合は，LOB列格納用RDエリアも同一位置が重複するように指定してください。

上記以外の場合は，LOB列格納用RDエリアは重複して指定できません。

マトリクス分割LOB列格納用RDエリア指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト

　　　〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝

　　　（RDエリア名〔，RDエリア名〕…）

マトリクス分割した表にBLOB型の列を追加する場合に，BLOB列を格納するRDエリア名を指定します。

マトリクス分割した表にBLOB型の列を追加する場合，マトリクス分割LOB列格納用RDエリア指定を指定してください。

RDエリア名については，LOB列格納用RDエリア指定の説明を参照してください。

抽象データ型定義内LOB格納用RDエリア指定：：＝

ALLOCATE（属性名〔..属性名〕…

　　IN ｛LOB属性格納用RDエリア名

　　　　 ｜（LOB属性格納用RDエリア名）

　　　　 ｜（（LOB属性格納用RDエリア名）

　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝

　　〔，属性名〔..属性名〕…

　　　　IN ｛LOB属性格納用RDエリア名

　　　　　　 ｜（LOB属性格納用RDエリア名）

　　　　　　 ｜（（LOB属性格納用RDエリア名）

　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝〕…）

LOB属性を含む抽象データ型の列を追加する場合に指定します。

属性名〔..属性名〕

抽象データ型を構成する属性名を指定します。抽象データ型の属性が抽象データ型であり，その入れ子になっている抽象データ型の属性にLOB型の属性がある場合は，そのLOB型の属性名を指定してください。

属性名は，次のような場合に指定してください。

抽象データ型定義の属性

抽象データ型定義の属性のデータ型がLOB型であれば指定します。

抽象データ型定義の入れ子

抽象データ型の属性が抽象データ型であり，その入れ子になっている抽象データ型の属性にLOB型の属性であれば，そのLOB型の属性名を指定してください。

LOB属性格納用RDエリア名

抽象データ型の任意の階層にある，BLOB属性のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB属性格納用RDエリアについての規則を次に示します。

データ型にBLOBを含む抽象データ型を指定した場合，各BLOB属性に対してユーザLOB用RDエリアの名前を必ず指定してください。BLOB以外のデータ型を指定した属性には指定できません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

横分割表に列を追加する場合は，表定義で指定したユーザ用RDエリアと同じ数のユーザLOB用RDエリアを指定してください。その場合，同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが，同じ順番になるようにしてください。

境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表にLOB属性を含む抽象データ型の列を追加する場合は，表定義で指定した表格納用RDエリアと1対1に対応するようにLOB属性格納用RDエリアを指定してください。また，表定義で指定している表格納用RDエリアに重複したRDエリアがある場合は，LOB属性格納用RDエリアも同一位置が重複するように指定してください。

上記以外の場合は，LOB属性格納用RDエリアは重複して指定できません。

プラグイン指定：：＝PLUGIN プラグインオプション

プラグイン機能が実装されている抽象データ型として定義された列に対して，プラグイン機能に渡すためのパラメタ情報を文字列定数（最大255バイト）で記述します。パラメタ情報には，16進文字列定数は指定できません。

パラメタ情報の詳細については，各種プラグインマニュアルを参照してください。

マトリクス分割LOB属性格納用RDエリア指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト

　　　〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝

　　　（RDエリア名〔，RDエリア名〕…）

マトリクス分割した表にLOB属性を含む抽象データ型列を追加する場合に，LOB属性を格納するRDエリア名を指定します。

マトリクス分割した表にLOB属性を含む抽象データ型列を追加する場合，マトリクス分割LOB属性格納用RDエリア指定を指定してください。

RDエリア名については，抽象データ型定義内LOB格納用RDエリア指定のLOB属性格納用RDエリア名の説明を参照してください。

圧縮指定：：＝

COMPRESSED 〔BY 圧縮分割サイズ〕

圧縮指定は，列データを圧縮する場合に指定します。BINARY型の列に圧縮を指定する場合は，定義長が256バイト以上である必要があります。255バイト以下の場合，エラーになります。

圧縮分割サイズ：：＝ n〔｛K｜M｜G｝〕

圧縮処理や伸張処理のオーバヘッドを削減したい場合，又は圧縮効率を向上させたい場合に指定します。ただし，圧縮分割サイズを大きくすると，メモリ所要量が増加します。詳細は，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

データをnバイト単位で分割して圧縮します。nは符号なし整数で指定し，単位としてK（キロバイト），M（メガバイト）及びG（ギガバイト）が指定できます（指定省略時はバイト単位）。圧縮分割サイズに指定できる値の範囲を次の表に示します。

表3‒2　圧縮分割サイズに指定できる値の範囲

単位

nに指定できる値の範囲

圧縮分割サイズの値

BINARY型

抽象データ型（XML型）

指定しない（バイト）

32,000≦n≦2,147,483,647

1,048,576≦n≦2,147,483,647

n

K

32≦n≦2,097,152

1024≦n≦2,097,152

n×1,024

M

1≦n≦2,048

1≦n≦2,048

n×1,048,576

G

1≦n≦2

1≦n≦2

n×1,073,741,824

圧縮分割サイズの注意事項を次に示します。

圧縮分割サイズに指定できる値の範囲外の値を指定した場合，エラーになります。ただし，実際の最大長の計算結果が2,147,483,648の場合は，2,147,483,647になります。

圧縮分割サイズに定義長より大きい値を指定した場合，分割しないで圧縮します。

圧縮分割サイズを省略すると，BINARY型の場合は32,000バイトを仮定し，抽象データ型（XML型）の場合は1メガバイトを仮定します。ALTER TABLE文で列の定義長を大きくしても，圧縮列の定義追加時に仮定した圧縮分割サイズは変わりません。

圧縮指定についての規則を次に示します。

圧縮指定が指定できる列は次のデータ型の列だけです。

・BINARY型

・抽象データ型（XML型）※

注※

抽象データ型（XML型）の列のデータを圧縮するためには，バージョン09-03以降のHiRDB XML Extensionが必要です。バージョン09-02以前のHiRDB XML Extensionを使用している場合，抽象データ型（XML型）の列に圧縮指定はできません。

DEFAULT句：：＝DEFAULT 〔既定値〕

追加する列に既定値を設定する場合に指定します。

DEFAULT句についての規則を次に示します。

一つのALTER TABLEで，WITH DEFAULTと同時には指定できません。

実表にデータが格納されている場合，追加する列にDEFAULT句は指定できません。

BLOB型，抽象データ型，及び定義長が32,001バイト以上のBINARY型の列には指定できません。

繰返し列には指定できません。

予備列には指定できません。

追加する列が既定の文字集合以外の場合，次に示す項目はDEFAULT句に指定できません。

・CURRENT_DATE(CURRENT DATE)

・CURRENT_TIME(CURRENT TIME)

・CURRENT TIMESTAMP(CURRENT_TIMESTAMP)

非ナル値制約：：＝｛｛NULL｜NOT NULL〔WITH DEFAULT〕｝※1

　　　　　　　　｜〔NOT NULL〕 WITH DEFAULT　※2｝

注※1　FIX表以外の表の列の場合

注※2　FIX表の列の場合

NULL

列名で指定した列にナル値を許す場合に指定できます。

FIX表の列には指定できません。

NOT NULL

列名で指定した列にナル値を許さないように制約（非ナル値制約）が必要な場合に指定します。

NOT NULLについての規則を次に示します。

実表にデータが格納されている場合，NOT NULLは指定できません。

NOT NULLを省略すると，追加した列にナル値が許され，既にデータが入っている行に追加した列にはナル値が設定されます。

NOT NULLは，繰返し列及び抽象データ型の列に指定できません。

WITH DEFAULT

既定値のある非ナル値制約の列を追加する場合に指定します。

WITH DEFAULTについての規則を次に示します。

FIX表以外の表でWITH DEFAULTを指定する場合，NOT NULLを指定してください。

一つのALTER TABLEで，DEFAULT句と同時には指定できません。

WITH DEFAULTは，繰返し列には指定できません。

WITH DEFAULTは，追加する予備列には指定できません。

WITH DEFAULTは，抽象データ型の列には指定できません。

予備列定義：：＝FOR RESERVED

列を予備列として追加する場合に指定します。予備列は，将来，FIX表に列を追加する見込みがある場合に定義します。予備列を定義すると，FIX表にデータが格納されている状態でも，予備列から切り出して列を追加できます。

予備列には，定義長分の0x00が格納されます。0x00以外の値は格納できません。

次の列に対しては，FOR RESERVEDを指定できません。

非FIX表の列

予備列を定義済みの表の列

CHAR型以外の列又は文字集合を指定したCHAR型の列

改竄防止表の列

更新可能列属性：：＝UPDATE 〔ONLY FROM NULL〕

改竄防止表に更新可能な列を追加する場合，又は改竄防止表に変更する予定のある表に更新可能な列を追加する場合に指定します。

更新可能列属性は改竄防止表の場合だけ有効となります。

改竄防止表への変更については，「CHANGE」の「INSERT ONLY」オプションを参照してください。

更新可能列属性についての規則を次に示します。

次に示す更新できない列には指定できません。

・予備列

UPDATE

改竄防止表で，更新可能な列を追加する場合に指定します。

UPDATE ONLY FROM NULL

改竄防止表で，行の値がナル値から非ナル値へ一度だけ更新可能な列を追加する場合に指定します。

改竄防止表で，UPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

○

ナル値

非ナル値

○

非ナル値

ナル値

×

非ナル値

非ナル値※

×

（凡例）

○：更新できます。

×：更新できません。

注

繰返し列の場合は，ナル値（要素数が0の値）から添え字指定なしでの列単位更新だけが実行できます。

注※

更新前の値と同値を含みます。

UPDATE ONLY FROM NULL指定についての規則を次に示します。

NOT NULLを指定した列には指定できません。

FIX表の場合指定できません。

BLOB型及び定義長が32,001バイト以上のBINARY型の列には指定できません。

更新可能列属性の指定可否と指定時の列の値の更新可否は次のようになります。

表種別

UPDATE指定

UPDATE ONLY

FROM NULL指定

左記の

指定なし

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

非改竄防止表

○

○

○

○

−

○

改竄防止表

○

○

○

○※

−

×

（凡例）

○：更新できます。

×：更新できません。

−：該当しません。

注※

ナル値から非ナル値へ一度だけ更新できます。

INTO 予備列名

新規に追加する列を，予備列から切り出したい場合に指定します。切り出した列は，定義長分の0x00で初期化されます。列名には，予備列以外の列名を指定できません。

WITH PROGRAM

次のどれかの操作をする場合，その表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

DEFAULT句指定の列を表に追加する場合

NOT NULL指定の列を表に追加する場合

BLOB型，又は抽象データ型の列を表に追加する場合

予備列から列を切り出す場合

(c)　表制約定義追加

：：＝ADD PRIMARY KEY（列名〔｛ASC｜DESC｝〕
　　　　　　　　　　　　〔，列名〔｛ASC｜DESC｝〕…〕）
　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　　　〔インデクスオプション〔インデクスオプション〕…〕

主キーを追加する場合に指定します。

主キーを追加する場合の規則を次に示します。

表に主キーが定義されている場合は指定できません。

表にインデクスが255個定義されている場合は指定できません。

同じ列構成のインデクス（クラスタキーも含む）が既に定義されている場合，主キーは追加できません。同じ列構成とは，次の条件をすべて満たすものをいいます。

列名の並び，及び列数が一致している

昇順，降順の指定がすべて一致している，又はすべて逆になっている

主キーを構成する列に非ナル値制約が定義されている必要があります。

重複したデータがある場合，主キーは追加できません。

主キーを定義しようとしている表を使用する手続き及びトリガが定義されている場合，そのSQLオブジェクト中のインデクス情報は無効になります。この場合，トリガは実行できなくなります。また，手続きからこの手続き又はトリガが実行できなくなるため，SQLオブジェクトを再作成する必要があります。

主キーを追加すると，指定した列に対してインデクスを定義します。

主キーのインデクス識別子は，(PRIMARYtttttttttt)のような名称となります。ttttttttttは表ID（10進数）です。なお，長さは19バイトです。

その他の規則については，「CREATE TABLE（表定義）」の「複数列一意性制約定義」を参照してください。

〔IN｛インデクス格納用RDエリア名

　｜（インデクス格納用RDエリア名）

　｜（（インデクス格納用RDエリア名）

　　　〔，（インデクス格納用RDエリア名）〕…）

　｜マトリクス分割インデクス格納用RDエリア指定｝〕

インデクス格納用RDエリア名，マトリクス分割インデクス格納用RDエリア指定については，「CREATE INDEX 形式1（インデクス定義）」の「オペランド」を参照してください。

インデクスオプション：：＝

｛PCTFREE＝未使用領域の比率

｜UNBALANCED SPLIT

｜EMPTY｝

インデクスオプションの規則を次に示します。

同一のインデクスオプションは，繰り返して指定できません。

各インデクスオプションの規則については，「CREATE INDEX 形式1（インデクス定義）」の「オペランド」を参照してください。

(d)　RDエリア追加定義

：：＝ADD RDAREA 表格納用RDエリア名
　〔FOR COLUMN 列名
　　｛LOB列格納用RDエリア指定
　　　｜抽象データ型定義内LOB格納用RDエリア指定｝
　　〔，列名 ｛LOB列格納用RDエリア指定
　　　　　　　 ｜抽象データ型定義内LOB格納用RDエリア指定｝〕…〕
　〔FOR INDEX インデクス識別子 インデクス格納用RDエリア指定
　　〔，インデクス識別子 インデクス格納用RDエリア指定〕…〕
　〔FOR 〔PRIMARY〕 CLUSTER KEY インデクス格納用RDエリア指定〕
　〔FOR PRIMARY KEY インデクス格納用RDエリア指定〕
　〔WITH PROGRAM〕

表格納用RDエリア名

ハッシュ関数によって横分割している表に対して，ユーザ用RDエリアを追加する場合に指定します。

表格納用RDエリア名についての規則を次に示します。

表にユニーク指定のインデクスが定義されている場合，ユーザ用RDエリアは追加できないことがあります。詳細については，「CREATE INDEX　形式1（インデクス定義）」のUNIQUEの説明を参照してください。

リバランス機能を使用しない場合，データが格納されているFIXハッシュ分割の表に対してユーザ用RDエリアは追加できません。リバランス機能については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

リバランス機能を使用している表を格納するRDエリアに，ほかの表及びインデクスは格納できません。

リバランス機能を使用するFIXハッシュ分割表に対して，RDエリアを追加した場合，リバランスユティリティを実行し正常終了するまでは，その表を検索，更新するSQLの性能が劣化することがあります。

リバランス機能を使用するFIXハッシュ分割表にユニーク指定のインデクス，ユニーククラスタキー，又は主キーを定義している場合，その表に対してRDエリアを追加すると，リバランスユティリティを実行し正常終了するまでは，その表へのデータの追加，更新はできません。

空き領域の再利用機能を使用した表にRDエリアを追加する場合，追加したRDエリアにも空き領域の再利用機能が適用されます。

表格納用RDエリアに共用RDエリアは指定できません。

表定義変更後の総分割RDエリア数の最大数は重複を含んで4096個です。

ただし，リバランス機能を使用した場合の総分割RDエリア数の最大数は重複を除いて1,024個です。

列名

RDエリアを追加する表に，BLOB又はBLOB属性を含む抽象データ型の列がある場合に指定します。

列名にはBLOB型の列，又はBLOB属性を含む抽象データ型で定義した列を指定してください。

表に定義しているBLOB型の列，又はBLOB属性を含む抽象データ型の列はすべて指定する必要があります。

LOB列格納用RDエリア指定：：＝

IN ｛LOB列格納用RDエリア名

　　 ｜（LOB列格納用RDエリア名）

　　 ｜（（LOB列格納用RDエリア名）

　　　　〔，（LOB列格納用RDエリア名）〕…）｝

BLOB列のデータを格納するユーザLOB用RDエリアの名前を指定します。

指定するRDエリア名は，表格納用RDエリア名に指定したRDエリアと同じサーバにあるユーザLOB用RDエリアを指定してください。LOB列格納用RDエリアは，表定義で指定した表格納用RDエリアと1対1に対応するように指定してください。また，表格納用RDエリアに重複したRDエリアがある場合は，LOB列格納用RDエリアも同一位置が重複するように指定してください。上記以外の場合は，LOB列格納用RDエリアは重複して指定できません。

抽象データ型定義内LOB格納用RDエリア指定：：＝

ALLOCATE（属性名〔..属性名〕…

　　IN ｛LOB属性格納用RDエリア名

　　　　 ｜（LOB属性格納用RDエリア名）

　　　　 ｜（（LOB属性格納用RDエリア名）

　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝

　　〔，属性名〔..属性名〕…

　　　　IN ｛LOB属性格納用RDエリア名

　　　　　　 ｜（LOB属性格納用RDエリア名）

　　　　　　 ｜（（LOB属性格納用RDエリア名）

　　　　　　　　〔，（LOB属性格納用RDエリア名）〕…）｝〕…）

属性名〔..属性名〕

抽象データ型を構成する属性名を指定します。抽象データ型の属性が抽象データ型であり，その入れ子になっている抽象データ型の属性にLOB型の属性がある場合は，そのLOB型の属性名を指定してください。

属性名は，次のような場合に指定してください。

抽象データ型定義の属性

抽象データ型定義の属性のデータ型がLOB型であれば指定してください。

抽象データ型定義の入れ子

抽象データ型の属性が抽象データ型であり，その入れ子になっている抽象データ型の属性にLOB型の属性であれば，そのLOB型の属性名を指定してください。

LOB属性格納用RDエリア名

抽象データ型の任意の階層にある，BLOB属性のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB属性格納用RDエリアについての規則を次に示します。

抽象データ型内にあるすべてのBLOB属性に対して，ユーザLOB用RDエリアを指定してください。

指定するRDエリア名は，表格納用RDエリア名に指定したRDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

LOB属性格納用RDエリアは，表定義で指定した表格納用RDエリアと1対1に対応するように指定してください。また，表格納用RDエリアに重複したRDエリアがある場合は，LOB属性格納用RDエリアも同一位置が重複するように指定してください。

上記以外の場合は，LOB属性格納用RDエリアは重複して指定できません。

FOR INDEX インデクス識別子 インデクス格納用RDエリア指定

〔，インデクス識別子 インデクス格納用RDエリア指定〕…〕

RDエリアを追加する表にインデクスが定義されている場合，追加する表格納用RDエリアに対応するインデクス格納用のRDエリアを指定します。

インデクス識別子

RDエリアを追加する表に定義されているインデクスの，インデクス識別子を指定します。

インデクス格納用RDエリア指定

インデクス格納用RDエリア指定については，ADD RDAREAのインデクス格納用RDエリア指定の説明を参照してください。

FOR 〔PRIMARY〕 CLUSTER KEY インデクス格納用RDエリア指定

RDエリアを追加する表にクラスタキーが定義されている場合，追加する表格納用RDエリアに対応するクラスタキー格納用のRDエリアを指定します。

PRIMARY

クラスタキーを主キーとして定義している場合に指定します。

インデクス格納用RDエリア指定

インデクス格納用RDエリア指定については，ADD RDAREAのインデクス格納用RDエリア指定の説明を参照してください。

FOR PRIMARY KEY インデクス格納用RDエリア指定

RDエリアを追加する表に主キーが定義されている場合，追加する表格納用RDエリアに対応する主キー格納用のRDエリアを指定します。

クラスタキーを構成する列を主キーとして定義している場合，FOR PRIMARY CLUSTER KEYを指定してください。

インデクス格納用RDエリア指定については，ADD RDAREAのインデクス格納用RDエリア指定の説明を参照してください。

インデクス格納用RDエリア指定：：＝

IN｛インデクス格納用RDエリア名

　　｜（インデクス格納用RDエリア名）

　　｜（（インデクス格納用RDエリア名）

　　　〔，（インデクス格納用RDエリア名）〕…）｝

インデクス，クラスタキー，又は主キーを格納するRDエリアの名称を指定します。

CREATE INDEX 形式1で定義したインデクス（インデクス構成列のデータ型が抽象データ型以外），CREATE INDEX 形式3で定義したインデクス（部分構造インデクス），クラスタキー，及び主キーの場合は，一時表用RDエリア以外のユーザ用RDエリアを指定します。ただし，HiRDB/パラレルサーバでは，共用表の場合は共用RDエリアを指定します。

CREATE INDEX 形式2で定義したインデクス（インデクス構成列のデータ型が抽象データ型）の場合は，ユーザLOB用RDエリアを指定します。

インデクス格納用RDエリアを指定する場合の規則を次に示します。

HiRDB/パラレルサーバの場合，追加する表を格納するRDエリアと，それに対応するインデクスを格納するRDエリアは，同じバックエンドサーバになければなりません。

サーバ内で横分割しているインデクスは，表を格納するRDエリアとインデクスを格納するRDエリアの数を同じにする必要があります。

サーバ内で横分割していないインデクスは，表を格納するバックエンドサーバとインデクスを格納するRDエリアの数を同じにする必要があります。

ユーザ用RDエリアを追加する場合，次の計算式を満たすようなRDエリアを指定する必要があります。

　キー長≦(インデクス格納用RDエリアのページサイズ÷2)−1242

インデクス格納用RDエリアは，表定義で指定した表格納用RDエリアと1対1に対応するように指定してください。また，表格納用RDエリアに重複したRDエリアがある場合は，インデクス格納用RDエリアも同一位置が重複するように指定してください。

インデクス種別によるインデクス格納用RDエリアの指定可否を次の表に示します。インデクス格納用RDエリアの指定が必要となっているインデクスについては，必ずインデクス格納用RDエリアを指定してください。

表3‒3　インデクス種別によるインデクス格納用RDエリアの指定可否

インデクスの定義方法

インデクスの分割方法

インデクス格納用RDエリアの指定要否

CREATE INDEX 形式1，又は形式3で定義したインデクス，及び主キー

1サーバ内だけの横分割※１

サーバ内分割キーインデクス

○

サーバ内非分割キーインデクス

サーバ間だけの横分割※２

サーバ内分割キーインデクス

サーバ内非分割キーインデクス

×※５※６

サーバ内，かつサーバ間の横分割※３

サーバ内分割キーインデクス

○

サーバ内非分割キーインデクス

非分割※４

非分割キーインデクス

×※５

CREATE INDEX 形式2で定義したインデクス，及びクラスタキー

1サーバ内だけの横分割※１

○

サーバ間だけの横分割※２

サーバ内，かつサーバ間の横分割※３

（凡例）

○：インデクス格納用RDエリアを指定する必要があります。

×：インデクス格納用RDエリアを指定する必要はありません。

注※1

HiRDB/シングルサーバでの横分割，又はHiRDB/パラレルサーバで一つのバックエンドサーバに閉じた横分割のことをいいます。

注※2

HiRDB/パラレルサーバで複数のバックエンドサーバにわたった横分割で，かつバックエンドサーバ内ではインデクスを分割していない横分割のことをいいます。

注※3

HiRDB/パラレルサーバで複数のバックエンドサーバにわたった横分割で，かつバックエンドサーバ内でもインデクスを分割している横分割のことをいいます。

注※4

横分割していないインデクスのことをいいます。

注※5

RDエリアの追加によって，表を格納するバックエンドサーバの数が増える場合は，インデクス格納用RDエリアも指定する必要があります。

注※6

RDエリアを追加しても表を格納するバックエンドサーバの数が変わらない場合，インデクス格納用RDエリアを指定することもできます。インデクス格納用RDエリアを指定すると，インデクスはサーバ内の横分割をしたインデクスとなります。

WITH PROGRAM

ハッシュ分割表にRDエリアを追加する場合，その表を使用する手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトを無効にするときに指定します。

(e)　列属性変更定義

：：＝CHANGE｛列名｛〔｛VARCHAR（データ長）
　　　　　　　　　　　　　｜NVARCHAR（データ長）
　　　　　　　　　　　　　｜MCHAR（｛＊｜データ長｝）
　　　　　　　　　　　　　｜MVARCHAR（｛＊｜データ長｝）｝
　　　　　　　　　　　　　〔ARRAY ［｛＊｜最大要素数｝］〕〕
　　　　　　　　　　　｜〔ARRAY ［最大要素数］〕
　　　　　　　　　　　｜BINARY（データ長）｝
　　　　　　　　　　　〔｛NO SPLIT｜SPLIT｝〕〔列回復制約２〕
　　　　　　　　　　　〔｛SET DEFAULT句｜DROP DEFAULT｝〕
　　　　　　　　　　　〔WITH DEFAULT〕〔更新可能列属性〕
　　　　　　　　｜CLUSTER KEY〔UNIQUE〕
　　　　　　　　｜LOCK｛ROW｜PAGE｝
　　　　　　　　｜HASH ハッシュ関数名
　　　　　　　　｜SEGMENT REUSE
　　　　　　　　　　　　｛〔セグメント数〔｛K｜M｝〕〕｜NO｝
　　　　　　　　｜SEGMENT REUSE OPTION 再利用オプション値
　　　　　　　　｜INSERT ONLY
　　　　　　　　　〔WHILE ｛日間隔データ｜ラベル付き間隔｝ BY 列名〕｝
　　　　　　　　〔WITH PROGRAM〕

列名

定義を変更する場合，列の名称を指定します。

列名についての規則を次に示します。

ビュー表定義時にビュー定義文中で次に示す指定をした列は，ALTER TABLEで定義内容を変更できません。

・選択式や探索条件中でスカラ関数の引数として指定した列

・選択式や探索条件中で関数呼出しの引数として指定した列

・選択式や探索条件中で連結演算の演算項として指定した列

・選択式や探索条件中でCASE式の値式中に指定した列

・選択式や探索条件中でCAST指定の値式中に指定した列

ビュー表定義時にビュー定義文中で次に示す指定をした場合，そのビュー表で指定した表の列は，ALTER TABLEで定義内容を変更できません。

・行副問合せを含む場合

・集合演算を用いたスカラ副問合せ，表副問合せを含む場合

・FROM句の導出表，又はEXISTS述語以外で結果の列数が2以上の表副問合せを含む場合

・選択式中にスカラ副問合せを含む場合

・比較述語，IN述語，及び限定述語の左側の行値構成子が，スカラ副問合せを含む場合

・比較述語の右側の行値構成子が，スカラ副問合せを含む場合でかつ行値構成子要素数が2以上の場合

・IN述語の右側の行値構成子の並び中に，スカラ副問合せを含む場合

・BETWEEN述語，LIKE述語，XLIKE述語，SIMILAR述語，NULL述語及び論理述語中にスカラ副問合せを含む場合

・値式中にスカラ副問合せを含む場合

列名は，表識別子で指定した実表中の列名を指定してください。

列名の後に，列定義の変更内容を指定するオペランドを一つ以上指定してください。

｛VARCHAR（データ長）

｜NVARCHAR（データ長）

｜MCHAR（｛＊｜データ長｝）

｜MVARCHAR（｛＊｜データ長｝）

｜BINARY（データ長）｝

可変長データのデータ長を変更する場合に指定します。又はデータ型を，CHARからMCHARに，VARCHARからMVARCHARに変更する場合に指定します。

規則を次に示します。

可変長データ型の列の最大長は小さくできません。

インデクスの定義された可変長データ型の列の場合，次の計算式を満たさないような変更はできません。

キー長≦

MIN((インデクス格納用RDエリアのページサイズ÷2)−1242，4036)

最大長を変更しない場合，データ型の指定は省略してください。

ビュー定義文中の導出問合せ式に指定した列のうち，次に示す指定をした列は，32,001バイト以上のBINARYに変更できません。

・比較述語，限定述語，及びIN述語の副問合せ中に指定した列

・重複排除に指定した列

・グループ分け，又は集合関数に指定した列

・集合演算の対象となる問合せ指定の選択式に指定した列

・内部導出表を作成する条件の，どれかを満たす問合せ指定中で，内部導出表として展開されるビュー表を定義するときに指定した列

内部導出表となる条件については，「内部導出表」を参照してください。

CHARをMCHARに変更できます。その場合，データ長は変更できません。データ長には，変更前のデータ長，又は＊を指定してください。

VARCHARをMVARCHARに変更できます。その場合，列の最大長を大きくできます。最大長を変更しない場合，データ長には変更前の最大長，又は＊を指定してください。

文字集合を指定した列は，データ型を変更できません。

次のBINARY型の列は32,001バイト以上に変更できません。

・更新可能列属性のUPDATE ONLY FROM NULLを指定している列

・データ長の変更と同時に更新可能列属性のUPDATE ONLY FROM NULLを付与する列

予備列のデータ型をCHARからMCHARに変更することはできません。

ARRAY ［｛＊｜最大要素数｝］

繰返し列の最大要素数を大きくする場合に指定します。

規則を次に示します。

最大要素数には，2〜30,000の符号なし整数を指定します。

省略した場合は，繰返し列でないことを示します。

最大要素数を変更しない場合は，＊を指定してください。

最大要素数は小さくできません。

ARRAY ［最大要素数］

繰返し列の最大要素数を大きくする場合に指定します。

最大要素数には，2〜30,000の符号なし整数を指定します。

最大要素数は小さくできません。

｛NO SPLIT｜SPLIT｝

可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）のデータ格納時に，データベース容量を削減したい場合に指定します。

可変長文字列型の定義長を255バイト以下から256バイト以上に変更する場合で，データベース容量を削減したい場合は，NO SPLITを指定してください。

NO SPLIT，及びSPLITの詳細（ノースプリットオプション）については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

NO SPLIT

実データ長が256バイト以上の場合に指定します。

バージョン09-50より前のHiRDBで，CREATE TABLE又はALTER TABLE ADDによって定義した，定義長が256バイト以上である可変長文字列型の列のうち，定義時にNO SPLITを指定していない列に対して指定します。

実表にデータが格納されている場合，指定できません。

SPLIT

実データ長が255バイト以下の場合に指定します。

バージョン09-50より前のHiRDBで，CREATE TABLE又はALTER TABLE ADDによって定義した，定義長が255バイト以下である可変長文字列型の列のうち，定義時にNO SPLITを指定した列に対して指定します。

実表にデータが格納されている場合，指定できません。

列回復制約2：：＝　RECOVERY｛ALL｜PARTIAL｜NO｝

データ型がBLOBの列又はBLOB属性を含む抽象データ型の列の場合，列に対するデータベースの更新ログ取得方式を変更するときに指定します。ALL，PARTIAL，及びNOの内容はALTER TABLE ADDの列回復制約１と同じです。

｛SET DEFAULT句｜DROP DEFAULT｝

SET DEFAULT句

DEFAULT句：：＝DEFAULT 〔既定値〕

既定値を設定又は変更する場合に指定します。規則を次に示します。

指定できる列のデータ型はALTER TABLE ADDのデフォルト句と同じです。

WITH DEFAULTを定義している列に対してSET DEFAULT句を指定した場合，WITH DEFAULTの指定は無効となり，SET DEFAULT句の指定が有効となります。

一つのALTER TABLEで，WITH DEFAULTと同時には指定できません。

最大長を変更する列が既定の文字集合以外の場合，DEFAULT句に次の項目は指定できません。

・CURRENT_DATE(CURRENT DATE)

・CURRENT_TIME(CURRENT TIME)

・CURRENT_TIMESTAMP(CURRENT TIMESTAMP)

改竄防止表の行削除禁止期間を指定した挿入履歴保持列には指定できません。

予備列に対してSET DEFAULT句は指定できません。

DROP DEFAULT

既定値を削除する場合に指定します。

DROP DEFAULTは，DEFAULT句を指定している列に対して指定してください。

WITH DEFAULT

既定値のない非ナル値制約のある列を，既定値のある非ナル値制約の列に変更する場合に指定します。

WITH DEFAULTについての規則を次に示します。

非ナル値制約のない列には指定できません。

既に既定値のある非ナル値制約の列に対して，WITH DEFAULTは指定できません。

DEFAULT句を定義している列に対して，WITH DEFAULTは指定できません。

一つのALTER TABLEで，SET DEFAULT句，又はDROP DEFAULT句と同時には指定できません。

既定値を持つ列を既定値のない列に変更できません。

繰返し列には指定できません。

抽象データ型の列には指定できません。

予備列には指定できません。

更新可能列属性：：＝UPDATE 〔ONLY FROM NULL〕

改竄防止表に変更する前に更新可能列属性を変更する場合に指定します。

更新可能列属性は改竄防止表の場合だけ有効になります。

改竄防止表への変更については，「INSERT ONLY」オプションを参照してください。

更新可能列属性についての規則を次に示します。

改竄防止表に対しては指定できません。

SYSTEM GENERATEDを指定した列には指定できません。

既に更新可能列属性を指定している列には指定できません。

次に示す更新できない列には指定できません。

・クラスタキー構成列

・分割キー構成列（フレキシブルハッシュ分割表の分割キー構成列を除く）

・予備列

UPDATE

改竄防止表に変更後も更新可能な列になります。

UPDATE ONLY FROM NULL

改竄防止表に変更後ナル値から非ナル値へ一度だけ更新できます。

改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

○

ナル値

非ナル値

○

非ナル値

ナル値

×

非ナル値

非ナル値※

×

（凡例）

○：更新できます。

×：更新できません。

注

繰返し列の場合は，ナル値（要素数が0の値）から添え字指定なしでの列単位更新だけ実行できます。

注※　更新前の値と同値含む

UPDATE ONLY FROM NULL指定についての規則を次に示します。

NOT NULLを指定した列には指定できません。

FIX表の場合指定できません。

主キー又はクラスタキー構成列には指定できません。

分割キー構成列には指定できません。

BLOB型及び定義長が32,001バイト以上のBINARY型の列には指定できません。

更新可能列属性の指定可否と指定時の列の値の更新可否は次のようになります。

表種別

UPDATE指定

UPDATE ONLY

FROM NULL指定

左記の

指定なし

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

非改竄防止表

○

○

○

○

−

○

改竄防止表

×

○

×

○※

−

×

（凡例）

○：更新できます。

×：更新できません。

−：該当しません。

注※

ナル値から非ナル値へ一度だけ更新できます。

CLUSTER KEY UNIQUE

一意性制約のないクラスタキーを一意性制約のあるクラスタキーに変更する場合に指定します。

CLUSTER KEY UNIQUEについての規則を次に示します。

実表にデータが入っている場合，クラスタキーの属性は変更できません。

表定義で一意性制約のあるクラスタキーを定義している場合は指定できません。

フレキシブルハッシュ分割の表に対しては指定できません。

CLUSTER KEY

一意性制約のあるクラスタキーを一意性制約のないクラスタキーに変更する場合に指定します。

実表にデータが入っている場合，クラスタキーの属性は変更できません。

表定義で一意性制約のないクラスタキーを定義している場合は指定できません。

LOCK｛ROW｜PAGE｝

表の最小排他資源単位を変更する場合に指定します。

行単位に変更する場合はLOCK ROWを，ページ単位に変更する場合はLOCK PAGEを指定してください。

HASH ハッシュ関数名

表をハッシュ関数によって横分割している場合に，ハッシュ関数を変更するときに指定します。データが格納されているFIXハッシュ分割の表に対しては変更できません。

リバランス機能を使用する表のハッシュ関数に，HASH1〜HASH6，HASHZ，HASH0は指定できません。また，リバランス機能を使用しない表のハッシュ関数に，HASHA〜HASHFは指定できません。

SEGMENT REUSE ｛〔セグメント数〔｛K｜M｝〕〕｜NO｝

セグメント数を変更します。空き領域を再利用する処理はオーバヘッドが掛かるため，性能よりも格納効率を優先するシステムにだけ適用してください。

空き領域の再利用機能については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

セグメント数〔｛Ｋ｜Ｍ｝〕

空き領域の再利用機能を使用し，かつ該当する表のセグメント数に上限を設定する場合，その上限のセグメント数を指定します。セグメント数は，1〜268,435,440の符号なし整数で指定できます。また，単位として，K（キロ），又はM（メガ）を指定できますが，268,435,440を超える値は指定できません。

行の挿入，削除を頻繁に行う表に対して，行の挿入性能の向上，及び指定したセグメント内での格納効率の向上が期待できます。

セグメント数の指定なし

空き領域の再利用機能を使用し，かつ該当する表のセグメント数に上限を設定しない場合，セグメント数を省略します。

行の挿入，削除を頻繁に行う表で，かつRDエリアに格納される表が該当する表だけの場合に適用してください。行の挿入性能の向上，及び該当する表を格納するRDエリア内での，空き領域の格納効率の向上が期待できます。

NO

空き領域の再利用機能を使用しない場合に指定します。

行の挿入，削除を頻繁に行わない表に対してはNOを指定してください。

SEGMENT REUSEについての規則を次に示します。

空き領域の再利用機能は，LOB列，LOB属性の抽象データ型列，及びインデクスに対しては無効となります。

空き領域の再利用機能は，リバランス表に対しては指定できません。

SEGMENT REUSE OPTION 再利用オプション値

再利用オプション機能の適用範囲を変更する場合に指定します。この機能を適用している場合，空き領域の再利用機能を使用したときのデータ格納効率が向上します。空き領域の再利用機能が非適用の表に対しては指定できません。

再利用オプション値には0〜3を値として指定できます。0を指定した場合は，再利用オプション機能を適用しません。なお，このオプションの推奨値は3です。

それぞれを指定すると，次の場合に格納効率の向上が期待できます。

各機能の再利用オプション値

機能

格納効率の向上が期待できるケース

1

UPDATE対応

固定長データ，ADT列のNULL値からのUPDATEがある

BINARY列のUPDATEがある

VARCHAR列，NVARCHAR列，MVARCHAR列（NO SPLIT指定）のUPDATEがある

確保済みセグメント数に比べてサーチモードの切り替え回数が少ない（pddbstコマンドで確認できる）

2

分岐行が多発する表の格納効率向上

分岐行を作成する表を運用するケース

3

UPDATE対応及び分岐行が多発する表の格納効率向上

固定長データ，ADT列のNULL値からのUPDATEがある

BINARY列のUPDATEがある

VARCHAR列，NVARCHAR列，MVARCHAR列（NO SPLIT指定）のUPDATEがある

確保済みセグメント数に比べてサーチモードの切り替え回数が少ない（pddbstコマンドで確認できる）

分岐行を作成する表を運用するケース

INSERT ONLY 〔WHILE ｛日間隔データ｜ラベル付き間隔｝ BY 列名〕

改竄防止表に変更する場合に指定します。改竄防止表については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

改竄防止表とした場合，その表の値は更新できません。ただし，更新可能列は更新できます。

改竄防止表には，行の削除を禁止する期間（行削除禁止期間）を指定できます。行削除禁止期間を指定する場合，WHILEで期間を指定し，列名には挿入履歴保持列（DATE型の列で，かつSYSTEM GENERATEDの列）を指定してください。削除禁止期間を指定しない場合，永久的に行の削除はできません。

日間隔データ

行削除禁止期間を，日間隔データの10進数表現で指定します。日間隔データの10進数表現については，「日間隔データの10進数表現」を参照してください。

なお，日間隔データは正の値だけ指定できます。

ラベル付き間隔

行削除禁止期間を，ラベル付き間隔で指定します。ラベル付き間隔については，「日付演算」を参照してください。

ラベル付き間隔の値式には，括弧で囲まれていない正の整数定数だけ指定できます。

列名

DATE型で，かつSYSTEM GENERATEDの列を指定してください。

行削除禁止期間には行を挿入した日を含み，行削除禁止期間の計算は，「日付演算」の「日付データと日間隔データとを加減算する場合の規則」に従います。削除禁止最終日付と削除可能日付は，それぞれ次の演算結果となります。

削除禁止最終日付＝行挿入日付＋削除禁止期間−1日

削除可能日付＝行挿入日付＋削除禁止期間

行挿入日付と削除禁止期間の指定値での，削除禁止最終日付と削除可能日付の関係については，「削除禁止最終日付と削除可能日付の関係」を参照してください。

表を改竄防止表に変更する場合，次に示す制限があります。

既に改竄防止表となっている表は指定できません。

外部キーを定義した表は改竄防止表に変更できません。

検査制約を定義した表は改竄防止表に変更できません。

すべての列に更新可能列属性を指定している表は改竄防止表に変更できません。

インナレプリカ機能を適用したRDエリアに表を定義している場合，その表を改竄防止表に変更できません。

指定した表に行がある場合，その表を改竄防止表に変更できません。

予備列を定義した表を，改竄防止表とすることはできません。

WITH PROGRAM

次の場合に指定します。

列名の変更，DEFAULT句の既定値の変更，表の排他制御モード変更，ハッシュ分割した表のハッシュ関数の変更，SEGMENT REUSEの変更，又は改竄防止表に変更をする場合に，その表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいとき

クラスタキーの一意性制約属性の変更をする場合に，そのクラスタキーを使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいとき

(f)　列削除定義：：＝DROP 列名〔WITH PROGRAM〕

列名

列を削除する場合に指定します。

列名についての規則を次に示します。

列名は，表識別子で指定した実表中の列名にしてください。

実表にデータが格納されている場合，列は削除できません。

列が1個の場合は，削除できません。

列を削除すると，その列に対するインデクス，注釈，及び削除する列を使用しているビュー表（パブリックビュー表を含む）も削除されます。

クラスタキー又は主キーを定義したインデクスを構成する列は削除できません。

列のデータ型がBLOBの場合は削除できません。

抽象データ型列がある表の列は指定できません。

改竄防止表の挿入履歴保持列の場合，その列は削除できません。

改竄防止表の列を削除した結果，すべての列が更新可能列となる場合，その列は削除できません。

列を削除した結果，予備列だけの表になる場合，その列は削除できません。

予備列を削除すると，その予備列を持つ表を使用しているビュー表（パブリックビュー表を含む）も削除されることがあります。

WITH PROGRAM

表中の列を削除するときに，その表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

(g)　表制約定義削除：：＝DROP PRIMARY KEY〔WITH PROGRAM〕

PRIMARY KEY

主キーを削除する場合に指定します。

主キーを削除する場合の規則を次に示します。

表に主キーが定義されていない場合は指定できません。

参照している外部キーが存在する場合，主キーは削除できません。

クラスタキーとして定義した主キー（PRIMARY CLUSTER KEY）は削除できません。

WITH PROGRAM

主キーを削除するときに，その主キーを使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，その主キーを使用する手続き及びトリガの有効なSQLオブジェクトがあると，その主キーは削除できません。

(h)　表名変更定義：：＝RENAME TABLE TO 表識別子〔WITH PROGRAM〕

表の名称を変更する場合に指定します。

表識別子

変更後の実表の名称を指定します。

表識別子についての規則を次に示します。

インデクスが付いている表の名称も変更できます。

ビュー表の名称は変更できません。

次に示す表の名称は変更できません。

・ビュー表の基になる表

・CREATE PROCEDUREのSQL手続き文中に指定した表

・CREATE TRIGGERのSQL手続き文中に指定した表，及びトリガを定義した表

スキーマ内にある実表及びビュー表と同じ名称には，変更できません。

改竄防止表の名称は変更できません。

WITH PROGRAM

表識別子の名称を変更する場合に，その表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。ただし，WITH PROGRAMを指定しても，トリガを定義した表の表名は変更できません。

(i)　列名変更定義：：＝RENAME COLUMN FROM 変更前列名 TO 変更後列名〔WITH PROGRAM〕

列の名称を変更する場合に指定します。

変更前列名，変更後列名

名称を変更する列の，変更前と変更後の名称を指定します。

変更前列名，変更後列名についての規則を次に示します。

インデクスのキー列の名称も変更できます。

ビュー表の列名は変更できません。

次に示す列の名称は変更できません。

・ビュー表の基になる表の列

・CREATE PROCEDUREのSQL手続き文中に指定した表の列

・CREATE TRIGGERのSQL手続き文中に指定した表の列，トリガ契機列，及びトリガ動作条件中に指定した列

既に表にある列名には変更できません。

変更前列名が表にない場合は，変更できません。

改竄防止表の列名は変更できません。

WITH PROGRAM

列の名称を変更するときに，その列を含む表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。ただし，WITH PROGRAMを指定しても，次の列の列名は変更できません。

トリガ契機列

トリガ動作条件中で新旧値相関名を使用して参照している列

トリガSQL文中で新旧値相関名を使用して参照している列

(j)　分割格納条件変更定義

：：＝CHANGE RDAREA ｛横分割表変更指定｜マトリクス分割表変更指定｝
　〔LOB列格納用RDエリア変更指定〕
　〔インデクス格納用RDエリア変更指定
　　〔インデクス格納用RDエリア変更指定〕…〕
　〔クラスタキー格納用RDエリア変更指定〕
　〔主キー格納用RDエリア変更指定〕
　〔WITHOUT PURGE〕〔WITHOUT PROGRAM〕

横分割された表やマトリクス分割された表の分割格納条件を変更する場合に指定します。

次に示す表は，分割格納条件を変更できません。

抽象データ型の列を持つ表

本文中では，データ型にBLOB型を指定した列を”LOB列”と記述します。

一つのALTER TABLE文での，表の分割格納条件の分割，統合の単位は次のとおりです。

表種別

表の分割方法

実行種別

分割

統合

横分割表

キーレンジ分割

境界値指定

任意の1個の境界値を2〜16個に分割します。

任意の2〜16個の境界値を1個に統合します。

格納条件指定

任意の1個のRDエリアを2〜16個に分割します。

任意の2〜16個のRDエリアを1個に統合します。

マトリクス分割表

キーレンジ分割

境界値指定

一つの次元の1個の境界値を2〜16個に分割します。結果として，n個の境界値を2n〜16n個の境界値に分割します。

一つの次元の2〜16個の境界値を1個に統合します。結果として，2n〜16n個の境界値をn個の境界値に統合します。

（凡例）

n：分割又は統合する表の分割格納条件に該当する別次元の分割数

表の分割格納条件を分割・統合する場合のSQL例については，「使用例」の9.（境界値指定の横分割表の場合），10.（格納条件指定の横分割表の場合），又は11.（マトリクス分割表の場合）を参照してください。また，分割格納条件を変更した場合，変更対象のRDエリアに格納されているデータは，ALTER TABLE実行時にシステムが削除します（「WITHOUT PURGE」オプションを指定した場合，変更対象のデータを，削除する範囲が変わる場合があります。詳細は「WITHOUT PURGE」オプションを参照してください）。このため，ALTER TABLE実行後も使用するデータは，データを格納し直す必要があります。分割格納条件の変更を行う前にデータをアンロードし，分割格納条件の変更後にデータのロードを行うなどの操作が必要です。削除するデータを格納し直す方法については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件を変更するときの運用」を参照してください。

表の分割格納条件の変更時の規則を次に示します。

《表の分割格納条件の変更前の確認事項》

表の分割格納条件の変更前の確認事項を次に示します。

分割格納条件を変更する場合，HiRDB Advanced High Availabilityが必要です。

表の種別と分割方法によって，分割格納条件を変更できない場合があります。表の種別と分割方法による変更の可否を次に示します。

表種別

分割方法

変更の可否

横分割表

キーレンジ分割

格納条件指定

格納条件の比較演算子に=だけを用いた表

○

格納条件の比較演算子に=以外を用いた表

×

境界値指定

○

ハッシュ分割

×

マトリクス分割表

第1次元：境界値指定

第2次元：境界値指定

○

第1次元：境界値指定

第2次元：ハッシュ分割

○※2

非分割表※1

−

×

（凡例）

　　○：変更できます。

　　×：変更できません。

　　−：該当しません。

注※1　分割格納条件を指定していない表です。

注※2　境界値指定の次元だけ変更できます。ハッシュ分割の次元は変更できません。

表格納用RDエリア，インデクス格納用RDエリア及びLOB列格納用RDエリアが，1対1の関係にない場合，分割格納条件を変更できません。

格納条件指定の横分割表，又は境界値指定のキーレンジ分割の組み合わせのマトリクス分割表の場合，次の条件をすべて満たすときは分割格納条件を変更できません。

・変更対象の表にインデクス，主キー，又はクラスタキーが定義されている

・変更対象の表又は変更した結果の表の表格納用RDエリアが一つである

改竄防止表の分割格納条件は，変更できません。

インナレプリカ機能を使用している場合の確認事項を次に示します。

・表，インデクス，主キー，クラスタキー，LOB列を格納するRDエリアの世代数をすべて同じにする必要があります。

・表に参照制約を定義している場合，参照表及び被参照表を格納するRDエリアの世代数を，すべて同じにする必要があります。

《表の分割格納条件の変更時の規則》

表の分割格納条件の変更時の規則を次に示します。

1回のALTER TABLEで分割格納条件の分割と統合を同時に実行できません。2回のALTER TABLEに分けて実行する必要があります。

変更対象の表のRDエリア（横分割表変更指定，又はマトリクス分割表変更指定の変更前境界値リストで特定するRDエリア，又は変更前RDエリア情報リストで指定するRDエリア），インデクス格納用RDエリア及びLOB列格納用RDエリアは，1対1の関係にする必要があります。

表，インデクス，主キー，クラスタキー，及びLOB列は，表を基準に分割数やRDエリアの重複の対応関係を維持する必要があります（例えば，表の変更前後で，システムが境界値を一つにまとめる場合，及び指定するRDエリアが変更対象の境界値以外のデータを格納している場合，変更前後で同じRDエリアを使用し，同じRDエリアを指定する位置などをインデクス，主キー，クラスタキー，及びLOB列も同じように指定する必要があります。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件の変更」を参照してください）。

格納条件指定の横分割表の場合，表定義変更後の表格納用RDエリア名は重複しないようにしてください。

表定義変更後の総分割RDエリア数の最大数は重複を含んで4,096個です。

表定義変更後の総格納条件指定数（格納条件を指定しないRDエリアも含む）の最大数は15000個です。

変更対象として指定したRDエリアの表のデータは，ALTER TABLE実行時にシステムが削除します（そのRDエリアに対応するインデクス格納用RDエリア，及びLOB列格納用RDエリアのデータもシステムが削除します）。また，インナレプリカ機能を使用している場合，変更対象の表，インデクス，主キー，クラスタキー，及びLOB列（LOB型属性列含む）を格納するすべての世代のレプリカRDエリアのデータもALTER TABLE実行時にシステムが削除します（変更時の注意事項の4を参照してください）。

システム定義のpd_check_pendingオペランドにUSEを指定した場合，変更対象の表が被参照表のとき，被参照表を参照する参照表に対し，ディクショナリ表とRDエリア中の表情報を検査保留状態に設定します。また，インナレプリカ機能を使用している場合は，すべての世代でRDエリア中の表情報を検査保留状態に設定します。

検査保留状態の表の分割格納条件を変更した場合の，検査保留状態の解除に関する規則を次に示します。

<<RDエリアの表情報中に設定された検査保留状態>>

データ削除対象のRDエリアだけ，変更対象表の検査保留状態を解除します。

<<ディクショナリ表中に設定された検査保留状態>>

システム定義のpd_check_pendingオペランドにUSEを指定している場合に，検査保留状態を解除するディクショナリ表を次の表に示します。NOUSEを指定している場合は，検査保留状態を解除するディクショナリ表はありません。

表3‒4　 システム定義のpd_check_pendingオペランドにUSEを指定している場合に，検査保留状態を解除するディクショナリ表

変更対象表に定義されている制約

表情報に検査保留状態が設定されたRDエリアの有無※

検査保留状態を解除するディクショナリ表

参照制約

なし

SQL_REFERENTIAL_CONSTRAINTS表

CHECK_PEND列

SQL_TABLES表

CHECK_PEND列

検査制約

なし

SQL_CHECKS表

CHECK_PEND2列

SQL_TABLES表

CHECK_PEND2列

参照制約及び検査制約

参照制約：なし

検査制約：なし

SQL_REFERENTIAL_CONSTRAINTS表

CHECK_PEND列

SQL_CHECKS表

CHECK_PEND2列

SQL_TABLES表

CHECK_PEND列，CHECK_PEND2列

参照制約：なし

検査制約：あり

SQL_REFERENTIAL_CONSTRAINTS表

CHECK_PEND列

SQL_TABLES表

CHECK_PEND列

参照制約：あり

検査制約：なし

SQL_CHECKS表

CHECK_PEND2列

SQL_TABLES表

CHECK_PEND2列

制約が定義されていない

なし

−

−

（凡例）

　　−：該当しません。

注※　インナレプリカ機能を使用している場合は，すべての世代の変更対象表の表格納用RDエリアを示します。

変更対象のデータを削除する範囲を次に示します（「WITHOUT PURGE」オプションを指定した場合，変更対象のデータを，削除する範囲が変わることがあります。詳細については，「WITHOUT PURGE」オプションを参照してください）。

境界値指定の横分割表の場合：

・変更前境界値リストに指定した境界値で特定するRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

・変更前境界値リストに指定した境界値で特定するRDエリアが，変更対象以外の境界値のデータを格納するRDエリアと重複していた場合，変更対象以外の境界値のデータ。

・インナレプリカ機能を使用している場合，変更前境界値リストに指定した境界値で特定するRDエリアの全世代のレプリカRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

格納条件指定の横分割表の場合：

・変更前RDエリア情報リストに指定したRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

・インナレプリカ機能を使用している場合，変更前RDエリア情報リストに指定したRDエリアの全世代のレプリカRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

マトリクス分割表の場合：

・変更対象列名と変更前境界値リストに指定した境界値で特定する複数のRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

・変更前境界値リストに指定した境界値で特定するRDエリアが，変更対象以外の境界値のデータを格納するRDエリアと重複していた場合，変更対象以外の境界値のデータ。

・インナレプリカ機能を使用している場合，変更前境界値リストに指定した境界値で特定するRDエリアの全世代のレプリカRDエリアの表，インデクス，主キー，クラスタキー，及びLOB列のデータ。

境界値指定の横分割表又はマトリクス分割表の場合，RDエリアが重複（隣り合っていない境界値を格納するRDエリアが同じRDエリアの場合）又は連続（隣り合った境界値を格納するRDエリアが同じRDエリアの場合）するとき，境界値指定の横分割表とマトリクス分割表で次のようになります。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

境界値指定の横分割表の場合を次に示します。

項目

境界値指定の横分割表

ALTER TABLEに指定する変更後のRDエリア※

重複

重複してもかまいません。

連続

連続しないようにしてください。

分割格納条件を変更した結果の表全体のRDエリア

重複

重複してもかまいません。

連続

分割時は，連続したRDエリアをシステムが一つにまとめます。

統合時は指定できません。

マトリクス分割表の場合を次に示します。

項目

境界値指定の横分割表

ALTER TABLEに指定する変更後のRDエリア※

重複

重複してもかまいません。

連続

連続してもかまいません。

分割格納条件を変更した結果の表全体のRDエリア

重複

重複してもかまいません。

連続

連続したRDエリアをシステムは一つにまとめません。

注※

　　変更後境界値分割指定，又はマトリクス分割表格納用RDエリア変更指定に指定したRDエリアです。

統合した結果，表格納用RDエリアが次の状態になる指定はできません。

・表の分割数が1個になる場合

・一つの次元の分割数が1個になる場合

変更後のRDエリアに共用RDエリアは指定できません。

分割格納条件を変更する表を使用する手続き，及びトリガを定義している場合，「WITH PROGRAM」を指定して手続き，及びトリガを無効化する必要があります。

分割格納条件を変更する場合の注意を次に示します。

《変更時の注意事項》

分割格納条件を変更する表を使用する手続き，及びトリガが定義され，「WITH PROGRAM」を指定して手続き，及びトリガを無効化した場合，定義無効化になった手続き，及びトリガはALTER ROUTINEで再作成する必要があります（手続きの場合，ALTER PROCEDURE，トリガの場合，ALTER TRIGGERで再作成することもできます）。

変更対象の境界値で特定するRDエリアが，変更対象以外の境界値のデータを格納するRDエリアと重複していた場合，システムは変更対象のRDエリアの表のデータをすべて削除するため，変更対象以外の境界値のデータも削除します。

変更対象の表のデータを変更した結果の表に格納し直す場合，及び障害に備えてデータのバックアップを取得する場合，変更する前のデータをデータベース再編成ユティリティ（pdrorg）でアンロードし，変更した結果の表にロードする運用方法や，データベース複写ユティリティ(pdcopy)でRDエリアのバックアップを取得する運用方法などが必要です。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件を変更するときの運用」を参照してください。

変更する表が被参照表で，表のデータを削除する場合，参照表，及び被参照表の整合性を保てなくなります。この場合，表の分割格納条件の変更を行い，表のデータを変更した結果の表に格納し直した後に，参照表と被参照表の整合性を確認してください。変更後の表に格納し直す方法については，変更時の注意事項の項番3を，確認方法については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件を変更するときの運用」を参照してください。

インナレプリカ機能を使用している場合，参照表，及び被参照表を格納するRDエリアの世代数をすべて同じにしていなかったとき，参照表，及び被参照表の整合性を保てなくなります。参照表，及び被参照表の整合性が保てなくなった場合，RDエリアのバックアップからデータを回復するなどの運用が必要です。運用方法については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件を変更するときの運用」を参照してください。

システム定義のpd_check_pendingオペランドにUSEを指定した場合，分割格納条件を変更する表を被参照表とする参照表がほかのユーザによって使用されていたとき，そのトランザクションが終了してから参照表を検査保留状態に設定します。

(k)　横分割表変更指定

：：＝｛〔PARTITIONED〕変更前境界値リスト INTO 変更後境界値分割指定
　　　　｜PARTITIONED CONDITION 変更前RDエリア情報リスト
　　　　　 INTO 変更後格納条件分割指定｝

境界値指定又は格納条件指定の横分割表の，分割格納条件を変更する場合に指定します。

PARTITIONED

境界値指定の横分割表の分割格納条件を変更する場合に指定します。横分割表変更指定の規則を次に示します。

＜分割時＞

一つのSQLで，一つの境界値，及び境界値に対応したRDエリアを分割できます。

変更前境界値リストに指定した境界値を，変更後境界値分割指定に従って分割します。

＜統合時＞

一つのSQLで，連続した複数の境界値，及び境界値に対応したRDエリアを統合できます。

変更前境界値リストに指定した境界値を，変更前境界値リストに指定した最大の境界値，及び変更後境界値分割指定に指定したRDエリアに統合します。

PARTITIONED CONDITION

格納条件指定の横分割表の分割格納条件を変更する場合に指定します。横分割表変更指定の規則を次に示します。

＜分割時＞

一つのSQLで，格納条件に対応した一つのRDエリアを分割できます。

変更前RDエリア情報リストに指定したRDエリアを，変更後格納条件分割指定に従って分割します。

＜統合時＞

一つのSQLで，格納条件に対応した複数のRDエリアを統合できます。

変更前RDエリア情報リストに指定したRDエリアを，変更後格納条件分割指定に指定したRDエリアに統合します。

マトリクス分割表変更指定：：＝

　　　　　MULTIDIM（変更対象列名　変更前境界値リスト）

　　　　　AT 変更後境界値リスト

　　　　　INTO マトリクス分割表格納用RDエリア変更指定

マトリクス分割表の分割格納条件を変更する場合に指定します。

マトリクス分割表格納用RDエリア変更指定についての規則を次に示します。

＜分割時＞

一つのSQLで，任意の一つの次元の境界値，及び境界値に対応したRDエリア群を分割できます。

変更対象列名で特定した次元の，変更前境界値リストで特定したRDエリア群を，変更後境界値リストに指定した境界値，及びマトリクス分割表格納用RDエリア変更指定に指定したRDエリア群に分割します。

＜統合時＞

一つのSQLで，任意の一つの次元の連続した複数の境界値，及び複数のRDエリア群を統合できます。

変更対象列名で特定した次元の，変更前境界値リストで特定したRDエリア群を，変更後境界値リストに指定した境界値で，マトリクス分割表格納用RDエリア変更指定に指定したRDエリア群に統合します。

MULTIDIM（変更対象列名 変更前境界値リスト）

マトリクス分割表の変更対象の分割列名，及び境界値を指定します。

変更対象列名

変更対象の次元の分割列名を指定します。

変更前境界値リスト：：＝（（｛境界値｜MAX｝）〔，（｛境界値｜MAX｝）〕…）

変更対象の境界値を指定します。

AT 変更後境界値リスト

INTO マトリクス分割表格納用RDエリア変更指定

変更後の境界値及び表を格納用するRDエリアを指定します。

(l)　変更前境界値リスト：：＝境界値リスト，変更後境界値リスト：：＝境界値リスト

変更前境界値リスト：：＝境界値リスト

境界値リスト：：＝（（｛境界値｜MAX｝）〔，（｛境界値｜MAX｝）〕…）

変更前の境界値を指定します。指定した境界値から変更対象のRDエリアを特定します。

変更前境界値リストについての規則を次に示します。

＜分割時＞

境界値又はMAXを1個指定できます。

表に定義していない境界値は指定できません。

表に定義した最大の境界値より大きい分割キー値に対しては，境界値の代わりにMAXを指定してください。

＜統合時＞

境界値及びMAXを2〜16個指定できます。

MAXは1個指定できます。

表に定義していない境界値は指定できません。

表に定義した最大の境界値より大きい分割キー値に対しては，境界値の代わりにMAXを指定してください。

連続した境界値を，昇順に指定してください。

同じ境界値を複数指定できません。

境界値

変更する前の表に定義してある境界値を指定します。変更対象の境界値及びRDエリアを特定するために指定します。

MAX

変更する前の表に定義してある最大の境界値を超えた範囲を変更対象にする場合に指定します。

変更後境界値リスト：：＝境界値リスト

境界値リスト：：＝（（｛境界値｜MAX｝）〔，（｛境界値｜MAX｝）〕…）

変更後の境界値を指定します。

変更後境界値リストの規則を次に示します。

＜分割時＞

境界値及びMAXを1〜16個指定できます。

MAXは1個指定できます。

境界値には定数を指定してください。

連続した境界値を昇順に指定してください。

最後に指定する境界値は，変更前境界値リストで指定した値を指定してください。

変更前境界値リストで指定した境界値の範囲を超える境界値は指定できません。

境界値に指定できる値については，「CREATE TABLE（表定義）」を参照してください。

＜統合時＞

境界値又はMAXを1個指定できます。

指定する境界値は，変更前境界値リストで最後に指定した値を指定する必要があります。

変更した結果の表で，一つの次元の分割数が一つになる指定はできません。

境界値

変更後の境界値を指定します。

MAX

変更した結果の表の，最後の境界値の範囲を指定します。

(m)　変更後境界値分割指定

：：＝｛表格納用RDエリア名
　　　　｜（表格納用RDエリア名）
　　　　｜（〔（表格納用RDエリア名）境界値，〕…（表格納用RDエリア名））｝

変更前境界値リスト（(j)）で指定した境界値及び変更対象のRDエリアを，指定した境界値及びRDエリアに変更します。指定した境界値を分割キーに持つデータは，直前に指定したRDエリアに格納します。

＜分割時＞

表格納用RDエリア名は2〜16個指定できます。

最後のRDエリアに対しては，境界値を指定できません。

境界値は1〜15個指定できます。

境界値には定数を指定してください。

境界値は昇順に指定してください。

変更前境界値リストで指定した，変更対象の境界値を分割した最後の範囲を格納するRDエリアの場合，RDエリアの直後に境界値を指定しない形式でRDエリア名を記述してください。

変更前境界値リストで指定した変更対象の範囲を超える境界値は指定できません。

表格納用RDエリア名には，同一のRDエリアを複数指定できます。ただし，同一のRDエリアを連続して指定できません。

境界値に指定できる値については，「CREATE TABLE（表定義）」を参照してください。

＜統合時＞

表格納用RDエリア名は1個指定できます。

境界値は指定できません。

変更した結果の表で，格納するRDエリアが一つになる指定はできません。

＜注意事項＞

分割した結果，隣り合った境界値を格納するRDエリアが，同じRDエリアだった場合，システムが境界値を最大の境界値にまとめます。

表格納用RDエリア名

変更後にデータを格納するRDエリアを指定します。ただし，一時表用RDエリアは指定できません。

境界値

分割時に変更後の境界値を指定します。統合時は指定できません。

(n)　変更前RDエリア情報リスト

：：＝｛表格納用RDエリア名
　　　　｜（表格納用RDエリア名）
　　　　｜（（表格納用RDエリア名）
　　　　　　〔，（表格納用RDエリア名）〕…〔，OTHERS〕）
　　　　｜OTHERS｝

変更前の表格納用RDエリア名を指定します。指定した表格納用RDエリア名から変更対象の格納条件を特定します。

変更前RDエリア情報リストについての規則を次に示します。

＜分割時＞

表格納用RDエリア名又はOTHERSを1個指定できます。

表に指定していない表格納用RDエリア名は指定できません。

格納条件に指定している定数が一つだけの表格納用RDエリア名は指定できません。ただし，格納条件を指定していない表格納用RDエリア名は指定できます。

格納条件を指定している表格納用RDエリア名を指定した場合，RDエリア内の格納条件をほかのRDエリアに分割し，新たに格納条件を追加することはできません。

格納条件を指定していない表格納用RDエリア名を指定した場合，新たに格納条件を追加できます。

表定義を変更する表に格納条件を指定していない表格納用RDエリアが存在しない場合，格納条件を追加するときは，表格納用RDエリア名の代わりにOTHERSを指定してください。

格納条件を指定していない表格納用RDエリアが存在する場合，OTHERSは指定できません。

＜統合時＞

表格納用RDエリア名又はOTHERSを2〜16個指定できます。

OTHERSは1個指定できます。

表に指定していない表格納用RDエリア名は指定できません。

同じ表格納用RDエリア名は複数指定できません。

格納条件を指定していない表格納用RDエリア名を含んだ指定をした場合，格納条件を削除できます。

格納条件を指定していない表格納用RDエリアが存在しない場合，格納条件を削除するときは，表格納用RDエリア名の代わりにOTHERSを指定してください。

格納条件を指定していない表格納用RDエリアが存在する場合，OTHERSは指定できません。

表格納用RDエリア名

変更する前の表に指定してある表格納用RDエリア名を指定します。変更対象の格納条件を特定するために指定します。

OTHERS

変更する表に格納条件を指定していない表格納用RDエリアが存在しない場合に，格納条件を追加又は削除するときに指定します。

(o)　変更後格納条件分割指定

：：＝｛表格納用RDエリア名
　　　　｜（表格納用RDエリア名）
　　　　｜（（表格納用RDエリア名）格納条件
　　　　　　｛，（表格納用RDエリア名）格納条件
　　　　　　　〔〔，（表格納用RDエリア名）格納条件〕…〕
　　　　　　　〔｛，（表格納用RDエリア名）
　　　　　　　　　｜，OTHERS｝〕）
　　　　　　　｜，（表格納用RDエリア名））
　　　　　　　｜，OTHERS）｝
　　　　｜OTHERS｝
　格納条件：：＝列名＝｛定数｜（定数〔，定数…〕）｝

変更前RDエリア情報リストで指定した変更対象のRDエリアを，指定した格納条件及びRDエリアに変更します。

変更後格納条件分割指定についての規則を次に示します。

＜分割時＞

表格納用RDエリア名又はOTHERSを2〜16個指定できます。

OTHERSは1個指定できます。

格納条件を指定しない表格納用RDエリア名の指定は1個指定できます。

＜変更前RDエリアリストに格納条件を指定しているRDエリア名を指定した場合＞

格納条件を指定しないRDエリア名及びOTHERSを指定できません。

＜変更前RDエリアリストに格納条件を指定していないRDエリア名を指定した場合＞

格納条件を指定しないRDエリア名又はOTHERSを含めて指定してください。

格納条件を指定していないRDエリアを削除する場合，OTHERSを指定します。

＜変更前RDエリアリストにOTHERSを指定した場合＞

格納条件を指定しないRDエリア名又はOTHERSを含めて指定してください。

格納条件を追加する場合，OTHERSを指定してください。

＜統合時＞

表格納用RDエリア名又はOTHERSは1個指定できます。

格納条件は指定できません。

格納条件を削除する場合，OTHERSを指定してください。

統合を行った結果の表で格納条件がすべてなくなる指定はできません。

＜変更前RDエリアリストに格納条件を指定しているRDエリア名だけを指定した場合＞

格納条件を指定しないRDエリア名を指定できません。

＜変更前RDエリアリストに格納条件を指定していないRDエリア名を含んで指定した場合＞

格納条件を指定していないRDエリアを削除する場合，OTHERSを指定してください。

＜変更前RDエリアリストにOTHERSを含んで指定した場合＞

格納条件を指定しないRDエリアを追加できます。

表格納用RDエリア名

変更後にデータを格納するRDエリア名を指定します。ただし，一時表用RDエリアは指定できません。

格納条件

分割時に変更後の格納条件を指定します。統合時は指定できません。

列名には分割キーに指定している列名を指定してください。

格納条件には定数を指定してください。格納条件に指定できる値については，「CREATE TABLE（表定義）」を参照してください。

＜変更前RDエリア情報リストに格納条件を指定している表格納用RDエリア名を指定した場合＞

変更対象の表格納用RDエリアに指定している格納条件はすべて指定してください。

存在しない格納条件は指定できません。

格納条件を重複して指定できません。

＜変更前RDエリア情報リストに格納条件を指定していない表格納用RDエリア名又はOTHERSを指定した場合＞

表定義に存在しない格納条件を指定してください。

表定義に存在する格納条件は指定できません。

OTHERS

表定義変更した結果，表に定義した格納条件を満たさないデータを格納するRDエリアが必要ない場合に指定します。

(p)　インデクス格納用RDエリア変更指定：：＝ FOR INDEX インデクス名 INTO 変更後インデクス格納用RDエリア名リスト

分割格納条件を変更する表にインデクスを定義している場合に指定します。

インデクス格納用RDエリア変更指定の規則を次に示します。

インデクス格納用RDエリアだけの変更はできません。

インデクス格納用RDエリアは横分割表変更指定又はマトリクス分割表変更指定で指定した境界値と同じ範囲又は格納条件のRDエリアを変更できます。

表に定義したインデクスをすべて指定する必要があります。

インデクス名

分割格納条件を変更する表にインデクスを定義している場合，定義しているインデクスの識別子を指定します。

変更後インデクス格納用RDエリア名リスト：：＝

　　　｛インデクス格納用RDエリア名

　　　　｜（インデクス格納用RDエリア名）

　　　　｜（（インデクス格納用RDエリア名）

　　　　　　〔，（インデクス格納用RDエリア名）〕…〔，OTHERS〕）

　　　　｜２次元格納用RDエリア指定｝

　　　　｜OTHERS｝

２次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト

　　　〔，マトリクス分割用RDエリアリスト〕…)

マトリクス分割用RDエリアリスト：：＝

　　　（インデクス格納用RDエリア名

　　　　〔，インデクス格納用RDエリア名〕…)

インデクス，主キー，又はクラスタキーを格納するRDエリア名を指定します。

変更後インデクス格納用RDエリア名リストの規則を次に示します。

変更後インデクス格納用RDエリア名リストに指定するRDエリアの数は，次の箇所に指定したRDエリアの数と同じにする必要があります。

・変更後境界値分割指定（境界値指定の横分割表の場合）

・変更後格納条件分割指定（格納条件指定の横分割表の場合）

・マトリクス分割表格納用RDエリア変更指定（マトリクス分割表の場合）

変更後境界値分割指定で重複したRDエリアを指定した場合，変更後インデクス格納用RDエリア名リストに指定するRDエリアも，同じように重複して指定する必要があります。

表，インデクス，主キー，及びクラスタキーは，表を基準に，分割数やRDエリアの重複の対応関係を維持する必要があります（例えば，表の変更前後で，システムが境界値を一つにまとめる場合，及び指定するRDエリアが変更対象の境界値以外のデータを格納している場合，変更前後で同じRDエリアを使用し，同じRDエリアを指定する位置などをインデクス，主キー，及びクラスタキーも同じように指定する必要があります）。

変更後格納条件指定でOTHERSを指定した場合，変更後格納条件指定に対応する変更後インデクス格納用RDエリア名リストにOTHERSを指定する必要があります。

2次元格納用RDエリア指定

マトリクス分割表の格納用RDエリアを指定します。

マトリクス分割用RDエリアリスト

マトリクス分割表の一つの次元用のRDエリアを指定します。

インデクス格納用RDエリア名

変更後のデータを格納するRDエリアの名称を指定します。ただし，一時表用RDエリアは指定できません。

OTHERS

変更後格納条件分割指定でOTHERSを指定した場合に指定します。

変更後格納条件分割指定でOTHERSを指定していない場合はOTHERSを指定できません。

(q)　主キー格納用RDエリア変更指定：：＝ FOR PRIMARY KEY INTO 変更後インデクス格納用RDエリア名リスト

分割格納条件を変更する表に主キーを定義している場合に指定します。

主キー格納用RDエリア変更指定の規則を次に示します。

主キー格納用RDエリア変更指定は，1個だけ指定できます。

主キーを格納するRDエリアだけの変更はできません。

FOR PRIMARY KEY

表に主キーを定義している場合に指定します。

変更後インデクス格納用RDエリア名リスト

変更後の主キーを格納するRDエリアを指定します。詳細は変更後インデクス格納用RDエリア名リスト（(n)）を参照してください。

(r)　クラスタキー格納用RDエリア変更指定：：＝ FOR 〔PRIMARY〕 CLUSTER KEY INTO 変更後インデクス格納用RDエリア名リスト

分割格納条件を変更する表にクラスタキーを定義している場合に指定します。

クラスタキー格納用RDエリア変更指定の規則を次に示します。

クラスタキーを格納するRDエリアだけの変更はできません。

クラスタキー格納用RDエリア変更指定は，1個だけ指定できます。

FOR 〔PRIMARY〕 CLUSTER KEY

クラスタキーを格納するインデクス格納用RDエリアを変更する場合に指定します。

PRIMARY

クラスタキーを主キーとして定義している場合に指定します。

変更後インデクス格納用RDエリア名リスト

変更後のクラスタキーを格納するRDエリアの名称を指定します。詳細は変更後インデクス格納用RDエリア名リスト（(n)）を参照してください。

(s)　LOB列格納用RDエリア変更指定

：：＝FOR COLUMN　列名
　｛LOB列格納用RDエリア変更リスト
　　｜INTO マトリクス分割LOB列格納用RDエリア変更指定｝
　〔，列名｛LOB列格納用RDエリア名指定
　　　　　　｜INTO マトリクス分割LOB列格納用RDエリア変更指定｝〕…

分割格納条件を変更する表にLOB列を定義していた場合に指定します。

LOB列格納用RDエリア変更指定の規則を次に示します。

LOB列格納用RDエリアだけの変更はできません。

列名にはLOB列を指定してください。

表に定義しているLOB列はすべて指定する必要があります。

列名

表に定義しているLOB列の名称を指定します。

(t)　LOB列格納用RDエリア変更リスト

：：＝INTO
　｛LOB列格納用RDエリア名
　　｜（LOB列格納用RDエリア名）
　　｜（（LOB列格納用RDエリア名）
　　　　〔，（LOB列格納用RDエリア名）〕…〔，OTHERS〕）
　　｜OTHERS｝

横分割表のLOB列のデータを格納するユーザLOB用RDエリアの名称を指定します。

LOB列格納用RDエリアについての規則を次に示します。

データ型にBLOBを指定した列は，LOB列格納用RDエリア名を必ず指定してください。BLOB以外のデータ型を指定した列には指定できません。

変更後境界値分割指定で重複したRDエリアを指定した場合，LOB列格納用RDエリア名も同じように重複したRDエリアを指定する必要があります。

表，及びLOB列は，表を基準に分割数やRDエリアの重複の対応関係を維持する必要があります（例えば，表の変更前後で，システムが境界値を一つにまとめる場合，及び指定するRDエリアが変更対象の境界値以外のデータを格納している場合，変更前後で同じRDエリアを使用し，同じRDエリアを指定する位置などをLOB列も同じように指定する必要があります）。

変更後格納条件指定でOTHERSを指定した場合，変更後格納条件指定に対応するLOB列格納用RDエリア変更リストにOTHERSを指定する必要があります。

LOB列格納用RDエリア名

LOB列を格納するRDエリア名を指定します。

OTHERS

変更後格納条件分割指定でOTHERSを指定した場合に指定します。

変更後格納条件分割指定でOTHERSを指定していない場合はOTHERSを指定できません。

(u)　マトリクス分割表格納用RDエリア変更指定：：＝2次元格納用RDエリア指定

マトリクス分割LOB列格納用RDエリア変更指定：：＝2次元格納用RDエリア指定

マトリクス分割表格納用RDエリア変更指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）

マトリクス分割された表の，変更後のRDエリアを指定します。

マトリクス分割表格納用RDエリア変更指定の規則を次に示します。

＜分割時（第1次元分割列で分割する場合）＞

マトリクス分割用RDエリアリストの数は，変更後境界値リストで指定した境界値の数と同じです。

一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は，第2次元の分割数と同じです。

SQL例については，「使用例」の10.の＜例1＞を参照してください。

＜分割時（第2次元分割列で分割する場合）＞

マトリクス分割用RDエリアリストの数は，第1次元の分割数と同じです。

一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は，変更後境界値リストで指定した境界値の数と同じです。

SQL例については，「使用例」の10.の＜例3＞を参照してください。

＜統合時（第1次元分割列で統合する場合）＞

マトリクス分割用RDエリアリストの数は，1個です。

一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は，第2次元の分割数と同じです。

SQL例については，「使用例」の10.の＜例2＞を参照してください。

＜統合時（第2次元分割列で統合する場合）＞

マトリクス分割用RDエリアリストの数は，第1次元の分割数と同じです。

一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は，1個です。

SQL例については，「使用例」の10.の＜例4＞を参照してください。

＜注意事項＞

マトリクス分割表格納用RDエリア変更指定を指定する場合の注意事項を次に示します。

変更した結果の表の隣り合った境界値を格納するRDエリアが，同じRDエリアとなった場合でも，システムはRDエリアを一つにまとめません（境界値指定の横分割表の変更ではシステムがRDエリアを一つにまとめます）。

2次元格納用RDエリア指定

マトリクス分割表の格納用RDエリアを指定します。

マトリクス分割用RDエリアリスト

マトリクス分割表の一つの次元用のRDエリアを指定します。

RDエリア名

変更後のデータを格納するRDエリアの名称を指定します。ただし，一時表用RDエリアは指定できません。

マトリクス分割LOB列格納用RDエリア変更指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）

マトリクス分割した表にLOB列を定義している場合に，格納するRDエリア名を指定します。

マトリクス分割LOB列格納用RDエリア変更指定についての規則を次に示します。

データ型にBLOBを指定した列は，LOB列格納用RDエリア名を必ず指定してください。BLOB以外のデータ型を指定した列には指定できません。

マトリクス分割表変更指定で重複したRDエリアを指定した場合，LOB列格納用RDエリア名も，同じように重複して指定する必要があります。

表，及びLOB列は，表を基準に分割数やRDエリアの重複の対応関係を維持する必要があります（例えば，表の変更前後で，システムが境界値を一つにまとめる場合，及び指定するRDエリアが変更対象の境界値以外のデータを格納している場合，変更前後で同じRDエリアを使用し，同じRDエリアを指定する位置などをLOB列も同じように指定する必要があります）。

2次元格納用RDエリア指定

マトリクス分割表の格納用RDエリアを記述する場合に指定します。

マトリクス分割用RDエリアリスト

マトリクス分割表の一つの次元用のRDエリアを指定します。

RDエリア名

変更後のデータを格納するRDエリアの名称を記述します。

WITHOUT PURGE

変更後の表のデータが，分割格納条件の境界値の範囲又は格納条件指定に一致しない場合，ALTER TABLE実行時にHiRDBがそのデータを削除します。しかし，変更前後で同じRDエリアを指定している場合に（変更対象のRDエリアを，変更後境界値分割指定，変更後格納条件分割指定，又はマトリクス分割表変更指定に指定している場合），同じRDエリアの表のデータをALTER TABLE実行時にHiRDBに削除させないようにするときに指定します。この指定は，分割格納条件の変更前の表のデータを変更後も使用し，表のデータのアンロード，及びデータロードの運用を削減したい場合に有効です。

ただし，WITHOUT PURGEを指定しても，変更後に使用されないRDエリアの表のデータは，変更対象の表と関連を持たなくなり，整合性を保てなくなるため，システムが削除します。

WITHOUT PURGEを指定できるのは，次に示す条件を満たす場合（マトリクス分割表の場合は，RDエリアを分割・統合する各次元で次の条件を満たす場合）です。これ以外の場合にWITHOUT PURGEを指定すると，エラーとなります。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件の変更」を参照してください。

《境界値指定の横分割表の場合》

変更対象のRDエリアを，変更後のRDエリアに含んでいること

《格納条件指定の横分割表の場合》

変更対象のRDエリアを，変更後のRDエリアに含んでいること

《マトリクス分割表の場合》

変更対象のRDエリア群を，変更後のRDエリア群に含んでいること

1.のRDエリア群の指定順序が同じ場合

《注意事項》

WITHOUT PURGE指定時の注意事項を次に示します。

分割格納条件の分割時は，変更対象のRDエリアのデータが，分割後に割り当てる境界値の範囲のデータ又は分割後に割り当てる格納条件の値とすべて一致していることを確認する必要があります。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件の変更」を参照してください。

分割格納条件の統合時は，削除するRDエリアのデータを登録し直す必要がある場合，分割格納条件を変更する前にアンロードし，分割格納条件を変更した結果の表にロードする必要があります。ただし，WITHOUT PURGEによって削除しないデータを，分割格納条件を変更した後にロードした場合，二重にデータを登録することになるため，アンロード，及びデータロードを行うRDエリアに対する注意が必要です。詳細については，マニュアル「HiRDB Version 9 システム運用ガイド」の「表の分割格納条件の変更」を参照してください。

格納条件指定の横分割表の場合，分割格納条件の分割時に変更前RDエリア情報リストでOTHERSを指定したとき，WITHOUT PURGEは指定できません。

WITH PROGRAM

変更対象の表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にする場合に指定します。

(5)　共通規則

CHANGE句で実表の列を変更すると，ビュー表の列も変更されます。

格納条件を指定した列に対してALTER TABLEは指定できません。

WITH PROGRAMを省略した場合，表定義する表，又はその表を参照して定義したビュー表を使用する手続き，及びトリガの有効なSQLオブジェクトがあると，表定義を変更できません。

繰返し列でない列を繰返し列に変更できません。また，繰返し列を繰返し列でない列に変更できません。

境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表に，BLOB列又はBLOB属性を含む抽象データ型の列を追加する場合，表定義で指定した表格納用RDエリア名に対応するように，それぞれLOB列格納用RDエリア名又はLOB属性格納用RDエリア名を指定しなければなりません。そのため，表定義で指定している表格納用RDエリア名に重複したRDエリア名があるときは，LOB列格納用RDエリア名又はLOB属性格納用RDエリア名を重複して指定することになります。

ADD COLUMN，ADD RDAREA，又はCHANGE RDAREAで指定する表格納用RDエリア，LOB列格納用RDエリア，LOB属性格納用RDエリア，及びインデクス格納用RDエリアは，事前にデータベース初期設定ユティリティで作成しておくか，データベース構成変更ユティリティで追加しておく必要があります。

LOB列格納用RDエリア，LOB属性格納用RDエリア，及びユーザLOB用RDエリアを指定したインデクス格納用RDエリアは重複して指定できません。それぞれ，異なるユーザLOB用RDエリアを指定してください。

ほかのBLOB列，BLOB属性，又はインデクスに割り当てられているユーザLOB用RDエリアは指定できません。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からALTER TABLEは実行できません。

ADD COLUMN，ADD RDAREA，又はCHANGE RDAREAで指定する，表格納用RDエリア，LOB列格納用RDエリア，LOB属性格納用RDエリア，及びインデクス格納用RDエリアに，インナレプリカ機能を適用しているRDエリアと，適用していないRDエリアとを混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合，オリジナルRDエリアの名称を指定します。

インナレプリカ機能を使用している場合のALTER TABLEの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

監査証跡表の場合，ALTER TABLEは実行できません。

被参照表，参照表に対して，DROP句を用いた表定義変更はできません。

被参照表，参照表に対して，RENAME句を用いた表名変更はできません。

被参照表の主キー構成列，外部キー構成列に対して定義変更を行う場合，次に示す制限があります。

CHANGE句を用いたデータ型，データ長の変更はできません。

RENAME句を用いた列名変更はできません。

検査制約を定義した表に対して，DROP句を用いた表定義変更はできません。

検査制約を定義した表に対して，RENAME句を用いた表名変更はできません。

検査制約を定義した列に対して定義変更を行う場合，次に示す制限があります。

CHANGE句を用いたデータ型，データ長の変更はできません。

CHANGE句を用いたSPLITの変更はできません。

CHANGE句を用いた既定値の設定，解除はできません。

CHANGE句を用いたWITH DEFAULTの設定はできません。

RENAME句を用いた列名変更はできません。

一時表の場合，ALTER TABLEは実行できません。

(6)　留意事項

表定義時にFIXを指定した実表にデータが格納されている場合，ALTER TABLEでは次に示す項目が指定できます。

表格納用RDエリアの追加

ハッシュ関数の変更

CHARからMCHARへの列属性の変更

表名，及び列名の変更

最小排他資源単位の変更

分割格納条件の変更

更新可能列属性の付与（UPDATE指定だけ）

改竄防止表への変更

予備列からの列の切り出し

WITH DEFAULTを指定した場合，データが格納されている表に列を追加できません。

行単位インタフェースを使用して，日付データをCHAR（10）で受け渡しする場合，日付データ型を使用しないで，CHAR（10）で列を指定してください。

行単位インタフェースを使用して，時刻データをCHAR（8）で受け渡しする場合，時刻データ型を使用しないでCHAR（8）で列を指定してください。

行単位インタフェースを使用して，時刻印データを19，22，24，又は26バイトのCHARで受け渡しをする場合，時刻印データ型を使用しないで19，22，24，又は26バイトのCHARで列を指定してください。

ALTER TABLEは，OLTP下のX/Openに従ったUAPから指定できません。

表又は列の名称を変更した場合，ユティリティや運用コマンドでは変更後の名称を指定してください。

表又は列の名称を変更した場合，名称変更前に作成した次のファイルは使用できません。

データベース再編成ユティリティのアンロードデータファイル

データベース作成ユティリティ及びデータベース再編成ユティリティのインデクス情報ファイル

ディクショナリ搬出入ユティリティの搬出ファイル

ハッシュ関数を変更，又は表格納用RDエリアを追加する場合，データを再ロードする必要はありません。ただし，追加された表格納用RDエリアには，INSERT文実行時に初めてデータが格納されるため，表格納用RDエリア追加時にはデータが格納されません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの行は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

ALTERのADD指定で追加する列については，列データ抑制指定はできません。

WITHOUT ROLLBACKオプションを指定した表には，CHANGE LOCK PAGEを指定できません。

トリガを定義した表には，列を追加できます。トリガ契機列を省略したトリガの場合には，追加した列もトリガの実行対象になります。トリガ契機列を指定している場合には，トリガの実行対象にはなりません。なお，列を追加してもトリガのSQLオブジェクトは無効になりません。

トリガ契機列は，列定義変更，又は列削除ができます。ただし，トリガ契機列をすべて削除した場合は，そのトリガは削除されます。なお，一度削除した列と同名の列を追加しても，その列はトリガの実行対象にはなりません。また，トリガ契機列の列定義変更又は列削除をしても，トリガのSQLオブジェクトは無効になりません。

トリガ契機列の列削除をした後，ほかの操作でそのトリガのSQLオブジェクトを無効にした場合，無効にしたSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

列定義を元に戻し，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成します。

無効にしたトリガをDROP TRIGGERで削除してから，列削除した列を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

（条件）

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

WITH PROGRAMを指定して，トリガSQL文中で参照している表に対してNOT NULL列の追加をすると，そのトリガのSQLオブジェクトは無効になります。無効にしたトリガのSQLオブジェクトを実行するためには，ALTER TRIGGER又はALTER ROUTINEを実行して，トリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して次の操作をすると，そのトリガのSQLオブジェクトは無効になります。

トリガSQL文中で参照している表に対して，列定義変更，列削除，列名変更，又は表名変更をした場合

トリガSQL文中で新旧値相関名を使用して参照している列を，列定義変更，又は列削除した場合

無効にしたトリガのSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

列定義，列名，又は表名を元に戻し，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成します。

無効にしたトリガをDROP TRIGGERで削除してから，列定義変更，若しくは列削除した列，又は名称変更前の列名，表名を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

（条件）

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

WITH PROGRAMを指定して，トリガ動作条件中で新旧値相関名を使用して参照している列の列定義変更，又は列削除をした場合，そのトリガのSQLオブジェクトは無効になります。また，トリガを引き起こすSQLを前処理するときにもエラーになります。無効にしたトリガのSQLオブジェクトを実行したり，トリガを引き起こすSQLを前処理したりするためには，次のどちらかの操作をする必要があります。

列定義を元に戻し，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成します。

無効にしたトリガをDROP TRIGGERで削除してから，列定義変更，又は列削除した列を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

（条件）

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

トリガを定義した表の表名，及び次の列の列名は変更できません。

トリガ契機列

トリガ動作条件中で新旧値相関名を使用して参照している列

トリガSQL文中で新旧値相関名を使用して参照している列

(7)　使用例

在庫表（ZAIKO）に，倉庫住所（SADRS）列を追加します。

  ALTER TABLE ZAIKO
      ADD SADRS VARCHAR(40)

在庫表（ZAIKO）に，既定値のある非ナル値制約の列の倉庫住所（SADRS）を追加します。

  ALTER TABLE ZAIKO
      ADD SADRS VARCHAR(40)
      NOT NULL WITH DEFAULT

在庫表（ZAIKO）の，可変長データ型である倉庫住所（SADRS）列の最大長を60に変更します。

  ALTER TABLE ZAIKO
      CHANGE SADRS VARCHAR(60)

在庫表（ZAIKO）の商品コード（SCODE）列に設定されているクラスタキーの属性を，一意性制約のないものから一意性制約のあるものへ変更します。

  ALTER TABLE ZAIKO
      CHANGE CLUSTER KEY UNIQUE

在庫表（ZAIKO）の倉庫住所（SADRS）列を削除します。

  ALTER TABLE ZAIKO
      DROP SADRS

在庫表（ZAIKO）の倉庫住所（SADRS）の列に対する手続きの有効なオブジェクトを無効にして，倉庫住所（SADRS）の列を削除します。

  ALTER TABLE ZAIKO
      DROP SADRS WITH PROGRAM

在庫表（ZAIKO）に倉庫地図（SMAP）列を追加します。

  ALTER TABLE ZAIKO
      ADD SMAP BLOB(1M) IN (RMAPLOB1)

ハッシュ分割の新在庫表（NZAIKO）を格納するRDエリアを追加します。このとき，インデクス（ISCODE）とBLOB型の倉庫地図（SMAP）列を格納するRDエリアも追加します。

  ALTER TABLE NZAIKO
      ADD RDAREA RDA3
        FOR COLUMN SMAP IN (RMAPLOB3)
        FOR INDEX ISCODE IN (RDA4)

境界値指定の横分割表の境界値の変更例を次に示します。

＜例1＞境界値の分割，統合

変更前

CREATE FIX TABLE "T1"("C1" INT,"C2" INT) PARTITIONED BY "C1"
  IN(("TA1")100,("TA2")200,("TA3")400,("TA4")500,("TA5")600,("TA6"))
CREATE INDEX "I1" ON "T1"("C1")
  IN(("IA1"),("IA2"),("IA3"),("IA4"),("IA5"),("IA6"))

１.統合《状態1 →状態2》

ALTER TABLE "T1" CHANGE RDAREA
  ((100),(200)) INTO "TA11"
  FOR INDEX "I1" INTO "IA11"

２.分割《状態2 →状態3》

ALTER TABLE "T1" CHANGE RDAREA
  ((400)) INTO (("TA12")300,("TA13"))
  FOR INDEX "I1" INTO (("IA12"),("IA13"))

３.統合《状態3 →状態4》

ALTER TABLE "T1" CHANGE RDAREA
  ((600),(MAX)) INTO "TA11"
  FOR INDEX "I1" INTO "IA11"

＜例2＞システムが隣り合った境界値を統合する場合(分割時の特殊例)

変更前

CREATE FIX TABLE "T1"("C1" INT,"C2" INT) PARTITIONED BY "C1"
  IN(("TA1")100,("TA2")200,("TA3")400,("TA4")500,("TA5")600,("TA6"))
CREATE INDEX "I1" ON "T1"("C1")
  IN(("IA1"),("IA2"),("IA3"),("IA4"),("IA5"),("IA6"))

境界値の変更

ALTER TABLE "T1" CHANGE RDAREA
  ((400)) INTO (("TA3")300,("TA4"))
FOR INDEX "I1" INTO (("IA3"),("IA4"))

格納条件指定の横分割表のRDエリアの変更例を次に示します。

変更前《状態1》

CREATE FIX TABLE "T1"("C1" CHAR(3),"C2" INT)
  IN(("TA1")"C1"='001',("TA2")"C1"='002',
  ("TA3")"C1"='003',("TA4")"C1"=('004','005'),("TA5"))
CREATE INDEX "I1" ON "T1"("C1")
  IN(("IA1"),("IA2"),("IA3"),("IA4"),("IA5"))

＜例1＞格納条件の追加

１.分割《状態1 →状態2》

ALTER TABLE "T1" CHANGE RDAREA PARTITIONED CONDITION
  (("TA5")) INTO (("TA6")"C1"='006',("TA5"))
   FOR INDEX "I1" INTO (("IA6"),("IA5"))

＜例2＞格納条件の削除

２.統合《状態1 →状態3》

ALTER TABLE "T1" CHANGE RDAREA PARTITIONED CONDITION
  (("TA1"),("TA5")) INTO "TA5"
   FOR INDEX "I1" INTO "IA5"

＜例3＞RDエリアの分割

３.分割《状態1 →状態4》

ALTER TABLE "T1" CHANGE RDAREA PARTITIONED CONDITION
  (("TA4")) INTO (("TA4")"C1"='004',("TA7")"C1"='005')
   FOR INDEX "I1" INTO (("IA4"),("IA7"))

＜例4＞RDエリアの統合

４.統合《状態1 →状態5》

ALTER TABLE "T1" CHANGE RDAREA PARTITIONED CONDITION
  (("TA1"),("TA2")) INTO "TA2"
   FOR INDEX "I1" INTO "IA2"

マトリクス分割表の分割格納条件の分割，及び統合の例を次に示します。

前提

在庫表（ZAIKO）を定義します。このとき，商品番号（GNO）と入庫日（NYUUKOBI）のそれぞれに境界値を設定し，それぞれのデータが該当するRDエリアに格納されるようにします。この状態を《状態1》とします。

CREATE FIX TABLE "USERA"."ZAIKO"
("GNO" CHAR(5),"GNAME" CHAR(8),"KIKAKU" CHAR(3),"TANKA" INTEGER,"NYUUKOBI" CHAR(10))
  PARTITIONED BY MULTIDIM
    ("GNO"      (('20000')),
     "NYUUKOBI" (('2010-12-31'),('2011-12-31')))
    IN (("RDAT01","RDAT02","RDAT03"),
        ("RDAT01","RDAT04","RDAT05"))
  CLUSTER KEY ("GNO","NYUUKOBI")
    IN (("RDAI01","RDAI02","RDAI03"),
        ("RDAI01","RDAI04","RDAI05"))

＜例1＞第1次元列でのRDエリアの分割（《状態1》→《状態2》）

ALTER TABLE "USERA"."ZAIKO" CHANGE RDAREA
MULTIDIM ("GNO" ((MAX))) AT (('60000'),(MAX))
  INTO (("RDAT01","RDAT04","RDAT05"),
        ("RDAT11","RDAT14","RDAT15"))
FOR CLUSTER KEY
  INTO (("RDAI01","RDAI04","RDAI05"),
        ("RDAI11","RDAI14","RDAI15"))

注

RDAT01，RDAT04，RDAT05のデータ，及びRDAI01，RDAI04，RDAI05のキーは削除されます。

＜例2＞第1次元列でのRDエリアの統合（《状態2》→《状態1》）

ALTER TABLE "USERA"."ZAIKO" CHANGE RDAREA
MULTIDIM ("GNO" (('60000'),(MAX))) AT ((MAX))
  INTO (("RDAT01","RDAT04","RDAT05"))
FOR CLUSTER KEY
  INTO (("RDAI01","RDAI04","RDAI05"))

注　

RDAT01，RDAT11，RDAT04，RDAT14，RDAT05，RDAT15のデータ，及びRDAI01，RDAI11，RDAI04，RDAI14，RDAI05，RDAI15のキーは削除されます。

＜例3＞第2次元列でのRDエリアの分割（《状態1》→《状態3》）

ALTER TABLE "USERA"."ZAIKO" CHANGE RDAREA
MULTIDIM ("NYUUKOBI" ((MAX))) AT (('2012-12-31'),(MAX))
  INTO (("RDAT03","RDAT13"),
        ("RDAT05","RDAT15"))
FOR CLUSTER KEY
  INTO (("RDAI03","RDAI13"),
        ("RDAI05","RDAI15"))

注　

RDAT03，RDAT05のデータ，及びRDAI03，RDAI05のキーは削除されます。

＜例4＞第2次元列でのRDエリアの統合（《状態3》→《状態1》）

ALTER TABLE "USERA"."ZAIKO" CHANGE RDAREA
MULTIDIM ("NYUUKOBI" (('2012-12-31'),(MAX))) AT ((MAX))
  INTO (("RDAT03"),
        ("RDAT05"))
FOR CLUSTER KEY
  INTO (("RDAI03"),
        ("RDAI05"))

注　

RDAT03，RDAT13，RDAT05，RDAT15のデータ，及びRDAI03，RDAI13，RDAI05，RDAI15のキーは削除されます。

非改竄防止表の受注表（JUTYU）を，次の条件で改竄防止表に変更します。

《表定義時の条件》

あらかじめ挿入履歴保持列として，JINSERTDATE列を定義する。

改竄防止表に変更後も更新可能な列としてBIKOU列を定義する。

  CREATE TABLE JUTYU
      (DNO CHAR(6),TCODE CHAR(5),SCODE CHAR(4),
       BIKOU CHAR(60) UPDATE,
       JSURYO INTEGER,JDATE DATE,JTIME TIME,
       JINSERTDATE DATE NOT NULL WITH DEFAULT SYSTEM GENERATED)

《表定義変更時の条件》

行削除禁止期間を10年とする。

  ALTER TABLE JUTYU
      CHANGE INSERT ONLY WHILE 10 YEARS BY JINSERTDATE

3.6　ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

3.6.1　ALTER TRIGGERの形式と規則

(1)　機能

トリガのSQLオブジェクトを再作成します。

(2)　使用権限

トリガの所有者

自分が所有するトリガのSQLオブジェクトを再作成できます。

DBA権限を持つユーザ

自分が所有するトリガと，他ユーザが所有するトリガのSQLオブジェクトを再作成できます。

(3)　形式

　ALTER TRIGGER 〔認可識別子.〕トリガ識別子
　　　｛CHANGE｜ALTER｝ ROUTINE OBJECT
　　　〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕

　SQLコンパイルオプション：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　　　　　　　　　　　　　｜OPTIMIZE LEVEL SQL最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL最適化オプション〕…
　　　　　　　　　　　　　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL拡張最適化オプション〕…
　　　　　　　　　　　　　　　　｜SUBSTR LENGTH 文字の最大長 ｝

(4)　オペランド

(a)　〔認可識別子.〕トリガ識別子

認可識別子

SQLオブジェクトを再作成するトリガの所有者の認可識別子を指定します。省略した場合，ALTER TRIGGERを実行するユーザの認可識別子が仮定されます。

トリガ識別子

SQLオブジェクトを再作成するトリガの識別子を指定します。

(b)　｛CHANGE｜ALTER｝ ROUTINE OBJECT

トリガを再作成することを示します。CHANGE及びALTERは，どちらを指定しても意味は変わりません。

(c)　SQLコンパイルオプション

：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　｜OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…
　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…
　　　　｜SUBSTR LENGTH 文字の最大長 ｝

SQLコンパイルオプションにはISOLATION，OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL，SUBSTR LENGTHをそれぞれ1回しか指定できません。

〔ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕〕

SQLのデータ保証レベルを指定します。

データ保証レベル

データ保証レベルとは，トランザクションのどの時点までデータの内容を保証するかのレベルです。次に示すデータ保証レベルを指定できます。

0

データの内容を保証しない場合に指定します。

0レベルを指定すると，ほかのユーザが更新中のデータでも，更新完了を待たないで参照できます。ただし，参照する表が共用表の場合，ほかのユーザが排他モードでLOCK文を実行しているときには，排他解除待ちとなります。

1

検索処理の終了までデータの内容を保証したい場合に指定します。

1レベルを指定すると，検索処理が終了するまで（HiRDBがページ，又は行を見終わるまで）一度検索したデータをほかのユーザは更新できません。

2

トランザクションの終了まで一度検索したデータの内容を保証したい場合に指定します。

2レベルを指定すると，トランザクションが終了するまで一度検索したデータをほかのユーザは更新できません。

〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕

トリガ中で，FOR UPDATE句を指定した（FOR UPDATEが仮定される場合を含む）カーソル又は問合せに対して，SQLコンパイルオプションで指定したデータ保証レベルに関係なく，常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。

このオペランドを省略した場合，EXCLUSIVEを仮定します。ただし，0904互換モードを適用している場合はCOMPATIBLEを仮定します。

バージョン09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略したトリガと同じ動作をさせたい場合はCOMPATIBLEを指定します。

このオペランドと，ISOLATIONデータ保証レベルの関係から決まるFOR UPDATEの排他オプションを次に示します。

ISOLATION データ保証レベル

FOR UPDATE EXCLUSVIE

FOR UPDATE COMPATIBLE

0

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

1

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

2

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

《クライアント環境定義との関係》

ALTER TRIGGERに対して，PDISLLVL，PDFORUPDATEEXLOCKの指定は無効となります。

《SQLとの関係》

トリガ中のSQL文に排他オプションを指定している場合は，SQLコンパイルオプションで指定するデータ保証レベル，FOR UPDATE EXCLUSIVE，及びFOR UPDATE COMPATIBLEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。

《システム定義との関係》

ALTER TRIGGERに対して，pd_isolation_levelオペランドの指定は無効となります。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE TRIGGER，ALTER TRIGGER，又はALTER ROUTINEの実行時）に指定した値が仮定されます。

データ保証レベルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。

SQL最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法がありますが，通常時は識別子で指定する方法をお勧めします。

省略した場合，前回のSQLオブジェクト作成時（CREATE TRIGGER，ALTER TRIGGER，又はALTER ROUTINE）に採用した値が仮定されます。

識別子で指定する場合：

OPTIMIZE LEVEL "識別子"〔，"識別子"〕…

＜指定例＞

ネストループジョイン優先とグループ分け高速化処理を適用する場合

OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"

すべての最適化を適用しない場合

OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。ただし，同時に"NONE"以外の識別子を指定すると，"NONE"は無効になります。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

OPTIMIZE LEVEL 符号なし整数〔，符号なし整数〕…

＜指定例＞

複数のSQLオブジェクト作成，ANDの複数インデクス利用の抑止，及び複数インデクス利用の強制を適用する場合

符号なし整数をコンマで区切って指定する場合：

OPTIMIZE LEVEL 4,10,16

符号なし整数の和を指定する場合：

OPTIMIZE LEVEL 30

既に14（4+10）を指定していて，新たに16を追加する場合

OPTIMIZE LEVEL 14,16

すべての最適化を適用しない場合

OPTIMIZE LEVEL 0

＜規則＞

バージョン06-00より前のHiRDBから，バージョン06-00以降のHiRDBにバージョンアップする場合，バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は，バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。ただし，同時に0以外の識別子を指定すると，0は無効になります。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

複数の最適化方法を指定する場合，その符号なし整数の和を指定することもできます。ただし，同じ最適化方法の値は二つ以上足さないでください（足した結果が別の最適化方法とみなされることもあるため）。

複数の最適化方法の値を足して指定する場合，どの最適方法を指定しているのか分かりにくくなるため，コンマで区切って指定する方法をお勧めします。また，既に複数の最適化方法の値を足して指定している場合で，新たに別の最適化方法が必要になったときは，追加する値をコンマで区切って後ろに指定できます。

《システム定義との関係》

ALTER TRIGGERに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

システム定義のpd_floatable_besオペランド，又はpd_non_floatable_besオペランドを指定している場合，「フロータブルサーバ対象拡大（データ取り出しバックエンドサーバ）」及び「フロータブルサーバ対象限定（データ取り出しバックエンドサーバ）」の指定は無効となります。

システム定義のpd_indexlock_modeオペランドにKEYを指定している場合（インデクスキー値排他の場合），「更新SQLの作業表作成抑止」の指定は無効になります。

《クライアント環境定義との関係》

ALTER TRIGGERに対して，PDSQLOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL拡張最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。

SQL拡張最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法があります。

省略した場合，前回のSQLオブジェクト作成時（CREATE TRIGGER，ALTER TRIGGER，又はALTER ROUTINE）に採用した値が仮定されます。

識別子で指定する場合：

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL 1,2

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL 0

＜規則＞

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

《システム定義との関係》

ALTER TRIGGERに対して，システム定義のpd_optimize_levelオぺランドの指定は無効となります。

《クライアント環境定義との関係》

ALTER TRIGGERに対して，PDADDITIONALOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

＜規則＞

バージョン08-00より前のHiRDBからバージョン08-00以降のHiRDBにバージョンアップする場合，3を仮定します。文字の最大長を変更する必要がない場合は，バージョン08-00以降のHiRDBにバージョンアップしたときにこのオペランドを指定する必要はありません。

《システム定義との関係》

ALTER TRIGGERに対して，システム定義のpd_substr_lengthオぺランドの指定は無効となります。pd_substr_lengthオぺランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

ALTER TRIGGERに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効となります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

このオペランドを省略した場合，前回のSQLオブジェクト作成時（CREATE TRIGGER，ALTER TRIGGER，又はALTER ROUTINEの実行時）に指定した値が仮定されます。

(5)　共通規則

SQLオブジェクトが無効なトリガに対して，ALTER TRIGGERを実行して正常に終了すると，そのトリガのSQLオブジェクトは有効になります。

SQLオブジェクトがインデクス無効状態になっているトリガに対して，ALTER TRIGGERを実行して正常に終了すると，トリガのSQLオブジェクトのインデクス無効状態は解除されます。SQLオブジェクトがインデクス無効状態のトリガは，実行時にエラーになります。

ALTER TRIGGERでSQLコンパイルオプションを指定する場合，再作成するトリガの元のCREATE TRIGGERにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

次の条件では，Java手続きからALTER TRIGGERを実行できません。

実行中のSQLオブジェクトが再作成になる場合

(6)　留意事項

ALTER TRIGGERは，OLTP下のX/Openに従ったUAPから指定できません。

ALTER TRIGGER実行直後にGET DIAGNOSTICS文を実行すると，ALTER TRIGGERの診断情報が取得できます。このとき，再作成が正常終了したトリガのSQLコードは0となります。

トリガ中のトリガSQL文のデータ保証レベル，SQL最適化オプション，SQL拡張最適化オプション，及び文字の最大長は，トリガの定義時，又は変更時の指定で決まり，トリガ動作実行時のシステム定義やクライアント環境定義の影響を受けません。

(7)　使用例

無効になったトリガ（TRIG1）のSQLオブジェクトを再作成します。

  ALTER TRIGGER TRIG1
      CHANGE ROUTINE OBJECT

3.7　COMMENT（注釈付加）

3.7.1　COMMENTの形式と規則

(1)　機能

表，及び列に注釈を付けます。既に注釈が付いている場合，その注釈を新しい注釈に変更します。

(2)　使用権限

表の所有者

自分が所有する表に注釈を付けることができます。

(3)　形式

　COMMENT ON｛TABLE 〔認可識別子.〕表識別子
　　　　　　　　　｜COLUMN 〔認可識別子.〕表識別子.列名｝
　　　　　　　　　IS '文字列'

(4)　オペランド

(a)　COMMENT ON

自分が所有する表，及び列に対して注釈を付けることができます。

(b)　｛TABLE〔認可識別子.〕 表識別子｜COLUMN〔認可識別子.〕 表識別子.列名｝

表に注釈を付ける場合にはTABLEを指定します。

列に注釈を付ける場合にはCOLUMNを指定します。

表識別子にパブリックビューを指定する場合は，認可識別子にPUBLICを指定してください。

(c)　'文字列'

注釈を文字列で指定します。指定できる文字列の長さは0〜255バイトです。

なお，文字列として各国文字列定数を指定する場合に'N'は必要ありません。

また，次に示す文字列は指定できません。

16進文字列定数

(5)　留意事項

付けた注釈はデータディクショナリ表のSQL_TABLES表，SQL_COLUMNS表を検索すると参照できます。

既に注釈がある場合，前の注釈を削除して新しい注釈に変更します。

データディクショナリ表に注釈を付けることはできません。

COMMENTは，OLTP下のX/Openに従ったUAPからは指定できません。

(6)　使用例

在庫表（ZAIKO）に注釈を付けます。

  COMMENT ON TABLE ZAIKO IS '1995年7月作成'

在庫表（ZAIKO）の単価（TANKA）列に注釈を付けます。

  COMMENT ON COLUMN ZAIKO.TANKA
      IS '1995.7 カイテイ'

3.8　CREATE AUDIT（監査対象イベントの定義）

3.8.1　CREATE AUDITの形式と規則

(1)　機能

監査証跡として記録する監査対象イベント，及びその対象を定義します。

(2)　使用権限

監査権限を持つユーザ

監査権限を持つユーザが，CREATE AUDITの各定義文を実行できます。

(3)　形式

CREATE AUDIT
　　　〔AUDITTYPE　{PRIVILEGE｜EVENT｜ANY}〕
　　　FOR  操作種別
　　　〔選択オプション〕
　　　〔WHENEVER ｛SUCCESSFUL｜UNSUCCESSFUL｜ANY｝〕

≪各項目の詳細≫

操作種別：：＝｛ ANY
             ｜SESSION　〔｛セッション種別｜ANY｝〕
             ｜PRIVILEGE　〔｛権限操作種別｜ANY｝〕
             ｜DEFINITION 〔｛オブジェクト定義イベント種別｜ANY｝〕
             ｜ACCESS　　〔｛オブジェクト操作イベント種別｜ANY｝〕
             ｜UTILITY     〔｛ユティリティイベント種別｜ANY｝〕｝
選択オプション：：＝｛ON オブジェクト名｜BY AUTHORIZATION 認可識別子｝
　　オブジェクト名：：＝
　　　　　　　｛FUNCTION　認可識別子.ルーチン識別子
　　　　　　｜INDEX　認可識別子.インデクス識別子
　　　　　　｜LIST　認可識別子.表識別子
　　　　　　｜PROCEDURE　認可識別子.ルーチン識別子
　　　　　　｜RDAREA　RDエリア名
　　　　　　｜SCHEMA　認可識別子
　　　　　　｜TABLE　〔認可識別子. 〕表識別子
　　　　　　｜TRIGGER　認可識別子.トリガ識別子
　　　　　　｜TYPE　認可識別子.データ型識別子
　　　　　　｜VIEW　認可識別子.表識別子
　　　　　　｜SEQUENCE　認可識別子.順序数生成子識別子｝
　　セッション種別：：＝
　　　　｛CONNECT｜DISCONNECT｜AUTHORIZATION｝
　　権限操作種別：：＝
　　　　｛GRANT｜REVOKE｝
　　オブジェクト定義イベント種別：：＝
　　　　｛CREATE｜DROP｜ALTER｝
　　オブジェクト操作イベント種別：：＝
　　　　｛SELECT｜INSERT｜UPDATE｜DELETE｜PURGE｜ASSIGN｜CALL｜LOCK
　　　　　｜NEXT VALUE｝
　　ユティリティイベント種別：：＝
　　　　｛PDLOAD｜PDRORG｜PDEXP｜PDCONSTCK｝

(4)　オペランド

(a)　〔AUDITTYPE　{PRIVILEGE｜EVENT｜ANY}〕

権限チェック時の監査証跡を取得するか，イベントの最終結果の監査証跡を取得するかを指定します。

PRIVILEGE

権限チェック時の監査証跡を取得します。

EVENT

イベントの最終結果の監査証跡を取得します。

ANY

上記のすべての種別についての監査証跡を取得します。

PRIVILEGE，EVENT，及びANYは，個別で定義，及び削除をします。例えば，同じ監査イベントに対して，PRIVILEGE，EVENT，及びANYをすべて定義した状態で，ANYだけをDROP AUDITで削除しても，PRIVILEGE，及びEVENTの定義は残ります（監査対象のままとなります）。

(b)　操作種別

：：＝｛ANY
　　　　｜SESSION　〔｛セッション種別｜ANY｝〕
　　　　｜PRIVILEGE　〔｛権限操作種別｜ANY｝〕
　　　　｜DEFINITION 〔｛オブジェクト定義イベント種別｜ANY｝〕
　　　　｜ACCESS　〔｛オブジェクト操作イベント種別｜ANY｝〕
　　　　｜UTILITY 〔｛ユティリティイベント種別｜ANY｝〕｝

監査対象とする操作種別を指定します。個々の操作種別とANYは，個別に定義，及び削除をします。例えば，SESSION，PRIVILEGE，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，SESSION，及びPRIVILEGEの定義は残ります（監査対象のままとなります）。

ANY

すべての操作種別を監査対象とします。

SESSION　〔｛セッション種別｜ANY｝〕

セッションセキュリティイベントを監査対象にする場合に指定します。

ANYはすべてのセッションセキュリティイベントを監査対象とします。個々のセッション種別とANYは，個別に定義，及び削除をします。例えば，CONNECT，AUTHORIZATION，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，CONNECT，及びAUTHORIZATIONの定義は残ります（監査対象のままとなります）。

PRIVILEGE　〔｛権限操作種別｜ANY｝〕

権限管理イベントを監査対象にする場合に指定します。ANYはすべての権限管理イベントを監査対象とします。個々の権限操作種別とANYは，個別で定義，及び削除をします。例えば，GRANT，REVOKE，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，GRANT，及びREVOKEの定義は残ります（監査対象のままとなります）。

DEFINITION 〔｛オブジェクト定義イベント種別｜ANY｝〕

定義系SQLイベントを監査対象にする場合に指定します。ANYはすべての定義系SQLイベントを監査対象とします。個々のオブジェクト定義イベント種別とANYは，個別で定義，及び削除をします。例えば，CREATE，DROP，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，CREATE，及びDROPの定義は残ります（監査対象のままとなります）。

ACCESS　　〔｛オブジェクト操作イベント種別｜ANY｝〕

操作系SQLイベントを監査対象にする場合に指定します。ANYはすべての操作系SQLイベントを監査対象とします。個々のオブジェクト操作種別とANYは，個別で定義，及び削除をします。例えば，SELECT，INSERT，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，SELECT，及びINSERTの定義は残ります（監査対象のままとなります）。

UTILITY 〔｛ユティリティイベント種別｜ANY｝〕

ユティリティイベントを監査対象に定義する場合に指定します。ANYはすべてのユティリティイベントを監査対象とします。個々のユティリティイベント種別とANYは，個別で定義，及び削除をします。例えば，PDLOAD，PDRORG，及びANYを定義した状態で，ANYだけをDROP AUDITで削除しても，PDLOAD，及びPDRORGの定義は残ります（監査対象のままとなります）。

(c)　〔WHENEVER ｛SUCCESSFUL｜UNSUCCESSFUL｜ANY｝〕

監査イベントの最終結果の成否又は権限チェックの成否によって，その監査イベントを監査対象とするかどうかを指定します。WHENEVERの指定に対して取得する監査証跡を次の表に示します。

表3‒5　WHENEVERの指定に対して取得する監査証跡

WHENEVER

の指定

AUDITTYPEにPRIVILEGE又は

ANYを指定した場合

AUDITTYPEにEVENT又は

ANYを指定した場合

SUCCESSFUL

権限チェックが成功した場合だけ，権限チェック時の監査証跡を取得します。

監査イベントが成功した場合だけ，監査イベントの最終結果の監査証跡を取得します。

UNSUCCESSFUL

権限チェックが失敗した場合だけ，権限チェック時の監査証跡を取得します。

監査イベントが失敗した場合だけ，監査イベントの最終結果の監査証跡を取得します。

ANY

権限チェックの成否に関係なく権限チェック時の監査証跡を取得します。

監査イベントの成否に関係なく監査イベントの最終結果の監査証跡を取得します。

イベントの最終結果によっては一部失敗という結果があります。一部失敗時の監査証跡はSUCCESSFUL，UNSUCCESSFUL，ANYのどれを指定しても出力します。

SUCCESSFUL，UNSUCCESSFUL，及びANYは，個別で定義，及び削除をします。例えば，同じ監査イベントに対して，SUCCESSFUL，UNSUCCESSFUL，及びANYをすべて定義した状態で，ANYだけをDROP AUDITで削除しても，SUCCESSFUL，及びUNSUCCESSFULの定義は残ります（監査対象のままとなります）。

(d)　セッション種別：：＝｛CONNECT｜DISCONNECT｜AUTHORIZATION｝

監査対象とするHiRDBに対する接続，接続中のユーザ変更，又は切断操作を指定します。セッション種別とその監査イベントが発生する操作を次の表に示します。

表3‒6　セッション種別とその監査イベントが発生する操作

セッション種別

権限チェックの監査イベントが

発生する操作（AUDITTYPEにPRIVILEGEを指定した場合）

イベントの最終結果の監査証跡を取得する監査イベントが発生する操作（AUDITTYPEにEVENTを指定した場合）

CONNECT

HiRDBへの接続

同左

DISCONNECT

なし

HiRDBからの切断

AUTHORIZATION

SET SESSION AUTHORIZATION文の実行

同左

(e)　権限操作種別：：＝｛GRANT｜REVOKE｝

権限に関する操作を監査対象とする場合に指定します。権限操作種別とその監査イベントが発生する操作を次の表に示します。

表3‒7　権限操作種別とその監査イベントが発生する操作

権限操作種別

権限チェックの監査イベントが

発生する操作（AUDITTYPEにPRIVILEGEを指定した場合）

イベントの最終結果の監査証跡を取得する監査イベントが発生する操作（AUDITTYPEにEVENTを指定した場合）

GRANT

GRANTの実行

同左

REVOKE

REVOKEの実行

同左

(f)　オブジェクト定義イベント種別：：＝｛CREATE｜DROP｜ALTER｝

監査対象とするオブジェクトの作成，削除，又は定義変更の操作を指定します。オブジェクト定義イベント種別とその監査イベントが発生する操作を次の表に示します。

表3‒8　オブジェクト定義イベント種別とその監査イベントが発生する操作

オブジェクト定義イベント種別

権限チェックの監査イベントが

発生する操作（AUDITTYPEにPRIVILEGEを指定した場合）

イベントの最終結果の監査証跡を取得する監査イベントが発生する操作（AUDITTYPEにEVENTを指定した場合

CREATE

次のSQLの実行

ALTER PROCEDURE※１

ALTER ROUTINE※１

ALTER TRIGGER※１

ASSIGN LIST文

CREATE CONNECTION SECURITY

CREATE FUNCTION

CREATE INDEX

CREATE PROCEDURE

CREATE PUBLIC FUNCTION

CREATE PUBLIC PROCEDURE

CREATE SCHEMA

CREATE SEQUENCE

CREATE TABLE

CREATE TRIGGER

CREATE TYPE

CREATE VIEW

CREATE PUBLIC VIEW

UAPからのCALL文※２

同左

DROP

次のSQLの実行

DROP CONNECTION SECURITY

DROP DATA TYPE

DROP FUNCTION

DROP INDEX

DROP LIST文

DROP PROCEDURE

DROP PUBLIC FUNCTION

DROP PUBLIC PROCEDURE

DROP SCHEMA

DROP SEQUENCE

DROP TABLE

DROP TRIGGER

DROP VIEW

DROP PUBLIC VIEW

REVOKE※３

同左

ALTER

次のSQLの実行

ALTER INDEX

ALTER PROCEDURE

ALTER ROUTINE

ALTER TABLE

ALTER TRIGGER

COMMENT

同左

注※1

内部的にCREATE PROCEDUREが実行されます。

注※2

呼び出し対象となるプロシジャのインデクス情報が無効な場合，呼び出しごとに内部的にCREATE PROCEDUREが実行されます。このような場合，ALTER PROCEDURE又はALTER ROUTINEで呼び出し対象となるプロシジャのSQLオブジェクトを再作成することで，呼び出しごとに内部的に実行されるCREATE PROCEDUREが実行されなくなります。

注※3

ビューの基表からのSELECT権限が削除された場合，ビュー表を削除するために内部的にDROP VIEWが実行されます。

オブジェクト定義イベントで行われる権限チェックには，以下のようなものがあります。

監査イベントでのスキーマ定義権限チェック

ストアドプロシジャ定義時，又はストアドプロシジャのSQLオブジェクト再作成時での，SQL手続き文中の操作系SQL及び制御系SQLのアクセス権限チェック

メンバに手続きを含むユーザ定義型の定義時，又はユーザ定義型のメンバのSQLオブジェクト再作成時での，SQL手続き文中の操作系SQL及び制御系SQLのアクセス権限チェック

トリガ定義時，又はトリガのSQLオブジェクト再作成時での，トリガSQL文中の操作系SQL及び制御系SQLのアクセス権限チェック

ビュー定義時の基表へのアクセス権限チェック

(g)　オブジェクト操作イベント種別：：＝｛SELECT｜INSERT｜UPDATE｜DELETE｜PURGE｜ASSIGN ｜CALL｜LOCK｜NEXT VALUE｝

監査対象とするオブジェクトに対する操作を指定します。オブジェクト操作イベントの監査対象定義を指定した場合，手続き及びトリガSQL文中のオブジェクト操作も監査対象となります。オブジェクト操作イベント種別とその監査イベントが発生する操作を次の表に示します。

表3‒9　オブジェクト操作イベント種別とその監査イベントが発生する操作

オブジェクト操作イベント種別

権限チェックの監査イベントが

発生する操作（AUDITTYPEにPRIVILEGEを指定した場合）

イベントの最終結果の監査証跡を取得する監査イベントが発生する操作（AUDITTYPEにEVENTを指定した場合）

SELECT

1行SELECT文の実行※

問合せ指定を指定したINSERT文の実行※

探索条件に副問合せを指定したUPDATE文の実行※

探索条件に副問合せを指定したDELETE文の実行※

リストに対する問合せの実行※

同左

INSERT

INSERT文の実行※

同左

UPDATE

UPDATE文の実行※

同左

DELETE

DELETE文の実行※

同左

PURGE

PURGE TABLE文の実行※

同左

CALL

権限チェックイベントはありません

CALL文による手続の実行※

LOCK

LOCK文の実行※

同左

ASSIGN

ASSIGN LIST文形式1の実行

ASSIGN LIST文形式1の実行

ASSIGN LIST文形式２の実行

NEXT VALUE

NEXT VALUE式の実行

同左

注※

動的SELECT文を含みます。

次のSQL文中での問合せは，オブジェクト操作イベント種別がSELECTで定義されている場合に，監査証跡を出力します。

INSERT文で指定した問合せ指定

UPDATE文及びDELETE文の探索条件中に指定した副問合せ

リストに対する問合せ

(h)　ユティリティイベント種別：：＝｛PDLOAD｜PDRORG｜PDEXP｜PDCONSTCK｝

ユティリティイベントを監査対象として定義します。ユティリティイベント種別とその監査イベントが発生する操作を次の表に示します。

表3‒10　ユティリティイベント種別とその監査イベントが発生する操作

ユティリティ

イベント種別

権限チェックの監査イベントが

発生する操作（AUDITTYPEにPRIVILEGEを指定した場合）

イベントの最終結果の監査証跡を取得する監査イベントが発生する操作（AUDITTYPEにEVENTを指定した場合）

PDLOAD

pdloadの実行

同左

PDRORG

pdrorgの実行

同左

PDEXP

pdexp，pddefrevの実行

同左

PDCONSTCK

pdconstckの実行

同左

(i)　選択オプション：：＝｛ON オブジェクト名｜BY AUTHORIZATION 認可識別子｝

ON オブジェクト名

監査証跡を取得するオブジェクトを絞り込む場合に指定します。監査証跡の取得対象とするオブジェクトを指定します。各オブジェクト名の名称規則については，「名前の指定」を参照してください。

オブジェクトにパブリックビュー，パブリック手続き，又はパブリック関数を指定した場合は，認可識別子をPUBLICと指定してください。

ディクショナリ表を指定する場合は，オブジェクト名にTABLEを指定し，認可識別子を省略して表識別子だけを指定してください。その場合，ディクショナリ表SQL_AUDITSのオブジェクト所有者の列には'(Data dictionary)'を格納します。

BY AUTHORIZATION 認可識別子

監査対象とするイベント実行者の認可識別子を指定します。

(5)　規則

セキュリティ監査機能については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

実際に監査証跡を記録するには，システム定義のpd_auditオペランドの設定，又はpdaudbeginコマンドを実行する必要があります。

CREATE AUDIT，及びDROP AUDITを実行した際の監査証跡は，セキュリティ監査機能が有効な場合は必ず記録します。

(6)　留意事項

CREATE AUDITは，OLTP下のX/Openに従ったUAPからは指定できません。

監査対象イベントの定義では，操作種別とそのほかのオペランドとの組み合わせによって，証跡が出力されない場合があります。そのような定義の指定をした場合は，KFPA19680-Eメッセージが出力されます。次の表に指定可否の組み合わせの詳細を示します。

表3‒11　イベントタイプ，イベントサブタイプとAUDITTYPEの指定可否

イベントタイプ

イベント

サブタイプ

AUDITTYPE指定可否

PRIVILEGE

EVENT

ANY

ANY

−

△※１※２

○

△※１※２

SESSION

DISCONNECT

×

○

△※２

ANY

△※２

○

△※２

上記以外のすべて

○

○

○

PRIVILEGE

すべて

○

○

○

DEFINITION

すべて

○

○

○

ACCESS

CALL

×

○

△※１

ANY

△※１

○

△※１

上記以外のすべて

○

○

○

UTILITY

すべて

○

○

○

（凡例）

−：該当しません。

○：指定できます。

×：指定できません（KFPA19680-Eメッセージが出力されます）。

△：指定できますが，証跡が出力されない場合があります。

注※１

イベントCALLの権限チェックの証跡は出力されません。

注※２

イベントDISCONNECTの権限チェックの証跡は出力されません。

表3‒12　イベントタイプ，イベントサブタイプとオブジェクト名の指定可否（1/2）

イベント

タイプ

イベント

サブタイプ

FUNCTION

INDEX

LIST

PROCEDURE

ANY

−

△

△

△

△

SESSION

すべて

×

×

×

×

PRIVILEGE

GRANT

×

×

×

×

REVOKE

×

×

×

×

ANY

×

×

×

×

DEFINITION

CREATE

○

○

×

○

DROP

○

○

×

○

ALTER

○

○

×

○

ANY

○

○

×

○

ACCESS

SELECT

×

×

○

×

INSERT

×

×

×

×

UPDATE

×

×

×

×

DELETE

×

×

×

×

PURGE

×

×

×

×

ASSIGN

×

×

○

×

CALL

×

×

×

○

LOCK

×

×

×

×

NEXT VALUE

×

×

×

×

ANY

×

×

△

△

UTILITY

PDLOAD

×

×

×

×

PDRORG

×

×

×

×

PDEXP

×

×

×

○

PDCONSTCK

×

×

×

×

ANY

×

×

×

△

（凡例）

−：該当しません。

○：指定できます。

×：指定できません（KFPA19680-Eメッセージが出力されます）。

△：指定できますが，証跡が出力されない場合があります。

表3‒13　イベントタイプ，イベントサブタイプとオブジェクト名の指定可否（2/2）

イベント

タイプ

イベント

サブタイプ

RDAREA

SCHEMA

SERVER

TABLE

TRIGGER

TYPE

VIEW

SEQUENCE

ANY

−

△

△

△

△

△

△

△

△

SESSION

すべて

×

×

×

×

×

×

×

×

PRIVILEGE

GRANT

×

×

×

○

×

×

○

×

REVOKE

×

×

×

○

×

×

○

×

ANY

×

×

×

○

×

×

○

×

DEFINITION

CREATE

○

○

○

○

○

○

○

○

DROP

×

○

○

○

○

○

○

○

ALTER

○

×

×

○

○

×

○

×

ANY

△

△

△

○

○

△

○

△

ACCESS

SELECT

×

×

×

○

×

×

○

×

INSERT

×

×

×

○

×

×

○

×

UPDATE

×

×

×

○

×

×

○

×

DELETE

×

×

×

○

×

×

○

×

PURGE

×

×

×

○

×

×

×

×

ASSIGN

×

×

×

○

×

×

×

×

CALL

×

×

×

×

×

×

×

×

LOCK

×

×

×

○

×

×

○

×

NEXT VALUE

×

×

×

×

×

×

×

○

ANY

×

×

×

△

×

×

△

△

UTILITY

PDLOAD

×

×

×

○

×

×

×

○

PDRORG

×

○

×

○

×

×

×

×

PDEXP

×

×

×

○

○

×

○

×

PDCONSTCK

×

×

×

○

×

×

×

×

ANY

×

△

×

○

△

×

△

△

（凡例）

−：該当しません。

○：指定できます。

×：指定できません（KFPA19680-Eメッセージが出力されます）。

△：指定できますが，証跡が出力されない場合があります。

AUDITTYPE句，FOR ＜操作種別＞及び各種別，WHENEVER句の中にあるANY指定を定義している状態でバージョンアップする場合，個々の種別が増えたときはすべて監査対象に含まれます。

例えば，CREATE AUDIT FOR ANY を定義している状態で，バージョンアップをして操作種別が新たに増えた場合，その操作種別も自動的に監査対象になります。

既に定義されている監査対象イベントの定義をCREATE AUDIT文で実行することはできません。KFPA11908-Eメッセージが出力されます。

(7)　使用例

すべての監査イベントの権限チェック時を監査対象として定義します。

  CREATE AUDIT FOR ANY WHENEVER ANY

HiRDBへの接続の権限チェック時を監査対象として定義します。

  CREATE AUDIT FOR SESSION CONNECT

GRANT文実行の権限チェック時を監査対象として定義します。

  CREATE AUDIT FOR PRIVILEGE GRANT

オブジェクト作成の権限チェック時を監査対象として定義します。

  CREATE AUDIT FOR DEFINITION CREATE

INSERTの権限チェック時を監査対象として定義します。

  CREATE AUDIT FOR ACCESS INSERT

すべての監査イベントを監査対象として定義します。

  CREATE AUDIT AUDITTYPE ANY FOR ANY

すべての監査イベントのイベント終了時を監査対象として定義します。

  CREATE AUDIT AUDITTYPE EVENT FOR ANY

監査証跡の取得対象オブジェクトを表USER1.T1に絞り込みます。

  CREATE AUDIT AUDITTYPE EVENT FOR ANY ON TABLE "USER1"."T1"

監査証跡の取得対象をUSER1に絞り込みます。

  CREATE AUDIT AUDITTYPE ANY FOR ANY BY AUTHORIZATION "USER1"

3.9　CREATE CONNECTION SECURITY（CONNECT関連セキュリティ機能の定義）

3.9.1　CREATE CONNECTION SECURITYの形式と規則

(1)　機能

CONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

(2)　使用権限

DBA権限を持つユーザ

DBA権限を持つユーザが，CREATE CONNECTION SECURITYの各定義文を実行できます。

(3)　形式

　CREATE CONNECTION SECURITY FOR ｛セキュリティ対象〔，セキュリティ対象 〕｜接続制約｝

　セキュリティ対象：：＝｛CONNECT〔 PERMISSION COUNT 定数
　　　　　　　　　　　　　　　　　　〔 LOCK ｛ 定数 DAY〔S〕｜定数 HOUR〔S〕
　　　　　　　　　　　　　　　　　　　　　　　｜定数 MINUTE〔S〕｜UNLIMITED ｝〕〕
　　　　　　　　　　　　｜PASSWORD〔 TEST 〕 パスワード文字制限定義 ｝
　接続制約：：＝CONSTRAINT 接続制約名 FOR 〔EXCEPT〕 'IPアドレス'
　パスワード文字制限定義：：＝〔 MIN LENGTH 定数 〕
　　　　　　　　　　　　　　　〔 USER IDENTIFIER｛ RESTRICT｜UNRESTRICT ｝〕
　　　　　　　　　　　　　　　〔 SIMILAR｛ RESTRICT｜UNRESTRICT ｝〕

(4)　オペランド

(a)　セキュリティ対象

：：＝｛CONNECT 〔 PERMISSION COUNT 定数
　　　　　〔 LOCK｛ 定数 DAY〔S〕｜定数 HOUR〔S〕
　　　　　　　　　　｜定数 MINUTE〔S〕｜UNLIMITED ｝〕〕
　　　　｜PASSWORD 〔TEST〕 パスワード文字制限定義 ｝

セキュリティ対象にはCONNECT，PASSWORDをそれぞれ１回しか指定できません。

セキュリティ対象を省略した場合，省略したセキュリティ対象は定義されません。CONNECT，PASSWORD両方のセキュリティ対象を省略することはできません。

セキュリティ対象にCONNECT，又はPASSWORDだけを指定し，CONNECT，又はPASSWORD以降の各オペランドをすべて省略した場合，省略した各オペランドのデフォルト値が設定されます。

CONNECT 〔 PERMISSION COUNT 定数

　　　　〔 LOCK｛ 定数 DAY〔S〕｜定数 HOUR〔S〕｜定数 MINUTE〔S〕

　　　　　　　　　｜UNLIMITED ｝〕〕

連続認証失敗回数制限に関する設定値を指定します。

PERMISSION COUNT 定数

連続認証失敗アカウントロック状態に陥るまでの連続認証失敗回数の許容回数を指定します。連続認証失敗回数が指定値を超えると連続認証失敗アカウントロック状態になります。

PERMISSION COUNT指定を省略した場合は2が設定されます。また，PERMISSION COUNT指定を省略した場合はLOCK指定はできません。

定数

連続認証失敗アカウントロック状態に陥るまでの連続認証失敗回数の許容回数を指定します。

最小値は1（回），最大値は10（回）です。

定数には符号なし整数を指定してください。

LOCK｛ 定数 DAY〔S〕｜定数 HOUR〔S〕｜定数 MINUTE〔S〕｜UNLIMITED ｝

連続認証失敗アカウントロック状態を継続する期間を指定します。

LOCK指定を省略した場合，LOCK 1440 MINUTE（LOCK 1 DAY,LOCK 24 HOUR）が設定されます。

定数には符号なし整数を指定してください。

定数 DAY〔S〕

連続認証失敗アカウントロック状態を継続する期間を日単位で指定します。

最小値は1（日），最大値は31（日）です。

定数 HOUR〔S〕

連続認証失敗アカウントロック状態を継続する期間を時間単位で指定します。

最小値は1（時間），最大値は744（時間）です。

定数 MINUTE〔S〕

連続認証失敗アカウントロック状態を継続する期間を分単位で指定します。

最小値は10（分），最大値は44640（分）です。

UNLIMITED

連続認証失敗アカウントロック状態を継続する期間を無期限にする場合に指定します。

PASSWORD 〔TEST〕 パスワード文字制限定義

パスワード文字制限強化に関する設定値を指定します。

TEST

パスワード文字制限を定義する前に，あらかじめ変更する制限内容に不適合なパスワードを持つ認可識別子を確認する場合に指定します。

TESTを指定した場合，現状のパスワード文字列がパスワード文字制限定義で指定した文字制限に合っているか否かのチェックを行います。

TESTを指定した場合は，パスワード文字制限定義の設定は定義されません。

(b)　接続制約

：：＝CONSTRAINT 接続制約名 FOR 〔EXCEPT〕 'IPアドレス'

IPアドレスによる接続許可・拒否に関する制約を指定します。

接続拒否・許可に関係なく，接続制約を一つ以上定義した場合，許可の制約を定義していないIPアドレスからは接続できません。この機能についての詳細は，マニュアル「HiRDB Version 9 システム運用ガイド」の「IPアドレスによる接続制限」を参照してください。

CONSTRAINT 接続制約名

指定する制約を特定するための接続制約名を指定します。

FOR 〔EXCEPT〕 'IPアドレス'

接続を許可・拒否するクライアントのIPアドレスを文字列定数で指定します。

接続を拒否する場合はEXCEPTを指定してください。EXCEPTを省略すると，接続を許可する設定になります。

IPアドレス

IPv4アドレスを指定します。以下の形式で指定できます。

表3‒14　 IPv4アドレス指定の形式

形式

説明

個別設定

1オクテットごとにピリオドで区切られた10進数で指定します。

範囲指定

ネットワークアドレス／アドレスプリフィックス表記

ネットワークアドレスは1オクテットごとにピリオドで区切られた10進数で指定します。

アドレスプレフィックスは0以上32以下のネットワーク部のビット数を指定します。

ワイルドカードを使用した形式

1オクテットごとに10進数の代わりにアスタリスク（*）を指定できます。

アスタリスクを指定すると，0〜255の範囲を一括で示します。

(c)　パスワード文字制限定義

：：＝〔 MIN LENGTH 定数 〕
　　　〔 USER IDENTIFIER｛ RESTRICT｜UNRESTRICT ｝〕
　　　〔 SIMILAR｛ RESTRICT｜UNRESTRICT ｝〕

MIN LENGTH 定数

パスワードの最小許容バイト数を指定します。

指定した定数未満のバイト数のパスワードを禁止します。

MIN LENGTH指定を省略した場合，8が設定されます。

最小値は6，最大値は15です。

定数には符号なし整数を指定してください。

USER IDENTIFIER｛RESTRICT｜UNRESTRICT｝

認可識別子を含むパスワードを禁止するかどうかを指定します。USER IDENTIFIER指定を省略した場合，RESTRICTが設定されます。

RESTRICT

認可識別子を含むパスワードを禁止する場合に指定します。

UNRESTRICT

認可識別子を含むパスワードを禁止しない場合に指定します。

SIMILAR｛ RESTRICT｜UNRESTRICT ｝

パスワードを構成する文字のすべてを単一文字種とすることを禁止するかどうかを指定します。

SIMILAR指定を省略した場合，RESTRICTが設定されます。

以下の例のようなパスワードを禁止するかどうかを指定します。

例）

FDBGLAOT（英大文字だけ）

24681357（数字だけ）

RESTRICT

パスワードを構成する文字のすべてを単一文字種にすることを禁止する場合に指定します。

UNRESTRICT

パスワードを構成する文字のすべてを単一文字種にすることを禁止しない場合に指定します。

(5)　共通規則

指定したセキュリティ対象が既に定義されている場合，同じセキュリティ対象を重複して定義できません。

CONNECT関連セキュリティ機能に関する項目の定義内容を変更したい場合，一度CONNECT関連セキュリティ機能に関する項目の定義を削除してから，再度CONNECT関連セキュリティ機能に関する項目を定義してください。

DBA権限保持者，及び監査人が一人でも指定したパスワード文字制限定義に違反している場合，CREATE CONNECTION SECURITY FOR PASSWORDはエラーとなります。ただし，TESTオプションを指定している場合はエラーにはなりません。

(6)　留意事項

単一文字種の制限に関する指定を省略した場合はRESTRICTが設定され，制限が有効になります。制限をしない場合は必ずUNRESTRICTを指定してください。

パスワード文字制限が定義されている状態でも，TESTオペランド指定によるパスワードの事前チェックはできます。

(7)　使用例

以下の設定内容でCONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

連続認証失敗回数制限に関する定義

・連続認証失敗許容回数5回

・ロック継続期間7日

パスワード文字制限に関する定義

・パスワード最小許容バイト数10文字

・認可識別子を含むパスワードを禁止

・単一文字種を禁止

CREATE CONNECTION SECURITY FOR
  CONNECT PERMISSION COUNT 5
          LOCK 7 DAY,
  PASSWORD MIN LENGTH 10
           USER IDENTIFIER RESTRICT
           SIMILAR RESTRICT

以下の設定内容でCONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

連続認証失敗回数制限に関する定義

・連続認証失敗許容回数5回

・ロック継続期間 15時間

パスワード文字制限に関する定義

・デフォルト値を設定

CREATE CONNECTION SECURITY FOR
  CONNECT PERMISSION COUNT 5
          LOCK 15 HOUR,
  PASSWORD

以下の設定内容でCONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

連続認証失敗回数制限に関する定義

・定義しない

パスワード文字制限に関する定義

・デフォルト値を設定

CREATE CONNECTION SECURITY FOR PASSWORD

IPアドレスによる接続制限のCONNECT関連セキュリティ機能に関するセキュリティ項目を定義する場合は，マニュアル「HiRDB Version 9 システム運用ガイド」の「IPアドレスによる接続制限」を参照してください。

3.10　CREATE 〔PUBLIC〕FUNCTION（関数定義，パブリック関数定義）

3.10.1　CREATE FUNCTION（関数定義）

(1)　機能

関数を定義します。

(2)　使用権限

スキーマを所有するユーザ

自分が所有する関数を定義できます。

(3)　形式

　CREATE 関数本体

　関数本体：：＝FUNCTION 〔認可識別子.〕ルーチン識別子
　　　　　　　　　　　　（〔SQLパラメタ名 データ型
　　　　　　　　　　　　　　　〔，SQLパラメタ名 データ型〕…〕）
　　　　　　　　　　　　RETURNS データ型
　　　　　　　　　　　　〔LANGUAGE ｛SQL｜JAVA｜C｝〕
　　　　　　　　　　　  〔SQLコンパイルオプション〕
　　　　　　　　　　　　｛SQL手続き文｜外部ルーチン指定｝
　SQLコンパイルオプション：：＝SUBSTR LENGTH 文字の最大長
　外部ルーチン指定：：＝EXTERNAL NAME ｛外部Javaルーチン名｜外部Cストアドルーチン名｝
　　　　　　　　　　　　PARAMETER STYLE パラメタスタイル
　パラメタスタイル：：＝｛JAVA｜RDSQL ｝

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

認可識別子

定義する関数の所有者の認可識別子を指定します。

ルーチン識別子

定義する関数のルーチン識別子を指定します。ルーチン識別子は，所有者のルーチン中で同じ識別子を使用できます。

(b)　（〔SQLパラメタ名 データ型〔，SQLパラメタ名 データ型〕…〕）

SQLパラメタ名

関数のパラメタの名称を指定します。一つの関数中で，SQLパラメタ名は重複して指定できません。

データ型

関数のパラメタのデータ型を指定します。

BOOLEANは指定できません。

指定するデータ型が抽象データ型で，認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

次のデータ型は指定できません。

LANGUAGE句でJAVA又はCを指定した場合，抽象データ型

LANGUAGE句でCを指定した場合，BINARY型及びBLOB型

指定できるデータ型については，「型マッピング」又は「SQLパラメタのデータ型と，C関数に渡すパラメタのデータ型の対応関係」を参照してください。

(c)　RETURNS データ型

データ型

関数の戻り値のデータ型を指定します。

次のデータ型は指定できません。

LANGUAGE句でC以外を指定した場合，BOOLEAN

LANGUAGE句でJAVA又はCを指定した場合の抽象データ型

LANGUAGE句でCを指定した場合，BINARY型及びBLOB型

指定できるデータ型については，「型マッピング」又は「SQLパラメタのデータ型と，C関数に渡すパラメタのデータ型の対応関係」を参照してください。

指定するデータ型が抽象データ型で，認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

(d)　LANGUAGE ｛SQL｜JAVA｜C｝

定義する関数の記述言語を指定します。

外部ルーチン指定を指定する場合，記述言語はJAVA又はCにしてください。

SQL

関数の処理部分をSQL手続き文にする場合に指定します。

JAVA

関数の処理部分を外部ルーチン指定にする場合で，関数をJavaクラスのメソッドで実装するときに指定します。

C

関数の処理部分を外部ルーチン指定にする場合で，関数をC言語で実装するときに指定します。Cを指定した場合，SQLパラメタの最大数が128に制限されます。

このオペランドの指定によって，他オペランドの指定要否が変わります。LANGUAGE句指定による他オペランドの指定要否を次の表に示します。

表3‒15　　CREATE FUNCTIONのLANGUAGE句指定による他オペランドの指定要否

他オペランド

LANGUAGE句

SQL

JAVA

C

EXTERNAL NAME

×

○

○

PARAMETER STYLE

×

JAVA

RDSQL

SQL手続き文

○

×

×

（凡例）

○：指定してください。

×：指定しないでください。

JAVA：JAVAを指定してください。

RDSQL：RDSQLを指定してください。

(e)　SQLコンパイルオプション：：＝SUBSTR LENGTH 文字の最大長

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

《システム定義との関係》

SUBSTR LENGTHを省略すると，システム定義のpd_substr_lengthオぺランドの指定値が仮定されます。pd_substr_lengthオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

CREATE FUNCTIONに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効となります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

(f)　SQL手続き文

SQL関数で実行するSQL手続き文を指定します。

SQL手続き文については，「ルーチン制御SQL」の「全般規定」を参照してください。

指定できるのは複合文だけです。また，SQL関数の中で最後に実行するSQL手続き文は，RETURN文でなければなりません。

(g)　EXTERNAL NAME ｛外部Javaルーチン名｜外部Cストアドルーチン名｝

外部Javaルーチン名

Java言語で記述したJavaメソッドを外部ルーチンとして指定します。外部Javaルーチン名の指定方法については，「外部Javaルーチン名」を参照してください。

外部Cストアドルーチン名

C言語で記述したC関数を外部ルーチンとして指定します。外部Cストアドルーチン名の指定方法については，「外部Cストアドルーチン名」を参照してください。

LANGUAGE句でCを指定する場合は，「SQLパラメタのデータ型と，C関数に渡すパラメタのデータ型の対応関係」を参照してください。

(h)　PARAMETER STYLE パラメタスタイル

外部ルーチンを呼び出す場合，パラメタとして引き渡される内容を指定します。

パラメタスタイルがJAVAの場合

SQLデータ型で定義している外部Java関数のパラメタは，SQLデータ型に対応したJavaデータ型のJavaメソッドのパラメタとして渡されます。

Javaデータ型で定義しているJavaメソッドの戻り値は，Javaデータ型に対応したSQLデータ型の外部Java関数の戻り値として返されます。

パラメタスタイルがRDSQLの場合

SQLパラメタ数をnとすると，外部C関数のSQLパラメタは，次の表に示すように，C関数のパラメタとして渡されます。

表3‒16　　C関数のパラメタとして渡される内容

パラメタ番号

(nはSQL

パラメタ数)

内容

内容の詳細

データ型

1番目〜n番目

SQLパラメタのデータ部

SQLパラメタのデータ部に対応する，入力パラメタです。

SQLパラメタのデータ型に対応するデータ型※1

n+1番目

戻り値のデータ

外部Cストアドルーチンを実装したC関数が，戻り値を設定するための出力パラメタです。

RETURNSで指定したSQLデータ型に対応するデータ型※1

n+2番目〜

2n+1番目

SQLパラメタの標識部

SQLパラメタの標識部に対応する，入力パラメタです。データがナル値の場合，負の値を設定してC関数に渡します。

short*

2n+2番目

戻り値の標識部

外部Cストアドルーチンの戻り値の標識部を設定するための出力パラメタです。初期値として，0が設定されています。

外部Cストアドルーチンを実装したC関数内では，次の説明に従って，標識部を設定してください。

出力値がナル値の場合

設定値：−1

出力値が非ナル値の場合

設定値：0

short*

2n+3番目

SQLSTATE

外部Cストアドルーチンを実装したC関数が，SQLSTATEの値を設定するための出力パラメタです。領域長は6バイトです。領域の先頭から5バイト目までにSQLSTATEの値を設定してください。外部Cストアドルーチンを実装したC関数内では，次の説明に従って，SQLSTATEの値を設定してください。

C関数が正常終了したとき

設定値：'00000'

SQL実行結果：正常終了します。

C関数が異常終了したとき

設定値：形式'38XYY'の値

X，Yは，それぞれ次の範囲の値です。

X：'I'〜'Z'

Y：'0'〜'9'又は'A'〜'Z'

（例）'38I01'，'38ZCD'

SQL実行結果：SQLエラーになります。

C関数が任意の状態で終了したとき

設定値：'00000'，形式'38XYY'の値以外

SQL実行結果：SQLエラーになります。

char*

2n+4番目

ルーチン名

ルーチン名を表す入力パラメタです。

struct{

short 変数名1;

char変数名2[30];

}*※2

2n+5番目

特定名

関数を特定するための特定名を表す入力パラメタです。

struct{

short 変数名1;

char変数名2[30];

}*※2

2n+6番目

メッセージテキスト

外部Cストアドルーチンを実装したC関数内でエラーが発生した場合，エラーが発生した詳細な理由を設定するための出力パラメタです。

外部Cストアドルーチンの実行終了時，SQLSTATEにクラス38の値が設定されていると，メッセージテキストを埋め込んだエラーメッセージが出力されます。

なお，設定できるメッセージテキストの長さは，最大80バイトです。

struct{

short 変数名1;

char変数名2[80];

}*※2

注※1

外部C関数定義時に指定できるSQLパラメタのデータ型と，外部Cストアドルーチンを実装したC関数に渡すパラメタのデータ型の対応関係については，「SQLパラメタのデータ型と，C関数に渡すパラメタのデータ型の対応関係」を参照してください。

注※2

変数名1に文字列長（バイト数），変数名2に内容を表す文字列を設定します。

表3‒17　SQLパラメタのデータ型と，C関数に渡すパラメタのデータ型の対応関係

SQLパラメタの

データ型

C関数に渡すパラメタのデータ型

領域サイズ(byte)

備考

INT〔EGER〕

int*

4

−

SMALLINT

short*

2

−

〔LARGE〕 DEC〔IMAL〕〔(p〔,s〕)〕,

〔LARGE〕NUMERIC〔(p〔,s〕)〕

char* ※２

↓p/2↓ + 1

1≦p≦38，0≦s≦p

FLOAT，

DOUBLE PRECISION

double*

8

−

SMALLFLT，

REAL

float*

4

−

CHAR〔ACTER〕〔(n)〕

char* ※１

n + 1

1≦n≦30,000

CHAR〔ACTER〕〔(n)〕 CHARACTER SET〔MASTER.〕EBCDIK

CHAR〔ACTER〕〔(n)〕CHARACTER SET 〔MASTER.〕UTF16

char* ※１

n + 2

2≦n≦30,000

VARCHAR(n)

char* ※１

n + 1

1≦n≦32,000

VARCHAR(n) CHARACTER SET 〔MASTER.〕EBCDIK

CHAR〔ACTER〕 VARYING(n)

char* ※１

n + 1

1≦n≦32,000

CHAR〔ACTER〕 VARYING(n) CHARACTER SET 〔MASTER.〕EBCDIK

VARCHAR(n) CHARACTER SET〔MASTER.〕 UTF16

char* ※１

n + 2

2≦n≦32,000

CHAR〔ACTER〕 VARYING(n) CHARACTER SET〔MASTER.〕 UTF16

char* ※１

n + 2

2≦n≦32,000

NCHAR〔(n)〕，

NATIONAL CHAR〔ACTER〕〔(n)〕

char* ※１

2n + 1

1≦n≦15,000

NVARCHAR(n)，

NATIONAL CHAR〔ACTER〕 VARYING(n)，

NCHAR VARYING(n)

char* ※１

2n + 1

1≦n≦16,000

MCHAR〔(n)〕

char* ※１

n + 1

1≦n≦30,000

MVARCHAR(n)

char* ※１

n + 1

1≦n≦32,000

DATE

char*※４

4

−

TIME

char*※４

3

−

INTERVAL YEAR TO DAY

char* ※３

5

−

INTERVAL HOUR TO SECOND

char* ※３

4

−

TIMESTAMP〔(p)〕

char* ※４

n

領域サイズｎは，pの値に従って，次のように決定します。

p=0のとき，n=7

p=2のとき，n=8

p=4のとき，n=9

p=6のとき，n=10

BOOLEAN

int* ※5

4

0:偽

1:真

標識変数

short*

2

−

（凡例）

−：備考はありません。

注

int型が4バイトの2進形式データを表現する処理系以外では，C関数に渡すパラメタのデータ型のint型を，4バイト2進形式データを表すデータ型に読み替えてください。

注※１

文字集合指定UTF16が指定されていないSQLのデータ型（CHAR(n)，VARCHAR(n)，NCHAR(n)，NVARCHAR(n)，MCHAR(n)，MVARCHAR(n)）と，C言語のデータ型（char[n+1]，char[n+1]，char[2n+1]，char[2n+1]，char[n+1]，char[n+1]）との間での変換規則を示します。

SQLのデータ型からC言語のデータ型への変換（Cストアドプロシジャの場合は，入力パラメタ及び入出力パラメタ，Cストアドファンクションの場合は，入力パラメタ）

CHAR(n)からchar[n+1]への変換

VARCHAR(n)からchar[n+1]への変換

NCHAR(n)からchar[2n+1]への変換

NVARCHAR(n)からchar[2n+1]への変換

MCHAR(n)からchar[n+1]への変換

MVARCHAR(n)からchar[n+1]への変換

文字列の終端にナル文字を付け加えます。

C言語のデータ型からSQLのデータ型への変換（Cストアドプロシジャの場合は，出力パラメタ及び入出力パラメタ，Cストアドファンクションの場合は，戻り値）

char[n+1]からCHAR(n)への変換

char[n+1]からVARCHAR(n)への変換

char[2n+1]からNCHAR(n)への変換

char[2n+1]からNVARCHAR(n)への変換

char[n+1]からMCHAR(n)への変換

char[n+1]からMVARCHAR(n)への変換

C言語の文字列からHiRDBが受け取る文字列の長さは，先頭からナル文字の一つ前までの長さとします。SQLのデータ型がCHAR(n)，NCHAR(n)又はMCHAR(n)であり，HiRDBが受け取った文字列の長さがSQLのデータ型の定義長に満たない場合は，文字列の終わりに空白を追加して定義長にします。なお，n+1個の配列要素の中にナル文字がない場合，異常終了します。

文字集合指定UTF16が指定されているSQLのデータ型（CHAR(n)，VARCHAR(n)）と，C言語のデータ型（char[n+2]，char[n+2]）との間での変換規則を示します。

SQLのデータ型からC言語のデータ型への変換（Cストアドプロシジャの場合は，入力パラメタ及び入出力パラメタ，Cストアドファンクションの場合は，入力パラメタ）

CHAR(n)からchar[n+2]への変換

VARCHAR(n)からchar[n+2]への変換

文字列の終端に2バイトのナル文字を付け加えます。

C言語のデータ型からSQLのデータ型への変換（Cストアドプロシジャの場合は，出力パラメタ及び入出力パラメタ，Cストアドファンクションの場合は，戻り値）

char[n+2]からCHAR(n)への変換

char[n+2]からVARCHAR(n)への変換

C言語の文字列からHiRDBが受け取る文字列の長さは，先頭からナル文字の一つ前までの長さとします。SQLのデータ型がCHAR(n)であり，HiRDBが受け取った文字列の長さがSQLのデータ型の定義長に満たない場合は，文字列の終わりに空白を追加して定義長にします。なお，n+2個の配列要素の中に2バイトのナル文字がない場合，異常終了します。

注※2

DECIMAL型は，パック10進形式でデータを表現します。DECIMAL型については，「データ型」を参照してください。

C言語によってDECIMAL型の値を設定する記述例を次に示します。

123.4567（奇数けた）の場合

unsigned char ex1[4]={0x12,0x34,0x56,0x7c};

-123.456（偶数けた）の場合

unsigned char ex2[4]={0x01,0x23,0x45,0x6d};

0（奇数けた）の場合

unsigned char ex3[1]={0x0c};

注※3

INTERVAL YEAR TO DAY型，INTERVAL HOUR TO SECOND型は，パック10進形式でデータを表現します。各データ型については，「データ型」を参照してください。

注※4

DATE型，TIME型，TIMESTAMP型は，符号なしパック10進形式でデータを表現します。各データ型については，「データ型」を参照してください。

注※5

BOOLEAN型は，Cストアドファンクションの戻り値としてだけ使用できます。

(5)　共通規則

SQLパラメタは，代入文の代入先には指定できません。

関数のパラメタは，30,000個（LANGUAGE句がCの場合は128個）以下でなければなりません。ただし，LANGUAGE句にSQL以外を指定した場合，30,000個以下でも，外部ルーチンの言語仕様の制限で実行時にエラーになるときがあります。

SQLパラメタは，入力用のSQLパラメタとなります。

SQL手続き文中で指定する関数は，既に定義してある関数だけ指定できます。

関数を定義すると，システムが各関数を一意に特定するための特定名を定義します。特定名の名称規則を次に示します。

特定名：：＝F 関数名 オブジェクトID

先頭1バイト'F'固定

2バイト目から関数名（関数名が19バイトを超える場合は，19文字まで使用します）

関数名に続いてオブジェクトIDが10バイト（右詰めで先頭から0が埋め込まれた値となります）

システムが提供する関数と同じ関数は定義できません。次に示す条件1又は条件2のどちらかの条件をすべて満たす場合，その関数は定義できません。

条件1

関数のSQLパラメタ数が二つ

1番目のSQLパラメタのデータ型が抽象データ型

関数名と同じ名称の属性が，1番目のSQLパラメタで指定した抽象データ型中の属性として定義されている

2番目のSQLパラメタのデータ型が，関数名と同じ名称の属性のデータ型と同じ

条件2

関数のSQLパラメタ数が一つ

SQLパラメタのデータ型が抽象データ型

関数名と同じ名称の属性が，SQLパラメタで指定した抽象データ型中の属性として定義されている

LANGUAGE句を省略，又はLANGUAGE句にSQLを指定した場合，外部ルーチン指定は指定できません。

LANGUAGE句にSQL以外を指定した場合，SQL手続き文は指定できません。

関数本体中に指定した関数呼出しの関数名が認可識別子で修飾されている場合，現在定義しようとしている関数と，認可識別子，ルーチン識別子，引数の数が一致する関数は指定できません。

関数本体中に指定した関数呼出しの関数名が認可識別子で修飾されていない場合，現在定義しようとしている関数と，ルーチン識別子，引数の数が一致する関数は指定できません。

次の条件をすべて満たす関数が定義されている場合，CREATE FUNCTIONは実行できません。

認可識別子が同じ

ルーチン識別子（関数名）が同じ

パラメタの数が同じ

パラメタのデータ型が同じ※

注※

固定長文字データ型又は可変長文字データ型の文字集合指定が異なる場合は，異なるデータ型として扱います。

ALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成する関数の元のCREATE FUNCTIONにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

実行中のSQLオブジェクトが無効になる場合，外部Java手続き中からCREATE FUNCTIONは実行できません。

(6)　留意事項

CREATE FUNCTIONは，OLTP下のX/Openに従ったUAPから指定できません。

SQLパラメタは，ナル値を持てます。

SQL手続き文中で複数のSQL文を実行するためには，複合文などのルーチン制御SQLを使用します。

SQL関数を定義すると，それを実行するためのアクセス手順を記述したSQLオブジェクトが作成されます。

関数定義に伴うSQLオブジェクトの無効化について示します。

定義する関数と，所有者，ルーチン識別子，及びSQLパラメタ数が同じ関数が既にある場合，既にある関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトは無効となります。

定義する関数と，ルーチン識別子及びSQLパラメタ数が同じで，かつ認可識別子が'MASTER'の関数がある場合，認可識別子'MASTER'の関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクトのうち，定義する関数の認可識別子が所有するSQLオブジェクトは無効となります。また，有効なSQLオブジェクトがパブリック関数及びパブリック手続きの場合，定義する関数の認可識別子と，パブリック関数及びパブリック手続きを定義した認可識別子が同じならば，そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。

定義する関数と，ルーチン識別子及びSQLパラメタ数が同じパブリック関数がある場合，そのパブリック関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクトのうち，定義する関数の認可識別子が所有するSQLオブジェクトは無効となります。また，有効なSQLオブジェクトがパブリック関数及びパブリック手続きの場合，定義する関数の認可識別子と，パブリック関数及びパブリック手続きを定義した認可識別子とが同じならば，そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。

ストアドファンクションを定義，又は削除するときの注意事項については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

5に示した無効になる関数のうち，次のどちらかの条件を満たす関数をビュー定義で使用している場合，関数定義がエラーになります。

引数のデータ型に抽象データ型を使用している

戻り値のデータ型に抽象データ型を使用している

関数，手続き，及びトリガの有効なSQLオブジェクトが無効になった場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数，手続き，及びトリガの行は削除されます。

無効となった関数，手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，関数，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

関数定義に伴って無効となった関数を使用したビュー表がある場合，そのビュー表を操作するにはALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。

ルーチン内でのルーチンの呼び出しを多数又は無限に繰り返す場合，OSのスタックがオーバフローすることがあります。

SQLコンパイルオプションのSUBSTR LENGTHは，関数の定義時，又は変更時の指定で決まり，関数呼出し時のシステム定義やクライアント環境定義の影響を受けません。

3.10.2　CREATE PUBLIC FUNCTION（パブリック関数定義）

(1)　機能

すべてのユーザから，認可識別子でルーチン識別子を修飾しなくても使用できる関数（パブリック関数）を定義します。

(2)　使用権限

スキーマを所有するユーザ

自分が所有するパブリック関数を定義できます。

(3)　形式

　CREATE PUBLIC 関数本体

(4)　オペランド

(a)　PUBLIC

関数をパブリック関数として定義する場合に指定します。

パブリック関数にすると，同じ内容の関数をユーザごとに定義しなくても，一つの関数をルーチン識別子だけを指定して複数のユーザで使用できます。

(b)　関数本体

「〔認可識別子.〕ルーチン識別子」以外の説明については，「CREATE FUNCTION（関数定義）」と同じです。

〔認可識別子.〕ルーチン識別子

認可識別子

パブリック関数のため，認可識別子は指定できません。

ルーチン識別子

定義するパブリック関数のルーチン識別子を指定します。ルーチン識別子は，パブリック関数中で同じルーチン識別子を使用できます。

(5)　共通規則

関数本体の「〔認可識別子.〕ルーチン識別子」の認可識別子は指定できません。

関数本体中に指定した関数呼出しの関数名がPUBLICで修飾されている場合，現在定義しようとしているパブリック関数と，ルーチン識別子，引数の数が一致するパブリック関数は指定できません。

関数本体中に指定した関数呼出しの関数名が認可識別子で修飾されていない場合，現在定義しようとしているパブリック関数と，ルーチン識別子，引数の数が一致する関数は指定できません。

次の条件をすべて満たすパブリック関数が定義されている場合，CREATE PUBLIC FUNCTIONは実行できません。

ルーチン識別子（関数名）が同じ

パラメタの数が同じ

パラメタのデータ型が同じ※

注※

固定長文字データ型又は可変長文字データ型の文字集合指定が異なる場合は，異なるデータ型として扱います。

ALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成する関数の元のCREATE PUBLIC FUNCTIONにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

実行中のSQLオブジェクトが無効になる場合，外部Java手続き中からCREATE PUBLIC FUNCTIONは実行できません。

その他の規則は，「CREATE FUNCTION（関数定義）」と同じです。

(6)　留意事項

CREATE PUBLIC FUNCTIONは，OLTP下のX/Openに従ったUAPから指定できません。

パブリック関数定義に伴うSQLオブジェクトの無効化について，次に示します。

定義するパブリック関数と，ルーチン識別子及びSQLパラメタ数が同じパブリック関数が既にある場合，既にあるパブリック関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトは無効となります。

定義するパブリック関数と，ルーチン識別子及びSQLパラメタ数が同じで，かつ認可識別子が'MASTER'の関数がある場合，認可識別子'MASTER'の関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトは無効となります。

ストアドファンクションを定義，又は削除するときの注意事項については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

2に示した無効になる関数のうち，次のどちらかの条件を満たす関数をビュー定義で使用している場合，パブリック関数定義がエラーになります。

引数のデータ型に抽象データ型を使用している

戻り値のデータ型に抽象データ型を使用している

無効となった関数を使用したビュー表がある場合，そのビュー表を操作するにはALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。

ディクショナリ表の所有者を格納する列（SQL_ROUTINES表のROUTINE_SCHEMA列など）にはPUBLICが設定されます。また，パブリック関数を定義した認可識別子はSQL_ROUTINES表のROUTINE_CREATOR列に格納されます。

パブリック関数の削除は，DROP PUBLIC FUNCTIONで行います。

その他の留意事項は，「CREATE FUNCTION（関数定義）」と同じです。

3.11　CREATE INDEX　形式1（インデクス定義）

3.11.1　CREATE INDEX形式1の形式と規則

(1)　機能

実表の一つ，又は複数の列にインデクスを定義します。

(2)　使用権限

表の所有者

公用RDエリアに自分が所有する表のインデクスを定義できます。

私用RDエリアの利用権限を持つ表の所有者

利用権限を持つ私用RDエリアに自分が所有する表のインデクスを定義できます。

(3)　形式1＜インデクスの定義＞

　CREATE 〔UNIQUE〕 INDEX 〔認可識別子.〕インデクス識別子
　　　　ON 〔認可識別子.〕表識別子（列名〔｛ASC｜DESC｝〕
　　　　　　　　　　　　　　　　　〔，列名〔｛ASC｜DESC｝〕〕…）
　　　　〔IN｛RDエリア名
　　　　　　　｜（RDエリア名）
　　　　　　　｜（（RDエリア名）〔，（RDエリア名）〕…）
　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　〔インデクスオプション〕…

　マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝
　　　　　　　（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）
　インデクスオプション：：＝｛PCTFREE=未使用領域の比率
　　　　　　　　　　　　　　｜UNBALANCED SPLIT
　　　　　　　　　　　　　　｜EMPTY
　　　　　　　　　　　　　　｜除外値指定｝
　除外値指定：：＝EXCEPT VALUES （NULL〔，NULL〕…）

(4)　オペランド

(a)　〔UNIQUE〕

インデクスを定義するキー値（インデクスとして定義する一つ，又は複数の列の全体の値）が，すべての行で異なっている場合に指定します。

UNIQUEを指定して，インデクス作成，又は更新時に重複キー値を検出した場合，HiRDBがエラーを返します。ただし，ナル値を含むキー値の場合，重複した値があっても重複キーにはなりません。

UNIQUEを指定する場合は次の点に注意してください。

1. 表を横分割する場合

表を横分割する場合のUNIQUE指定可否を次の表に示します。

表3‒18　表を横分割する場合のUNIQUE指定可否

表の分割方法※１

UNIQUEを指定しようとするインデクスの構成列※２

インデクスの分割方法※４

UNIQUE指定可否

サーバ内の横分割

キーレンジ分割（マトリクス分割以外），及びFIXハッシュ分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーを含む（順不同）

表の分割数と一致

○

表の分割数と不一致（横分割しない）

○

分割キーを含まない（順不同）

表の分割数と一致

×

表の分割数と不一致（横分割しない）

○※３

フレキシブルハッシュ分割

該当しない

該当しない

×

マトリクス分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーをすべて含む場合（順不同）

表の分割数と一致

○

表の分割数と不一致

−

分割キーをすべて含まない場合（順不同）

表の分割数と一致

×

表の分割数と不一致（横分割しない）

−

サーバ間の横分割（サーバ内分割なし）

キーレンジ分割（マトリクス分割以外），及びFIXハッシュ分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーをすべて含む場合（順不同）

表の分割数と一致

○

表の分割数と不一致

−

分割キーをすべて含まない場合（順不同）

表の分割数と一致

×

表の分割数と不一致

−

フレキシブルハッシュ分割

該当しない

該当しない

×

マトリクス分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーをすべて含む場合（順不同）

表の分割数と一致

○

表の分割数と不一致

−

分割キーをすべて含まない場合（順不同）

表の分割数と一致

×

表の分割数と不一致

−

サーバ間の横分割（サーバ内分割あり）

キーレンジ分割（マトリクス分割以外），及びFIXハッシュ分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーをすべて含む場合（順不同）

表の分割数と一致（サーバ内でも分割）

○

表の分割数と不一致（サーバ内は非分割）

○

分割キーをすべて含まない場合（順不同）

表の分割数と一致（サーバ内でも分割）

×

表の分割数と不一致（サーバ内は非分割）

×

フレキシブルハッシュ分割

該当しない

該当しない

×

マトリクス分割

分割キーインデクス

表の分割数と一致

○

表の分割数と不一致

−

非分割キーインデクス

分割キーをすべて含む場合（順不同）

表の分割数と一致

○

表の分割数と不一致

−

分割キーをすべて含まない場合（順不同）

表の分割数と一致

×

表の分割数と不一致

−

（凡例）

○：UNIQUEを指定できます。

×：UNIQUEを指定できません。

−：インデクスを定義できません。

注※1

サーバ内の横分割とは，HiRDB/シングルサーバでの横分割，又はHiRDB/パラレルサーバで一つのバックエンドサーバに閉じた横分割のことをいいます。

サーバ間の横分割とは，HiRDB/パラレルサーバで複数のバックエンドサーバにわたった横分割のことをいいます。なお，サーバ内の横分割とサーバ間の横分割が混在する場合は，サーバ間の横分割に分類します。表の横分割については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

注※2

分割キーインデクスとは，表を横分割するときに格納条件を指定した列（分割キー）を第1構成列とするインデクスのことで，次のインデクスを指します。

単一列分割の場合：

分割キーに作成した単一列インデクス，又は分割キーを先頭とする複数の列に作成した複数列インデクス

複数列分割の場合：

分割キーを先頭とし，かつ分割に指定した列を先頭から同順にすべて含んでいて，複数の列に作成した複数列インデクス

分割キーインデクス以外のインデクスを，非分割キーインデクスといいます。

注※3

ハッシュ分割表のリバランス機能使用時は×となります（RDエリアを追加してサーバ間分割に移行した場合に，UNIQUEが指定できなくなるため）。

注※4

インデクスの分割方法は，インデクス格納用RDエリアの指定方法に依存します。INオペランドを省略した場合は，フレキシブルハッシュ分割を除き，インデクスの分割方法が原因でUNIQUEを指定できなくなることはありません。INオペランドで明示的にインデクス格納用RDエリアを指定する場合には，UNIQUEを指定できないときがあるので注意してください。

2. 繰返し列を使用している場合

UNIQUEを指定したインデクスの構成列に，繰返し列を含むことはできません。

(b)　〔認可識別子.〕インデクス識別子

認可識別子には，作成したインデクスを所有するユーザの認可識別子を指定します。

インデクス識別子には，定義するインデクスの名称を指定します。

表所有者が定義した自分の所有するインデクス内に同じ名称は指定できません。

(c)　〔認可識別子.〕表識別子

認可識別子には，表を所有するユーザの認可識別子を指定します。

表識別子には，インデクスを作成する実表の名称を指定します。

(d)　（列名〔｛ASC｜DESC｝〕〔，列名〔｛ASC｜DESC｝〕〕…）

列名

インデクスを定義する列の名称を指定します。

列名は最大64個指定できます。

列名を複数個指定する場合，同じ名称は指定できません。

ASC

インデクスを昇順に定義する場合に指定します。

DESC

インデクスを降順に定義する場合に指定します。

(e)　IN

｛RDエリア名
　｜（RDエリア名）
　｜（（RDエリア名）〔，（RDエリア名）〕…）
　｜マトリクス分割インデクス格納用RDエリア指定｝

マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）

インデクスを格納するRDエリアの名称を指定します。

マトリクス分割インデクス格納用RDエリア指定は，マトリクス分割表にインデクスを定義する場合に指定します。RDエリア名の規則については，マトリクス分割以外の表と同じです。

インデクスを格納するRDエリアについての規則を次に示します。

RDエリア名は一時表用RDエリア以外のユーザ用RDエリアである必要があります。また，HiRDB/パラレルサーバでは次の制限があります。表識別子で指定した表が共用表の場合，RDエリア名は共用RDエリアでなければいけません。表識別子で指定した表が非共用表の場合，RDエリア名に共用RDエリアは指定できません。

RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

RDエリア名を省略すると，表識別子で指定した表が格納されているRDエリアに格納されます。ただし，HiRDB/シングルサーバで表を分割した場合，又はHiRDB/パラレルサーバで同じバックエンドサーバ内で表を分割した場合，分割キー以外の列を先頭に指定したインデクスは，最初に分割条件を指定した表格納先RDエリアに格納されます。マトリクス分割表の場合，分割キーに指定したすべての列を，インデクス構成列の先頭から同順に指定しないときは，2次元格納用RDエリア指定を省略できません。

RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。ただし，境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表で，表格納用RDエリア名が重複している場合は指定できます。

表が複数のRDエリアに分割して格納されている場合，インデクス格納用RDエリアの指定は次のようになります。

・分割キーインデクスの場合，RDエリア名は表を格納しているRDエリアと同じ数だけ指定します。このとき，インデクスの格納先はCREATE TABLEで指定した表格納用RDエリアの指定順に対応します。

・境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表で，表格納用RDエリア名が重複している場合は，それに対応するようにインデクス格納用RDエリア名を指定します。

定義例を次に示します。

1．格納条件による横分割の場合

2．境界値による横分割の場合

3．マトリクス分割の場合

HiRDB/パラレルサーバの場合，表を格納するRDエリアと対応するインデクスを格納するRDエリアは同じバックエンドサーバ内の必要があります。

非分割キーインデクスの場合のRDエリアの指定は次のようにしてください。

・インデクスをサーバ内横分割しない場合，RDエリア名は表を分割して格納しているサーバの数だけ指定します。HiRDB/パラレルサーバの場合，表があるバックエンドサーバごとに一つのRDエリアを指定します。HiRDB/シングルサーバの場合，一つ指定できます。ただし，マトリクス分割表の場合，分割キーインデクスのときと同じです。

・インデクスをサーバ内横分割する場合，RDエリア名は表を格納しているRDエリアと同じ数だけ指定します。このとき，インデクスの格納先はCREATE TABLEで指定した表格納用RDエリアの指定順に対応します。また，境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表で，表格納用RDエリア名が重複している場合は，それに対応するようにインデクス格納用RDエリア名を指定します。

なお，指定順は任意であり，同一サーバ上の表格納RDエリアに対応するインデクスが各々格納されます。

リバランス表を格納しているユーザ用RDエリアは指定できません。

リバランス表に対してインデクスを定義する場合は，RDエリア名を必ず指定してください。

(f)　PCTFREE=未使用領域の比率

インデクス作成時のインデクスページ内の未使用領域の比率を指定します。未使用領域の比率は，0〜99（単位：％）を指定できます。省略すると，30％が仮定されます。仮定値は，システム共通定義のpd_ddl_idx_pctfreeオペランドで変更できます。pd_ddl_idx_pctfreeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

データベース作成ユティリティ及びデータベース再編成ユティリティでのインデクスの一括作成時に，未使用領域の比率でインデクスが作成されます。INSERT文やUPDATE文など，ほかの追加，及び更新ではPCTFREE=0が仮定されます。

インデクスを定義した後，行の追加が頻繁に発生する場合，未使用領域の比率を高く設定してください。

(g)　UNBALANCED SPLIT

ページスプリットする場合，両ページに対するキーの振り分けを不均衡にします。

スプリット対象ページへのキーの追加位置が，ページの前半部の場合はスプリット後の左側のページの空きを多く確保し，後半部の場合は右側のページの空きを多く確保するように分割します。このようなインデクスをアンバランスインデクススプリットといいます。

アンバランスインデクススプリットについては，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(h)　EMPTY

未完状態のインデクスを作成する場合に指定します。

EMPTYを指定すると，インデクスを定義するときの同時実行性を向上させることができます。また，表の格納データが多く，複数のインデクスの定義を同時に実行する場合に効果があります。表にデータが格納されていない場合は効果がありません。

EMPTYオプションの使用方法については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(i)　除外値指定

ナル値だけで構成されるキー値を除いて，インデクスを定義します。

非ナル値制約の列を含む場合には，除外値指定は指定できません。また，除外値指定を指定した場合，データベース再編成ユティリティでインデクス順にアンロードできません。

除外値を指定したインデクスの構成列に，繰返し列を含むことはできません。

(5)　共通規則

インデクスは，一つの表に最大255個定義できます。

インデクスは，ナル値を含む列，又は行のない列に対しても定義できます。

インデクスは，次に示すデータ型の列では定義できません。

BLOB

BINARY

抽象データ型

インデクスを複数の列で構成する場合，項番3に加え，次に示すデータ型の列は指定できません。

FLOAT

SMALLFLT

インデクスを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計≦

MIN((インデクス格納用RDエリアのページサイズ÷2)−1242，4036)

定義するインデクスが一時インデクスの場合は，一時表を実体化する際に上記を満たすかどうかをチェックします。

一時表の実体化については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

インデクスを構成する各列の長さを次の表に示します。

表3‒19　インデクスを構成する列の長さ

データ型

各列の長さの合計が255バイト以下の場合

各列の長さの合計が256バイト以上の場合

単一列インデクスを構成する列

複数列インデクスを構成する列

単一列インデクスを構成する列

複数列インデクスを構成する列

構成列が固定長だけの場合

構成列に可変長を含む

構成列が固定長だけの場合

構成列に可変長を含む

INTEGER

4

5

6

−

5

7

SMALLINT

2

3

4

−

3

5

DECIMAL〔（m〔，n〕）〕

↓m÷2↓＋1

↓m÷2↓＋2

↓m÷2↓＋3

−

↓m÷2↓＋2

↓m÷2↓＋4

FLOAT

8

−

−

−

−

−

SMALLFLT

4

−

−

−

−

−

CHAR（n），MCHAR（n）

n1

n1＋1

n1＋2

n1

n1＋1

n1＋3

NCHAR（n）

2×n2

2×n2＋1

2×n2＋2

2×n2

2×n2＋1

2×n2＋3

DATE

4

5

6

−

5

7

TIME

3

4

5

−

4

6

TIMESTAMP

7＋p÷2

8＋p÷2

9＋p÷2

−

8＋p÷2

10＋p÷2

INTERVAL YEAR TO DAY

5

6

7

−

6

8

INTERVAL HOUR TO SECOND

4

5

6

−

5

7

VARCHAR, MVARCHAR

n1+1

−

n1＋2

n1+2

−

n1＋3

NVARCHAR

2×n2+1

−

2×n2＋2

2×n2+2

−

2×n2＋3

（凡例）

m，n：正の整数

n1：実際のデータ長

n2：文字数

p：小数秒精度

−：該当しません。

同じ列構成のインデクス（クラスタキー，主キーも含む）は，一つだけ定義できます。同じ列構成とは，次の条件をすべて満たすものをいいます。

列名の並び，及び列数が一致している

昇順，降順の指定がすべて一致している，又はすべて逆になっている

インデクスを定義しようとしている表に対して手続き及びトリガが定義されている場合，そのSQLオブジェクト中のインデクス情報は無効になります。この場合，トリガは実行できなくなります。また，手続きからこの手続き又はトリガは実行できなくなるため，SQLオブジェクトを再作成する必要があります。

同一のインデクスオプションは，繰り返して指定できません。

複数の繰返し列から構成されるインデクスを定義した場合，それらの繰返し列の現在要素数は同じにしてください。

実行中のSQLオブジェクト中のインデクス情報が無効になる場合，Java手続き中からCREATE INDEXは実行できません。

インデクスを格納するRDエリアに，インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合，RDエリア名にはオリジナルRDエリア名を指定します。

インナレプリカ機能を使用している場合のCREATE INDEXの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

一つのRDエリアに格納できるインデクスは，最大500個です。

インデクスの構成列に，予備列は指定できません。

一時インデクスを定義する場合，次の指定はできません。

格納用RDエリア名

EMPTY

SQLセッション固有一時表を使用しているSQLセッション中で，使用中のSQLセッション固有一時表に対してインデクスは定義できません。

(6)　留意事項

インデクスが付いている列の値をユーザが更新すると，インデクスも更新されます。

複数列インデクスを定義すると，各列の指定順位はキー値作成の指定順位になります。

単一列インデクスが定義されている列にも，複数列インデクスを定義できます。

CREATE INDEXは，OLTP下のX/Openに従ったUAPからは指定できません。

EMPTYを指定してインデクスを定義した場合，データベース再編成ユティリティでインデクスを再作成する必要があります。インデクスの再作成については，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

WITHOUT ROLLBACKを指定している表にインデクスを定義した場合の規則については，「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

除外値指定を指定したインデクスは，除外値の行が選択される可能性があるSQL文では使用されないので注意してください。

大量のデータが登録されている表に対してCREATE INDEX文でインデクスを作成する場合，処理時間が長くなるおそれがあります。CREATE INDEX文を実行する前に，タイマ監視に関する指定を次のように設定してください。

クライアント環境定義PDCWAITTIME

実績やデータ量からCREATE INDEXの実行時間を推測できる場合は，0以外の余裕を持たせた値を指定してください。

実行時間を推測できない場合は，0又は指定を省略してください。

HiRDB/パラレルサーバでサーバ間横分割した表にインデクスを定義する場合で，表格納用RDエリア，又は指定したインデクス格納用RDエリアが閉塞状態のときは，RDエリアの排他待ちとなります。このとき，排他待ちの時間がシステム定義pd_lck_wait_timeoutオペランドの指定値に達してタイムアウトしても，すぐにエラーリターンされないことがあります。これを避けるため，CREATE INDEX文を実行する前に，表格納用RDエリア，又は指定したインデクス格納用RDエリアの閉塞状態を解除してください。

(7)　使用例

在庫表（ZAIKO）の商品コード（SCODE）列に昇順のインデクス（IDX1）を定義します。ただし，インデクス定義後も行の追加が頻繁に発生すると仮定し，インデクスページ内の未使用領域の比率を50パーセントに指定します。

  CREATE INDEX IDX1
      ON ZAIKO(SCODE ASC)
      PCTFREE = 50

在庫表（ZAIKO）の商品名（SNAME）列と色（COL）列を組にして，複数列インデクス（IDX2）を定義します。このとき，インデクスをユーザ用RDエリア（RDA1）に格納します。

  CREATE INDEX IDX2
      ON ZAIKO(SNAME,COL)
      IN RDA1

在庫表（ZAIKO）の商品コード（SCODE）列に昇順のインデクス（IDX3）を定義します。このとき，インデクスをRDA1，RDA2，RDA3のRDエリアに分割して格納します。

ただし，在庫表は商品コードを分割キーにし，三つのRDエリアに分割して格納されているものとします。

  CREATE INDEX IDX3
      ON ZAIKO(SCODE)
      IN ((RDA1),(RDA2),(RDA3))

3.12　CREATE INDEX　形式2（インデクス定義）

3.12.1　CREATE INDEX形式2の形式と規則

(1)　機能

インデクス型を指定したインデクスを定義します。

(2)　使用権限

表の所有者

公用RDエリアに自分が所有する表のインデクスを定義できます。

私用RDエリアの利用権限を持つ表の所有者

利用権限を持つ私用RDエリアに自分が所有する表のインデクスを定義できます。

(3)　形式2＜インデクス型を指定したインデクスの定義＞

　CREATE INDEX 〔認可識別子.〕インデクス識別子
　　　　USING TYPE 〔認可識別子.〕インデクス型識別子
　　　　ON 〔認可識別子.〕表識別子（列名）
　　　　IN｛RDエリア名
　　　　　　｜（RDエリア名）
　　　　　　｜（（RDエリア名）〔，（RDエリア名）〕…）
　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　〔インデクスオプション〕
        〔PLUGIN プラグインオプション〕
　マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝
　　　　　　　（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）
　インデクスオプション：：＝EMPTY

(4)　オペランド

(a)　〔認可識別子.〕インデクス識別子

認可識別子には，作成するインデクスを所有するユーザの認可識別子を指定します。

インデクス識別子には，定義するインデクスの名称を指定します。

表所有者が定義した自分の所有するインデクス内に同じ名称は指定できません。

(b)　USING TYPE 〔認可識別子.〕インデクス型識別子

認可識別子

インデクス型の所有者の認可識別子を指定します。

認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称のインデクス型がないときは，認可識別子'MASTER'に同一名称のインデクス型があれば，そのインデクス型を指定したものとします。

インデクス型識別子

インデクス型を指定します。インデクス型識別子については，各種プラグインマニュアルを参照してください。

(c)　〔認可識別子.〕表識別子（列名）

認可識別子

認可識別子には，表を所有するユーザの認可識別子を指定します。

表識別子

表識別子には，インデクスを作成する実表の名称を指定します。

FIX表は指定できません。

列名

インデクスを定義する列の名称を指定します。列のデータ型は，抽象データ型だけです。

(d)　IN

｛RDエリア名
　｜（RDエリア名）
　｜（（RDエリア名）〔，（RDエリア名）〕…）
　｜マトリクス分割インデクス格納用RDエリア指定｝

マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）

インデクスを格納するRDエリアの名称を指定します。

マトリクス分割表にインデクスを定義する場合，マトリクス分割インデクス格納用RDエリア指定を指定してください。

インデクスを格納するRDエリアについての規則を次に示します。

RDエリア名はユーザLOB用RDエリアでなければなりません。

RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。ただし，境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表で，表格納用RDエリア名が重複している場合は指定できます。

表が複数のRDエリアに分割して格納されている場合，インデクス格納用RDエリアの指定は，次に示すとおりです。

・RDエリア名は，表を格納しているRDエリアと同じ数だけ指定します。このとき，インデクスの格納先はCREATE TABLEで指定した表格納用RDエリアの指定順に対応します。

・境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表で，表格納用RDエリア名が重複している場合は，それに対応するようにインデクス格納用RDエリア名を指定します。

(e)　EMPTY

未完状態のプラグインインデクスを作成する場合に指定します。

EMPTYを指定すると，プラグインインデクスを定義するときの同時実行性が向上します。また，表の格納データが多く，複数のインデクスの定義を同時に実行する場合に効果があります。表にデータが格納されていない場合は効果がありません。

EMPTYオプションの使用方法については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(f)　PLUGIN プラグインオプション

プラグインインデクスに対するパラメタ情報を文字列定数（最大255バイト）で指定します。パラメタ情報には，16進文字列定数は指定できません。

パラメタ情報については，各種プラグインマニュアルを参照してください。

(5)　共通規則

インデクスは，一つの表に最大255個定義できます。

インデクスは，ナル値を含む列，又は行のない列に対しても定義できます。

インデクスを格納するRDエリアに，インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合，RDエリア名にはオリジナルRDエリア名を指定します。

インナレプリカ機能を使用している場合のCREATE INDEXの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

一つのRDエリアに格納できるインデクスは，最大500個です。

(6)　留意事項

インデクスが付いている列の値をユーザが更新すると，インデクスも更新されます。

CREATE INDEXは，OLTP下のX/Openに従ったUAPから指定できません。

EMPTYを指定してプラグインインデクスを定義した場合，データベース再編成ユティリティでプラグインインデクスを再作成する必要があります。インデクスの再作成については，マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

大量のデータが登録されている表に対してCREATE INDEX文でインデクスを作成する場合，処理時間が長くなるおそれがあります。CREATE INDEX文を実行する前に，タイマ監視に関する指定を次のように設定してください。

クライアント環境定義PDCWAITTIME

実績やデータ量からCREATE INDEXの実行時間を推測できる場合は，0以外の余裕を持たせた値を指定してください。

実行時間を推測できない場合は，0又は指定を省略してください。

HiRDB/パラレルサーバでサーバ間横分割した表にインデクスを定義する場合で，表格納用RDエリア，又は指定したインデクス格納用RDエリアが閉塞状態のときは，RDエリアの排他待ちとなります。このとき，排他待ちの時間がシステム定義pd_lck_wait_timeoutオペランドの指定値に達してタイムアウトしても，すぐにエラーリターンされないことがあります。これを避けるため，CREATE INDEX文を実行する前に，表格納用RDエリア，又は指定したインデクス格納用RDエリアの閉塞状態を解除してください。

3.13　CREATE INDEX　形式3（部分構造インデクス定義）

3.13.1　CREATE INDEX形式3の形式と規則

(1)　機能

XML型列の値の特定の部分構造をキーとするインデクスを定義します。

使用権限，形式，規則などの詳細については，「CREATE INDEX 形式3（部分構造インデクス定義）」を参照してください。

3.14　CREATE 〔PUBLIC〕PROCEDURE（手続き定義，パブリック手続き定義）

3.14.1　CREATE PROCEDURE（手続き定義）

(1)　機能

手続きを定義します。

(2)　使用権限

スキーマを所有するユーザ

自分が所有する手続きを定義できます。

(3)　形式

　CREATE 手続き本体
　手続き本体：：＝PROCEDURE 〔認可識別子.〕ルーチン識別子
　　　　　　　　　（〔｛IN｜OUT｜INOUT｝ SQLパラメタ名 データ型
　　　　　　　　　　　　〔，｛IN｜OUT｜INOUT｝ SQLパラメタ名 データ型〕…〕）
　　　　〔DYNAMIC RESULT SETS 結果集合数〕
　　　　〔LANGUAGE句〕
　　　　〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕
　　　　｛SQL手続き文｜外部ルーチン指定｝

　LANGUAGE句：：＝LANGUAGE｛SQL｜JAVA｜C｝
　SQLコンパイルオプション：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　　　　　　　　　　　　　｜OPTIMIZE LEVEL SQL最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL最適化オプション〕…
　　　　　　　　　　　　　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL拡張最適化オプション〕…
　　　　　　　　　　　　　　　　｜SUBSTR LENGTH 文字の最大長 ｝
　外部ルーチン指定：：＝EXTERNAL NAME ｛外部Javaルーチン名｜外部Cストアドルーチン名｝
　　　　　　　　　　　　PARAMETER STYLE パラメタスタイル
　パラメタスタイル：：＝｛JAVA｜RDSQL}

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

認可識別子

定義する手続きの所有者の認可識別子を指定します。

ルーチン識別子

定義する手続きのルーチンの名前を指定します。

(b)　（〔｛IN｜OUT｜INOUT｝ SQLパラメタ名 データ型〔，｛IN｜OUT｜INOUT｝ SQLパラメタ名 データ型〕…〕）

｛IN｜OUT｜INOUT｝

手続きのパラメタの入出力モード（パラメタモード）を指定します。

IN

入力パラメタの場合に指定します。

OUT

出力パラメタの場合に指定します。

INOUT

入力及び出力パラメタの場合に指定します。

SQLパラメタ名

手続きのパラメタの名称を指定します。一つの手続き中で，SQLパラメタ名は重複して指定できません。

データ型

手続きのパラメタのデータ型を指定します。

指定するデータ型が抽象データ型で，認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

次のデータ型は指定できません。

LANGUAGE句でJAVA又はCを指定した場合，抽象データ型

LANGUAGE句でCを指定した場合，BINARY型及びBLOB型

指定できるデータ型については，「型マッピング」又は「CREATE 〔PUBLIC〕FUNCTION（関数定義，パブリック関数定義）」を参照してください。

(c)　DYNAMIC RESULT SETS 結果集合数

定義する手続きが返す，結果集合の最大数を整数値で指定します。

指定できる値は0〜1023です。

結果集合数に0を指定するか，又はこのオペランドを省略した場合，結果集合を返さない手続きとみなされます。

ただし，LANGUAGE句でCを指定した場合，このオペランドの指定を無視します。

(d)　LANGUAGE｛SQL｜JAVA｜C｝

定義する手続きの記述言語を指定します。

外部ルーチン指定を記述する場合，記述言語にSQLは指定しないでください。

SQL

手続きの処理部分をSQL手続き文にする場合に指定します。

JAVA

手続きの処理部分を外部ルーチン指定にする場合で，手続きをJavaクラスのメソッドで実装するときに指定します。

C

手続きの処理部分を外部ルーチン指定にする場合で，手続きをC言語で記述されたモジュールによって実装するときに指定します。Cを指定した場合，SQLパラメタの最大個数が128に制限されます。

このオペランドの指定によって，他オペランドの指定要否が変わります。LANGUAGE句指定による他オペランドの指定要否を次の表に示します。

表3‒20　 CREATE PROCEDUREのLANGUAGE句指定による他オペランドの指定要否

他オペランド

LANGUAGE句

SQL

JAVA

C

EXTERNAL NAME

×

○

○

PARAMETER STYLE

×

JAVA

RDSQL

SQL手続き文

○

×

×

（凡例）

○：指定してください。

×：指定しないでください。

JAVA：JAVAを指定してください。

RDSQL：RDSQLを指定してください。

(e)　SQLコンパイルオプション

：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　｜OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…
　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…
　　　　｜SUBSTR LENGTH 文字の最大長 ｝

SQLコンパイルオプションにはISOLATION，OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL，SUBSTR LENGTHをそれぞれ1回しか指定できません。

〔ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕〕

SQLのデータ保証レベルを指定します。

データ保証レベル

データ保証レベルとは，トランザクションのどの時点までデータの内容を保証するかのレベルをいいます。次に示すデータ保証レベルを指定できます。

0

データの内容を保証しない場合に指定します。0レベルを指定すると，ほかのユーザが更新中のデータでも，更新完了を待たないで参照できます。ただし，参照する表が共用表の場合，ほかのユーザが排他モードでLOCK文を実行しているときには，排他解除待ちとなります。

1

検索処理の終了までデータの内容を保証したい場合に指定します。1レベルを指定すると，検索処理が終了するまで（HiRDBがページ，又は行を見終わるまで）1度検索したデータをほかのユーザは更新できません。

2

トランザクションの終了まで1度検索したデータの内容を保証したい場合に指定します。2レベルを指定すると，トランザクションが終了するまで1度検索したデータをほかのユーザは更新できません。

〔FOR UPDATE｛EXCLUSIVE｜COMPATIBLE｝〕

手続き中で，FOR UPDATE句を指定した（FOR UPDATEが仮定される場合を含む）カーソル又は問合せに対して，SQLコンパイルオプションで指定したデータ保証レベルに関係なく，常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。

このオペランドを省略した場合，EXCLUSIVEを仮定します。ただし，0904互換モードを適用している場合はCOMPATIBLEを仮定します。

バージョン09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略した手続きと同じ動作をさせたい場合はCOMPATIBLEを指定します。

バージョン09-50より前のHiRDBから，09-50以降のHiRDBにバージョンアップする場合の注意事項を次に示します。

手続きを再定義する場合で，バージョン09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略した手続きと同じ動作をさせたい場合は次のどちらかの対処をしてください。

・ALTER PROCEDURE又はALTER ROUTINEで手続きを再定義してください。

・手続きを削除し，CREATE PROCEDUREで手続きを再定義する場合は，COMPATIBLEを指定して再定義してください。

このオペランドと，ISOLATIONデータ保証レベルの関係から決まるFOR UPDATEの排他オプションを次に示します。

ISOLATION データ保証レベル

FOR UPDATE EXCLUSVIE

FOR UPDATE COMPATIBLE

0

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

1

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

2

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

《クライアント環境定義との関係》

CREATE PROCEDUREに対して，PDISLLVL，PDFORUPDATEEXLOCKの指定は無効となります。

《SQLとの関係》

手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定するデータ保証レベル，FOR UPDATE EXCLUSIVE，及びFOR UPDATE COMPATIBLEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。

《システム定義との関係》

データ保証レベルを省略すると，pd_isolation_levelオぺランドの指定値が仮定されます。pd_isolation_levelオぺランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

データ保証レベルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。

SQL最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法がありますが，通常時は識別子で指定する方法をお勧めします。

識別子で指定する場合：

OPTIMIZE LEVEL "識別子"〔，"識別子"〕…

＜指定例＞

ネストループジョイン優先とグループ分け高速化処理を適用する場合

OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"

すべての最適化を適用しない場合

OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。ただし，同時に"NONE"以外の識別子を指定すると，"NONE"は無効になります。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

OPTIMIZE LEVEL 符号なし整数〔，符号なし整数〕…

＜指定例＞

複数のSQLオブジェクト作成，ANDの複数インデクス利用の抑止，及び複数インデクス利用の強制を適用する場合

符号なし整数をコンマで区切って指定する場合：

OPTIMIZE LEVEL 4,10,16

符号なし整数の和を指定する場合：

OPTIMIZE LEVEL 30

既に14（4+10）を指定していて，新たに16を追加する場合

OPTIMIZE LEVEL 14,16

すべての最適化を適用しない場合

OPTIMIZE LEVEL 0

＜規則＞

バージョン06-00より前のHiRDBから，バージョン06-00以降のHiRDBにバージョンアップする場合，バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は，バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。ただし，同時に0以外の識別子を指定すると，0は無効になります。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

複数の最適化方法を指定する場合，その符号なし整数の和を指定することもできます。ただし，同じ最適化方法の値は二つ以上足さないでください（足した結果が別の最適化方法とみなされることもあるため）。

複数の最適化方法の値を足して指定する場合，どの最適方法を指定しているのか分かりにくくなるため，コンマで区切って指定する方法をお勧めします。また，既に複数の最適化方法の値を足して指定している場合で，新たに別の最適化方法が必要になったときは，追加する値をコンマで区切って後ろに指定できます。

《システム定義との関係》

SQL最適化オプションを省略すると，システム定義のpd_optimize_levelオぺランドの指定値が仮定されます。pd_optimize_levelオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

システム定義のpd_floatable_besオペランド，又はpd_non_floatable_besオペランドを指定している場合，「フロータブルサーバ対象拡大（データ取り出しバックエンドサーバ）」及び「フロータブルサーバ対象限定（データ取り出しバックエンドサーバ）」の指定は無効となります。

システム定義のpd_indexlock_modeオペランドにKEYを指定している場合（インデクスキー値排他の場合），「更新SQLの作業表作成抑止」の指定は無効になります。

《クライアント環境定義との関係》

CREATE PROCEDUREに対して，PDSQLOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL拡張最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。

SQL拡張最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法があります。

識別子で指定する場合：

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL 1,2

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL 0

＜規則＞

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

《システム定義との関係》

SQL拡張最適化オプションを省略すると，システム定義のpd_additional_optimize_levelオぺランドの指定値が仮定されます。pd_additional_optimize_levelオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

CREATE PROCEDUREに対して，PDADDITIONALOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

《システム定義との関係》

SUBSTR LENGTHを省略すると，システム定義のpd_substr_lengthオぺランドの指定値が仮定されます。pd_substr_lengthオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

CREATE PROCEDUREに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効となります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

(f)　SQL手続き文

手続きで実行するSQL手続き文を指定します。SQL手続き文については，「7.　ルーチン制御SQL」の「全般規定」を参照してください。

(g)　EXTERNAL NAME ｛外部Javaルーチン名｜外部Cストアドルーチン名｝

外部Javaルーチン名

Java言語で記述したJavaメソッドを外部ルーチンとして指定します。外部Javaルーチン名の指定方法については，「外部Javaルーチン名」を参照してください。

外部Cストアドルーチン名

C言語で記述したC関数を外部ルーチンとして指定します。外部Cストアドルーチン名の指定方法については，「外部Cストアドルーチン名」を参照してください。

(h)　PARAMETER STYLE パラメタスタイル

外部ルーチンを呼び出す場合，パラメタとして引き渡される内容を指定します。

パラメタスタイルがJAVAの場合

SQLデータ型で定義している外部Java手続きのパラメタは，SQLデータ型に対応したJavaデータ型のJavaメソッドのパラメタとして渡されます。

SQLデータ型で定義されている外部Java手続きのOUT及びINOUTパラメタが，SQLデータ型に対応するJavaデータ型であり，要素数1の配列であるJavaメソッドのパラメタとして渡されます。Javaメソッド終了後，Javaメソッドが書き込んだ配列は，外部Java手続きの出力パラメタとして扱われます。

パラメタスタイルがRDSQLの場合

SQLパラメタ数をnとすると，外部C関数のSQLパラメタは，次の表に示すように，C関数のパラメタとして渡されます。

表3‒21　C関数のパラメタとして渡される内容

パラメタ番号

(nはSQL

パラメタ数)

内容

内容の詳細

データ型

1番目〜n番目

SQLパラメタのデータ部

SQLパラメタのデータ部に対応するパラメタです。各パラメタの入出力モードは，対応するSQLパラメタの入出力モードと同じです。

SQLパラメタのデータ型に対応するデータ型※1

n+1番目〜2n番目

SQLパラメタの標識部

SQLパラメタの標識部に対応するパラメタです。各パラメタの入出力モードは，対応するSQLパラメタの入出力モードと同じです。

入力パラメタである場合，データがナル値ならば，負の値を設定してC関数に渡します。

出力パラメタである場合，外部Cストアドルーチンを実装したC関数内では，次の説明に従って標識部を設定してください。

出力値がナル値の場合

設定値：−1

出力値が非ナル値の場合

設定値：0

short*

2n+1番目

SQLSTATE

外部Cストアドルーチンを実装したC関数が，SQLSTATEの値を設定するための出力パラメタです。領域長は6バイトです。領域の先頭から5バイト目までにSQLSTATEの値を設定してください。外部Cストアドルーチンを実装したC関数内では，次の説明に従って，SQLSTATEの値を設定してください。

C関数が正常終了したとき

設定値：'00000'

SQL実行結果：正常終了します。

C関数が異常終了したとき

設定値：形式'38XYY'の値

X，Yは，それぞれ次の範囲の値です。

X：'I'〜'Z'

Y：'0'〜'9'又は'A'〜'Z'

（例）'38I01'，'38ZCD'

SQL実行結果：SQLエラーになります。

C関数が任意の状態で終了したとき

設定値：'00000'，形式'38XYY'の値以外

SQL実行結果：SQLエラーになります。

char*

2n+2番目

ルーチン名

ルーチン名を表す入力パラメタです。

struct{

short 変数名1;

char変数名2[30];

}*※2

2n+3番目

特定名

手続きを特定するための特定名を表す入力パラメタです。

struct{

short 変数名1;

char変数名2[30];

}*※2

2n+4番目

メッセージテキスト

外部Cストアドルーチンを実装したC関数内でエラーが発生した場合，エラーが発生した詳細な理由を設定するための出力パラメタです。

外部Cストアドルーチンの実行終了時，SQLSTATEにクラス38の値が設定されていると，メッセージテキストを埋め込んだエラーメッセージが出力されます。

なお，設定できるメッセージテキストの長さは，最大80バイトです。

struct{

short 変数名1;

char変数名2[80];

}*※2

注※1

外部C手続き定義時に指定できるSQLパラメタのデータ型と，外部Cストアドルーチンを実装したC関数に渡すパラメタのデータ型の対応関係については，外部C関数定義時の対応関係と同じです。詳細は，「CREATE 〔PUBLIC〕FUNCTION（関数定義，パブリック関数定義）」を参照してください。

注※2

変数名1に文字列長（バイト数），変数名2に内容を表す文字列を設定します。

(5)　共通規則

ルーチン識別子は，以下に示す手続きの識別子と同じ識別子を指定できません。

所有者の手続き

パブリック手続きの手続き

入力パラメタは，CALL文の対象となるルーチンの引数の入出力パラメタがOUT又はINOUTで定義されたもの，FETCH文，及び1行SELECT文のINTO句，並びに代入文の代入先には指定できません。

出力パラメタは，CALL文の対象となるルーチンの引数の入出力パラメタがOUT又はINOUTで定義されたもの，FETCH文のINTO句，1行SELECT文のINTO句，代入文の代入先，及びWRITE LINE文の値式以外では指定できません。

手続きのパラメタは，30,000個（LANGUAGE句がCの場合は128個）以下でなければなりません。ただし，LANGUAGE句にJavaを指定した場合，30,000個以下でも，使用するJavaVMによっては，その仕様上の制限によって実行時にエラーになる場合があります。

手続きを特定するための特定名は，〔認可識別子.〕ルーチン識別子と同じです。

入力パラメタ，及び出力パラメタには，BOOLEAN型を指定できません。

手続き本体中に指定したCALL文の手続き名が認可識別子で修飾されている場合，現在定義しようとしている手続きと，認可識別子，ルーチン識別子が一致する手続きは指定できません。

手続き本体中に指定したCALL文の手続き名が認可識別子で修飾されていない場合，現在定義しようとしている手続きと，ルーチン識別子が一致する手続きは指定できません。

ALTER PROCEDURE，又はALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成する手続きの元のCREATE PROCEDUREにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

SQL手続き文中の問合せ指定でWRITE指定は指定できません。

LANGUAGE句にCを指定している場合，結果集合を返却することはできません。

(6)　留意事項

CREATE PROCEDUREは，OLTP下のX/Openに従ったUAPから指定できません。

SQLパラメタは，ナル値が持てます。

SQLルーチン中で複数のSQL文を実行するためには，複合文などのルーチン制御SQLを使用します。

SQL手続きを定義すると，それを実行するためのアクセス手順を記述したSQLオブジェクトが作成されます。外部JAVA手続きを定義した場合，手続き中のSQL文を実行するためのアクセス手順を記述したオブジェクトは作成されません。

手続き中のSQL文のデータ型のデータ保証レベル，SQL最適化オプション， SQL拡張最適化オプション，及び文字の最大長は，手続きの定義時，又は変更時の指定で決まり，手続き呼び出し時のシステム定義やクライアント環境定義の影響を受けません。

ルーチン内でのルーチンの呼び出しを多数又は無限に繰り返す場合，OSのスタックがオーバフローすることがあります。

外部Java手続きから次のSQLは実行できません。

COMMIT文，LOCK文，ROLLBACK文以外の制御系SQL

ルーチン制御SQL

SQL手続き中では，結果集合を受け取ることはできません。

外部Java手続き中で取得したDatabaseMetaDataクラスの，メソッドが返却する結果集合（ResultSet）は，動的結果集合として返却できません。外部Java手続きのコール元のコネクションのメタデータを使用して，情報を取得してください。

3.14.2　CREATE PUBLIC PROCEDURE（パブリック手続き定義）

(1)　機能

すべてのユーザから，認可識別子でルーチン識別子を修飾しなくても使用できる手続き（パブリック手続き）を定義できます。

(2)　使用権限

スキーマを所有するユーザ

自分が所有するパブリック手続きを定義できます。

(3)　形式

　CREATE PUBLIC 手続き本体

(4)　オペランド

(a)　PUBLIC

手続きをパブリック手続きとして定義する場合に指定します。

パブリック手続きにすると，同じ内容の手続きをユーザごとに定義しなくても，一つの手続きをルーチン識別子だけを指定して複数のユーザで使用できます。

(b)　手続き本体

「〔認可識別子.〕ルーチン識別子」以外の説明については，「CREATE PROCEDURE（手続き定義）」と同じです。

〔認可識別子.〕ルーチン識別子

認可識別子

パブリック手続きのため，認可識別子は指定できません。

ルーチン識別子

定義するパブリック手続きのルーチンの名前を指定します。

(5)　共通規則

手続き本体の「〔認可識別子.〕ルーチン識別子」の認可識別子は指定できません。

ルーチン識別子は，システム内のすべての手続き中で同じ識別子を使用できません。

手続きを特定するための特定名は，PUBLIC.ルーチン識別子と同じです。

手続き本体中に指定したCALL文の手続き名がPUBLICで修飾されている場合，現在定義しようとしているパブリック手続きと，認可識別子，ルーチン識別子が一致するパブリック手続きは指定できません。

手続き本体中に指定したCALL文の手続き名が認可識別子で修飾されていない場合，現在定義しようとしているパブリック手続きと，ルーチン識別子が一致する手続きは指定できません。

ALTER PROCEDURE，又はALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成する手続きの元のCREATE PUBLIC PROCEDUREにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

その他の規則は，「CREATE PROCEDURE（手続き定義）」と同じです。

(6)　留意事項

CREATE PUBLIC PROCEDUREは，OLTP下のX/Openに従ったUAPから指定できません。

ディクショナリ表の所有者を格納する列（SQL_ROUTINES表のROUTINE_SCHEMA列など）にはPUBLICが設定されます。また，パブリック手続きを定義した認可識別子はSQL_ROUTINES表のROUTINE_CREATOR列に格納されます。

パブリック手続きの削除は，DROP PUBLIC PROCEDUREで行います。

その他の留意事項は，「CREATE PROCEDURE（手続き定義）」と同じです。

3.15　CREATE SCHEMA（スキーマ定義）

3.15.1　CREATE SCHEMAの形式と規則

(1)　機能

スキーマを定義します。

(2)　使用権限

スキーマ定義権限を持つユーザ

ユーザ自身のスキーマを定義できます。

DBA権限を持つユーザ

CONNECT権限又はDBA権限を持つ，ほかのユーザのスキーマを定義できます。

(3)　形式

　CREATE SCHEMA スキーマ名句
　スキーマ名句：：＝〔AUTHORIZATION 認可識別子〕

(4)　オペランド

(a)　AUTHORIZATION 認可識別子

ユーザの認可識別子を指定します。認可識別子を省略すると，実行するユーザの認可識別子が仮定されます。

(5)　留意事項

表，インデクス，抽象データ型，インデクス型，関数，手続き，トリガ，及びアクセス権限は，スキーマを定義した後で定義します。

1ユーザは，1個のスキーマだけ所有できます。

スキーマ定義中で定義した表，及びインデクスの所有者の認可識別子は，スキーマの認可識別子と同じにしてください。

DBA権限を持つユーザによってスキーマを定義されたユーザは，スキーマ定義権限が与えられます。

CREATE SCHEMAは，OLTP下のX/Openに従ったUAPから指定できません。

(6)　使用例

ユーザ（USER1）のスキーマを定義します。

    CREATE SCHEMA
        AUTHORIZATION USER1

3.16　CREATE SEQUENCE（順序数生成子定義）

3.16.1　CREATE SEQUENCEの形式と規則

(1)　機能

順序数生成子を定義します。

(2)　使用権限

スキーマを所有するユーザ

RDエリア利用権限のある私用RDエリア，又は公用RDエリアに順序数生成子を定義できます。

(3)　形式

　CREATE SEQUENCE 〔認可識別子.〕順序数生成子識別子
　　　　　　　　　　　 〔 FOR PUBLIC USAGE〕
　　　　　　　　　　　 〔 順序数生成子オプション列〕
　　　　　　　　　　　 〔 IN 順序数生成子格納RDエリア名〕

　順序数生成子オプション列：：＝順序数生成子オプション〔 順序数生成子オプション〕…
　順序数生成子オプション：：＝｛順序数生成子データ型オプション
　　　　　　　　　　　　　　　　｜共通順序数生成子オプション列｝
　共通順序数生成子オプション列：：＝共通順序数生成子オプション
　　　　　　　　　　　　　　　　　　　　　　　〔 共通順序数生成子オプション〕…
　共通順序数生成子オプション：：＝｛順序数生成子開始オプション
　　　　　　　　　　　　　　　　　　｜基本順序数生成子オプション｝
　基本順序数生成子オプション：：＝｛順序数生成子増分オプション
　　　　　　　　　　　　　　　　　　｜順序数生成子最大値オプション
　　　　　　　　　　　　　　　　　　｜順序数生成子最小値オプション
　　　　　　　　　　　　　　　　　　｜順序数生成子循環オプション
　　　　　　　　　　　　　　　　　　｜順序数生成子ログ出力間隔オプション｝

　順序数生成子データ型オプション　：：＝AS データ型
　順序数生成子開始オプション　　　：：＝START WITH 開始値
　順序数生成子増分オプション　　　：：＝INCREMENT BY 増分
　順序数生成子最大値オプション　　：：＝｛MAXVALUE 最大値｜NO MAXVALUE｝
　順序数生成子最小値オプション　　：：＝｛MINVALUE 最小値｜NO MINVALUE｝
　順序数生成子循環オプション　　　：：＝｛CYCLE｜NO CYCLE｝
　順序数生成子ログ出力間隔オプション：：＝LOG INTERVAL出力間隔

(4)　オペランド

(a)　〔認可識別子.〕順序数生成子識別子

認可識別子

定義する順序数生成子の所有者になるユーザの認可識別子を指定します。

省略した場合，実行するユーザの認可識別子を仮定します。

順序数生成子識別子

順序数生成子の識別子を指定します。

(b)　FOR PUBLIC USAGE

すべてのユーザが使用可能な順序数生成子を定義する場合に指定します。

省略した場合，所有者だけが使用できる順序数生成子となります。

(c)　IN 順序数生成子格納RDエリア名

順序数生成子を格納するユーザ用RDエリア名を指定します。

インナレプリカ機能を適用したRDエリア，及び一時表用RDエリアは指定できません。

RDエリア名を省略した場合，次に示す優先順位で順序数生成子を格納するRDエリアを決定します。

一時表用RDエリア以外のインナレプリカ機能を適用しないRDエリアのうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

1の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

2で決定できなかった場合はエラーになります。

(d)　順序数生成子オプション列

順序数生成子オプション列には，同一のオプションを繰り返して指定できません。

(e)　順序数生成子データ型オプション：：＝AS データ型

順序数生成子が生成する値のデータ型を指定します。

データ型にはINTEGER，SMALLINT，位取り0のDECIMALが指定できます。

このオプションを省略した場合，INTEGERが仮定されます。

(f)　順序数生成子開始オプション：：＝START WITH 開始値

順序数生成子の開始値となる整数値を指定します。

順序数生成子を定義した後，最初にNEXT VALUE式を実行すると順序数生成子は開始値を返します。

順序数生成子開始オプションには，順序数生成子最小値以上で，かつ，順序数生成子最大値以下の整数値を指定します。

このオプションを省略した場合，昇順順序数生成子ならば順序数生成子最小値，降順順序数生成子ならば順序数生成子最大値が仮定されます。

昇順順序数生成子及び降順順序数生成子については順序数生成子増分オプションを参照してください。

(g)　順序数生成子増分オプション：：＝INCREMENT BY 増分

順序数生成子が生成した値（現在値）を更新するときに加算する値を指定します。

増分が正なら昇順順序数生成子，負なら降順順序数生成子となります。

順序数生成子増分オプションには0以外で次の条件を満たす整数を指定します。

増分≦順序数生成子データ型の最大値

増分≧順序数生成子データ型の最小値

このオプションを省略した場合，1が仮定されます。

(h)　順序数生成子最大値オプション：：＝｛MAXVALUE 最大値｜NO MAXVALUE｝

順序数生成子が生成する値（順序番号）の最大値を指定します。

順序数生成子最大値オプションに最大値を設定する場合，次の条件を満たす必要があります。

順序数生成子最大値≦順序数生成子データ型の最大値

順序数生成子最大値＞順序数生成子最小値

順序数生成子最大値≧順序数生成子開始値

このオプションを省略した場合，又はNO MAXVALUEを指定した場合は，その順序数生成子データ型の最大値が仮定されます。

(i)　順序数生成子最小値オプション：：＝｛MINVALUE 最小値｜NO MINVALUE｝

順序番号の最小値を指定します。

順序数生成子最小値オプションに最小値を設定する場合，次の条件を満たす必要があります。

順序数生成子最小値≧順序数生成子データ型の最小値

順序数生成子最小値＜順序数生成子最大値

順序数生成子最小値≦順序数生成子開始値

このオプションを省略した場合，又はNO MINVALUEを指定した場合は，その順序数生成子データ型の最小値が仮定されます。

(j)　順序数生成子循環オプション：：＝｛CYCLE｜NO CYCLE｝

順序数生成子が生成できる値が最大値又は最小値を超えたときに，順序番号の循環をするかどうかを指定します。順序数生成子循環オプションにCYCLEを指定した場合の動作を次に示します。

昇順順序数生成子の場合

順序数生成子最大値を超えたときに，順序数生成子は順序数生成子最小値を順序番号として生成します。

降順順序数生成子の場合

順序数生成子最小値を超えたときに，順序数生成子は順序数生成子最大値を順序番号として生成します。

なお，順序数生成子が循環したときは重複した番号が発生します。

このオプションを省略した場合，又はNO CYCLEを指定した場合の動作を次に示します。

昇順順序数生成子の場合

順序数生成子最大値を超えるときにエラーとなります。

降順順序数生成子の場合

順序数生成子最小値を超えるときにエラーとなります。

(k)　順序数生成子ログ出力間隔オプション：：＝｛LOG INTERVAL 出力間隔｝

順序数生成子のログを出力する間隔を指定します。

出力間隔を大きく指定することで，ログの出力回数を削減し処理性能が向上します。ただし，システム障害が発生し，出力間隔を2以上に指定した場合，最大で出力間隔の数だけ順序番号に欠番が発生する可能性があります。出力間隔に1を指定した場合，又はこのオプションを省略した場合は欠番が発生しません。

出力間隔は，1〜2³¹-1の範囲で，かつ次に示す条件を満たす必要があります。

出力間隔≦（↓（順序数生成子最大値−順序数生成子最小値）÷増分↓）の絶対値

このオプションを省略した場合は1が仮定されます。

順序数生成子ログ出力間隔の詳細については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

順序数生成子は，一つのRDエリアに表と合わせて最大500個定義できます。

順序番号の生成規則を次に示します。

指定した順序数生成子が1回も使用されていない状態にある場合，順序数生成子の開始値を返却し，現在値に開始値を設定します。

指定した順序数生成子が1回以上使用されている状態の場合，現在値の次の値を返却し，現在値に増分を加算します。

(6)　留意事項

CREATE SEQUENCEは，OLTP下のX/Openに従ったUAPからは指定できません。

(7)　使用例

順序数生成子（SEQ1）を次に示す条件で定義します。

RDエリア"RDA1"に格納

INTEGER型

開始値1

増分1

最大値999

最小値1

循環なし

ログ出力間隔20

   CREATE SEQUENCE USER1.SEQ1
   AS INTEGER
   START WITH 1
   INCREMENT BY 1
   MAXVALUE 999
   MINVALUE 1
   NO CYCLE
   LOG INTERVAL 20
   IN RDA1

3.17　CREATE TABLE（表定義）

3.17.1　CREATE TABLEの形式と規則

(1)　機能

表を定義します。

(2)　使用権限

スキーマを所有するユーザ

RDエリア利用権限のある私用RDエリア，又は公用RDエリアに表を定義できます。

(3)　形式

CREATE 〔〔SHARE〕FIX〕〔GLOBAL TEMPORARY〕 TABLE
　　〔認可識別子.〕表識別子
　　（表要素〔，表要素〕…）
　　〔｛IN｛表格納用RDエリア名
　　　　　　｜（表格納用RDエリア名）
　　　　　　｜（〔（表格納用RDエリア名）格納条件，〕…
　　　　　　　　（表格納用RDエリア名）〔格納条件〕）｝
　　　　｜PARTITIONED BY 列名
　　　　　　IN （〔（表格納用RDエリア名）境界値，〕…
　　　　　　　　　（表格納用RDエリア名）境界値，
　　　　　　　　　　（表格納用RDエリア名））
　　　　｜PARTITIONED BY MULTIDIM
　　　　　　（第1次元列名 第1次元境界値リスト
　　　　　　　，{第2次元列名 第2次元境界値リスト
　　　　　　　　　| 〔FIX〕 HASH 〔ハッシュ関数名〕
　　　　　　　　　　　BY 第2次元列名 〔，第2次元列名〕…}）
　　　　　　IN マトリクス分割表格納用RDエリア指定
　　　　｜〔FIX〕 HASH 〔ハッシュ関数名〕 BY 列名 〔，列名〕…
　　　　　　IN （表格納用RDエリア名，表格納用RDエリア名，…）｝〕
　　〔表オプション〕…
　　｛〔表制約定義〕…｜〔ON COMMIT ｛DELETE｜PRESERVE｝ROWS〕｝
　　〔WITH PROGRAM〕

≪各項目の詳細≫

表要素：：＝｛列定義｜表制約定義｝
　列定義：：＝列名 データ型〔ARRAY ［最大要素数］〕
　　　　　　　〔｛列データ抑制指定｜〔列回復制約〕
　　　　　　　　　｛IN ｛LOB列格納用RDエリア名
　　　　　　　　　　　　 ｜（LOB列格納用RDエリア名）
　　　　　　　　　　　　 ｜（（LOB列格納用RDエリア名）
　　　　　　　　　　　　　　〔，（LOB列格納用RDエリア名）〕…）
　　　　　　　　　　　　 ｜マトリクス分割LOB列格納用RDエリア指定｝
　　　　　　　　　　｜抽象データ型定義内LOB格納用RDエリア指定｝｝〕
　　　　　　　〔プラグイン指定〕
　　　　　　　〔圧縮指定〕
　　　　　　　〔DEFAULT句〕
　　　　　　　〔列制約〕…
　　　　　　　〔予備列定義〕
　　　　　　　〔更新可能列属性〕
　　列データ抑制指定：：＝SUPPRESS
　　列回復制約：：＝RECOVERY 〔｛ALL｜PARTIAL｜NO｝〕
　　抽象データ型定義内LOB格納用RDエリア指定：：＝
　　　　ALLOCATE（属性名〔..属性名〕…
　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　 ｜（LOB属性格納用RDエリア名）
　　　　　　　　 ｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕）
　　　　　　　　 ｜マトリクス分割LOB属性格納用RDエリア指定｝
　　　　　　〔，属性名〔..属性名〕…
　　　　　　　　　IN ｛LOB属性格納用RDエリア名
　　　　　　　　　　　 ｜（LOB属性格納用RDエリア名）
　　　　　　　　　　　 ｜（（LOB属性格納用RDエリア名）
　　　　　　　　　　　　　〔，（LOB属性格納用RDエリア名）〕）
　　　　　　　　　　　 ｜マトリクス分割LOB属性格納用RDエリア指定｝〕…）
　　プラグイン指定：：＝PLUGIN プラグインオプション
　　圧縮指定：：＝ COMPRESSED 〔BY 圧縮分割サイズ〕
　　圧縮分割サイズ：：＝ n〔｛K｜M｜G｝〕
　　DEFAULT句：：＝DEFAULT 〔既定値〕
　　既定値：：＝｛定数｜USER｜CURRENT_USER｜CURRENT_DATE｜CURRENT DATE
　　　　　　　　　｜CURRENT_TIME｜CURRENT TIME
　　　　　　　　　｜CURRENT_TIMESTAMP〔（小数秒精度）〕 〔USING BES〕
　　　　　　　　　｜CURRENT TIMESTAMP〔（小数秒精度）〕 〔USING BES〕
　　　　　　　　　｜NULL｝
　　列制約：：＝｛非ナル値制約指定
　　　　　　　　　｜単一列一意性制約定義
　　　　　　　　　　〔インデクスオプション〔インデクスオプション〕〕
　　　　　　　　　｜｛ 単一列検査制約定義〔制約名定義〕
　　　　　　　　　　　　｜〔制約名定義〕単一列検査制約定義 ｝※３
　　　　　　　　　｜｛ 単一列参照制約定義〔制約名定義〕
　　　　　　　　　　　　｜〔制約名定義〕単一列参照制約定義｝｝※３
　　　予備列定義：：＝FOR RESERVED
　　更新可能列属性：：＝UPDATE 〔ONLY FROM NULL〕
　　　非ナル値制約指定：：＝
　　　　　　｛〔NULL
　　　　　　　｜NOT NULL〔WITH DEFAULT〔SYSTEM GENERATED〕〕〕※２
　　　　　　　｜〔〔NOT NULL〕 WITH DEFAULT〔SYSTEM GENERATED〕〕｝※１
　　　単一列一意性制約定義：：＝
　　　　　　　｛〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY〔｛ASC｜DESC｝〕
　　　　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕
　　　　　　　　｜PRIMARY KEY〔｛ASC｜DESC｝〕
　　　　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕｝
　　　インデクスオプション：：＝｛PCTFREE＝未使用領域の比率
　　　　　　　　　　　　　　　　　｜UNBALANCED SPLIT｝
　　　単一列検査制約定義：：＝CHECK（探索条件）
　　　単一列参照制約定義：：＝参照指定
　　複数列一意性制約定義：：＝
　　　　　　｛〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY
　　　　　　　　（列名〔｛ASC｜DESC｝〕〔，列名〔｛ASC｜DESC｝〕〕…）
　　　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　　　　｜PRIMARY KEY（列名〔｛ASC｜DESC｝〕
　　　　　　　　〔，列名〔｛ASC｜DESC｝〕〕…）
　　　　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕｝
　　複数列検査制約定義：：＝CHECK（探索条件）
　　複数列参照制約定義：：＝FOREIGN KEY（列名 〔，列名〕…）参照指定
格納条件：：＝列名｛＝｜<>｜^＝｜!＝｜<｜<＝｜>｜>＝｝
　　　　　　　｛定数｜（定数〔，定数〕…）｝
第1次元列名：：＝列名
第2次元列名：：＝列名
第1次元境界値リスト：：＝境界値リスト
第2次元境界値リスト：：＝境界値リスト
　境界値リスト：：＝（（境界値）〔，（境界値）〕…）
マトリクス分割表格納用RDエリア指定：：＝2次元格納用RDエリア指定
マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定
マトリクス分割LOB列格納用RDエリア指定：：＝2次元格納用RDエリア指定
マトリクス分割LOB属性格納用RDエリア指定：：＝2次元格納用RDエリア指定
　2次元格納用RDエリア指定：：＝（マトリクス分割用RDエリアリスト
　　　　　　　　　　　　　　　　　〔，マトリクス分割用RDエリアリスト〕…）
　マトリクス分割用RDエリアリスト：：＝（RDエリア名〔，RDエリア名〕…）
ハッシュ関数名：：＝｛HASH1｜HASH2｜HASH3｜HASH4｜HASH5｜HASH6｜HASHZ
　　　　　　　　　｜HASH0｜HASHA｜HASHB｜HASHC｜HASHD｜HASHE｜HASHF｝
参照指定：：＝REFERENCES 被参照表 〔参照制約動作指定〕
被参照表：：＝表名
参照制約動作指定：：＝｛削除動作 〔更新動作〕｜更新動作 〔削除動作〕｝
削除動作：：＝ON DELETE 参照動作
更新動作：：＝ON UPDATE 参照動作
参照動作：：＝｛ CASCADE｜RESTRICT｝
制約名定義：：＝CONSTRAINT 制約名
表オプション：：＝
　　　｛PCTFREE＝｛未使用領域の比率
　　　　　　　　　　 ｜（〔未使用領域の比率〕，セグメント内の空きページ比率）｝
　　　　｜｛LOCK ROW｜LOCK PAGE｝
　　　　｜SUPPRESS〔DEC〔IMAL〕〕
　　　　｜WITHOUT ROLLBACK
　　　　｜INDEXLOCK｛NONE｜PAGE｝
　　　　｜SEGMENT REUSE ｛〔セグメント数〔｛K｜M｝〕〕｜NO｝
　　　　｜INSERT ONLY 〔WHILE ｛日間隔データ｜ラベル付き間隔｝ BY 列名〕｝

注※1

FIX表の列，クラスタキー又は主キーを構成する列の場合

注※2

上記以外の場合

注※3

制約名定義の指定位置は，システム共通定義pd_constraint_nameオペランドの指定値，又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。詳細は，「表制約定義」を参照してください。

(4)　オペランド

(a)　〔SHARE〕FIX〔GLOBAL TEMPORARY〕

〔SHARE〕FIX

行の長さが固定している表の場合に指定します。表データを共用RDエリアに格納し，共用表とする場合はSHAREを指定します。

ただし，共用RDエリアのないHiRDB/シングルサーバではHiRDB/パラレルサーバとSQLの互換性を保つためにSHAREを指定することで共用表を定義できますが，表データは通常のユーザ用RDエリアに格納します。

行長の変更を伴うデータベースの操作はできませんが，行の格納効率を上げられます。また，行単位インタフェースを用いることで，列数が多い表の場合，アクセス性能を上げられます。

FIXについての規則を次に示します。

FIXを指定した場合，次のデータ型は指定できません。

・VARCHAR

・NVARCHAR

・MVARCHAR

・BLOB

・BINARY

・抽象データ型

FIXを指定した場合，繰返し列は指定できません。

FIXを指定した場合，行の長さが次の値を超えてはいけません。

定義する表が一時表の場合は，実体化する際に行の長さが上記の値を超えているかをチェックします。

一時表の実体化については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

FIXを指定して定義した表の各列には，NOT NULLが仮定されます。

SHAREとFIXを指定した場合，表データを複数のRDエリアに分割して格納できません。

定義する表が一時表の場合はSHAREを指定できません。

GLOBAL TEMPORARY

定義する実表が一時表の場合に指定します。ただし，表の構成列に次のデータ型は指定できません。

BLOB型

ユーザ定義及びプラグインが提供する抽象データ型

(b)　〔認可識別子.〕表識別子

認可識別子

定義する実表の所有者になるユーザの認可識別子を指定します。

表識別子

定義する実表の名前を指定します。表識別子は，表所有者の表中で同じ識別子は使用できません。

(c)　表要素：：＝｛列定義｜表制約定義｝

列定義

表を構成する列自体の定義（列名，データ型など）に指定します。単一列ごとに非ナル値制約，一意性制約，検査制約，参照制約の項目を指定できます。

表制約定義：：＝｛複数列一意性制約定義

　　　　　　〔インデクスオプション〔インデクスオプション〕〕

　　　　　｜｛複数列検査制約定義〔制約名定義〕

　　　　　｜〔制約名定義〕複数列検査制約定義｝

　　　　　｜｛複数列参照制約定義〔制約名定義〕

　　　　　｜〔制約名定義〕複数列参照制約定義｝｝

複数の列に一意性制約，検査制約，参照制約を指定します。

制約名定義の指定位置は，システム共通定義pd_constraint_nameオペランドの指定値，又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。制約名定義の指定位置を次の表に示します。

表3‒22　制約名定義の指定位置

クライアント環境変数

システム共通定義

pd_constraint_name

指定なし

LEADING

TRAILING

PDCNSTRNTNAME

指定なし

前

前

後

LEADING

前

前

前

TRAILING

後

後

後

（凡例）

前：制約名定義を制約定義の前に指定します（標準SQL仕様）。

後：制約名定義を制約定義の後に指定します（XDM/RD互換仕様）。

SHAREとFIXを指定している場合，複数列参照制約は指定できません。

(d)　｛IN〜

｛IN｛表格納用RDエリア名
　　　｜（表格納用RDエリア名）
　　　｜（〔（表格納用RDエリア名）格納条件，〕…
　　　　　（表格納用RDエリア名）〔格納条件〕）｝
　｜PARTITIONED BY 列名
　　　IN（〔（表格納用RDエリア名）境界値，〕…
　　　　（表格納用RDエリア名）境界値，（表格納用RDエリア名））
　｜PARTITIONED BY MULTIDIM
　　　（第1次元列名 第1次元境界値リスト
　　　　，｛第2次元列名 第2次元境界値リスト
　　　　　　｜〔FIX〕 HASH 〔ハッシュ関数名〕
　　　　　　　 BY 第2次元列名 〔，第2次元列名〕…｝）
　　　IN マトリクス分割表格納用RDエリア指定
　｜〔FIX〕 HASH 〔ハッシュ関数名〕 BY 列名 〔，列名〕…
　　　IN （表格納用RDエリア名，表格納用RDエリア名，…）｝

IN

表の行を格納するRDエリアを指定します。定義する表が一時表の場合は指定できません。

表格納用RDエリア名

表の行を格納する一時表用RDエリア以外のユーザ用RDエリアの名前を指定します。

ただし，HiRDB/パラレルサーバでは次の制限があります。SHAREを指定している場合，共用RDエリアの名前を指定します。また，SHAREを指定していない場合，共用RDエリアの名前を指定できません。

RDエリア名を省略した場合，表を格納するRDエリアは次の表に示すとおりに決定されます。また，HiRDB/パラレルサーバではSHAREを指定している場合，共用RDエリアが格納先の候補となります。SHAREを指定していない場合，共用RDエリアは格納先の候補となりません。

なお，リバランス表を格納しているユーザ用RDエリアは指定できません。

表3‒23　表格納RDエリアの指定を省略したときの表格納RDエリアの決定方法

プライマリ

キー又は

クラスタ

キーの指定

インデクス格納

RDエリアの

指定※

表格納RDエリアの決定方法

なし

−

次に示す優先順位で表格納RDエリアを決定します。

インナレプリカ機能を適用しないRDエリアのうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

1の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

1，2で決定できなかった場合は，インナレプリカ機能を適用するRDエリア（オリジナルRDエリア）のうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

3の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

あり

なし

次に示す優先順位で表格納RDエリアを決定します。

インナレプリカ機能を適用しないRDエリアのうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

1の条件を満たすRDエリアが複数ある場合は，インデクスの定義数が一番少ない公用RDエリア

1，2の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

1，2，3で決定できなかった場合は，インナレプリカ機能を適用するRDエリア（オリジナルRDエリア）のうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

4の条件を満たすRDエリアが複数ある場合は，インデクスの定義数が一番少ない公用RDエリア

4，5の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

インナレプリカ機能を適用しないRDエリア

インナレプリカ機能を適用しないRDエリアのうち，定義されている表と順序数生成子の合計が一番少ない公用RDエリア

1の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

インナレプリカ機能を適用するRDエリア（オリジナルRDエリア）

インナレプリカ機能を適用するRDエリアのうち，オリジナルRDエリアで，かつレプリカRDエリア数の等しい公用RDエリア

1の条件を満たすRDエリアが複数ある場合は，HiRDBが最初に見付けたRDエリア

（凡例）

−：該当しません。

注※

HiRDB/パラレルサーバで，かつインデクス格納用RDエリアの指定がある場合，インデクス格納用RDエリアと同じサーバ内のRDエリアが表格納RDエリアの選定対象になります。

格納条件

表を複数のRDエリアに分割（表の横分割）して格納するための条件を指定します。格納条件を指定した場合，単一列分割になります。

定数の複数指定は格納条件になる列が次に示す形式の場合に有効です。

列の値が範囲指定によってグループ分けできないとき（例えば，店番号や部課コードなど）

列の値が文字列などの不連続な値で構成されているとき

格納条件についての規則を次に示します。

格納条件を複数指定する場合，格納条件中に同じ列名を指定してください。

格納条件を複数指定した場合に行が格納されるRDエリアは，格納条件の指定順にHiRDBが条件を評価して，最初に真になった格納条件に対応したRDエリアです。どちらかの条件でも真にならなかった行は，格納条件を指定しないRDエリアに格納されます。格納条件を指定しないRDエリアが定義されていない場合は格納できません。

HiRDBが格納条件を評価した結果，行が格納されないRDエリアがある場合，表の定義はできません。

データ挿入時，挿入するデータに該当するRDエリアがない場合はデータを挿入できません。

データ更新時，格納条件に指定した列の値は更新できません。

一つの格納条件は一個のRDエリア名と対応します。RDエリアは最大4,096個指定できます。ただし，同じRDエリア名は指定できません。

列名に予備列は指定できません。

PARTITIONED BY 列名

永続実表を境界値によって分割し，複数のRDエリアに格納する場合に指定します。分割できるRDエリアは，重複を含んで最大4096個です。

なお，定義する表が一時表の場合は指定できません。

列名

境界値を指定する列の名称を指定します。指定できる列のデータ型は，格納条件で比較演算できる列のデータ型と同じです。PARTITIONED BY 列名を指定した場合，単一列分割になります。

BY 列名についての規則を次に示します。

データ更新時，列名で指定した列の値は更新できません。

列名で指定した列はNOT NULL（非ナル値制約，FIX指定，クラスタキー，又は主キー）にしてください。

クラスタキーを指定した列がある場合，それ以外の列に対して境界値は指定できません。

クラスタキーが複数列の場合，先頭の列以外の列に対して境界値は指定できません。

繰返し列は指定できません。

予備列は指定できません。

境界値

表の行を分割するときの境界値を指定します。境界値には定数を指定してください。

境界値についての規則を次に示します。

定数には，次のものは指定できません。

・長さ0の文字列定数，各国文字列定数，混在文字列定数，及び16進文字列定数

・長さ256バイト以上の文字列定数，長さ128文字以上の各国文字列定数，長さ256バイト以上の混在文字列定数，及び長さ256バイト以上の16進文字列定数（16進文字列の文字数512文字以上）

境界値は昇順に指定してください。同じ値は指定できません。

最後に指定する境界値には，最大値は指定しないでください。

表格納用RDエリア名と境界値は交互に指定し，表格納用RDエリア名で始まり表格納用RDエリア名で終わるようにしてください。

指定できる表格納用RDエリア名の延べ数は，最大4096個です。

表格納用RDエリア名は，同一のものを複数指定できます。ただし，同じ表格納用RDエリア名は続けて指定しないでください。

最初に境界値を指定するRDエリアには，指定する境界値以下の値の行が格納されます。2番目以降（最後は除く）に指定するRDエリアには，その前に指定した境界値より大きく，かつその後に指定する境界値以下の値の行が格納されます。最後に指定するRDエリアには，その前に指定した境界値より大きい値の行が格納されます。

PARTITIONED BY MULTIDIM

表データをある一つの列（第１次元分割列）で分割し，さらに各境界値データを別の列（第２次元分割列）で分割する場合に指定します。このような指定による分割方法をマトリクス分割といい，分割した表を，マトリクス分割表といいます。

マトリクス分割表を定義する場合，HiRDB Advanced High Availabilityが必要です。

なお，定義する表が一時表の場合は指定できません。

第1次元列名：：＝列名

第1次元分割列名を指定します。

第1次元分割列名についての規則を次に示します。

指定した列は，NOT NULLにしてください。NOT NULLにする方法を次に示します。

・FIX表として表を定義する。

・列定義でNOT NULLを指定する。

・クラスタキー，又は主キーを定義する。

指定した列の値は更新できません。

列名に繰返し列は指定できません。

列名に指定する列のデータ型は，格納条件の比較演算できる列のデータ型を参照してください。

列名に予備列は指定できません。

第1次元境界値リスト：：＝境界値リスト

境界値リスト：：＝（（境界値）〔，（境界値）〕…）

第1次元列名で指定した列の境界値リストを指定します。

境界値には，表の行を分割するときの境界値を指定します。境界値についての規則を次に示します。

境界値には定数を指定してください。

境界値は昇順に指定してください。

境界値には，次の定数はできません。

・長さ0の文字列定数，各国文字列定数，混在文字列定数，及び16進文字列定数

・長さ256バイト以上の文字列定数，及び混在文字列定数

・長さ128文字以上の各国文字列定数

・長さ256バイト以上の16進文字列定数（16進文字列の文字数512文字以上）

また，最後に指定する境界値に最大値は指定できません。

第2次元列名：：＝列名

第2次元分割列名を指定します。

規則については，第1次元列名の説明を参照してください。

第2次元境界値リスト：：＝境界値リスト

境界値リスト：：＝（（境界値）〔，（境界値）〕…）

第2次元列名で指定した列の境界値リストを指定します。

境界値の規則については，第1次元境界値リストの境界値の説明を参照してください。

〔FIX〕 HASH 〔ハッシュ関数名〕

　BY 第2次元列名 〔，第2次元列名〕…

第2次元列名：：＝列名

使用するハッシュ関数名，及び第２次元分割列名を指定します。

指定方法の詳細，及び規則については，〔FIX〕HASHの項目を参照してください。

マトリクス分割表格納用RDエリア指定：：＝2次元格納用RDエリア指定

2次元格納用RDエリア指定：：＝

　　（マトリクス分割用RDエリアリスト

　　　〔，マトリクス分割用RDエリアリスト〕…）

マトリクス分割用RDエリアリスト：：＝

　　（RDエリア名〔，RDエリア名〕…）

マトリクス分割表，及びマトリクス分割表へのクラスタキー，主キー，BLOB列，BLOB属性の抽象データ型を定義する場合，それを格納するRDエリア名を指定します。

マトリクス分割表格納用RDエリア指定についての規則を次に示します。

RDエリア名の指定の規則については，各オペランドのRDエリアの説明を参照してください。

一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は，第2次元境界値リストに指定した境界値の数＋1です。また，第2次元分割列にハッシュ関数を使用する場合は，ユーザ任意の数です。

指定できるマトリクス分割用RDエリアリストの数は，第1次元境界値リストに指定した境界値の数＋1です。

マトリクス分割表へのクラスタキー，主キー，BLOB列，及びBLOB属性を持つ抽象データ型を定義する場合，マトリクス分割表格納用RDエリア指定に対応するようにRDエリアを指定してください。

クラスタキーは単一列に指定できません。

指定できるRDエリアの数は重複を含み最大4096個です。

クラスタキーが2列以上の場合，分割に指定した列を先頭から同順で含む必要があります。

〔FIX〕HASH

永続実表をハッシュ関数によって分割し，複数のRDエリアに格納する場合に指定します。同じ表格納用RDエリア名を連続して指定できます。また，マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合にも指定します。

表の分割方式をフレキシブルハッシュ分割にする場合は，HASHを指定します。FIXハッシュ分割にする場合は，FIX HASHを指定します。

なお，定義する表が一時表の場合は指定できません。

〔ハッシュ関数名〕

表を分割するためのハッシュ関数を指定します。

ハッシュ関数名を省略した場合，分割方法によって次のハッシュ関数が仮定されます。

表をハッシュ関数によって分割する場合は，HASH1を仮定する

マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合は，HASH6を仮定する

BY 列名 〔，列名〕…

ハッシュ関数の対象となる列の名称を指定します。指定できる列のデータ型は，格納条件で比較演算できる列のデータ型と同じです。

列名を一つ指定すると単一列分割，列名を複数指定すると複数列分割になります。

単一列分割する表の場合：

クラスタキーを指定した列がある場合，それ以外の列を列名に指定できません。

クラスタキーが複数列の場合，先頭の列以外の列を列名に指定できません。

複数列分割する表の場合：

クラスタキーを単一列に指定できません。

クラスタキーが複数列の場合，先頭から分割に指定した列を同順にすべて含む必要があります。

マトリクス分割表の第2次元分割列を単一列分割する場合：

クラスタキーを単一列に指定できません。

クラスタキーが複数列の場合，先頭から2番目の列以外の列を列名に指定できません。

マトリクス分割表の第2次元分割列を複数列分割する場合：

クラスタキーを単一列に指定できません。

クラスタキーが複数列の場合，先頭から2番目以降の列を同順に指定する必要があります（クラスタキー構成列の先頭から2番目の列以降の列をすべて含む必要はありません）。

主キーを指定した列がある場合，表の分割方法によって，主キーの定義可否が決まります。表を横分割する場合の主キーの定義可否（UNIQUE指定可否）については，「表を横分割する場合のUNIQUE指定可否」を参照してください。

BY 列名についての規則を次に示します。

複数列分割に指定できる列の最大数は16個です。ただし，マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合に指定できる列の最大数は15個です。

複数列分割する場合は，同じ列名を重複して指定できません。

複数列分割する場合は，列名には相互に依存しない値を持つ列を組み合わせて指定します。

列名で指定した列はNOT NULL（非ナル値制約，FIX指定，クラスタキー，又は主キー）にしてください。

フレキシブルハッシュ分割の表，又はマトリクス分割表の第2次元分割列にフレキシブルハッシュ分割を指定する場合には，UNIQUEを指定したクラスタキー，主キー，及びUNIQUEを指定したインデクスは定義できません。

FIXハッシュ分割では，データ更新時，列名で指定した列の値は更新できません。

繰返し列は指定できません。

列名をマトリクス分割表の第2次元列名に指定する場合は，第1次元列名で指定している列名は指定できません。

予備列は指定できません。

(e)　表オプション

：：＝｛PCTFREE＝｛未使用領域の比率
　　　　　　　　　　｜（〔未使用領域の比率〕，セグメント内の空きページ比率）｝
　　　　｜｛LOCK ROW｜LOCK PAGE｝｜SUPPRESS〔DEC〔IMAL〕〕
　　　　｜WITHOUT ROLLBACK
　　　　｜INDEXLOCK｛NONE｜PAGE｝
　　　　｜SEGMENT REUSE
　　　　　　　　｛〔セグメント数〔｛K｜M｝〕〕｜NO｝
　　　　｜INSERT ONLY 〔WHILE ｛日間隔データ｜ラベル付き間隔｝BY 列名〕｝

PCTFREE＝｛未使用領域の比率｜（〔未使用領域の比率〕，セグメント内の空きページ比率）｝

同じ表のオプションを繰り返し指定できません。

PCTFREEの指定は，括弧を付けた場合と括弧を付けない場合で指定内容が異なるので注意してください。

PCTFREE＝30は，未使用領域の比率が30%を示します。

PCTFREE＝（，30）は，セグメント内の空きページ比率が30%を示します。

未使用領域の比率

表の初期作成時にデータベース内に設定する未使用領域の比率を指定します。未使用領域の比率は，0〜99（%）を指定できます。未使用領域の比率を省略すると，30（%）が仮定されます。仮定値は，システム共通定義のpd_ddl_tbl_pctfreeオペランドで変更できます。pd_ddl_tbl_pctfreeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

未使用領域の比率は，データベース作成ユティリティ，及びデータベース再編成ユティリティ実行時に適用されます。INSERT文やUPDATE文など，ほかの追加，及び更新ではPCTFREE＝（0，0）が仮定されます。

未使用領域の比率についての規則を次に示します。

クラスタキーを定義する場合，次に示す理由のためPCTFREEを指定してください。

・データの初期作成，又は再編成後の挿入データをクラスタリング可能にするため，表中に空きを作成しておく。

・可変長データを含む表に対してデータの初期作成，又は再編成後に行長が長くなるような更新をしたとき，できるだけ近くに格納できるように表中に空きを作成しておく。

クラスタキーのないFIX表に対しては，PCTFREE＝（0，0）を指定してください。PCTFREEを省略した場合，PCTFREE＝（0，0）を仮定します。仮定値は，システム共通定義のpd_ddl_tbl_fix_pctfreeオペランドで変更できます。pd_ddl_tbl_fix_pctfreeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

クラスタキーのない非FIX表に対して，PCTFREEを指定すると，ページ内のレコード長が更新のために長くなった場合，該当ページの未使用領域が使用されます。

表の作成後，クラスタキーを定義する表に対して行の追加が頻繁に発生する場合，又は可変長データを含む表に対して，行長の長くなる更新が頻繁に発生する場合，未使用領域の比率を高く指定してください。

セグメント内の空きページ比率

表の作成時にセグメント内に設定する空きページ（未使用ページ）の比率を指定します。

セグメント内の空きページ比率は，0〜50（%）を指定できます。

セグメント内の空きページ比率を省略すると，10（%）が仮定されます。

仮定値は，システム共通定義のpd_ddl_tbl_pctfreeオペランドで変更できます。pd_ddl_tbl_pctfreeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

セグメント内の空きページ数を求める計算式を次に示します。

ここで指定したセグメント内の空きページ比率は，データベース作成ユティリティ，又はデータベース再編成ユティリティ実行時に適用されます。

クラスタキーを定義する表に対して行の追加が頻繁に発生する場合，及び行長の長くなる更新が頻繁に発生する場合，その増えた分のデータがページ内の未使用領域に納まらないときに，値を指定してください。

｛LOCK ROW｜LOCK PAGE｝

検索時及び更新時の，最小の排他資源単位を指定します。行単位の場合はLOCK ROW，ページ単位の場合はLOCK PAGEを指定します。省略した場合，LOCK ROWを仮定します。

なお，定義する表が一時表の場合は，指定しても無視されます。

LOCK ROW

最小の排他資源単位を行にします。

LOCK PAGE

最小の排他資源単位をページにします。

SUPPRESS〔DEC〔IMAL〕〕

非FIX表で，表内のデータの一部を省略して格納するときに指定します。

SUPPRESSオプションの指定は，列に格納するデータの有効けた数が定義長より短い表の場合に，データベース容量の削減に有効です。ただし，DECIMALデータの場合，有効けた数は先頭の0部分を除いたけた数になります。

DEC〔IMAL〕

表内のDECIMALデータの先頭0を省略して格納するときに指定します。

DECIMALについての規則を次に示します。

SUPPRESSを指定してDECIMALを省略しても，DECIMALが仮定されます。

格納するDECIMALデータの有効けた数が定義長と等しい場合，データは「定義長+1」の長さで格納されます。このため，SUPPRESSオプションを省略したときよりデータの長さが長くなるので注意してください。

DECIMALデータの定義精度（全けた数）が1の場合も，格納されるデータの長さが，SUPPRESSオプションを省略したときより長くなるので注意してください。

抽象データ型の属性中のDECIMALは，この機能の対象外です。

WITHOUT ROLLBACK

トランザクションのコミットを待たないで，表への更新（追加，削除も含む）処理が完了した時点で，その行の排他を解除する表を定義したい場合に指定します。

WITHOUT ROLLBACKについての規則を次に示します。

該当する表の行の更新処理（追加，削除も含む）の行排他，及びロールバック可否を次の表に示します。

表3‒24　WITHOUT ROLLBACK指定時の行の更新処理（追加，削除を含む）の行排他，及びロールバック可否

操作対象

システム定義

pd_idx_without_rollback

表に対する操作内容

行の挿入

行中の列の更新

行の削除

更新値が更新前の値と同じ

更新値が更新前の値と異なる

インデクスが定義されたWITHOUT ROLLBACK指定の表

更新対象列がインデクス構成列である

Y

○

○

○

○

N

×

○

実行できません。

×

更新対象列がインデクス構成列ではない

−

該当しません。

○

○

該当しません。

インデクスが定義されていないWITHOUT ROLLBACK指定の表

−

○

○

○

○

（凡例）

○：行排他は行の更新処理完了を契機に解除されます。処理完了後は更新内容をロールバックできません。

×：行排他はトランザクション終了時に解除されます。処理完了後もトランザクション未終了時はロールバックできます。

−：定義によりません。

データベース作成ユティリティ及びデータベース再編成ユティリティを実行する場合は，このオプションの指定は無視されます。

このオプションを指定する場合，FIX表にする必要があります。ただし，SHAREを指定している場合，このオプションは指定できません。

このオプションを指定する場合，BLOB列の定義はできません。また，LOCK PAGEも指定できません。

定義する表が一時表の場合，このオプションは指定できません。

INDEXLOCK｛NONE｜PAGE｝

XDM/RDとの互換のためのオプションであり，指定しても無視されます。

インデクスキー値無排他は，システム定義のpd_indexlock_modeオペランドで指定します。

pd_indexlock_modeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

SEGMENT REUSE ｛〔セグメント数〔｛K｜M｝〕〕｜NO｝

定義する表に，空き領域の再利用機能を使用する場合に指定します。

この指定を省略した場合，HiRDBは「セグメント数を指定していないSEGMENT REUSE」が指定されたものとして表を定義します。ただし，リバランス表，一時表の場合は，空き領域の再利用機能を適用しません。

空き領域の再利用機能については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

定義する表が一時表の場合，このオプションは指定できません。

セグメント数〔｛Ｋ｜Ｍ｝〕

空き領域の再利用機能を使用し，かつ該当する表のセグメント数に上限を設定する場合，その上限のセグメント数を指定します。セグメント数は，1〜268,435,440の符号なし整数で指定できます。また，単位として，K（キロ），又はM（メガ）を使用できますが，268,435,440を超える値は指定できません。

行の挿入，削除を頻繁に行う表に対して，行の挿入性能の向上，及び指定したセグメント内での格納効率の向上が期待できます。

セグメント数の指定なし

空き領域の再利用機能を使用し，かつ該当する表のセグメント数に上限を設定しない場合，セグメント数を省略します。

行の挿入，削除を頻繁に行う表で，かつRDエリアに格納される表が該当する表だけの場合に適用してください。行の挿入性能の向上，及び該当する表を格納するRDエリア内での，空き領域の格納効率の向上が期待できます。

NO

空き領域の再利用機能を使用しない場合に指定します。

行の挿入，削除を頻繁に行わない表に対してはNOを指定してください。

SEGMENT REUSEについての規則を次に示します。

空き領域の再利用機能は，LOB列，LOB属性の抽象データ型列，及びインデクスに対しては無効となります。

空き領域の再利用機能は，リバランス表に対しては指定できません。

INSERT ONLY 〔WHILE ｛日間隔データ｜ラベル付き間隔｝ BY 列名〕

表を改竄防止表とする場合に指定します。改竄防止表については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

改竄防止表とした場合，その表の値は更新できません。ただし，更新可能列は更新できます。

改竄防止表には，すべての列を更新可能列とすることはできません。

予備列を定義した表を，改竄防止表とすることはできません。

改竄防止表には，行の削除を禁止する期間（行削除禁止期間）を指定できます。行削除禁止期間を指定する場合，WHILEで期間を指定し，列名には挿入履歴保持列（DATE型の列で，かつSYSTEM GENERATEDの列）を指定してください。削除禁止期間を指定しない場合，永久的に行の削除はできません。

定義する表が一時表の場合，このオプションは指定できません。

日間隔データ

行削除禁止期間を，日間隔データの10進数表現で指定します。日間隔データの10進数表現については，「日間隔データの10進数表現」を参照してください。

なお，日間隔データは正の値だけ指定できます。

ラベル付き間隔

行削除禁止期間を，ラベル付き間隔で指定します。ラベル付き間隔については，「日付演算」を参照してください。

ラベル付き間隔の値式には，括弧で囲まれていない正の整数定数だけ指定できます。

列名

DATE型で，かつSYSTEM GENERATEDの列を指定してください。

行削除禁止期間には行を挿入した日を含み，行削除禁止期間の計算は，「日付演算」の「日付データと日間隔データとを加減算する場合の規則」に従います。削除禁止最終日付と削除可能日付は，それぞれ次の演算結果となります。

削除禁止最終日付＝行挿入日付＋削除禁止期間−1日

削除可能日付＝行挿入日付＋削除禁止期間

行挿入日付と削除禁止期間の指定値での，削除禁止最終日付と削除可能日付の関係を次の表に示します。

表3‒25　削除禁止最終日付と削除可能日付の関係

行挿入日付

削除禁止期間の指定値

削除禁止最終日付

削除可能日付

2002-03-01

1か年※１

2003-02-28

2003-03-01

1995-03-01

1か年※１

1996-02-29

1996-03-01

2002-02-28

1か月※２

2002-03-27

2002-03-28

2002-05-01

1か日※３

2002-05-01

2002-05-02

注※1

実際の指定形式は，日間隔データの場合は「00010000.」，ラベル付き間隔の場合は「1 YEAR」となります。

注※2

実際の指定形式は，日間隔データの場合は「00000100.」，ラベル付き間隔の場合は「1 MONTH」となります。

注※3

実際の指定形式は，日間隔データの場合は「00000001.」，ラベル付き間隔の場合は「1 DAY」となります。

(f)　｛〔表制約定義〕…｜〔ON COMMIT ｛DELETE｜PRESERVE｝ROWS〕｝

〔表制約定義〕…

標準SQLでは，表制約定義は表要素として指定します。したがって，表制約定義は表要素の並び中に表要素として指定することをお勧めします。表制約定義の詳細は，「表要素：：＝｛列定義｜表制約定義｝」の「表制約定義」の説明を参照してください。

ON COMMIT ｛DELETE｜PRESERVE｝ ROWS

定義する実表が一時表の場合に指定でき，一時表のデータが存在する期間を指定します。

DELETE

トランザクション固有一時表を作成する場合に指定します。

一時表のデータは，トランザクション終了時に削除されます。

PRESERVE

SQLセッション固有一時表を作成する場合に指定します。

一時表のデータは，SQLセッション終了時に削除されます。

(g)　列定義

：：＝列名 データ型〔ARRAY ［最大要素数］〕
　〔｛列データ抑制指定｜〔列回復制約〕
　　｛IN ｛LOB列格納用RDエリア名
　　　　　｜（LOB列格納用RDエリア名）
　　　　　｜（（LOB列格納用RDエリア名）〔，（LOB列格納用RDエリア名）〕…）
　　　　　｜マトリクス分割LOB列格納用RDエリア指定｝
　　　｜抽象データ型定義内LOB格納用RDエリア指定｝｝〕
　〔プラグイン指定〕〔圧縮指定〕〔DEFAULT句〕
　〔列制約…〕〔予備列定義〕〔更新可能列属性〕

列名

表を構成する列の名前を指定します。列名に同じ名前は指定できません。

データ型

列のデータ型を指定します。データ型については，「データ型」を参照してください。

スーパタイプでBLOBが定義されている抽象データ型，及びBOOLEANは指定できません。

指定するデータ型が抽象データ型で，認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

ARRAY ［最大要素数］

繰返し列を定義する場合に指定します。

最大要素数には，2〜30,000の符号なし整数を指定します。

繰返し列は，次のデータ型には指定できません。

文字集合を指定したCHAR，VARCHAR

BLOB

BINARY

抽象データ型

繰返し列は，圧縮列に指定できません。

LOB列格納用RDエリア名

BLOB列のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB列格納用RDエリアについての規則を次に示します。

データ型にBLOBを指定した列は，LOB列格納用RDエリア名を必ず指定してください。BLOB以外のデータ型を指定した列には指定できません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

表を分割する場合は，分割する数と同じ数のユーザLOB用RDエリアを指定してください。その場合，同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが，同じ順番になるように指定してください。例を次に示します。

（例）

CREATE TABLE MOVIE (ID INT NOT NULL,

IMAGE BLOB IN ((LU01),(LU02)))

IN ((RU01) ID < 120,(RU02))

（凡例）

LU01，LU02，RU01，及びRU02は，RDエリア名を示します。

注

RU01とLU01，RU02とLU02は，それぞれ同一サーバのRDエリアです。

LOB列格納用RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

LOB列格納用RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表では，表格納用RDエリアとLOB列格納用RDエリアが1対1に対応するようにLOB列格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は，LOB列格納用RDエリアも同一位置が重複するように指定してください。

上記以外の場合は，LOB列格納用RDエリアは重複して指定できません。

マトリクス分割LOB列格納用RDエリア指定：：＝2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については，PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また，指定するRDエリアについては，LOB列格納用RDエリア名の説明を参照してください。

(h)　列データ抑制指定：：＝SUPPRESS

列ごとのデータ抑制をします。固定長文字形式で後方空白のデータが多い場合にディスク容量を削除できます。

列データ抑制指定についての規則を次に示します。

列データの一番最後の文字が空白の場合，最後の空白から前方にサーチして連続している空白を，抑制してデータベースに格納します。この場合，1回空白が途切れたら，そこから前方の空白は抑制しません。

CHAR，及びMCHARは，4文字以上の半角の空白をデータ抑制の対象とします。

NCHARは，3文字以上の全角の空白をデータ抑制の対象とします。

FIX表には，指定できません。

データ型が抽象データ型の場合は指定できません。

データ型がCHAR，MCHAR，又はNCHAR以外のときは，指定できません。

繰返し列には指定できません。

この指定をした列は，データ抑制がされなかった場合でも，1バイトの付加情報が追加されます。

次に示すデータ型に対しては，この指定をしても無効となります。

CHARの場合，CHAR（5）より列データ長が短いとき

MCHARの場合，MCHAR（5）より列データ長が短いとき

NCHARの場合，NCHAR（3）より列データ長が短いとき

なお，一度スペースが途切れた場合，そこから前方のスペースの抑制はされません。

(i)　列回復制約：：＝RECOVERY 〔｛ALL｜PARTIAL｜NO｝〕

LOB列格納用RDエリア，又は抽象データ型定義内LOB格納用RDエリアに対して，データベースの更新ログ取得方式を指定します。省略すると，更新前ログ取得モード(PARTIAL)が仮定されます。仮定値は，システム共通定義のpd_ddl_tbl_recoveryオペランドで変更できます。pd_ddl_tbl_recoveryオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

LOB列格納用RDエリアの場合：

データ型にBLOBを指定した場合，ユーザLOB用RDエリアのデータベースの更新ログ取得方式を指定します。データ型がBLOB以外の列には指定できません。

抽象データ型定義内LOB格納用RDエリアの場合：

抽象データ型定義内にBLOB属性がある場合，ユーザLOB用RDエリアのデータベースの更新ログ取得方式を指定します。

ALL

ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。ログ取得モードで運用すると，ロールバック，及びロールフォワードに必要なデータベースの更新ログを取得します。

PARTIAL

更新前ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。更新前ログ取得モードで運用すると，ロールバックに必要なデータベースの更新ログを取得します。

NO

ログレスモードでユーザLOB用RDエリアを運用するときに指定します。ログレスモードで運用すると，データベースの更新ログを取得しません。

指定するデータベースの更新ログ取得方式によって，UAPを実行するときの運用方法や，障害が発生したときのユーザLOB用RDエリアの回復方法が異なります。ログレスモードの運用については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(j)　抽象データ型定義内LOB格納用RDエリア指定

：：＝ALLOCATE（属性名〔..属性名〕…
　IN ｛LOB属性格納用RDエリア名
　　　｜（LOB属性格納用RDエリア名）
　　　｜（（LOB属性格納用RDエリア名）〔，（LOB属性格納用RDエリア名）〕）
　　　｜マトリクス分割LOB属性格納用RDエリア指定｝
　　〔，属性名〔..属性名〕…
　　　IN ｛LOB属性格納用RDエリア名
　　　　　｜（LOB属性格納用RDエリア名）
　　　　　｜（（LOB属性格納用RDエリア名）〔，（LOB属性格納用RDエリア名）〕）
　　　　　｜マトリクス分割LOB属性格納用RDエリア指定｝〕…）

属性名〔..属性名〕

抽象データ型を構成する属性名を指定します。抽象データ型の属性が抽象データ型で，その入れ子になっている抽象データ型の属性にLOB型の属性がある場合は，そのLOB型の属性名を指定します。

次のような場合に属性名を指定してください。

抽象データ型の属性のデータ型がLOB型の場合

抽象データ型の属性が抽象データ型で，その入れ子になっている抽象データ型の属性がLOB型の属性の場合（そのLOB型の属性名を指定します）

LOB属性格納用RDエリア名

抽象データ型の任意の階層にある，BLOB属性のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB属性格納用RDエリアについての規則を次に示します。

データ型にBLOBを含む抽象データ型を指定した場合，各BLOB属性に対してユーザLOB用RDエリアの名前を必ず指定してください。BLOB以外のデータ型を指定した属性には指定できません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

表を分割する場合は，分割する数と同じ数のユーザLOB用RDエリアを指定してください。その場合，同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが，同じ順番になるようにしてください。

LOB属性格納用RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

LOB属性格納用RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表では，表格納用RDエリアとLOB属性格納用RDエリアが1対1に対応するようにLOB属性格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は，LOB属性格納用RDエリアも同一位置が重複するように指定してください。

上記以外の場合は，LOB属性格納用RDエリアは重複して指定できません。

マトリクス分割LOB属性格納用RDエリア：：＝2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については，PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また，指定するRDエリアについては，LOB属性格納用RDエリア名の説明を参照してください。

(k)　プラグイン指定：：＝PLUGIN プラグインオプション

プラグインオプション

データ型プラグインが実装されている抽象データ型として定義された列に対して，データ型プラグインに渡すためのパラメタ情報を文字列定数（最大255バイト）で記述します。パラメタ情報には，16進文字列定数は指定できません。

パラメタ情報の詳細については，各種プラグインマニュアルを参照してください。

(l)　圧縮指定：：＝COMPRESSED 〔BY 圧縮分割サイズ〕

圧縮指定は，列データを圧縮する場合に指定します。BINARY型の列に圧縮を指定する場合は，定義長が256バイト以上である必要があります。255バイト以下の場合，エラーになります。

圧縮分割サイズ：：＝ n〔｛K｜M｜G｝〕

圧縮処理や伸張処理のオーバヘッドを削減したい場合，又は圧縮効率を向上させたい場合に指定します。ただし，圧縮分割サイズを大きくすると，メモリ所要量が増加します。詳細は，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

データをnバイト単位で分割して圧縮します。nは符号なし整数で指定し，単位としてK（キロバイト），M（メガバイト）及びG（ギガバイト）が指定できます（指定省略時はバイト単位）。圧縮分割サイズに指定できる値の範囲を次の表に示します。

表3‒26　圧縮分割サイズに指定できる値の範囲

単位

nに指定できる値の範囲

圧縮分割サイズの値

BINARY型

抽象データ型（XML型）

指定しない（バイト）

32,000≦n≦2,147,483,647

1,048,576≦n≦2,147,483,647

n

K

32≦n≦2,097,152

1024≦n≦2,097,152

n×1,024

M

1≦n≦2,048

1≦n≦2,048

n×1,048,576

G

1≦n≦2

1≦n≦2

n×1,073,741,824

圧縮分割サイズの注意事項を次に示します。

圧縮分割サイズに指定できる値の範囲外の値を指定した場合，エラーになります。ただし，実際の最大長の計算結果が2,147,483,648の場合は，2,147,483,647になります。

圧縮分割サイズに定義長より大きい値を指定した場合，分割しないで圧縮します。

圧縮分割サイズを省略すると，BINARY型の場合は32,000バイトを仮定し，抽象データ型（XML型）の場合は1メガバイトを仮定します。ALTER TABLE文で列の定義長を大きくしても，圧縮列定義時に仮定した圧縮分割サイズは変わりません。

圧縮指定についての規則を次に示します。

圧縮指定ができる列は，次のデータ型の列だけです。

BINARY型

抽象データ型（XML型）※

注※

抽象データ型（XML型）の列のデータを圧縮するためには，バージョン09-03以降のHiRDB XML Extensionが必要です。バージョン09-02以前のHiRDB XML Extensionを使用している場合，抽象データ型（XML型）の列に圧縮指定はできません。

(m)　DEFAULT句：：＝DEFAULT 〔既定値〕

データ挿入時に値を省略した場合に，DEFAULT句で指定した値が挿入されます。

DEFAULT句についての規則を次に示します。

一つの項目に対して，DEFAULT句とWITH DEFAULTは同時には指定できません。

BLOB型，抽象データ型，及び定義長が32,001バイト以上のBINARY型の項目には指定できません。

繰返し列には指定できません。

予備列には指定できません。

既定値：：＝｛定数｜USER｜CURRENT_USER

｜CURRENT_DATE｜CURRENT DATE

｜CURRENT_TIME｜CURRENT TIME

｜CURRENT_TIMESTAMP〔（小数秒精度）〕〔USING BES〕

｜CURRENT TIMESTAMP〔（小数秒精度）〕〔USING BES〕｜NULL｝

既定値は，指定した項目に挿入できる値でなければなりません。

既定値についての規則を次に示します。

既定値を省略した場合，WITH DEFAULTの既定値が仮定されます。

既定値には，挿入時に上位有効けたが無効となるようなデータ型は指定できません。

非ナル値制約ありの列には，既定値としてNULLは指定できません。

既定文字集合以外の列に対してDEFAULT句を指定する場合，次の既定値は指定できません。

・CURRENT_DATE(CURRENT DATE)

・CURRENT_TIME(CURRENT TIME)

・CURRENT_TIMESTAMP(CURRENT TIMESTAMP)

既定値にUSER（CURRENT_USER），CURRENT_DATE（CURRENT DATE），CURRENT_TIME（CURRENT TIME），又はCURRENT_TIMESTAMP〔（小数秒精度）〕（CURRENT TIMESTAMP〔（小数秒精度）〕）を指定した場合，次の値が設定されます。

USER（CURRENT_USER）の場合：

行を挿入したときの実行ユーザの認可識別子の値が設定されます。

CURRENT_DATE（CURRENT DATE）の場合：

行を挿入したときの日付が設定されます。ただし，データベース作成ユティリティ（pdload）の場合は，ユティリティ起動時の日付が設定されます。

CURRENT_TIME（CURRENT TIME）の場合：

行を挿入したときの時刻が設定されます。ただし，データベース作成ユティリティ（pdload）の場合は，ユティリティ起動時の時刻が設定されます。

CURRENT_TIMESTAMP〔（小数秒精度） 〔USING BES〕〕（CURRENT TIMESTAMP〔（小数秒精度）〕 〔USING BES〕）の場合：

行を挿入したときの時刻印が設定されます。ただし，データベース作成ユティリティ（pdload）の場合は，ユティリティ起動時の時刻印が設定されます。また，HiRDB/パラレルサーバでマルチフロントエンドサーバ構成で運用する場合，時刻印はUAPが接続したフロントエンドサーバで取得します。

USING BESを指定した場合，現在の時刻印をHiRDB/パラレルサーバの場合は更新行又は挿入行を格納するRDエリアを管理しているバックエンドサーバ，HiRDB/シングルサーバの場合はシングルサーバで取得します。

USING BESを省略した場合，HiRDB/パラレルサーバの場合はフロントエンドサーバ，HiRDB/シングルサーバの場合はシングルサーバで現在の時刻印を取得します。

既定値取得サーバ種別指定にUSING BESを指定した列を分割キーに指定できません。

(n)　列制約

：：＝｛非ナル値制約
　　　　｜単一列一意性制約定義
　　　　　〔インデクスオプション〔インデクスオプション〕〕
　　　　｜｛ 単一列検査制約定義〔制約名定義〕
　　　　　　｜〔制約名定義〕　単一列検査制約定義 ｝
　　　　｜｛ 単一列参照制約定義〔制約名定義〕
　　　　　　｜〔制約名定義〕単一列参照制約定義 ｝｝

列単位に次の制約を指定できます。

非ナル値制約

単一列一意性制約定義

単一列検査制約定義

単一列参照制約定義

制約名定義の指定位置は，システム共通定義pd_constraint_nameオペランドの指定値，又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。詳細は，表「制約名定義の指定位置」を参照してください。

SHAREとFIXを指定している場合，単一列参照制約は指定できません。

(o)　予備列定義：：＝FOR RESERVED

列を予備列として定義する場合に指定します。将来，FIX表に列を追加する見込みがある場合に予備列を定義します。予備列を定義すると，FIX表にデータが格納されている状態でも，予備列から切り出して列を追加できます。

予備列には，定義長分の0x00が格納されます。0x00以外の値は格納できません。

予備列定義の規則を次に示します。

非FIX表には定義できません。

CHAR型以外の列に指定できません。

文字集合と同時に指定できません。

一つの表に複数指定できません。

表構成列の最後の列以外に指定できません。

予備列だけの表は定義できません。

一時表には定義できません。

(p)　更新可能列属性：：＝UPDATE 〔ONLY FROM NULL〕

改竄防止表を定義する場合又は改竄防止表に変更する予定のある表に更新可能列を定義する場合に指定します。

更新可能列属性は改竄防止表の場合だけ有効になります。

改竄防止表の定義については，「INSERT ONLY」オプションを参照してください。改竄防止表への変更については，「ALTER TABLE」の「CHANGE」の「INSERT ONLY」オプションを参照してください。

更新可能列属性についての規則を次に示します。

SYSTEM GENERATEDを指定した列には指定できません。

次に示す更新できない列には指定できません。

クラスタキー構成列

分割キー構成列（フレキシブルハッシュ分割表の分割キー構成列を除く）

予備列

定義する表が一時表の場合，このオプションは指定できません。

UPDATE

改竄防止表で更新可能列を定義する場合に指定します。

UPDATE ONLY FROM NULL

改竄防止表での行の値がナル値から非ナル値へ一度だけ更新可能な列を定義する場合に指定します。

改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

○

ナル値

非ナル値

○

非ナル値

ナル値

×

非ナル値

非ナル値※

×

（凡例）

○：更新できます。

×：更新できません。

注

繰返し列の場合は，ナル値（要素数が0の値）から添え字指定無しでの列単位更新だけ実行できます。

注※

更新前の値と同値を含みます。

UPDATE ONLY FROM NULL指定についての規則を次に示します。

NOT NULLを指定した列には指定できません。

FIX表の場合指定できません。

主キー又はクラスタキー構成列には指定できません。

分割キー構成列には指定できません。

BLOB型及び定義長が32,001バイト以上のBINARY型の列には指定できません。

更新可能列属性の指定可否と指定時の列の値の更新可否は次のようになります。

表種別

UPDATE指定

UPDATE ONLY

FROM NULL指定

左記の

指定なし

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

非改竄防止表

○

○

○

○

−

○

改竄防止表

○

○

○

○※

−

×

（凡例）

○：更新できます。

×：更新できません。

−：該当しません。

注※

ナル値から非ナル値へ一度だけ更新できます。

(q)　非ナル値制約指定

：：＝｛〔NULL
　　　　｜NOT NULL〔WITH DEFAULT〔SYSTEM GENERATED〕〕〕※２
　　　　｜〔〔NOT NULL〕 WITH DEFAULT〔SYSTEM GENERATED〕〕※１｝

注※1　FIX表の列，クラスタキー又は主キーを構成する列の場合

注※2　上記以外の場合

NULL

列名で指定した列にナル値を許す場合に指定できます。

FIX表の列，クラスタキー又は主キーを構成する列には指定できません。

NOT NULL

列名で指定した列にナル値を許さないように制約（非ナル値制約）する必要がある場合に指定します。

データ型が抽象データ型の場合，NOT NULLは指定できません。

NOT NULLは，繰返し列には指定できません。

WITH DEFAULT

INSERT文，又はデータベース作成ユティリティを使用したデータロード時に，挿入する列名と挿入値の指定を省略したとき，非ナル値制約を持つ列に対して既定値を挿入する場合に指定します。

WITH DEFAULTについての規則を次に示します。

FIX表にWITH DEFAULTを指定した場合，NOT NULLを省略できます。

データ型が抽象データ型の場合，WITH DEFAULTは指定できません。

予備列には指定できません。

WITH DEFAULTを指定した場合，設定される列の既定値を次の表に示します。

表3‒27　WITH DEFAULTを指定したときの既定値

データ型

列の既定値

INTEGER

0

SMALLINT

FLOAT

SMALLFLT

DECIMAL

CHAR

空白

NCHAR

MCHAR

VARCHAR

既定文字集合

文字集合(UTF16以外)

1バイトの空白

文字集合(UTF16)

1文字の空白

NVARCHAR

1文字の空白

MVARCHAR

1バイトの空白

DATE

行追加時の現在の日付

TIME

行追加時の現在の時刻

TIMESTAMP

行追加時の現在の時刻印

INTERVAL YEAR TO DAY

0か年0か月0か日間

INTERVAL HOUR TO SECOND

0時間0分0秒間

BLOB

長さ0バイトのデータ

BINARY

注　WITH DEFAULTを指定していない場合，ナル値が列の既定値になります。

SYSTEM GENERATED

列のデータ型がDATE型，又はTIME型の場合だけ指定できます。SYSTEM GENERATEDを指定した列を，挿入履歴保持列といいます。また，SYSTEM GENERATEDを指定した列は，改竄防止表の行削除禁止期間を指定するときに使用します。

SYSTEM GENERATEDを指定した列は，INSERT文でのデータ挿入時に，値の指定有無に関係なく，DATE型の場合は現在の日付（CURRENT_DATE），TIME型の場合は現在の時刻（CURRENT_TIME）を挿入します。

ただし，SYSTEM GENERATEDを指定した列に対する挿入値としてキーワードNULLを指定するとエラーになります。

(r)　単一列一意性制約定義

：：＝｛〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY〔｛ASC｜DESC｝〕
　　　〔IN｛インデクス格納用RDエリア名
　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕
　　　　｜PRIMARY KEY〔｛ASC｜DESC｝〕
　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕｝

〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY〔｛ASC｜DESC｝〕

〔IN｛インデクス格納用RDエリア名

　　　｜（インデクス格納用RDエリア名）

　　　｜（（インデクス格納用RDエリア名）

　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕

列名で指定した列をクラスタキーとして定義する場合に指定します。

クラスタキーについての規則を次に示します。

クラスタキーを指定した場合，それらを構成する列には，次に示すデータ型は指定できません。

・BLOB

・BINARY

・抽象データ型

クラスタキーを構成する列には，繰返し列は指定できません。

クラスタキーを指定すると，指定した列に対してインデクスが定義されます。定義されたインデクスは削除できません。

クラスタキーを構成する列にはNOT NULLが仮定されます。

UNIQUE又はPRIMARYを指定したクラスタキーに重複するデータは挿入できません。

一つの表に二つ以上のクラスタキーは定義できません。

クラスタキーを指定した場合，ハッシュ関数にHASHA〜HASHFは指定できません。

クラスタキーを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計

≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242，4036)

分割表にクラスタキーを指定する場合の規則を次に示します。

キーレンジ分割（格納条件，境界値）

クラスタキーを構成する列には，分割キーを指定してください。

ハッシュ分割

　単一列分割

　　クラスタキーを構成する列には，分割キーを指定してください。

　複数列分割

　　クラスタキーを単一列に指定できません。

マトリクス分割

　　クラスタキーを単一列に指定できません。

定義する表が一時表の場合は指定できません。

クラスタキーを構成する列には，予備列は指定できません。

UNIQUE

クラスタキーを構成する列の値がすべての行で異なるように制約する必要がある場合に指定します。

PRIMARY

クラスタキーを構成する列を主キーとして定義する場合に指定します。

ASC

クラスタキーのインデクスを昇順に作成する場合に指定します。

DESC

クラスタキーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

クラスタキーのインデクスを格納するRDエリア名を指定します。

インデクスを横分割して格納する場合は，表を横分割する個数分のインデクス格納用RDエリア名を指定します。

指定するインデクス格納用RDエリア名は，一時表用RDエリア以外のユーザ用RDエリアにしてください。

ただし，HiRDB/パラレルサーバでは次の制限があります。

SHAREを指定している場合，インデクス格納用RDエリア名は，共用RDエリアにしてください。

SHAREを指定していない場合，インデクス格納用RDエリア名は，共用RDエリアを指定できません。

インデクス格納用RDエリア名についての規則を次に示します。

RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

インデクス格納用RDエリア名を省略すると，定義した表を格納するRDエリアにインデクスも格納されます。

インデクス格納用RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表では，表格納用RDエリアとインデクス格納用RDエリアが１対１に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は，インデクス格納用RDエリアも同一位置が重複するように指定してください。

リバランス表を格納しているユーザ用RDエリアは指定できません。また，リバランス表に対してクラスタキーを定義する場合，RDエリア名の指定は省略できません。

インデクス格納用RDエリア名を指定する場合，その数は横分割した表の格納数と同じにして，同じサーバのRDエリアを指定する必要があります。このとき，インデクス格納用RDエリア名は表格納用RDエリア名の指定順に対応します。例を次に示します。

1.格納条件によって横分割する場合

2.境界値によって横分割する場合

PRIMARY KEY〔｛ASC｜DESC｝〕

〔IN｛インデクス格納用RDエリア名

　　　｜（インデクス格納用RDエリア名）

　　　｜（（インデクス格納用RDエリア名）

　　　　　〔，（インデクス格納用RDエリア名）〕…）｝〕

列名で指定した列を主キーとして定義する場合に指定します。

主キーについての規則を次に示します。

主キーを指定した場合，それらを構成する列には，次に示すデータ型は指定できません。

・BLOB

・BINARY

・抽象データ型

主キーを構成する列には，繰返し列は指定できません。

主キーを構成する列には，予備列は指定できません。

主キーを指定すると，指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合は，主キーを削除してください。

一時表の場合，ALTER TABLEで主キーを削除できません。一時表に定義された主キーを削除する場合は，一時表を削除して，再度定義してください。

主キーを構成する列にはNOT NULLが仮定されます。

主キーに重複するデータは挿入できません。

一つの表に二つ以上の主キーは定義できません。

横分割表に対する主キーの定義可否（UNIQUE指定可否）については，「表を横分割する場合のUNIQUE指定可否」を参照してください。

主キーを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計

≦MIN（（インデクス格納用RDエリアのページサイズ÷2）−1242，4036）

定義するインデクスが一時インデクスの場合は，一時表を実体化する際に上記を満たすかどうかをチェックします。

一時表の実体化については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

マトリクス分割表には，主キーを単一列に指定できません。

ASC

主キーのインデクスを昇順に作成する場合に指定します。

DESC

主キーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

主キーのインデクスを格納するRDエリア名を指定します。

指定するインデクス格納用RDエリアは，一時表用RDエリア以外のユーザ用RDエリアにしてください。

ただし，HiRDB/パラレルサーバでは次の制限があります。

SHAREを指定している場合，インデクス格納用RDエリア名は，共用RDエリアにしてください。

SHAREを指定してない場合，インデクス格納用RDエリア名は，共用RDエリアを指定できません。

インデクス格納用RDエリア名についての規則を次に示します。

RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

RDエリア名を省略すると，定義した表を格納するRDエリアにインデクスも格納されます。ただし，HiRDB/シングルサーバでの横分割表の場合，又はHiRDB/パラレルサーバでの同じバックエンドサーバ内の横分割表の場合，インデクスは次のように格納されます。

単一列分割する表の場合：

分割キー以外の列を主キーに指定した場合，最初に分割条件を指定した表格納用RDエリアに格納されます。

複数列分割する表の場合：

最初に分割条件を指定した表格納用RDエリアに格納されます。

マトリクス分割表の場合：

主キーを単一列に指定できません。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザ用RDエリアを指定してください。

インデクス格納用RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表では，表格納用RDエリアとインデクス格納用RDエリアが1対1に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は，インデクス格納用RDエリアも同一位置が重複するように指定してください。

リバランス表を格納しているユーザ用RDエリアは指定できません。また，リバランス表に対して主キーを定義する場合，RDエリア名の指定は省略できません。

表を複数のRDエリアに分割格納している場合，インデクス格納用RDエリアは次のどれかの指定方法となります。

(a) 単一列分割する表で，かつ分割キーに指定した列を主キーの先頭に指定する場合

(b) 複数列分割する表で，かつ分割キーに指定したすべての列を主キーの先頭から同順に指定する場合

(c) マトリクス分割表の場合

(d) (a)〜(c)以外で，分割キーに指定した列を主キーの構成列にすべて指定する場合（順不同）

(a)〜(c)の場合，RDエリア名は表格納用RDエリアと同じ数だけ指定します。この場合，インデクスの格納先は指定した表格納用RDエリアの指定順に対応します。

(d)の場合，RDエリア名は表を分割して格納しているサーバの数だけ指定します。HiRDB/シングルサーバの場合は一つだけ指定し，HiRDB/パラレルサーバの場合は，表があるバックエンドサーバごとに一つのRDエリアを指定します。

上記以外の場合，分割格納する表に対して主キーは定義できません。

定義する表が一時表の場合は指定できません。

(s)　インデクスオプション：：＝｛PCTFREE＝未使用領域の比率｜UNBALANCED SPLIT｝

PCTFREE＝未使用領域の比率

インデクス作成時のインデクスページ内の未使用領域の比率を指定します。未使用領域の比率は，0〜99（%）を指定できます。省略すると30%が仮定されます。仮定値は，システム共通定義のpd_ddl_idx_pctfreeオペランドで変更できます。pd_ddl_idx_pctfreeオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

データベース作成ユティリティ，及びデータベース再編成ユティリティでのインデクス一括作成時に，未使用領域の比率でインデクスが作成されます。INSERT文やUPDATE文など，ほかの追加及び更新ではPCTFREE＝0が仮定されます。

インデクスの定義後，行の追加が頻繁に発生する場合，未使用領域の比率を高く指定してください。

UNBALANCED SPLIT

ページスプリットする場合，両ページに対するキーの振り分けを不均衡にします。

スプリット対象ページへのキーの追加位置が，ページの前半部の場合はスプリット後の左側のページの空きを多く確保し，後半部の場合は右側のページの空きを多く確保するように分割します。このようなインデクスをアンバランスインデクススプリットといいます。

アンバランスインデクススプリットについては，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(t)　単一列検査制約定義：：＝CHECK（探索条件）

列名で指定した列に対して検査制約を定義する場合に指定します。

探索条件

列の値を制約する条件を指定します。この条件が偽になる場合，この表に対して挿入，更新はできません。

探索条件中に指定する列は，列名で指定した列を指定してください。

探索条件には，次のものを含むことはできません。

副問合せ

集合関数又はSQL/XML集合関数

ウィンドウ関数

繰返し列

予備列

関数呼出し

USER，CURRENT_USER

CURRENT DATE，CURRENT_DATE

CURRENT TIME，CURRENT_TIME

CURRENT TIMESTAMP，CURRENT_TIMESTAMP

？パラメタ，埋込み変数

TIMEからTIMESTAMPへの変換を指定したCAST指定

値式にTIME型を指定したスカラ関数VARCHAR_FORMAT

抽象データ型の値式

システム定義スカラ関数

スカラ関数IS_USER_CONTAINED_IN_HDS_GROUP

構造化繰返し述語

XMLコンストラクタ関数

SQL/XMLスカラ関数

(u)　単一列参照制約定義：：＝参照指定

列名で指定した列を外部キーとして定義する場合に指定します。

外部キーについての規則を次に示します。

外部キーを指定した場合，列には，次に示すデータ型は指定できません。

BLOB

BINARY

抽象データ型

外部キー列には，繰返し列は指定できません。

外部キー列には，予備列は指定できません。

外部キーと参照する主キーは次に示す事項をすべて同じにしてください。

対応するデータ型

対応するデータ長

(v)　複数列一意性制約定義

：：＝｛〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY
　　　　（列名〔｛ASC｜DESC｝〕〔，列名〔｛ASC｜DESC｝〕〕…）
　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕
　　　　｜PRIMARY KEY（列名〔｛ASC｜DESC｝〕
　　　　　〔，列名〔｛ASC｜DESC｝〕〕…）
　　　　　〔IN｛インデクス格納用RDエリア名
　　　　　　　　｜（インデクス格納用RDエリア名）
　　　　　　　　｜（（インデクス格納用RDエリア名）
　　　　　　　　　　〔，（インデクス格納用RDエリア名）〕…）
　　　　　　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕｝

〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEY（列名〔｛ASC｜DESC｝〕

〔，列名〔｛ASC｜DESC｝〕〕…）

〔IN｛インデクス格納用RDエリア名

　　　｜（インデクス格納用RDエリア名）

　　　｜（（インデクス格納用RDエリア名）

　　　　　〔，（インデクス格納用RDエリア名）〕…）

　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕

複数の列をクラスタキーとして定義する場合に指定します。

クラスタキーについての規則を次に示します。

クラスタキーを指定した場合，それらを構成する列には，次に示すデータ型は指定できません。

・BLOB

・BINARY

・抽象データ型

クラスタキーを複数の列で構成する場合，項番1に加えて次に示すデータ型も指定できません。

・FLOAT

・SMALLFLT

クラスタキーを構成する列には，繰返し列は指定できません。

クラスタキーを構成する列には，予備列は指定できません。

クラスタキーを指定すると，指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合，表を削除してください。

クラスタキーを構成する列にはNOT NULLが仮定されます。

UNIQUE又はPRIMARYを指定したクラスタキーに同じデータは挿入できません。

一つの表に二つ以上のクラスタキーは定義できません。

クラスタキーを構成する列の数は，最大64個です。

クラスタキーを指定した場合，ハッシュ関数にHASHA〜HASHFは指定できません。

インデクスを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計

≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242，4036)

分割表にクラスタキーを指定する場合の規則を次に示します。

キーレンジ分割（格納条件，境界値）

　クラスタキーを構成する列の先頭には，分割キーを指定してください。

ハッシュ分割

　単一列分割

　　クラスタキーを構成する列の先頭には，分割キーを指定してください。

　複数列分割

　　クラスタキーを構成する列の先頭から，分割キーを同順にすべて含むように指定してください。

マトリクス分割

　クラスタキーを構成する列の先頭から，第1次元分割列，第2次元分割列の順にすべて含むように指定してください。

　第2次元分割列を複数列分割する場合も，第1次元分割列から同順にすべての分割キーを含むように指定してください。

定義する表が一時表の場合は指定できません。

UNIQUE

クラスタキーを構成する複数の列の値がすべての行で異なるように制約する必要がある場合に指定します。

PRIMARY

クラスタキーを構成する複数の列を主キーとして定義する場合に指定します。

列名

クラスタキーを定義する列の名前を指定します。

クラスタキーを構成する列名は同じ列名を指定できません。複数の列にクラスタキーを定義する場合，各列の指定順序にキー値が作成されます。

ASC

クラスタキーのインデクスを昇順に作成する場合に指定します。

DESC

クラスタキーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

クラスタキーのインデクスを格納するRDエリア名を指定します。

インデクスを横分割して格納するときは，表を横分割する個数分のインデクス格納用RDエリア名を指定します。

指定するインデクス格納用RDエリア名は，一時表用RDエリア以外のユーザ用RDエリアにしてください。

インデクス格納用RDエリアについての規則を次に示します。

RDエリアは，あらかじめデータベース初期設定ユティリティで作成，又はデータベース構成変更ユティリティで追加されていなければなりません。

インデクス格納用RDエリア名を省略すると，定義した表を格納するRDエリアにインデクスも格納されます。

指定するRDエリア名は，表格納用RDエリアと同じサーバに定義しているユーザ用RDエリアを指定してください。

インデクス格納用RDエリア名を複数個指定する場合，同じRDエリア名は指定できません。境界値指定の横分割表，ハッシュ分割表，又はマトリクス分割表では，表格納用RDエリアとインデクス格納用RDエリアが１対１に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は，インデクス格納用RDエリアも同一位置が重複するように指定してください。

インデクス格納用RDエリア名を複数個指定する場合，その数は横分割した表の格納数と同じにする必要があります。このとき，インデクス格納用RDエリア名は表格納用RDエリア名の指定順に対応します。例については単一列一意性制約定義のインデクス格納用RDエリア名を参照してください。

リバランス表を格納しているユーザ用RDエリアは指定できません。また，リバランス表に対してクラスタキーを定義する場合，RDエリア名の指定は省略できません。

マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については，PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また，指定するRDエリアについては，インデクス格納用RDエリア名の説明を参照してください。

PRIMARY KEY（列名〔｛ASC｜DESC｝〕

〔，列名〔｛ASC｜DESC｝〕〕…）

〔IN｛インデクス格納用RDエリア名

　　　｜（インデクス格納用RDエリア名）

　　　｜（（インデクス格納用RDエリア名）

　　　　　〔，（インデクス格納用RDエリア名）〕…）

　　　｜マトリクス分割インデクス格納用RDエリア指定｝〕

複数の列を主キーとして定義する場合に指定します。

主キーについての規則を次に示します。

主キーを指定した場合，それらを構成する列には，次に示すデータ型は指定できません。

・BLOB

・BINARY

・抽象データ型

主キーを複数の列で構成する場合，項番1に加えて次に示すデータ型も指定できません。

・FLOAT

・SMALLFLT

主キーを構成する列には，繰返し列は指定できません。

主キーを構成する列には，予備列は指定できません。

主キーを指定すると，指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合は，主キーを削除してください。

一時表の場合，ALTER TABLEで主キーを削除できません。一時表に定義された主キーを削除する場合は，一時表を削除して，再度定義してください。

主キーを構成する列にはNOT NULLが仮定されます。

主キーに同じデータは挿入できません。

一つの表に二つ以上の主キーは定義できません。

主キーを構成する列の数は，最大64個です。

横分割表に対する主キーの定義可否（UNIQUE指定可否）については，「表を横分割する場合のUNIQUE指定可否」を参照してください。

インデクスを構成する列の長さの合計は，次の計算式を満たすようにしてください。

列の長さの合計

≦MIN（（インデクス格納用RDエリアのページサイズ÷2）−1242，4036）

定義するインデクスが一時インデクスの場合は，一時表を実体化する際に上記を満たすかどうかをチェックします。

一時表の実体化については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

列名

主キーを定義する列の名前を指定します。

主キーを構成する列名は同じ列名を指定できません。複数の列に主キーを定義する場合，各列の指定順序にキー値が作成されます。

ASC

主キーのインデクスを昇順に作成する場合に指定します。

DESC

主キーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

主キーのインデクスを格納するRDエリア名を指定します。

インデクス格納用RDエリア名を省略すると，定義した表を格納するRDエリアにインデクスも格納されます。ただし，HiRDB/シングルサーバでの横分割表の場合，又はHiRDB/パラレルサーバでの同じバックエンドサーバ内の横分割表の場合，インデクスは次のように格納されます。

単一列分割する表の場合：

定義した表を格納するRDエリアにインデクスも格納されます。

複数列分割する表の場合：

分割キーに指定したすべての列を，主キーの先頭から同じ順番で指定しないと，最初に分割条件を指定した表格納用RDエリアに格納されます。

マトリクス分割表の場合：

分割キーに指定したすべての列を，主キーの先頭から同じ順番で指定しないと，表定義はできません。分割キーに指定したすべての列を，主キーの先頭から同じ順番で指定しない場合，インデクス格納用RDエリア名を指定してください。

インデクス格納用RDエリア名の説明，規則については，単一列一意性制約定義のPRIMARY KEYのインデクス格納用RDエリア名の説明を参照してください。

マトリクス分割インデクス格納用RDエリア指定：：＝2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については，PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また，指定するRDエリアについては，複数列一意性制約定義の〔｛UNIQUE｜PRIMARY｝〕 CLUSTER KEYのインデクス格納用RDエリア名の説明を参照してください。

(w)　複数列検査制約定義：：＝CHECK（探索条件）

複数の列に対して検査制約を定義する場合に指定します。

探索条件

複数の列を制約する条件を指定します。この条件が偽になる場合，この表に対して挿入，更新はできません。

探索条件中に指定する列は，表定義で指定した列を指定してください。

探索条件中の制限は，「単一列検査制約定義」の「探索条件」を参照してください。

(x)　複数列参照制約定義：：＝FOREIGN KEY（列名〔，列名〕…） 参照指定

複数列を外部キーとして定義する場合に指定します。

外部キーについての規則を次に示します。

外部キーを指定した場合，それらを構成する列には，次に示すデータ型は指定できません。

BLOB

BINARY

抽象データ型

外部キーを構成する列には，繰返し列は指定できません。

外部キーを構成する列には，予備列は指定できません。

外部キーと参照する主キーは次に示す事項をすべて同じにしてください。

対応するデータ型

対応するデータ長

列数

なお，外部キーとして複数の列を指定した場合，HiRDBは指定順に列の対応をチェックします。

FOREIGN KEY（列名〔，列名〕…） 参照指定

外部キーを構成する列名を指定します。

列名は最大64個指定できます。

列名は同じ列名を指定できません。

(y)　格納条件：：＝列名｛＝｜<>｜^＝｜!＝｜<｜<＝｜>｜>＝｝｛定数｜（定数〔，定数〕）｝

表を複数のRDエリアに分割（表の横分割）して格納するための条件を指定します。

格納条件についての規則を次に示します。

定数を複数個指定できるのは，比較演算子で＝を用いた場合だけです。

定数を複数個指定する場合，同じ値は指定しないでください。

比較演算できる列のデータ型を次に示します。

INTEGER

SMALLINT

DECIMAL

FLOAT

SMALLFLT

CHARACTER※１

VARCHAR※１

NCHAR※２

NVARCHAR※２

MCHAR※１

MVARCHAR※１

DATE

TIME

TIMESTAMP※４

INTERVAL YEAR TO DAY※３

INTERVAL HOUR TO SECOND※３

注※1

定義長が255バイト以下の列だけ指定できます。

注※2

定義長が127文字以下の列だけ指定できます。

注※3

データディクショナリ表SQL_DIV_TABLE中のDCVALUES列（格納振り分け条件値）には，補正した値が格納されます。

（例）

19921225. → 19930025.

99981315. → 99990115.

注※4

DEFAULT句中にUSING BESを含む既定値を指定した場合は指定できません。

定数には，次のものは指定できません。

長さ0の文字列定数，各国文字列定数，混在文字列定数，及び16進文字列定数

長さ256バイト以上の文字列定数，長さ128文字以上の各国文字列定数，長さ256バイト以上の混在文字列定数，及び長さ256バイト以上の16進文字列定数（16進文字列の文字数512文字以上）

列名で指定した列の値は更新できません。

一つの格納条件に指定する定数の数は，すべての格納条件に指定した定数の総数が15,000以下の範囲で指定してください。ただし，格納条件を省略した場合も1と数えます。

クラスタキーを指定した列がある場合，それ以外の列に対して格納条件を指定できません。

列名で指定した列はNOT NULL（非ナル値制約，FIX指定，クラスタキー，又は主キー）にしてください。

クラスタキーが複数列の場合，先頭の列名以外の列に対して格納条件は指定できません。

繰返し列には，格納条件を指定できません。

予備列には，格納条件を指定できません。

(z)　ハッシュ関数名：：＝｛HASH1｜HASH2｜HASH3｜HASH4｜HASH5｜HASH6｜HASHZ｜HASH0｜HASHA｜HASHB｜HASHC｜HASHD｜HASHE｜HASHF｝

リバランス表でない場合，又はマトリクス分割表の第2次元にハッシュ関数を指定する場合：

HASH1〜HASH6，HASHZ，又はHASH0のどれかを指定してください。

HASH6が最も均等にハッシングされるので，通常はHASH6を指定してください。ただし，分割キーのデータによっては均等にならない場合もあるので，そのときにはほかのハッシュ関数を指定してください。

HASH0は年月の値で，データ格納先RDエリアを月単位に循環させる場合に指定してください。

HASHZは年月日の値で，データ格納先RDエリアを日単位に循環させる場合に指定してください。

HASH0とHASHZの使い分け

運用方法

推奨

月単位で分割する

HASH0

日単位で分割する

HASHZ

リバランス表の場合：

HASHA〜HASHFのどれかを指定してください。

HASHFが最も均等にハッシングされるので，通常はHASHFを指定してください。ただし，分割キーのデータによっては均等にならない場合もあるので，そのときにはほかのハッシュ関数を指定してください。

HASH1，HASHA

このハッシュ関数は，分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※を使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASH2，HASHB

このハッシュ関数は，分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※を使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASH1又はHASHAを指定してデータを均等にRDエリアに格納できなかった場合に指定します。

HASH3，HASHC

このハッシュ関数は，分割に指定した列のデータ型がINTEGER，又はSMALLINT専用です。分割したすべての列の末尾2バイト※を使用してハッシュします。データ長が2バイト以上の列に指定できます。

HASH4，HASHD

このハッシュ関数は，分割に指定した列のデータ型がDATE専用です。分割に指定したすべての列の先頭4バイト※を使用してハッシュします。データ長が4バイト以上の列に指定できます。

HASH5，HASHE

このハッシュ関数は，分割に指定した列のデータ型がTIME専用です。分割に指定したすべての列の先頭3バイト※を使用してハッシュします。データ長が3バイト以上の列に指定できます。

HASH6，HASHF

このハッシュ関数は，分割に指定した列のすべてのデータ型に使用できます。DECIMALの場合に最も適しています。分割に指定したすべての列の，データの全バイト※を使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASHZ

このハッシュ関数は，分割列中の年月日の値を使用してハッシングし，データを格納するRDエリアを日単位で循環させて割り当てる場合に使用します。

このハッシュ関数を指定する場合には，分割キーは1列で，そのデータ型はDATE，TIMESTAMP，CHAR(8)（文字集合がUTF16の場合はCHAR(16)）でなければなりません。文字の長さが8文字の場合の文字形式は，'YYYYMMDD'にしてください。

また，YYYY，MM，及びDDは，次の値にしてください。

　YYYY：0001〜9999（年）

　MM：01〜12（月）

　DD：01〜該当年月の最終日（日）

HASH0

このハッシュ関数は，分割列中の年月の値を使用してハッシングし，データを格納するRDエリアを月単位で循環させて割り当てる場合に使用します。

このハッシュ関数を指定する場合には，分割キーは1列で，そのデータ型はDATE，TIMESTAMP，CHAR(8)（文字集合がUTF16の場合はCHAR(16)），又はCHAR(6)（文字集合がUTF16の場合はCHAR(12)）でなければなりません。文字の長さが8文字の場合の文字形式は，'YYYYMMDD'，文字の長さが6文字の場合の文字形式は，'YYYYMM'にしてください。

また，YYYY，MM，及びDDは，次の値にしてください。

　YYYY：0001〜9999（年）

　MM：01〜12（月）

　DD：01〜該当年月の最終日（日）

注※

VARCHAR型，MVARCHAR型，又はNVARCHAR型は，後続の空白を無視してハッシュします。また，DECIMAL型，INTERVAL YEAR TO DAY型，又はINTERVAL HOUR TO SECOND型で符号部が'F'の場合は，'C'に変換してハッシュします。

(aa)　参照指定：：＝REFERENCES　被参照表　〔参照制約動作指定〕

参照する被参照表を指定します。制約動作を指定したい場合は参照制約動作指定を指定します。

参照指定を指定した場合，参照指定を指定した表（参照表）は，次の表に示す操作規則が適用されます。参照指定を指定した表が参照する表（被参照表）には，表「CASCADE指定時の被参照表に対する操作，及びそれに伴う参照表への影響」及び表「RESTRICT指定時の被参照表に対する操作」に示す操作規則が適用されます。

表3‒28　参照指定指定時の参照表に対する操作

外部キー構成列に対する操作

外部キー構成列の行と，外部キーが参照する被参照表の行の関係

操作結果

追加（INSERT）

挿入する行の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在する。

○

挿入する行の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在しない。

挿入する行の外部キー構成列中にナル値がある。

○

挿入する行の外部キー構成列中にナル値がない。

×

更新（UPDATE）

更新後の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在する。

○

更新後の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在しない。

更新後の外部キー構成列中にナル値がある。

○

更新後の外部キー構成列中にナル値がない。

×

（凡例）

○：参照表に対する操作ができます。

×：制約違反エラーとなります。

被参照表：：＝表名

参照する表名を指定します。

表名の規則を次に示します。

主キーを持つ表の表名を指定してください。

表名は実表にしてください。

自分の所有する表を指定してください。

定義する表識別子は指定できません。

参照制約動作指定：：＝｛削除動作〔更新動作〕｜更新動作〔削除動作〕｝

主キーの更新，削除に同期して行われる外部キーに対する動作を指定します。

削除動作：：＝ON DELETE 参照動作

被参照表の行を削除したときの動作を指定します。

更新動作：：＝ON UPDATE 参照動作

被参照表の行を更新したときの動作を指定します。

参照動作

CASCADE

データの整合性を保つため，主キーに対する操作を外部キーに伝える場合に指定します。

被参照表に対する操作，及びそれに伴う参照表への影響を次の表に示します。

表3‒29　CASCADE指定時の被参照表に対する操作，及びそれに伴う参照表への影響

外部キー構成列が参照する被参照表の主キー構成列に対する操作

外部キー構成列の行と外部キーが参照する被参照表の行の関係

参照表に対する影響

削除（DELETE）

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

行削除

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

影響しない

更新（UPDATE）

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

主キーと等しい値で更新

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

影響しない

RESTRICT

主キーに対する操作が外部キーに影響を与えるかどうかチェックして，データの整合性を維持するように操作を制約する場合に指定します。

被参照表に対する操作を次の表に示します。

表3‒30　RESTRICT指定時の被参照表に対する操作

外部キー構成列が参照する被参照表の主キー構成列に対する操作

外部キー構成列の行と外部キーが参照する被参照表の行の関係

操作結果

削除（DELETE）

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

×

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

○

更新（UPDATE）

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

×

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

○

（凡例）

○：被参照表に対する操作ができます。

×：制約違反エラーとなります。

参照制約動作自体を省略した場合は，ON DELETE RESTRICT ON UPDATE RESTRICTを仮定します。

削除指定を省略した場合はON DELETE RESTRICT，更新指定を省略した場合はON UPDATE RESTRICTを仮定します。

参照制約動作にCASCADEを指定した場合，HiRDBが制約操作を行うためのトリガを生成します。

作成するトリガの名称を次の表に示します。なお，トリガの名称の長さは共に21バイトです。

表3‒31　HiRDBが作成するトリガの名称

参照制約動作

トリガ名称

削除動作

（DRAyyyymmddhhmmssth）

更新動作

（URAyyyymmddhhmmssth）

注　yyyymmddhhmmssthは，トリガ生成時のタイムスタンプです（100分の1秒単位までの情報を持ちます）。参照動作がCASCADEの参照制約を指定した表を連続して定義すると，作成するトリガの名称が同じ名称になり，KFPA11803-Eエラーが発生することがあります。この場合は，エラーが発生した表定義を再度実行してください。

また，トリガのSQLコンパイルオプションは，トリガ定義でSQLコンパイルオプションを省略した場合の値と同じです。省略時の値については「CREATE TRIGGER（トリガ定義）」を参照してください。

外部キーが複数指定された場合は，次に示す順序で制約が行われます。

CASCADE

RESTRICT

CASCADEを複数指定した場合，表に指定した順にCASCADEの制約を行います。

RESTRICTを複数指定した場合，最適な制約チェックができるように，HiRDBが制約を行う順序を決定し，その順序で制約を行います。

(ab)　制約名定義：：＝CONSTRAINT 制約名

指定した制約に対して，制約名を定義する場合に指定します。

制約名

スキーマ内で同一制約名は指定できません。

制約名を省略した場合，HiRDBが制約名を仮定します。

HiRDBが仮定する制約名を次の表に示します。

表3‒32　制約名省略時にHiRDBが仮定する制約名

種類

制約名

備考

参照制約

単一列

参照制約定義

制約を指定する列名

なし

複数列

参照制約定義

外部キーに指定した最初の列名

なし

検査制約

CK_表番号_yyyymmddhhmmssth

30文字固定（表番号10文字，時刻16文字）

注　yyyymmddhhmmssthは，制約定義時のタイムスタンプです（100分の1秒単位までの情報を持ちます）。

表番号は，10文字で右詰め，先頭から0が埋められた値です。

ユーザが制約名を指定する場合は，重複する可能性があるため，上記のような形式の制約名は指定しないでください。

(ac)　WITH PROGRAM

外部キーを定義する場合，該当する手続き，及びトリガの有効なSQLオブジェクトを無効にする場合に指定します。外部キーを定義しない場合，WITH PROGRAMの指定は無視します。無効になるオブジェクトを次の表に示します。

表3‒33　無効になるオブジェクト

作成バージョン

オブジェクトの内容

オブジェクトの種類

無効になる条件

07-00以降

手続き，及びトリガのオブジェクト

REFERENCESで指定した表を使用したUPDATE文，又はDELETE文を含む場合

07-00より前

REFERENCESで指定した表を使用したSQL文を含む場合

(5)　共通規則

表は，順序数生成子と合わせて一つのRDエリアに最大500個定義できます。

クラスタキーを定義した列は更新できません。

ただし，クラスタキーを定義した列に，定義長256バイト以上の可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の列を含む場合は更新できます。クラスタキーを更新すると，更新した行はクラスタリング効果がなくなる可能性があります。

クラスタキーを定義した列にナル値は挿入できません。

クラスタキーを定義した列は更新できません。

指定するLOB列格納用RDエリア，又はLOB属性格納用RDエリアには，既にほかのBLOB列，又はBLOB属性に割り当てられているRDエリアは指定できません。

同じ列構成に対してCLUSTER KEY句とPRIMARY KEY句は指定できません。同じ列構成にクラスタキーと主キーを定義したい場合は，PRIMARY CLUSTER KEY句を指定してください。この場合の同じ列構成とは，次の条件をすべて満たすものをいいます。

CLUSTER KEY句とPRIMARY KEY句に指定した列名の並び，及び指定した列数が一致している。

昇順，降順の指定がすべて一致しているか，又はすべて逆になっている。

表格納用RDエリア，LOB列格納用RDエリア，LOB属性格納用RDエリア，及びインデクス格納用RDエリアに，インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合，RDエリア名にはオリジナルRDエリア名を指定します。

インナレプリカ機能を使用している場合のCREATE TABLEの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

次の表に対して，HiRDB Dataextractor，及びHiRDB Datareplicatorを使用したデータ反映はしないでください。

改竄防止表

非ナル値制約を指定し，かつSYSTEM GENERATEDを指定した列がある表

クラスタキー又は主キーを定義すると，定義されるインデクスのインデクス識別子は次の表に示す規則で決定されます。

表3‒34　定義されるインデクス識別子

指定項目

インデクス識別子

CLUSTER

（CLUSTER表番号）

PRIMARY

（PRIMARY表番号）

PRIMARY CLUSTER

（PRI−CLS表番号）

注

表番号の部分は10文字の右詰めで，先頭から0が埋められた値になります。

合計で19文字（このうち9文字は上記に示した括弧と文字）の固定値が指定されます。

一時表を定義する場合，格納用RDエリアは指定できません。

列は一つの表に最大30,000個定義できます。

また，列の長さ（データ長）の合計が，次の式を満たす必要があります。各列の長さ（データ長）を次の表に示します。

FIX指定のない表（表操作時）

FIX指定のある表（表定義時）

表3‒35　既定義型データ長一覧

分類

データ型及び条件

データ長（単位：バイト）

数値データ

INTEGER

4

SMALLINT

2

LARGE DECIMAL(m,n)※1

↓m÷2↓

＋1※2

FLOAT又はDOUBLE PRECISION

8

SMALLFLT又はREAL

4

文字データ

CHARACTER(n)

n※3

VARCHAR(n)

d≦255

繰返し列の要素

d＋2

上記以外

d＋1

d≧256

6

VARCHAR(n)

ノースプリットオプション指定あり

n≦255

抽象データ型の属性

d＋3

繰返し列の要素

d＋2

上記以外

d＋1

n≧256

6

各国文字データ

NCHAR(n)又はNATIONAL CHARACTER(n)

2×n ※4

NVARCHAR(n)

d≦127

繰返し列の要素

2×d＋2

上記以外

2×d＋1

d≧128

6

NVARCHAR(n)

ノースプリットオプション指定あり

n≦127

抽象データ型の属性

2×d＋3

繰返し列の要素

2×d＋2

上記以外

2×d＋1

n≧128

6

混在文字データ

MCHAR(n)

n※3

MVARCHAR(n)

d≦255

繰返し列の要素

d＋2

上記以外

d＋1

d≧256

6

MVARCHAR(n)

ノースプリットオプション指定あり

n≦255

抽象データ型の属性

d＋3

繰返し列の要素

d＋2

それ以外

d＋1

n≧256

6

日付データ

DATE

4

時刻データ

TIME

3

時刻印データ

TIMESTAMP(n)

7＋（n÷2）

日間隔データ

INTERVAL YEAR TO DAY

5

時間隔データ

INTERVAL HOUR TO SECOND

4

長大データ

BLOB

9

バイナリデータ

BINARY(n)

n≦255

d＋3

n≧256

15

（凡例）

d：実際のデータ長（文字数）

m，n：正の整数

注※1

全体のけた数がmけたで，小数点以下のけた数がnけたの固定小数点数です。mを省略した場合は15を仮定します。

注※2

表定義時に表オプションにSUPPRESS DECIMALを指定した場合，データ長は「↓k÷2↓＋2」になります。kは，格納時の有効けた数（先頭の0の部分を除いたけた数）を示します。なお，次に示す場合はSUPPRESS DECIMALを使用しないでください。計算式中のaは，SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の，表中の列のデータ長の合計値です。

32717＜（a＋表中の列数×2＋8）

注※3

列データ抑制指定をして，データ抑制された場合，nは「n−b＋4」になります。なお，データ抑制は，列データ抑制指定時，列データの最後の文字が空白の場合，その最後の文字と連続している半角の空白が4文字以上あるときだけ実行されます。bは，列データの最後の文字と連続している空白の数を示します。

ただし，列データ抑制指定をして，データ抑制されなかった場合は，列ごとに1バイトの付加情報が追加されます。

なお，次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは，SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の，表中の列のデータ長の合計値です。

32717＜（a＋表中の列数×2＋8）

注※4

列データ抑制指定をして，データ抑制された場合，2×nは「2×n−2×b＋5」になります。なお，データ抑制は，列データ抑制指定時，列データの最後の文字が空白の場合，その最後の文字と連続している全角の空白が3文字以上あるときだけ実行されます。bは，列データの最後の文字と連続している空白の数を示します。

ただし，列データ抑制指定をして，データ抑制されなかった場合は，列ごとに1バイトの付加情報が追加されます。

なお，次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは，SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の，表中の列のデータ長の合計値です。

32717＜（a＋表中の列数×2＋8）

(6)　参照制約に関する規則

同じ外部キー構成列（並びが同じでなくてもよい）の外部キーから，同じ被参照表を参照することはできません。

WITHOUT ROLLBACKを指定して定義した表には外部キーを指定できません。

WITHOUT ROLLBACKを指定して定義した表に主キーがある場合，その主キーを参照する外部キーを定義できません。

共用表には外部キーを指定できません。

改竄防止表には外部キーを指定できません。

外部キーは一つの表に最大255個定義できます。

一つの主キーには最大255個外部キーが定義できます。

外部キーの文字集合と，その外部キーから参照される表の主キーの文字集合は同じにしてください。

一時表には外部キーを指定できません。

被参照表が一時表である参照表には，外部キーを指定できません。

(7)　検査制約に関する規則

表中に定義できる検査制約は最大254個です。一つの表で検査制約中で指定した論理演算子の数（CASE式のWHEN探索条件中のAND，ORを除く，AND及びORの数）と検査制約の数の合計（検査制約制限値と呼ぶ）も最大254個です。

複数の条件を指定する場合は，複数の条件をまとめて一つの検査制約を定義しないで，複数に分けて検査制約を定義することを推奨します。これによって，制約違反となった場合に，違反となった条件を制約名から容易に判別できます。

改竄防止表には検査制約定義を指定できません。

検査制約の探索条件にBLOB型を指定する場合，又は定義長が32,001バイト以上のBINARY型の列を指定する場合，次のSQLを実行できません。

検査制約の探索条件に指定したBLOB型，又は定義長が32,001バイト以上のBINARY型の列に対するUPDATE文での連結演算による更新

一時表には検査制約を定義できません。

(8)　留意事項

CREATE TABLEは，OLTP下のX/Openに従ったUAPから指定できません。

表の未使用領域の比率，及びセグメント内空きページ比率の両方に0%を指定する場合，PCTFREE＝（0，0）を指定してください。

行単位インタフェースを使用して，日付データをCHAR（10）で受け渡しする場合は，日付けデータ型を使用しないで，CHAR（10）で列を定義してください。

行単位インタフェースを使用して，時刻データをCHAR（8）で受け渡しする場合は，時刻データ型を使用しないで，CHAR（8）で列を定義してください。

行単位インタフェースを使用して，時刻印データを19，22，24，又は26バイトのCHARで受け渡しをする場合，時刻印データ型を使用しないで19，22，24，又は26バイトのCHARで列を指定してください。

改竄防止表を定義する場合，表格納用RDエリアには改竄防止表だけを格納することをお勧めします。改竄防止表に対するpdrorgが異常終了した場合，再編成が完了するまでそのRDエリアは閉塞が解除できません。そのため，改竄防止表が格納されているRDエリアにほかの表，及びインデクスがあると，それらも使用できなくなります。

参照動作にCASCADEを指定した参照表に対して表定義変更などを行った場合，HiRDBが生成した制約操作を行うためのトリガが無効になる場合があります。次にトリガが無効になる条件を示します。

参照制約動作指定がON UPDATE CASCADEの場合に生成するトリガが，無効となる条件

・参照表に対して表定義変更（列に対するSPLITの変更，列に対する既定値の変更）を行った場合

・参照表に対してインデクスを定義した場合

・参照表のインデクスを削除した場合

・参照表に対して，トリガ契機がUPDATEのトリガを定義した場合

・参照表に定義したトリガ契機がUPDATEのトリガを削除した場合

・参照表が参照する被参照表の主キー構成列に対して，表定義変更を行った場合

参照制約動作指定がON DELETE CASCADEの場合に生成するトリガが，無効となる条件

・参照表に対して表定義変更（列に対するSPLITの変更，列に対する既定値の変更）を行った場合

・参照表に対してインデクスを定義した場合

・参照表のインデクスを削除した場合

・参照表に対して，トリガ契機がDELETEのトリガを定義した場合

・参照表に定義したトリガ契機がDELETEのトリガを削除した場合

無効になったトリガは，ALTER ROUTINEを使用して再作成してください。

参照動作としてON UPDATE CASCADEを指定した参照制約を複数指定する場合は，被参照表に同一表名を指定しないでください。

ただし，以下に示す条件をすべて満たす場合を除きます。

該当する複数の参照指定の外部キー構成列が重複していない。

該当する複数の参照指定の外部キー構成列に関連する検査制約，参照制約を定義していない。

(9)　使用例

在庫表（ZAIKO）を定義します。

  CREATE TABLE ZAIKO
      (SCODE CHAR(4),SNAME NCHAR(8),
      COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)

在庫表（ZAIKO）を次に示す条件で定義します。

FIX表にします。

表データはユーザ用RDエリア（RDA1）に格納します。

在庫表はクラスタキーのないFIX表のため，未使用領域の比率，及びセグメント内の空きページ比率を0%に指定します。

  CREATE FIX TABLE ZAIKO
     (SCODE CHAR(4),SNAME NCHAR(8),
     COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
   IN RDA1
   PCTFREE=(0,0)

在庫表（ZAIKO）を次に示す条件で定義します。

商品コード（SCODE）列を一意性制約のあるクラスタキーとして定義します。

表データ，及びインデクスをそれぞれ三つのRDエリアに分割して格納します。格納条件は次のとおりとします。

格納条件

格納するRDエリア

表データ

インデクス

101M ≦ SCODE ≦ 202M

RDA1

RDA4

302S ≦ SCODE ≦ 412M

RDA2

RDA5

591L ≦ SCODE ≦ 591S

RDA3

RDA6

  CREATE TABLE ZAIKO
      (SCODE CHAR(4)
          UNIQUE CLUSTER KEY ASC
          IN ((RDA4),(RDA5),(RDA6)),
      SNAME NCHAR(8),
      COL   NCHAR(1),
      TANKA INTEGER,
      ZSURYO INTEGER)
    IN ((RDA1)SCODE<='202M',
        (RDA2)SCODE<='412M',
        (RDA3))

在庫表（ZAIKO）を次に示す条件で定義します。

商品名（SNAME）列，及び色（COL）列をクラスタキーとして定義します。

クラスタキーのインデクスは，商品名の昇順，色の降順にします。

表データは，ユーザ用RDエリア（RDA1）に格納します。

インデクスは，ユーザ用RDエリア（RDA2）に格納します。

  CREATE TABLE ZAIKO
      (SCODE CHAR(4),SNAME NCHAR(8),
      COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
   IN RDA1
   CLUSTER KEY (SNAME ASC,COL DESC) IN RDA2

抽象データ型t_従業員を含む社員表を定義します。

  CREATE TABLE 社員表
      (社員No INTEGER NOT NULL,
       文書データ BLOB (6000) IN ((LRDA1),(LRDA2)),
       従業員 t_従業員 ALLOCATE(顔写真
         IN ((LRDA03),(LRDA04))))
         IN ((RDA1)社員No<=700000,(RDA2))

受注表（JUTYU）を，次の条件で定義します。

改竄防止表とする。

行削除禁止期間を10年とする。

挿入履歴保持列として，JINSERTDATE列を定義する。

  CREATE TABLE JUTYU
      (DNO CHAR(6),TCODE CHAR(5),SCODE CHAR(4),
       JSURYO INTEGER,JDATE DATE,JTIME TIME,
       JINSERTDATE DATE NOT NULL WITH DEFAULT SYSTEM GENERATED)
   INSERT ONLY WHILE 10 YEARS BY JINSERTDATE

在庫表（ZAIKO）を次に示す条件で定義します。

マトリクス分割表として，6個のユーザ用RDエリアに分割して格納します。

格納条件を次に示します。

格納条件

格納するRDエリア

SCODE≦202M AND TANKA≦5000

RDA1

SCODE≦202M AND TANKA＞5000

RDA2

202M＜SCODE≦412M AND TANKA≦5000

RDA3

202M＜SCODE≦412M AND TANKA＞5000

RDA4

SCODE＞412M AND TANKA≦5000

RDA5

SCODE＞412M AND TANKA＞5000

RDA6

  CREATE TABLE ZAIKO
      (SCODE CHAR(4) NOT NULL,
       TANKA INTEGER NOT NULL)
    PARTITIONED BY MULTIDIM (SCODE(('202M'),('412M')),
                             TANKA((5000)))
    IN ((RDA1,RDA2),(RDA3,RDA4),(RDA5,RDA6))

在庫表（ZAIKO）を次に示す条件で定義します。

商品コード（SCODE）列にサイズがS，M，L以外の商品で挿入・更新できないように検査制約を定義します。

  CREATE TABLE ZAIKO
      (SCODE CHAR(4) CONSTRAINT CHECK_SIZE
CHECK(SCODE LIKE '%S' OR SCODE LIKE '%M' OR SCODE LIKE '%L'),
SNAME NCHAR(8),
      COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)

単一の列に参照制約を定義します。

部名表の行を削除した場合，名前表に対応する行も削除します。

被参照表（部名表（DEPT1））を定義し，主キーを部コード（DNO）列にします。
  CREATE TABLE DEPT1
      (DNO CHAR(3) PRIMARY KEY,DNAME NVARCHAR(20),MGR CHAR(8))

参照表（氏名表（EMP1））を定義し，外部キーを部コード（DNO）列にします。
　CREATE TABLE EMP1
　　　(ENO CHAR(8),ENAME NVARCHAR(25),
　　　 DNO CHAR(3)
           CONSTRAINT EMP1_K REFERENCES DEPT1 ON DELETE CASCADE)

複数の列に参照制約を定義します。

課名表の行を削除した場合，名前表の行に，削除する課名表の行と同じ値がある場合，課名表の削除を抑止します。また，課名表の行を更新する場合，名前表の行に，更新する課名表の行と同じ値がある場合，課名表の更新を抑止します。

被参照表（課名表（DEPT2））を定義し，主キーを部コード（DNO）列，課コード（SNO）列にします。
  CREATE TABLE DEPT2
      (DNO CHAR(3),SNO CHAR(3),SNAME CHAR(20),CHIEF CHAR(8),
      PRIMARY KEY(DNO,SNO))

参照表（氏名表（EMP2））を定義し，外部キーを部コード（DNO）列，課コード（SNO）列にします。
　CREATE TABLE EMP2
　　　(ENO CHAR(8),ENAME CHAR(25),DNO CHAR(3),SNO CHAR(3),
　　　CONSTRAINT EMP2_K FOREIGN KEY(DNO,SNO) REFERENCES DEPT2)

3.18　CREATE TRIGGER（トリガ定義）

3.18.1　CREATE TRIGGERの形式と規則

(1)　機能

指定した表への操作（INSERT文，UPDATE文，及びDELETE文）を契機に，自動的にSQLを実行する動作（トリガ）を定義します。

(2)　使用権限

自分が所有する表に対してトリガを定義できます。

(3)　形式

　CREATE TRIGGER 〔認可識別子.〕トリガ識別子
　　　　トリガ動作時期
　　　　トリガ契機
　　　　ON 〔認可識別子.〕表識別子
　　　　〔REFERENCING 新旧値別名リスト〕
　　　　トリガ動作
　　　　〔SQLコンパイルオプション〔SQLコンパイルオプション〕…〕
　　　　〔WITH PROGRAM〕

　トリガ動作時期：：＝｛BEFORE｜AFTER｝
　トリガ契機：：＝｛INSERT｜DELETE｜UPDATE〔OF 列名〔，列名〕…〕｝
　新旧値別名リスト：：＝新旧値別名〔新旧値別名〕
　新旧値別名：：＝｛OLD 〔ROW〕 〔AS〕 旧値相関名
　　　　　　　　　　｜NEW 〔ROW〕 〔AS〕 新値相関名｝
　旧値相関名，新値相関名：：＝相関名
　トリガ動作：：＝〔｛FOR EACH ROW｜FOR EACH STATEMENT｝〕
　　　　　　　　　〔WHEN （探索条件）〕
　　　　　　　　　トリガSQL文
　トリガSQL文：：＝SQL手続き文
　SQLコンパイルオプション：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　　　　　　　　　　　　　｜OPTIMIZE LEVEL SQL最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL最適化オプション〕…
　　　　　　　　　　　　　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション
　　　　　　　　　　　　　　　　　　　　　　　　　〔，SQL拡張最適化オプション〕…
　　　　　　　　　　　　　　　　｜SUBSTR LENGTH 文字の最大長 ｝

(4)　オペランド

(a)　〔認可識別子.〕トリガ識別子

認可識別子

定義するトリガの所有者の認可識別子を指定します。省略した場合，CREATE TRIGGERを実行するユーザの認可識別子が仮定されます。

トリガ識別子

定義するトリガの名前を指定します。

(b)　トリガ動作時期：：＝｛BEFORE｜AFTER｝

BEFORE

表に対する操作の前に，トリガ動作を実行します。

BEFOREを指定した場合，データを更新するSQL（INSERT文，UPDATE文，及びDELETE文），CALL文，及びデフォルトコンストラクタ関数以外の関数呼出しは，トリガSQL文中には指定できません。

トリガ動作時期にBEFOREを指定したトリガを，BEFOREトリガといいます。

AFTER

表に対する操作の後に，トリガ動作を実行します。

トリガ動作時期にAFTERを指定したトリガを，AFTERトリガといいます。

(c)　トリガ契機：：＝｛INSERT｜DELETE｜UPDATE〔OF 列名〔，列名〕…〕｝

どのような操作をしたときにトリガを実行するかを指定します。

INSERT

表に行を挿入したときにトリガを実行します。トリガ契機にINSERTを指定したトリガをINSERTトリガといいます。

トリガ契機にINSERTを指定した場合，新旧値別名にOLD〔ROW〕〔AS〕旧値相関名は指定できません。

DELETE

表の行を削除したときにトリガを実行します。トリガ契機にDELETEを指定したトリガをDELETEトリガといいます。

トリガ契機にDELETEを指定した場合，新旧値別名にNEW〔ROW〕〔AS〕新値相関名は指定できません。

UPDATE

表の行を更新したときにトリガを実行します。トリガ契機にUPDATEを指定したトリガをUPDATEトリガといいます。

トリガ契機にUPDATEを指定した場合，トリガ動作条件を満たしていれば，更新前後で値が同じでもトリガを実行します。

OF 列名〔，列名〕…

特定の列を更新したときにトリガを実行したい場合，OF 列名〔，列名〕…を指定します。ここで指定した列を，トリガ契機列といいます。

トリガ契機列についての規則を次に示します。

列名には，トリガを定義する表の列名を指定します。

列名は重複して指定できません。

繰返し列を指定した場合，その列に対するADD句，又はDELETE句だけのUPDATE文でも，トリガを実行します。

トリガ契機列を省略した場合，対象表のすべての列名（予備列を除く）が仮定されます（トリガ定義後に追加した列も含まれます）。また，ADD句，又はDELETE句だけのUPDATE文でも，トリガを実行します。

予備列は指定できません。

(d)　〔認可識別子.〕表識別子

トリガを定義する実表の表名を指定します。

トリガは，自分の永続実表にだけ定義できます。ビュー表及び一時表に対してトリガは定義できません。

(e)　REFERENCING 新旧値別名リスト：：＝新旧値別名〔新旧値別名〕

トリガ定義中で更新前後の行を参照する場合に，別名を指定します。

新旧値別名には，OLD〔ROW〕〔AS〕旧値相関名，又はNEW〔ROW〕〔AS〕新値相関名を，それぞれ1回だけ指定できます。

(f)　新旧値別名：：＝｛OLD 〔ROW〕 〔AS〕 旧値相関名｜NEW 〔ROW〕 〔AS〕 新値相関名｝

旧値相関名：：＝相関名

新値相関名：：＝相関名

更新前，又は更新後の行に名前を付けて参照する場合に指定します。

新旧値別名についての規則を次に示します。

ROW及びASは，指定してもしなくても同じです。

旧値相関名と新値相関名には，同じ相関名は指定できません。

旧値相関名，又は新値相関名に指定した相関名の有効範囲は，トリガ定義全体になります。

BEFOREトリガで新値相関名で修飾した列を更新した場合は，その更新内容が表に反映されます。ただし，BEFOREトリガでは，次の列を新値相関名で修飾した更新はできません。更新した場合は実行時エラーとなります。

・SYSTEM GENERATEDを指定した列

また，トリガ契機がINSERTのBEFOREトリガでは，次の列を新値相関名で修飾した更新はできません。更新した場合は実行時エラーとなります。

・分割表（フレキシブルハッシュ分割表を除く）の分割キーに指定した列

BEFOREトリガの場合，新値相関名で修飾して更新するときでも，更新する前の挿入値（トリガ契機がINSERTの場合），又は更新値（トリガ契機がUPDATEの場合）は，指定した列に挿入又は更新できる値でなければなりません。例えば，非ナル値制約ありの列には，トリガ動作で更新する前の挿入値又は更新値としてNULLは指定できません。ただし，一意性制約については，トリガ動作で更新した後の値が一意性制約を満たしていれば挿入又は更新ができます。

繰返し列及び抽象データ型列は，新値相関名，及び旧値相関名で修飾して参照できません（トリガ定義中で，トリガを定義する表中の繰返し列及び抽象データ型列は参照できません）。

旧値相関名，及び新値相関名には，ROWは指定できません。

予備列は，新値相関名，及び旧値相関名で修飾して参照できません。

OLD 〔ROW〕 〔AS〕 旧値相関名

更新前の行に名前を付けて参照する場合に指定します。

旧値相関名で修飾した列が保持する値は，トリガの契機となるSQLの実行前の値です。UPDATE文の場合は更新前の値，DELETE文の場合は削除する行の列値となります。

NEW 〔ROW〕 〔AS〕 新値相関名

更新後の行に名前を付けて参照する場合に指定します。

新値相関名で修飾した列が保持する値は，トリガの契機となるSQLの実行結果の値です。UPDATE文の場合は更新後の値，INSERT文の場合は挿入値となります。ただし，トリガ中で新値相関名で修飾した列を更新した場合は，更新した値を引き継ぎます。

(g)　トリガ動作：：＝〔｛FOR EACH ROW｜FOR EACH STATEMENT｝〕〔WHEN （探索条件）〕トリガSQL文

FOR EACH ROW

トリガを，更新した行単位に実行する場合に指定します。トリガ動作にFOR EACH ROWを指定したトリガを，行単位トリガといいます。

FOR EACH ROWを指定した場合，表を1行更新するごとにトリガを実行します。

FOR EACH STATEMENT

トリガを，SQL文単位に実行する場合に指定します。トリガ動作にFOR EACH STATEMENTを指定したトリガを，文単位トリガといいます。

FOR EACH STATEMENTを指定した場合，一つのSQL文ごとにトリガを実行します。更新対象の行がない場合でもトリガを実行します。

FOR EACH STATEMENTを指定した場合，新旧値別名リストは指定できません。

探索条件

トリガ契機が発生したとき，ここに指定した条件が真になる場合にトリガSQL文を実行します。この探索条件を，トリガ動作条件といいます。

トリガ動作条件を省略した場合，指定したトリガ契機が発生すると必ずトリガSQL文を実行します。トリガ動作条件には，次のものは指定できません。

副問合せ

集合関数又はSQL/XML集合関数

ウィンドウ関数

繰返し列

埋込み変数，?パラメタ，SQL変数，及びSQLパラメタ

次のデータ型の列

・BLOB（ただし，スカラ関数LENGTH，スカラ関数POSITION，及びユーザ定義関数の関数呼出しの中では指定できます）

・最大長32,001バイト以上のBINARY（ただし，スカラ関数LENGTH，スカラ関数POSITION，及びユーザ定義関数の関数呼出しの中では指定できます）

・抽象データ型

構造化繰返し述語

プラグイン関数

結果が抽象データ型となる値式（値式中にも指定できません）

XMLコンストラクタ関数

SQL/XMLスカラ関数

予備列

トリガ動作条件中でトリガを定義する表の列を参照する場合は，新旧値相関名で修飾してください（修飾なし，又は表名での修飾は指定できません）。

トリガSQL文

SQL手続き文を指定します。SQL手続き文については，「ルーチン制御SQL」を参照してください。

トリガSQL文として指定するSQL手続き文には，次の制限があります。

トリガを定義している表の表名は指定できません。

トリガを定義している表の列を，修飾なし，又は表名で修飾して指定することはできません（新旧値別名で修飾した列は指定できます）。列を新旧値相関名で修飾した場合，トリガSQL文中でこの列指定を指定できる箇所は，SQL文中でSQLパラメタを指定できる箇所と同じになります。SQLパラメタを指定できる箇所については，「埋込み変数，標識変数，?パラメタ，SQLパラメタ，及びSQL変数」を参照してください。ただし，LIMIT句にはこの列指定は指定できません。

ROLLBACK文，COMMIT文，及びPURGE TABLE文は指定できません。また，CALL文でこれらを指定した手続きが呼び出された場合は，実行時エラーとなります。

JAVAストアドプロシジャ，及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。また，CALL文でJAVAストアドプロシジャを指定した手続きが呼び出された場合は，実行時エラーとなります。

トリガSQL文中で，新値相関名，又は旧値相関名で修飾して指定する列の個数は30,000以下にしてください。

(h)　SQLコンパイルオプション

：：＝｛ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕
　　　　｜OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…
　　　　｜ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…
　　　　｜SUBSTR LENGTH 文字の最大長 ｝

SQLコンパイルオプションには ISOLATION，OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL，SUBSTR LENGTHをそれぞれ1回しか指定できません。

〔ISOLATION データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕〕

SQLのデータ保証レベルを指定します。

データ保証レベル

データ保証レベルとは，トランザクションのどの時点までデータの内容を保証するかのレベルをいいます。次に示すデータ保証レベルを指定できます。

0

データの内容を保証しない場合に指定します。0レベルを指定すると，ほかのユーザが更新中のデータでも，更新完了を待たないで参照できます。ただし，参照する表が共用表の場合，ほかのユーザが排他モードでLOCK文を実行しているときには，排他解除待ちとなります。

1

検索処理の終了までデータの内容を保証したい場合に指定します。1レベルを指定すると，検索処理が終了するまで（HiRDBがページ，又は行を見終わるまで）1度検索したデータをほかのユーザは更新できません。

2

トランザクションの終了まで1度検索したデータの内容を保証したい場合に指定します。2レベルを指定すると，トランザクションが終了するまで1度検索したデータをほかのユーザは更新できません。

〔FOR UPDATE｛EXCLUSIVE｜COMPATIBLE｝〕

トリガ中でFOR UPDATE句を指定した（FOR UPDATEが仮定される場合を含む）カーソル又は問合せに対して，SQLコンパイルオプションで指定したデータ保証レベルに関係なく，常にWITH EXCLUSIVE LOCKを仮定する場合に指定します。

このオペランドを省略した場合，EXCLUSIVEを仮定します。ただし，0904互換モードを適用している場合はCOMPATIBLEを仮定します。

バージョン09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略したトリガと同じ動作をさせたい場合はCOMPATIBLEを指定します。

バージョン09-50より前のHiRDBから，09-50以降のHiRDBにバージョンアップする場合の注意事項を次に示します。

トリガを再定義する場合で，09-50より前のHiRDBでFOR UPDATE EXCLUSIVEを省略したトリガと同じ動作をさせたい場合は，次のどちらかの対処をしてください。

・ALTER TRIGGER又はALTER ROUTINEでトリガのSQLオブジェクトを再作成してください。

・トリガを削除し，CREATE TRIGGERでトリガを再定義する場合は，COMPATIBLEを指定して再定義してください。

このオペランドと，ISOLATIONデータ保証レベルの関係から決まるFOR UPDATEの排他オプションを次に示します。

ISOLATION データ保証レベル

FOR UPDATE EXCLUSVIE

FOR UPDATE COMPATIBLE

0

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

1

WITH EXCLUSIVE LOCK

WITHOUT LOCK WAIT

2

WITH EXCLUSIVE LOCK

WITH EXCLUSIVE LOCK

《クライアント環境定義との関係》

CREATE TRIGGERに対して，PDISLLVL，PDFORUPDATEEXLOCKの指定は無効となります。

《SQLとの関係》

手続き中のSQL文に排他オプションを指定している場合はSQLコンパイルオプションで指定するデータ保証レベル，FOR UPDATE EXCLUSIVE，及びFOR UPDATE COMPATIBLEから仮定する排他オプションよりSQL文に指定した排他オプションが優先されます。

《システム定義との関係》

データ保証レベルを省略すると，pd_isolation_levelオぺランドの指定値が仮定されます。pd_isolation_levelオぺランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

データ保証レベルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔OPTIMIZE LEVEL SQL最適化オプション〔，SQL最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。

SQL最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法がありますが，通常時は識別子で指定する方法をお勧めします。

識別子で指定する場合：

OPTIMIZE LEVEL "識別子"〔，"識別子"〕…

＜指定例＞

ネストループジョイン優先とグループ分け高速化処理を適用する場合

OPTIMIZE LEVEL "PRIOR_NEST_JOIN","RAPID_GROUPING"

すべての最適化を適用しない場合

OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。ただし，同時に"NONE"以外の識別子を指定すると，"NONE"は無効になります。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

OPTIMIZE LEVEL 符号なし整数〔，符号なし整数〕…

＜指定例＞

複数のSQLオブジェクト作成，ANDの複数インデクス利用の抑止，及び複数インデクス利用の強制を適用する場合

符号なし整数をコンマで区切って指定する場合：

OPTIMIZE LEVEL 4,10,16

符号なし整数の和を指定する場合：

OPTIMIZE LEVEL 30

既に14（4+10）を指定していて，新たに16を追加する場合

OPTIMIZE LEVEL 14,16

すべての最適化を適用しない場合

OPTIMIZE LEVEL 0

＜規則＞

バージョン06-00より前のHiRDBから，バージョン06-00以降のHiRDBにバージョンアップする場合，バージョン06-00より前の合計値指定も有効となります。最適化オプションを変更する必要がない場合は，バージョン06-00以降のHiRDBにバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（，）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。ただし，同時に0以外の識別子を指定すると，0は無効になります。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

複数の最適化方法を指定する場合，その符号なし整数の和を指定することもできます。ただし，同じ最適化方法の値は二つ以上足さないでください（足した結果が別の最適化方法とみなされることもあるため）。

複数の最適化方法の値を足して指定する場合，どの最適方法を指定しているのか分かりにくくなるため，コンマで区切って指定する方法をお勧めします。また，既に複数の最適化方法の値を足して指定している場合で，新たに別の最適化方法が必要になったときは，追加する値をコンマで区切って後ろに指定できます。

《システム定義との関係》

SQL最適化オプションを省略すると，システム定義のpd_optimize_levelオぺランドの指定値が仮定されます。pd_optimize_levelオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

システム定義のpd_floatable_besオペランド，又はpd_non_floatable_besオペランドを指定している場合，「フロータブルサーバ対象拡大（データ取り出しバックエンドサーバ）」及び「フロータブルサーバ対象限定（データ取り出しバックエンドサーバ）」の指定は無効となります。

システム定義のpd_indexlock_modeオペランドにKEYを指定している場合（インデクスキー値排他の場合），「更新SQLの作業表作成抑止」の指定は無効になります。

《クライアント環境定義との関係》

CREATE TRIGGERに対して，PDSQLOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔ADD OPTIMIZE LEVEL SQL拡張最適化オプション〔，SQL拡張最適化オプション〕…〕

データベースの状態を考慮して，最も効率的なアクセスパスを決定するための最適化の方法を指定します。

SQL拡張最適化オプションの指定値及びその内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。

SQL拡張最適化オプションは，識別子（文字列）で指定する方法と，数値で指定する方法があります。

識別子で指定する場合：

ADD OPTIMIZE LEVEL "識別子"〔,"識別子"〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL "COST_BASE_2","APPLY_HASH_JOIN"

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL "NONE"

＜規則＞

識別子は一つ以上指定してください。

識別子を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，識別子に"NONE"を指定してください。

識別子は大文字及び小文字で指定できます。

同じ識別子を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ識別子は指定しないようにしてください。

数値で指定する場合：

ADD OPTIMIZE LEVEL 符号なし整数〔,符号なし整数〕…

＜指定例＞

「コストベース最適化モード2の適用」及び「ハッシュジョイン，副問合せのハッシュ実行」を適用する場合

ADD OPTIMIZE LEVEL 1,2

すべての最適化を適用しない場合

ADD OPTIMIZE LEVEL 0

＜規則＞

符号なし整数は一つ以上指定してください。

符号なし整数を二つ以上指定する場合は，コンマ（,）で区切ってください。

すべての最適化を適用しない場合は，符号なし整数に0を指定してください。

同じ符号なし整数を二つ以上指定しても，一つ指定したものとみなされますが，なるべく同じ符号なし整数は指定しないようにしてください。

《システム定義との関係》

SQL拡張最適化オプションを省略すると，システム定義のpd_additional_optimize_levelオぺランドの指定値が仮定されます。pd_additional_optimize_levelオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

CREATE TRIGGERに対して，PDADDITIONALOPTLVLの指定は無効となります。

《SQLとの関係》

SQL文中にSQL最適化指定を指定している場合は，SQL最適化オプションよりもSQL最適化指定が優先されます。SQL最適化指定については，「SQL最適化指定」を参照してください。

〔SUBSTR LENGTH 文字の最大長〕

1文字を表現する最大バイト数を指定します。

文字の最大長に指定できる値は，3〜6（pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8_ivsを指定した場合は3〜10）です。

pdntenvコマンド（UNIX版の場合はpdsetupコマンド）で文字コード種別にutf-8，又はutf-8_ivsを指定した場合にだけ有効となり，スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては，「SUBSTR」を参照してください。

《システム定義との関係》

SUBSTR LENGTHを省略すると，システム定義のpd_substr_lengthオぺランドの指定値が仮定されます。pd_substr_lengthオペランドについては，マニュアル「HiRDB Version 9 システム定義」を参照してください。

《クライアント環境定義との関係》

CREATE TRIGGERに対して，PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》

文字コード種別にutf-8，又はutf-8_ivsを指定した場合だけ有効となります。

そのほかの文字コード種別の場合は，構文チェックだけ行い，指定を無視します。

(i)　WITH PROGRAM

トリガ定義時に，そのトリガを定義する表を使用し，次のどれかの条件を満たす手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトを無効にする場合に指定します。

トリガ契機がINSERTの場合，トリガを定義する表に対して行を挿入する手続き，及びトリガ

トリガ契機がUPDATEの場合，トリガを定義する表に対して行を更新する手続き，及びトリガ

トリガ契機がDELETEの場合，トリガを定義する表に対して行を削除する手続き，及びトリガ

バージョン07-00より前のHiRDBでSQLオブジェクトを作成した関数及び手続きは，上記の条件を満たしていなくてもすべて無効にします。

(5)　共通規則

トリガを定義すると，トリガ動作手続きと呼ばれる手続きのSQLオブジェクトが作成され，データディクショナリLOB用RDエリアに格納されます。このため，トリガを定義するためには，あらかじめデータディクショナリLOB用RDエリアに十分な容量を確保しておく必要があります。データディクショナリLOB用RDエリアの容量の見積もりについては，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

トリガ動作手続きのルーチン識別子は，次のような名称となります。なお，長さは22バイトです。

'(TRIGyyyymmddhhmmssth)'

yyyymmddhhmmssth：トリガ定義時のタイムスタンプ（100分の1秒単位）

トリガ動作手続きの特定名は，〔認可識別子.〕トリガ動作手続きのルーチン識別子と同じです。トリガ動作手続きのルーチン識別子は，ディクショナリ表SQL_TRIGGERSのSPECIFIC_NAME列に格納されます。

トリガを定義するユーザは，トリガSQL文を実行するために必要な権限を保持している必要があります。トリガを定義したユーザがその権限を保持しているかどうかは，トリガの定義時及び実行時にチェックされます。

WITH PROGRAMを省略した場合，トリガを定義する表を使用し，SQLオブジェクトを変更する必要のある手続き，及びトリガの有効なSQLオブジェクトがあれば，そのトリガは定義できません。

ALTER TRIGGER又はALTER ROUTINEでSQLコンパイルオプションを指定する場合，SQLオブジェクトを再作成するトリガの元のCREATE TRIGGERに，SQLコンパイルオプションを反映してできるSQLは，SQLの最大長を超えないようにしてください。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からCREATE TRIGGERは実行できません。

(6)　トリガを引き起こすSQLを実行するときの規則

トリガは，指定したトリガ契機（INSERT文，UPDATE文，又はDELETE文）でだけ発生します。PURGE TABLE文，データベース作成ユティリティ，データベース再編成ユティリティ，及びRDエリアの再初期化などでは動作しません。

トリガの実行順序を次に示します。

トリガ動作時期，トリガ契機，及びトリガの動作単位（文単位，又は行単位）が同じトリガを複数定義している場合は，定義した順番（SQL_TRIGGERS表のCREATE_TIME列の値の順番）にトリガ動作を実行します。

トリガ実行時にエラーが発生した場合，そのトランザクションは無効となります（暗黙的ロールバックを引き起こします）。また，トリガを引き起こすSQLの実行時，1回でもトリガが実行された後でエラーが発生すると，そのエラーがトリガ実行時かどうか，又はトランザクションを無効にするかどうかに関係なく，そのトランザクションを無効にします。ただし，WITHOUT ROLLBACKを指定して定義した表については，行更新（追加，削除を含む）の処理完了後はロールバックしない場合があります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

トリガを引き起こすSQLを実行するユーザは，トリガSQL文を実行するために必要な権限を保持している必要はありません。

トリガSQL文中のSQLを契機として，ほかのトリガを実行することもできます（トリガのネスト）。ただし，ネストして動作するのは16段目のトリガまでで，16段目のトリガでほかのトリガを引き起こす操作が発生すると，エラーになります。

トリガ契機にUPDATEを指定した行単位トリガは，その更新対象の行に対して1回だけ実行されます。トリガがネストして起動し，その延長で再度同じトリガが起動する場合でも，実行されるのは最初の1回だけです。

UPDATEトリガが定義されている表に対して次の指定はできません。

新値相関名を指定したUPDATEトリガを定義した表に対する，コンポネント指定を使用した更新

UPDATEトリガを定義した表に対する，連結演算を使用したBLOB型，又は定義長が32,001バイト以上のBINARY型の更新

行単位AFTERトリガを引き起こすSQLの副問合せ中で，トリガ動作又はその延長で更新される表を参照する場合，その副問合せには外への参照を含めないようにしてください。

(7)　留意事項

CREATE TRIGGERは，OLTP下のX/Openに従ったUAPから指定できません。

トリガSQL文に更新系SQL（UPDATE文，DELETE文，又はINSERT文）を指定する場合，指定した更新系SQLの実行時に次のようなSQLエラーになることがあります。

更新系SQLを指定したFOR EACH ROWのトリガを実行するSQL中に，更新系SQLで指定した表が含まれている

更新系SQLを指定したFOR EACH ROWのトリガを実行するFOR EACH ROWのトリガ定義（複数のトリガ定義がネストする場合も含む）中に，更新系SQL中に指定した表が含まれている

このような場合は，システム定義でインデクスキー値無排他を指定するか，又はトリガ定義を変更してください。

トリガSQL文に更新系SQLを指定する場合，指定した更新系SQLの実行中にSQLの検索に影響を与えることがあります。実行中のSQLの検索に影響させないようにするためには，更新系SQLが，実行中のSQLの検索条件に合致しないように，探索条件やデータを工夫する必要があります。特に，トリガ定義が入れ子になっている場合に注意してください。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中から無効となった手続き，及びトリガに関する行は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

トリガ中のトリガSQL文のデータ保証レベル，SQL最適化オプション，SQL拡張最適化オプション，及び文字の最大長は，トリガの定義時，又は変更時の指定で決まり，トリガ動作実行時のシステム定義やクライアント環境定義の影響を受けません。

ON 〔認可識別子.〕表識別子で指定した表を基表とするビュー表に対しても，トリガ契機に指定した操作を実行すれば，トリガ動作は実行されます。

トリガのSQLオブジェクトが無効な場合，そのトリガを定義した表を使用し，次のどれかに該当するSQLを実行すると，トリガ動作条件の真偽に関係なくエラーとなります。また，トリガのSQLオブジェクトのインデクスが無効な場合は，そのトリガを定義した表を使用し，次のどれかに該当するSQLを実行すると，トリガ動作条件が真のときにエラーとなります。

トリガ契機がINSERTの場合，トリガを定義した表に対して行を挿入するINSERT文

トリガ契機がUPDATEの場合，トリガを定義した表に対して行を更新するUPDATE文

トリガ契機がDELETEの場合，トリガを定義する表に対して行を削除するDELETE文

トリガがネストしている場合，性能が劣化する場合があります。できるだけネストはしないようにしてください。

ネストするトリガを作成する場合，先頭のトリガから作成すると，ネストするトリガ作成時にエラーとなります。また，WITH PROGRAM指定をすると，ネストするトリガは作成できますが，先頭のトリガが無効状態となります。このため，ネストするトリガを作成する場合は，ネストの末端のトリガから順番に作成してください。

(8)　使用例

CREATE TRIGGERの使用例では，在庫表（ZAIKO）のほかに，在庫履歴表（RZAIKO），広島在庫表，仙台在庫表を使用します。広島在庫表と仙台在庫表は，在庫表と同じ構成です。在庫履歴表の構成は次のとおりです。

在庫表（ZAIKO）に行が挿入された後，挿入された行の情報を在庫履歴表（RZAIKO）に挿入するトリガ（INSERTTRIG1）を定義します。

  CREATE TRIGGER INSERTTRIG1
    AFTER INSERT ON ZAIKO
    REFERENCING NEW ROW X1
    FOR EACH ROW
    INSERT INTO RZAIKO
      VALUES(X1.SCODE,NULL,X1.ZSURYO,CURRENT_DATE,CURRENT_TIME)

在庫表（ZAIKO）の数量（ZSURYO）が更新された後，更新前後の値を在庫履歴表（RZAIKO）に挿入するトリガ（INSERTTRIG2）を定義します。

  CREATE TRIGGER INSERTTRIG2
    AFTER UPDATE OF ZSURYO ON ZAIKO
    REFERENCING NEW ROW X1 OLD ROW Y1
    FOR EACH ROW
    INSERT INTO RZAIKO
      VALUES(Y1.SCODE,Y1.ZSURYO,X1.ZSURYO,CURRENT_DATE,CURRENT_TIME)

在庫表（ZAIKO）から行が削除された後，削除された行の情報を在庫履歴表（RZAIKO）に挿入するトリガ（INSERTTRIG3）を定義します。

  CREATE TRIGGER INSERTTRIG3
    AFTER DELETE ON ZAIKO
    REFERENCING OLD ROW Y1
    FOR EACH ROW
    INSERT INTO RZAIKO
      VALUES(Y1.SCODE,Y1.ZSURYO,NULL,CURRENT_DATE,CURRENT_TIME)

トリガ動作にルーチン制御SQL（複合文）を使用します。在庫表（ZAIKO）が更新された後，その更新内容を広島在庫表，及び仙台在庫表に反映するトリガ（UPDATELOCAL）を定義します。なお，複合文を使用しない場合は，在庫表の更新を契機にしたトリガを二つ定義しなければなりません。

  CREATE TRIGGER UPDATELOCAL
    AFTER UPDATE OF ZSURYO ON ZAIKO
    REFERENCING NEW ROW X1 OLD ROW Y1
    BEGIN
      UPDATE 広島在庫表 SET ZSURYO=X1.ZSURYO WHERE SCODE=Y1.SCODE;
      UPDATE 仙台在庫表 SET ZSURYO=X1.ZSURYO WHERE SCODE=Y1.SCODE;
    END

トリガ動作にルーチン制御SQL（代入文）を使用します。在庫表（ZAIKO）に挿入される行に対し，商品コード（SCODE）が101M，201M，又は301Mの場合は挿入される単価（TANKA）に5,000円を加算した金額を，商品コード（SCODE）が101M，201M，又は301M以外の場合は挿入される単価を1.2倍にした金額を新しく単価に設定するトリガ（SETTANKA）を定義します。

  CREATE TRIGGER SETTANKA
    BEFORE INSERT ON ZAIKO
    REFERENCING NEW ROW AS X1
    FOR EACH ROW
    SET X1.TANKA=CASE X1.SCODE WHEN '101M' THEN X1.TANKA+5000
        WHEN '201M' THEN X1.TANKA+5000
        WHEN '301M' THEN X1.TANKA+5000
        ELSE X1.TANKA * 1.2
      END

トリガ動作にSQL診断文（SIGNAL文）を使用します。在庫表（ZAIKO）の行を削除する前にSIGNAL文でエラーを発生させ，在庫表からの行の削除を抑止するトリガ（SIGNALTRIG）を定義します。

  CREATE TRIGGER SIGNALTRIG
    BEFORE DELETE ON ZAIKO
    SIGNAL SQLSTATE '99001'

3.19　CREATE TYPE（型定義）

3.19.1　CREATE TYPEの形式と規則

(1)　機能

抽象データ型を定義します。

(2)　使用権限

スキーマを所有するユーザ

自分が所有する抽象データ型を定義できます。

(3)　形式

　CREATE TYPE 〔認可識別子.〕データ型識別子
　　　　　　　　　〔サブタイプ句〕
　　　　　　　　　〔デフォルトコンストラクタオプション〕
　　　　　　　　　〔メンバリスト〕

　サブタイプ句：：＝UNDER 〔認可識別子.〕データ型識別子

　デフォルトコンストラクタオプション：：＝
　　　　　　　　　　CONSTRUCTOR ｛PRIVATE｜PROTECTED｜PUBLIC｝

　メンバリスト：：＝（メンバ〔，メンバ〕…）
　　　メンバ：：＝｛属性定義｜ルーチン宣言｝
　　　　　属性定義：：＝〔隠蔽レベル〕 属性名 データ型 〔NO SPLIT〕
　　　　　隠蔽レベル：：＝｛PRIVATE｜PROTECTED｜PUBLIC｝
　　　　　ルーチン宣言：：＝〔隠蔽レベル〕 ルーチン本体
　　　　　ルーチン本体：：＝｛関数本体｜手続き本体｝

(4)　オペランド

(a)　〔認可識別子.〕データ型識別子

認可識別子

定義する抽象データ型の所有者の認可識別子を指定します。

データ型識別子

定義する抽象データ型の名称を指定します。

(b)　サブタイプ句：：＝UNDER 〔認可識別子.〕データ型識別子

サブタイプ句は，指定した抽象データ型を継承するサブタイプを定義する場合に指定します。スーパタイプとなる抽象データ型の認可識別子とデータ型識別子を指定してください。

サブタイプ句を指定すると，そのスーパタイプで定義されているすべての属性及びルーチンが，定義した抽象データ型に継承されます。

認可識別子.

スーパタイプの抽象データ型の所有者の認可識別子を指定します。

認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

データ型識別子

スーパタイプの抽象データ型を指定します。

(c)　デフォルトコンストラクタオプション：：＝CONSTRUCTOR ｛PRIVATE｜PROTECTED｜PUBLIC｝

デフォルトコンストラクタオプションは，デフォルトコンストラクタ関数の隠蔽レベルを指定します。省略した場合，PRIVATEが仮定されます。

デフォルトコンストラクタ関数は，定義した抽象データ型の名称と同一の関数名を持つ関数が定義されることになります。デフォルトコンストラクタ関数には，引数がありません。この関数では，抽象データ型のそれぞれ各属性のナル値が設定された抽象データ型の値が戻されます。

PRIVATE

PRIVATEを指定した場合，抽象データ型のデフォルトコンストラクタ関数がこの抽象データ型定義文内でだけ利用できるようになります。

PROTECTED

PROTECTEDを指定した場合，部分的に隠蔽されることになります。抽象データ型のデフォルトコンストラクタ関数が，定義される抽象データ型の中と，その抽象データ型のすべてのサブタイプの定義内でだけ利用できるようになります。

PUBLIC

PUBLICを指定した場合，抽象データ型のデフォルトコンストラクタ関数が継承に関係なく利用できるようになります。

(d)　属性定義：：＝〔隠蔽レベル〕 属性名 データ型 〔NO SPLIT〕

属性定義では，抽象データ型を構成する属性を指定します。

隠蔽レベル

隠蔽レベルは三つあります。この隠蔽レベルは，属性又は抽象データ型に対する操作を記述するルーチンに対して指定できます。省略した場合は，その定義部分より上の隠蔽レベルが仮定されます。また，最初の属性に隠蔽レベルを指定していない場合，PUBLICが仮定されます。

PRIVATE

PRIVATEを指定した場合，隠蔽されることになります。指定された属性は，その抽象データ型の定義中でだけ利用できます。

PROTECTED

PROTECTEDを指定した場合，部分的に隠蔽されることになります。指定された属性は，その抽象データ型の定義中と，その抽象データ型のすべてのサブタイプの定義内でだけ利用できます。

PUBLIC

PUBLICを指定した場合，指定された属性は継承関係に関係なく利用できるようになります。

属性名

抽象データ型の属性の名称を指定します。

データ型

抽象データ型の属性のデータ型を指定します。

指定するデータ型が抽象データ型で，認可識別子を省略した場合，省略時に仮定される認可識別子に同一名称の抽象データ型がないときは，認可識別子'MASTER'に同一名称の抽象データ型があれば，その抽象データ型を指定したものとします。

なお，次のデータ型は指定できません。

文字集合を指定したCHAR，VARCHAR

NO SPLIT

可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の実際のデータ長が256バイト以上の場合，1行を1ページに格納したいときに指定します。NO SPLITを指定すると，データベース容量を削減できる場合があります。これをノースプリットオプションといいます。

ノースプリットオプションについては，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(e)　ルーチン宣言：：＝〔隠蔽レベル〕 ルーチン本体

ルーチン本体：：＝｛関数本体｜手続き本体｝

ルーチン宣言では，データへの操作を指定するルーチンを書きます。隠蔽レベルについては，属性定義と同じです。

ルーチン本体には，関数又は手続きを書きます。関数及び手続きについては，それぞれ「CREATE 〔PUBLIC〕FUNCTION（関数定義，パブリック関数定義）」及び「CREATE 〔PUBLIC〕PROCEDURE（手続き定義，パブリック手続き定義）」を参照してください。

(5)　共通規則

ルーチンで認可識別子を指定する場合，実行ユーザの認可識別子と同じものを指定します。

関数本体及び手続き本体中で指定するCALL文の手続き，及び関数呼出しの関数は，次のものでなければなりません。

このCREATE TYPE外で，既に定義されている関数及び手続き

このルーチン宣言より前のルーチン宣言で定義されている関数及び手続き

抽象データ型の属性名は，継承関係にあるすべての抽象データ型内でユニークでなければなりません。

継承するサブタイプの世代数は，最大30,000です。

CREATE TYPEで定義する抽象データ型は，次の式を満たす必要があります。各属性の長さ（データ長）を次の表に示します。

表3‒36　データ長一覧

分類

データ型

データ長

(単位：バイト)

数データ

INTEGER（4バイト2進形式の整数）

4

SMALLINT（2バイト2進形式の整数）

2

[LARGE] DECIMAL〔m，n〕※

（パック10進形式の固定小数点数）

↓m/2↓+1

FLOAT（8バイトの浮動小数点数）

8

SMALLFLT（4バイトの浮動小数点数）

4

文字データ

CHARACTER〔n〕（nバイトの固定長文字列）

n

VARCHAR〔n〕（nバイトの可変長文字列）

35

各国文字データ

NCHAR〔n〕（n文字の固定長各国文字列）

2n

NVARCHAR〔n〕（n文字の可変長各国文字列）

35

混在文字データ

MCHAR〔n〕（nバイトの固定長混在文字列）

n

MVARCHAR〔n〕（nバイトの可変長混在文字列）

35

日付データ

DATE（日付）

4

日間隔データ

INTERVAL YEAR TO DAY（日間隔）

5

時刻データ

TIME（時刻）

3

時間隔データ

INTERVAL HOUR TO SECOND（時間隔）

4

時刻印データ

TIMESTAMP〔p〕（pけたの小数秒）（時刻印）

7+p/2

長大データ

BLOB（nバイトのバイナリ列）

35

バイナリデータ

BINARY〔n〕（nバイトのバイナリデータ列）

35

抽象データ

CREATE TYPEで定義したユーザ定義型

35

（凡例）

m，n：正の整数

p：0，2，4，又は6の整数

注※

全体のけた数がmけたで，小数点以下のけた数がnけたの固定小数点数です。mを省略すると15が仮定されます。

ALTER PROCEDURE，又はALTER ROUTINEでSQLコンパイルオプションを指定する場合，再作成するルーチンの元のCREATE TYPEにSQLコンパイルオプションを反映してできるSQL文は，SQL文の最大長を超えないようにしてください。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からCREATE TYPEは実行できません。

(6)　留意事項

CREATE TYPEは，OLTP下のX/Openに従ったUAPから指定できません。

型定義に伴うSQLオブジェクトの無効化について示します。

抽象データ型を定義する場合，その抽象データ型と同じ継承関係にある抽象データ型（最上位のデータ型の，すべてのサブタイプ）を使用する関数，手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトは無効となります。

抽象データ型を定義する場合，定義する抽象データ型と，同じデータ型が認可識別子'MASTER'である場合，認可識別子'MASTER'のデータ型を使用する関数，手続き，及びトリガの有効なSQLオブジェクトのうち，定義する抽象データ型の認可識別子のSQLオブジェクトは無効になります。また，パブリック関数及びパブリック手続きの場合，定義する抽象データ型の認可識別子と，パブリック関数及びパブリック手続きを定義した認可識別子が同じならば，そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。

関数本体を指定して関数を定義する場合のSQLオブジェクトの無効化については，「CREATE 〔PUBLIC〕FUNCTION（関数定義，パブリック関数定義）」の留意事項を参照してください。

手続き本体を指定して手続きを定義する場合のSQLオブジェクトの無効化については，「CREATE 〔PUBLIC〕PROCEDURE（手続き定義，パブリック手続き定義）」の留意事項を参照してください。

関数，手続き，及びトリガの有効なSQLオブジェクトが無効となった場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数，手続き，及びトリガの行は削除されます。

2に示した無効になる関数のうち，次のどちらかの条件を満たす関数をビュー定義で使用している場合，型定義がエラーになります。

引数のデータ型に抽象データ型を使用している

戻り値のデータ型に抽象データ型を使用している

無効となった関数，手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，関数，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

型定義に伴って無効となった関数を使用したビュー表がある場合，そのビュー表を操作するにはALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。

プラグイン開発者によって提供され，pdplgrgstコマンドによってHiRDBに登録される抽象データ型を継承した場合，その抽象データ型のサブタイプは定義できません。

3.20　CREATE 〔PUBLIC〕VIEW（ビュー定義，パブリックビュー定義）

3.20.1　CREATE VIEW（ビュー定義）

(1)　機能

ビュー表を定義します。

(2)　使用権限

導出問合せ式を使用できるユーザ

使用できる導出問合せ式を指定し，自分が所有するビュー表を定義できます。

導出問合せ式を使用できるユーザを次に示します。導出問合せ式については，「問合せ式」を参照してください。また，導出問合せ式中の問合せ指定の権限については，「問合せ指定」の使用権限を参照してください。

実表又はビュー表の所有者

実表又はビュー表に対するSELECT権限を持つユーザ

ただし，他人が所有する表へのSELECT権限を受け取ってビュー表を定義した場合，以降このビュー表からのビュー定義は自分だけできます。SELECT権限を与えたユーザはできません。

(3)　形式

　CREATE 〔READ ONLY〕 VIEW 〔認可識別子.〕表識別子
　　　　　〔（列名〔，列名〕…）〕
　　AS　導出問合せ式

　導出問合せ式：：＝　問合せ式本体
　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝

(4)　オペランド

(a)　〔READ ONLY〕

定義するビュー表を読み込み専用にする場合に指定します。

(b)　〔認可識別子.〕表識別子〔（列名〔，列名〕…）〕

認可識別子

定義するビュー表の所有者となるユーザの認可識別子を指定します。

表識別子

定義するビュー表の名前を指定します。

定義するビュー表の所有者になるユーザが既に所有している表（実表及びビュー表）の中に同じ名前を指定しないでください。

列名

ビュー表を構成する列を指定します。

列名を省略した場合，次のようになります。

導出問合せ式に集合演算を指定しない場合，問合せ指定によって指定された導出表の各列の列名（AS 列名を指定している場合は，AS句で指定した列名）が，ビュー表を構成する各列の列名になります。

導出問合せ式に集合演算を指定した場合，導出問合せ式の1番目の問合せ指定によって指定された導出表の各列の列名（AS 列名を指定している場合は，AS句で指定した列名）が，ビュー表を構成する各列の列名になります。

ただし，導出問合せ式によって指定された導出表が，列名が同じである二つ以上の列を含む，又は名前のない列を含む場合は省略できません。

列名についての規則を次に示します。

導出表の列が次に示す項目から導き出された列で，AS列名を省略した場合，その列は名前のない列になります。

・スカラ演算

・関数呼出し

・集合関数

・定数

・USER値関数

・CURRENT_DATE値関数

・CURRENT_TIME値関数

・CURRENT_TIMESTAMP値関数

・コンポネント指定

同じ列名は指定できません。列名で指定する列の数は，導出問合せ式の結果で得られる導出表の列と同じ数にしてください。

列名で指定できる列の数の最大値は30,000個です。

(c)　導出問合せ式

ビュー表の定義内容を表す導出問合せ式を指定します。導出問合せ式については「問合せ式」を参照してください。

導出問合せ式についての規則を次に示します。

ビュー定義中の導出問合せ式では，選択式に〔表指定.〕ROWは指定できません。

ビュー定義中の導出問合せ式では，直接含まれるSELECT句に添字付きの繰返し列は指定できません。

導出問合せ式に直接含まれるSELECT句に*，又は表.*を指定しても，ビュー定義後にビュー表の基表に追加した列はビュー表には追加されません。

ビュー定義の導出問合せ式中には，実表及びビュー表を指定できます。また，ビュー表を基にして新しいビュー表も定義できます。

ビュー定義の導出問合せ式中では，埋込み変数，及び?パラメタは指定できません。

ビュー定義中の導出問合せ式では，次に示す値式は指定できません。

XMLコンストラクタ関数

SQL/XMLスカラ関数

SQL/XML述語

SQL/XML集合関数

ビュー定義中の導出問合せ式に，予備列を指定できません。

(5)　共通規則

ビュー表は，読み込み専用のビュー表と更新できるビュー表に分けられます。

読み込み専用のビュー表は行の挿入，更新，削除，及びカーソル宣言でのFOR UPDATE句の指定はできません。

読み込み専用のビュー表を次に示します。

ビュー定義文で，READ ONLYを指定して定義したビュー表

ビュー定義文で，最も外側の問合せ指定に対する表の結合，SELECT DISTINCT，GROUP BY句，HAVING句，又は集合関数を含むビュー表

ビュー定義文で，最も外側の問合せ指定のSELECT句に基の表の同一列を複数指定して定義したビュー表

ビュー定義文で，最も外側の問合せ指定のSELECT句に列指定以外の値式を含むビュー表

バージョン07-02より前に定義したビュー表のうち，ビュー定義文で，最も外側の問合せ指定のFROM句に指定した表と同じ表をFROM句に指定した副問合せを含むビュー表（FROM句に指定する表がビュー表の場合，ビュー表の基となる表も含む）

注　このビュー表を更新できるビュー表にするには，そのビュー表を削除してから，定義し直してください。

ビュー定義文で，最も外側の問合せ指定のFROM句に導出表を指定して定義したビュー表

ビュー定義文で集合演算を指定して定義したビュー表

また，上記以外のビュー表（読み込み専用でないビュー表）が更新できるビュー表です。

ビュー定義の導出問合せ式中に指定した表は，そのビュー表を構成する基の表です。ビュー定義の導出問合せ式に含まれるFROM句に指定した表は，そのビュー表を導き出すための操作対象の基になる表です。

ビュー定義の導出問合せ式中の，最も外側の問合せに含まれるFROM句に指定した表が，そのビュー表に対する操作の対象の基になる表です。

更新できるビュー表の所有者は，そのビュー表の操作の対象の基になる表に対して持つ，次のアクセス権限をそのまま引き継ぎます。

SELECT権限

INSERT権限

DELETE権限

UPDATE権限

読み込み専用のビュー表の所有者は，そのビュー表の操作の対象になる表の基になる表に対して持つSELECT権限だけを引き継ぎます。

また，すべて自分が所有する表から定義したビュー表の所有者はほかのユーザに対して自分の持つアクセス権限を与えたり，取り消したりできます。

ビュー表を使用して行の追加や更新をする場合，追加する行，又は更新後の行は，ビュー表定義時に導出問合せ式中で指定した探索条件を満足してもしなくてもかまいません。ただし，ビュー表定義時に指定した探索条件を満足しない行は，そのビュー表を使用して検索，更新，及び削除はできません。

ビュー表を構成する列の属性（データ型，データ長，非ナル値制約の有無，及び最大要素数）は，ビュー定義の導出問合せ式で指定した導出表の対応する列の属性と同じになります。

ビュー定義を実行する場合，そのビュー表の基になる表をあらかじめ定義してください。

ビュー定義文は，OLTP下のX/Openに従ったUAPから指定できません。

文字列表現された日付，時刻，又は時刻印の定数，及び10進数で表現された日間隔や時間隔の定数から定義したビュー表の列は，日付データ，時刻データ，時刻印データ，日間隔データ，及び時間隔データが要求される場所で指定しても，その列のデータ型で扱い，それぞれの要求されるデータ型には変換されません。ただし，スカラ関数DATE，TIME，及びTIMESTAMPの引数に指定した場合を除きます。

(例)

  UPDATE T1 SET C1=(SELECT VC2 FROM V1 WHERE VC1='E')
  …指定できません。

（C1は日付データ型の列，VC2は日付の文字列で表現された定数から定義したVARCHAR（10）の列）

ビュー定義中の導出問合せ式では，直接含まれるSELECT句に添字付きの繰返し列は指定できません。

ビュー定義中の導出問合せ式では，最も外側の問合せ指定の選択式にCASE式を指定した場合，そのCASE式の探索条件には繰返し列を指定できません。

ビュー定義の導出問合せ式の選択式には，次の項目は指定できません。

WRITE指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

ウィンドウ関数

関数呼出しを指定して定義したビュー表を操作する場合，呼び出す候補となるユーザ定義関数は，そのビュー表の定義よりも前に定義したユーザ定義関数だけとなります。

SQLオブジェクト移行ユティリティで，32ビットモードから64ビットモードのHiRDBへ移行した場合，次に示す条件をすべて満たすビュー表は移行前後で検索結果が異なることがあります。

(1) ビュー定義の導出問合せ式にユーザ定義関数を指定して，ビュー表を定義する

(2) (1)のビュー表を定義した後，(1)の導出問合せ式に指定したユーザ定義関数に対して，呼出し候補となるユーザ定義関数を定義する

(3) (2)で定義したユーザ定義関数は，(1)の導出問合せ式に指定したユーザ定義関数よりも呼出し優先度が高い

上記の(1)〜(3)の後，SQLオブジェクト移行ユティリティで，32ビットモードから64ビットモードのHiRDBへ移行する

ユーザ定義関数の呼出し決定規則については，「呼び出す関数の決定規則と結果のデータ型」を参照してください。

(6)　使用例

在庫表（ZAIKO）から商品名（SNAME）がソックスの行で商品コード（SCODE），在庫量（ZSURYO），単価（TANKA）の列で構成されるビュー表（VZAIKO1）を定義します。なお，列の並びは，商品コード，在庫量，単価の順とします。

  CREATE VIEW VZAIKO1
      AS SELECT SCODE,ZSURYO,TANKA
      FROM ZAIKO
      WHERE SNAME = N'ソックス'

在庫表（ZAIKO）と同じ構成のビュー表（VZAIKO2）を読み込み専用として定義します。

  CREATE READ ONLY VIEW VZAIKO2
      AS SELECT * FROM ZAIKO

3.20.2　CREATE PUBLIC VIEW（パブリックビュー定義）

(1)　機能

すべてのユーザから，認可識別子で表識別子を修飾しなくても使用できるビュー表（パブリックビュー）を定義できます。

(2)　使用権限

実表の所有者

自分が所有する実表から，自分が所有するパブリックビューを定義できます。

ビュー表の所有者

自分が所有する実表が基表となるビュー表から，自分が所有するパブリックビューを定義できます。

(3)　形式

　CREATE PUBLIC〔READ ONLY〕 VIEW 表識別子
　　　　　〔（列名〔，列名〕…）〕
　　AS　導出問合せ式

　導出問合せ式：：＝　問合せ式本体
　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝

(4)　オペランド

PUBLIC，表識別子以外の説明については，「CREATE VIEW（ビュー定義）」と同じです。

(a)　PUBLIC

ビュー表をパブリックビューとして定義する場合に指定します。

パブリックビューにすると，同じ内容のビュー表をユーザごとに定義しなくても，一つのビュー表を表識別子だけを指定して複数のユーザで使用できます。

(b)　表識別子

定義するパブリックビューの名前を指定します。

既に定義してあるパブリックビューと同じ名前は指定できません。

(5)　共通規則

定義するパブリックビューの名前には，既に定義されている表（実表及びビュー表）と同じ表識別子を指定できます。ただし，認可識別子を省略して表識別子を使用する場合，UAP実行ユーザが所有している表（実表及びビュー表）がパブリックビューより優先されます。パブリックビューを明示的に修飾する場合は，認可識別子にPUBLICを指定してください。

そのほかの規則は，「CREATE VIEW（ビュー定義）」の共通規則と同じです。

(6)　留意事項

ディクショナリ表の所有者を格納する列（SQL_TABLES表のTABLE_SCHEMA列など）にはPUBLICが設定されます。また，パブリックビューを定義した認可識別子は，SQL_TABLES表のTABLE_CREATOR列に格納します。

パブリックビューを使用したSQL文に対する前処理が有効な間に，使用しているパブリックビューと同じ名前の表（実表及びビュー表）を指定した定義系SQL文を発行すると，定義系SQLは排他待ちの状態になります。

パブリックビューを使用した手続き及びトリガを定義した後で，パブリックビューと同じ名前の表（実表及びビュー表）を定義しても，該当する手続き及びトリガは無効にならないで，パブリックビューを使用した手続き及びトリガとして動作します。ただし，その手続き及びトリガを再作成した（インデクス無効状態のプロシジャをHiRDBが内部的に再作成する場合も含む）場合，パブリックビューと同じ名前の表（実表及びビュー表）を使用した手続き及びトリガとして動作します。

パブリックビューの削除は，DROP PUBLIC VIEWで行います。

(7)　使用例

在庫表（ZAIKO）から商品名（SNAME）がソックスの行で商品コード（SCODE），在庫量（ZSURYO），単価（TANKA）の列で構成されるパブリックビュー（PVZAIKO1）を定義します。なお，列の並びは，商品コード，在庫量，単価の順とします。

  CREATE PUBLIC VIEW PVZAIKO1
      AS SELECT SCODE,ZSURYO,TANKA
      FROM ZAIKO
      WHERE SNAME = N'ソックス'

3.21　DROP AUDIT（監査対象イベントの削除）

3.21.1　DROP AUDITの形式と規則

(1)　機能

CREATE AUDITで定義した監査対象イベントと内容が一致する定義を，監査対象から削除します。

(2)　使用権限

監査権限を持つユーザ

監査権限を持つユーザが，DROP AUDITの各定義文を実行できます。

(3)　形式

DROP AUDIT
　　　〔AUDITTYPE　{PRIVILEGE｜EVENT｜ANY}〕
　　　FOR  操作種別
　　　〔選択オプション〕
　　　〔WHENEVER｛SUCCESSFUL｜UNSUCCESSFUL｜ANY｝〕

各項目の詳細

操作種別：：＝ ｛ANY
　　　　　　　｜SESSION　　〔｛セッション種別｜ANY｝〕
　　　　　　　｜PRIVILEGE　〔｛権限操作種別｜ANY｝〕
　　　　　　　｜DEFINITION 〔｛オブジェクト定義イベント種別｜ANY｝〕
　　　　　　　｜ACCESS　　〔｛オブジェクト操作イベント種別｜ANY｝〕
　　　　　　　｜UTILITY　　 〔｛ユティリティイベント種別｜ANY｝〕｝
選択オプション：：＝｛ON オブジェクト名
　　　　　　　｜BY AUTHORIZATION 認可識別子｝
　　オブジェクト名：：＝
　　　　　　　　　｛FUNCTION　認可識別子.ルーチン識別子
　　　　　　　　｜INDEX　認可識別子.インデクス識別子
　　　　　　　　｜LIST　認可識別子.表識別子
　　　　　　　　｜PROCEDURE　認可識別子.ルーチン識別子
　　　　　　　　｜RDAREA　RDエリア名
　　　　　　　　｜SCHEMA　認可識別子
　　　　　　　　｜TABLE　〔認可識別子. 〕表識別子
　　　　　　　　｜TRIGGER　認可識別子.トリガ識別子
　　　　　　　　｜TYPE　認可識別子.データ型識別子
　　　　　　　　｜VIEW　認可識別子.表識別子
　　　　　　　　｜SEQUENCE　認可識別子.順序数生成子識別子｝
セッション種別：：＝
　　｛CONNECT｜DISCONNECT｜AUTHORIZATION｝
権限操作種別：：＝
　　｛GRANT｜REVOKE｝
オブジェクト定義イベント種別：：＝
　　｛CREATE｜DROP｜ALTER｝
オブジェクト操作イベント種別：：＝
　　｛SELECT｜INSERT｜UPDATE｜DELETE｜PURGE｜ASSIGN｜CALL｜LOCK
　　　｜NEXT VALUE｝
ユティリティイベント種別：：＝
　　｛PDLOAD｜PDRORG｜PDEXP｜PDCONSTCK｝

(4)　オペランド

それぞれの項目の詳細については，「CREATE AUDIT（監査対象イベントの定義）」を参照してください。

(a)　AUDITTYPE　{PRIVILEGE｜EVENT｜ANY}

削除する監査証跡の種別を指定します。

(b)　FOR 操作種別

監査対象から削除する操作種別を指定します。

(c)　WHENEVER ｛SUCCESSFUL｜UNSUCCESSFUL｜ANY｝

CREATE AUDITで指定した WHENEVER句の指定を，監査対象から削除します。

(d)　セッション種別

監査対象から削除する，HiRDBに対する接続，接続中のユーザ変更，又は切断操作を指定します。

(e)　権限操作種別

監査対象から削除する，HiRDBに対する権限操作を指定します。

(f)　オブジェクト定義イベント種別

監査対象から削除する，HiRDBに対するオブジェクト定義操作を指定します。

(g)　オブジェクト操作イベント種別

監査対象から削除する，HiRDBに対するオブジェクト操作を指定します。

(h)　ユティリティイベント種別

監査対象から削除する，HiRDBに対するユティリティイベントを指定します。

(i)　選択オプション

監査対象から削除する選択オプションを指定します。

(5)　規則

セキュリティ監査機能については，マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

実際に監査証跡を記録するには，システム定義pd_auditオペランドの指定，又はpdaudbeginコマンドを実行する必要があります。

CREATE AUDIT，及びDROP AUDITを実行した際の監査証跡は，セキュリティ監査機能が有効な場合は必ず記録します。

CREATE AUDIT時に指定したAUDITTYPE, FOR ＜操作種別＞, WHENEVER の組み合わせと同じ指定でDROP AUDITを実行できます。

(例)

CREATE AUDIT AUDITTYPE EVENT FOR SESSIONを削除する場合は，DROP AUDIT AUDITTYPE EVENT FOR SESSIONと指定すると削除できます。

DROP AUDITでは，定義された監査対象範囲の一部分だけを，監査対象から外すような使い方はできません。その場合，KFPA11909-Eメッセージを出力します。

（例１）

CREATE AUDIT FOR ANYで，すべての監査イベントを監査対象として定義した場合，表へのSELECTを監査対象から削除するため，DROP AUDIT FOR ACCESSにSELECTを指定して実行できません。

表へのSELECTを監査対象から削除したい場合は，表へのSELECT以外の必要な監査対象の定義を行ってから，DROP AUDIT FOR ANYを実行してください。

（例２）

CREATE AUDIT AUDITTYPE PRIVILEGE FOR ANYで，権限チェック時のすべての監査イベントを監査対象として定義した場合，AUDITTYPEのPRIVILEGEを監査対象から削除するため，DROP AUDIT AUDITTYPE PRIVILEGEを指定して実行できません。

(6)　留意事項

DROP AUDITは，OLTP下のX/Openに従ったUAPからは指定できません。

(7)　使用例

CREATE AUDIT FOR ANYで定義した監査対象を削除します。

  DROP AUDIT FOR ANY

CREATE AUDIT FOR SESSIONで定義した監査対象を削除します。

  DROP AUDIT FOR SESSION CONNECT

CREATE AUDIT FOR PRIVILEGEで定義した監査対象を削除します。

  DROP AUDIT FOR PRIVILEGE GRANT

CREATE AUDIT FOR DEFINITIONで定義した監査対象を削除します。

  DROP AUDIT FOR DEFINITION CREATE WHENEVER ANY

CREATE AUDIT FOR ACCESSで定義した監査対象を削除します。

  DROP AUDIT FOR ACCESS INSERT

CREATE AUDIT AUDITTYPE ANY FOR ANY で定義した監査対象を削除します。

  DROP AUDIT AUDITTYPE ANY FOR ANY

CREATE AUDIT AUDITTYPE PRIVILEGE FOR ANY で定義した監査対象を削除します。

  DROP AUDIT AUDITTYPE PRIVILEGE FOR ANY

CREATE AUDIT AUDITTYPE EVENT FOR ANY ON TABLE "USER1"."T1"で定義した監査対象を削除します。

  DROP AUDIT AUDITTYPE EVENT FOR ANY ON TABLE "USER1"."T1"

CREATE AUDIT AUDITTYPE ANY FOR ANY BY AUTHORIZATION "USER1"で定義した監査対象を削除します。

  DROP AUDIT AUDITTYPE ANY FOR ANY BY AUTHORIZATION "USER1"

3.22　DROP CONNECTION SECURITY （CONNECT関連セキュリティ機能の削除）

3.22.1　DROP CONNECTION SECURITYの形式と規則

(1)　機能

CONNECT関連セキュリティ機能に関するセキュリティ項目を削除します。

(2)　使用権限

DBA権限を持つユーザ

DBA権限を持つユーザが，DROP CONNECTION SECURITYの各定義文を実行できます。

(3)　形式

　DROP CONNECTION SECURITY FOR
｛セキュリティ対象〔，セキュリティ対象 〕｜CONSTRAINT 接続制約名｝

　セキュリティ対象：：＝｛ CONNECT｜PASSWORD ｝

(4)　オペランド

(a)　セキュリティ対象：：= ｛CONNECT｜PASSWORD｝

セキュリティ対象にはCONNECT，PASSWORDをそれぞれ１回しか指定できません。

CONNECT

連続認証失敗回数制限に関する設定を削除する場合に指定します。

PASSWORD

パスワード文字制限強化に関する設定を削除する場合に指定します。

(b)　CONSTRAINT 接続制約名

IPアドレスによる接続許可・拒否に関する制約を削除する場合に指定します。

(5)　留意事項

連続認証失敗回数制限に関する設定を削除した場合，全ユーザの連続認証失敗アカウントロック状態は解除されます（SQL_USERSの連続認証失敗アカウントロック日時，及び連続認証失敗回数にナル値を設定します）。

パスワード文字制限に関する設定を削除した場合，全ユーザのパスワード無効アカウントロック状態は解除されます（SQL_USERSのパスワード無効アカウントロック日時にナル値を設定します）。

定義されていないセキュリティ対象又は接続制約名を指定することはできません。

CONNECT，又はPASSWORDのどちらか一方だけを定義した状態でCONNECT，PASSWORDの両方を削除しようとした場合はエラーとなります。削除の対象に指定した定義済みの項目は削除されません。

(6)　使用例

パスワード文字制限強化に関する設定を削除します。

  DROP CONNECTION SECURITY FOR PASSWORD

IPアドレスによる接続制限に関する設定を削除する場合は，マニュアル「HiRDB Version 9 システム運用ガイド」の「IPアドレスによる接続制限」を参照してください。

3.23　DROP DATA TYPE（ユーザ定義型削除）

3.23.1　DROP DATA TYPEの形式と規則

(1)　機能

抽象データ型を削除します。

(2)　使用権限

抽象データ型の所有者

自分が所有する抽象データ型を削除できます。

DBA権限を持つユーザ

他ユーザが所有する抽象データ型を削除できます。

(3)　形式

　DROP DATA TYPE 〔認可識別子.〕データ型識別子
　　　　　　　　　　〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕データ型識別子

認可識別子

削除するデータ型識別子の所有者の認可識別子を指定します。

データ型識別子

削除するデータ型識別子を指定します。

(b)　WITH PROGRAM

抽象データ型を削除する場合，次に示す関数，手続き，及びトリガの有効なSQLオブジェクトを無効にするときに指定します。

削除する抽象データ型と同じ継承関係にある抽象データ型（最も上位のデータ型のすべてのサブタイプ）を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除する抽象データ型で定義した関数及び手続きを使用する，関数，手続き，及びトリガの有効なSQLオブジェクト

削除する抽象データ型で定義した関数と所有者，ルーチン識別子，及びパラメタ数が同じ関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

WITH PROGRAMを省略した場合，次に示す関数，手続き，及びトリガのSQLオブジェクトがあるときは，その抽象データ型は削除できません。

削除する抽象データ型と同じ継承関係にある抽象データ型を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除する抽象データ型で定義した関数及び手続きを使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除する抽象データ型で定義した関数と所有者，ルーチン識別子，及びパラメタ数が同じ関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

(5)　共通規則

指定した抽象データ型を利用している実表，インデクス，抽象データ型，抽象データ型内のルーチン，ルーチン，及びトリガがある場合は削除しません。

抽象データ型定義内で定義した関数をビュー定義で使用している場合は，その抽象データ型は削除できません。

WITH PROGRAMの指定によって無効となる関数のうち，次のどれかの条件を満たす関数をビュー定義に使用している場合，抽象データ型の削除はできません。

引数のデータ型に抽象データ型を指定している

戻り値のデータ型に抽象データ型を指定している

抽象データ型削除に伴って実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP DATA TYPEは実行できません。

(6)　留意事項

DROP DATA TYPEは，OLTP下のX/Openに従ったUAPから指定できません。

指定した抽象データ型内で抽象データ型関数が指定されている場合，プラグイン情報も削除されます。

WITH PROGRAMを指定して関数，手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数，手続き，及びトリガの行は削除されます。

WITH PROGRAMを指定して無効にした関数，手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して関数，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して無効にしたトリガのSQLオブジェクトを実行するためには，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成しておく必要があります。ただし，削除した抽象データ型定義内で定義した関数及び手続きを使用していたトリガについては，SQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

抽象データ型を定義し直して，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成する。

無効にしたトリガをDROP TRIGGERで削除してから，削除した抽象データ型定義内で定義した関数及び手続きを使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

(条件)

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

WITH PROGRAMを指定して無効にした関数を使用したビュー表がある場合，そのビュー表を操作するためには，ALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。

(7)　使用例

ユーザ（認可識別子：USER1）が定義したSGML型を削除します。

    DROP DATA TYPE USER1.SGML

3.24　DROP 〔PUBLIC〕FUNCTION（関数削除，パブリック関数削除）

3.24.1　DROP FUNCTION（関数削除）

(1)　機能

関数を削除します。

(2)　使用権限

関数の所有者

自分が所有する関数を削除できます。

DBA権限を持つユーザ

他ユーザが所有する関数を削除できます。

(3)　形式

　DROP FUNCTION 〔認可識別子.〕ルーチン識別子（〔データ型〔，データ型〕…〕）
　　　　　　　　　　〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

認可識別子

削除する関数の所有者の認可識別子を指定します。

ルーチン識別子

削除する関数の名称を指定します。

(b)　データ型

削除する関数のパラメタで指定したデータ型を指定します。削除する関数のパラメタに指定したデータ型が，固定長文字データ型又は可変長文字データ型でかつ，文字集合指定を指定している場合，その文字集合指定を指定してください。

(c)　WITH PROGRAM

関数を削除する場合，次に示す関数，手続き，及びトリガの有効なSQLオブジェクトを無効にするときに指定します。

削除する関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除する関数と所有者，ルーチン識別子，及びパラメタ数が同じ関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

WITH PROGRAMを省略した場合，次に示す関数，手続き，及びトリガのSQLオブジェクトがあるときは，その関数は削除できません。

削除する関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除する関数と所有者，ルーチン識別子，及びパラメタ数が同じ関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

(5)　共通規則

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP FUNCTIONは実行できません。

抽象データ型内で定義した関数は削除できません。

同一名の関数が複数ある場合，削除する関数を一意に特定できるようにパラメタのデータ型を指定します。

指定した関数を使用する，ビュー表（パブリックビューも含む）がある場合，関数は削除できません。

WITH PROGRAMの指定によって無効となる関数のうち，次のどれかの条件を満たす関数をビュー定義に使用している場合，その関数は削除できません。

引数のデータ型に抽象データ型を使用している

戻り値のデータ型に抽象データ型を使用している

(6)　留意事項

DROP FUNCTIONは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して関数，手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数，手続き，及びトリガの行は削除されます。

WITH PROGRAMを指定して無効にした関数，手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して関数，手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して無効にしたトリガのSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。ただし，削除した関数と所有者，ルーチン識別子，及びパラメタ数が同じ関数を使用していたトリガについては，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成してもかまいません。

関数を定義し直して，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成する。

無効にしたトリガをDROP TRIGGERで削除してから，削除した関数を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

（条件）

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

WITH PROGRAMを指定してトリガ動作条件中で使用している関数を削除した場合，無効にしたトリガのSQLオブジェクトを実行するときだけでなく，そのトリガを引き起こすSQLを前処理するときにもエラーになります。

WITH PROGRAMを指定して無効にした関数を使用したビュー表がある場合，そのビュー表を操作するためには，ALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。

3.24.2　DROP PUBLIC FUNCTION（パブリック関数削除）

(1)　機能

すべてのユーザから，認可識別子でルーチン識別子を修飾しなくても使用できる関数（パブリック関数）を削除します。

(2)　使用権限

パブリック関数の所有者

自分が所有する（定義した）パブリック関数を削除できます。

DBA権限を持つユーザ

他ユーザが所有するパブリック関数を削除できます。

(3)　形式

　DROP PUBLIC FUNCTION ルーチン識別子（〔データ型〔，データ型〕…〕）
　　　　　　　　　　〔WITH PROGRAM〕

(4)　オペランド

PUBLIC，ルーチン識別子，WITH PROGRAM以外の説明については，「DROP FUNCTION（関数削除）」を参照してください。

(a)　PUBLIC

パブリック関数を削除する場合に指定します。

(b)　ルーチン識別子

削除するパブリック関数の名称を指定します。

(c)　WITH PROGRAM

パブリック関数を削除する場合，次に示す関数，手続き，及びトリガの有効なSQLオブジェクトを無効にするときに指定します。

削除するパブリック関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除するパブリック関数と，ルーチン識別子，及びパラメタ数が同じパブリック関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

WITH PROGRAMを省略した場合，次に示す関数，手続き，及びトリガのSQLオブジェクトがあるときは，その関数は削除できません。

削除するパブリック関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

削除するパブリック関数とルーチン識別子，及びパラメタ数が同じ関数を使用する関数，手続き，及びトリガの有効なSQLオブジェクト

(5)　共通規則

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP PUBLIC FUNCTIONは実行できません。

その他の共通規則は，「DROP FUNCTION（関数削除）」と同じです。

(6)　留意事項

DROP PUBLIC FUNCTIONは，OLTP下のX/Openに従ったUAPから指定できません。

その他の留意事項は，「DROP FUNCTION（関数削除）」と同じです。

3.25　DROP INDEX（インデクス削除）

3.25.1　DROP INDEXの形式と規則

(1)　機能

インデクスを削除します。

(2)　使用権限

インデクスの所有者

ユーザ自身のインデクスを削除できます。

DBA権限を持つユーザ

他ユーザのインデクスを削除できます。

(3)　形式

　DROP INDEX 〔認可識別子.〕インデクス識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕インデクス識別子〔WITH PROGRAM〕

認可識別子

インデクスを持つユーザの識別子を指定します。

省略した場合，実行するユーザの認可識別子を仮定します。

インデクス識別子

削除するインデクス識別子を指定します。

WITH PROGRAM

インデクスを削除するときに，そのインデクスを使用する手続き及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，そのインデクスを使用する手続き及びトリガの有効なSQLオブジェクトがあると，そのインデクスは削除できません。

(5)　共通規則

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP INDEXは実行できません。

インナレプリカ機能を使用している場合のDROP INDEXの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

SQLセッション固有一時表を使用しているSQLセッション中で，使用中のSQLセッション固有一時表のインデクスは削除できません。

(6)　留意事項

DROP INDEXは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，手続き及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAM指定の有無に関係なく，削除するインデクスを定義している表に対する手続き及びトリガ（その表に定義したトリガを除く）がある場合，そのSQLオブジェクト中のインデクス情報は無効となります。この場合，このトリガは実行できなくなります。また，手続き又はトリガからこの手続きを実行できなくなるため，SQLオブジェクトを再作成する必要があります。

(7)　使用例

在庫表（ZAIKO）の商品コード（SCODE）列に定義したインデクス（IDX1）を削除します。

    DROP INDEX IDX1

3.26　DROP 〔PUBLIC〕PROCEDURE（手続き削除，パブリック手続き削除）

3.26.1　DROP PROCEDURE（手続き削除）

(1)　機能

手続きを削除します。

(2)　使用権限

手続きの所有者

自分が所有する手続きを削除できます。

DBA権限を持つユーザ

他ユーザの所有する手続きを削除できます。

(3)　形式

　DROP PROCEDURE 〔認可識別子.〕ルーチン識別子
　　　　　　　　　　　〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

認可識別子

削除する手続きの所有者の認可識別子を指定します。

省略した場合，実行するユーザの認可識別子を仮定します。

ルーチン識別子

削除する手続きのルーチンの名前を指定します。

(b)　WITH PROGRAM

手続きを削除する場合，その手続きを使用する手続き，及びトリガの有効なSQLオブジェクトがあれば，そのSQLオブジェクトを無効にするときに指定します。

WITH PROGRAMを省略した場合，その手続きを使用する手続き，及びトリガの有効なSQLオブジェクトがあるときは，その手続きは削除できません。

(5)　共通規則

指定した手続きを呼び出すSQLルーチン，及び抽象データ型内のルーチン，トリガがある場合は削除しません。

抽象データ型内で定義した手続きは削除できません。

次のような場合，Java手続き中からDROP PROCEDUREは実行できません。

実行中のSQLオブジェクトが無効になる場合，又は削除される場合

実行中のJava手続きが削除される場合

(6)　留意事項

DROP PROCEDUREは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの行は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して無効にしたトリガのSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

手続きを定義し直して，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成する。

無効にしたトリガをDROP TRIGGERで削除してから，削除した手続きを使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

（条件）

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

ルーチン識別子には，トリガ動作手続きの識別子は指定できません。トリガを削除する場合には，DROP TRIGGERを実行してください。

3.26.2　DROP PUBLIC PROCEDURE（パブリック手続き削除）

(1)　機能

すべてのユーザから，認可識別子でルーチン識別子を修飾しなくても使用できる手続き（パブリック手続き）を削除します。

(2)　使用権限

手続きの所有者

自分が所有する（定義した）パブリック手続きを削除できます。

DBA権限を持つユーザ

他ユーザの所有するパブリック手続きを削除できます。

(3)　形式

　DROP PUBLIC PROCEDURE ルーチン識別子
　　　　　　　　　　　〔WITH PROGRAM〕

(4)　オペランド

PUBLIC，ルーチン識別子以外の説明については，「DROP PROCEDURE（手続き削除）」を参照してください。

(a)　PUBLIC

パブリック手続きを削除する場合に指定します。

(b)　ルーチン識別子

削除するパブリック手続きのルーチンの名前を指定します。

(5)　共通規則

次のような場合，Java手続き中からDROP PUBLIC PROCEDUREは実行できません。

実行中のSQLオブジェクトが無効になる場合，又は削除される場合

実行中のJava手続きが削除される場合

その他の共通規則は，「DROP PROCEDURE（手続き削除）」と同じです。

(6)　留意事項

DROP PUBLIC PROCEDUREは，OLTP下のX/Openに従ったUAPから指定できません。

その他の留意事項は，「DROP PROCEDURE（手続き削除）」と同じです。

3.27　DROP SCHEMA（スキーマ削除）

3.27.1　DROP SCHEMAの形式と規則

(1)　機能

スキーマ定義で定義したスキーマを削除します。

(2)　使用権限

スキーマの所有者

ユーザ自身のスキーマを削除できます。

DBA権限を持つユーザ

他ユーザのスキーマを削除できます。

(3)　形式

　DROP SCHEMA AUTHORIZATION 認可識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　認可識別子〔WITH PROGRAM〕

認可識別子

スキーマの所有者の認可識別子を指定します。

WITH PROGRAM

スキーマを削除するときに，指定したスキーマ内の実表，ビュー表，インデクス，抽象データ型，ルーチン，トリガ，及び順序数生成子を使用する，関数，手続き，及びトリガの有効な他ユーザのSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，スキーマ内の実表，ビュー表，インデクス，抽象データ型，手続き，トリガ，及び順序数生成子を使用する，関数，手続き，及びトリガの有効な他ユーザのSQLオブジェクトがあると，そのスキーマは削除できません。

(5)　共通規則

指定した認可識別子のスキーマ内のすべての実表，ビュー表（パブリックビューも含む），インデクス，コメント，アクセス権限，ルーチン（DROP SCHEMAで指定した認可識別子が定義したパブリック手続き，パブリック関数を含む），トリガ，抽象データ型，インデクス型，及び順序数生成子が削除されます。

WITH PROGRAMを指定しても，指定したスキーマ内の抽象データ型，関数，手続き，トリガ，及び順序数生成子を使用する，関数，手続き，トリガ，及び順序数生成子の有効な他ユーザのSQLオブジェクトがあると，そのスキーマは削除できません。

指定したスキーマ内の関数を使用する，他ユーザのビュー表，又は他ユーザが定義したパブリックビューがある場合，そのスキーマは削除できません。

スキーマ内の抽象データ型を使用する，他ユーザの表又はインデクスがある場合，そのスキーマは削除できません。

次のような場合，Java手続き中からDROP SCHEMAは実行できません。

実行中のSQLオブジェクトが無効になる場合，又は削除される場合

実行中のJava手続きが削除される場合

インナレプリカ機能を使用している場合のDROP SCHEMAの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

指定したスキーマ内に改竄防止表があり，かつその改竄防止表に行がある場合，そのスキーマは削除できません。

DBA権限を持つユーザは監査人のスキーマを削除できますが，監査人のスキーマ内に監査証跡表がある場合は監査人のスキーマを削除できません。

SQLセッション固有一時表を使用しているSQLセッション中で，使用中のSQLセッション固有一時表を含むスキーマは削除できません。

(6)　留意事項

DROP SCHEMAは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して関数，手続き，トリガ，及び順序数生成子の有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数，手続き，トリガ，及び順序数生成子の情報は削除されます。

WITH PROGRAMを指定して無効にした関数，手続き，トリガ，及び順序数生成子の有効なSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して，関数，手続き，トリガ，及び順序数生成子の有効なSQLオブジェクトを再作成しておく必要があります。

(7)　使用例

ユーザ（認可識別子：USER1）が持っているスキーマを削除します。

    DROP SCHEMA
        AUTHORIZATION USER1

3.28　DROP SEQUENCE（順序数生成子削除）

3.28.1　DROP SEQUENCEの形式と規則

(1)　機能

順序数生成子を削除します。

(2)　使用権限

指定する順序数生成子の所有者

自分が所有する順序数生成子を削除できます。

DBA権限を持つユーザ

自分が所有する順序数生成子，及び他ユーザが所有する順序数生成子を削除できます。

(3)　形式

　DROP SEQUENCE 〔認可識別子.〕順序数生成子識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕順序数生成子識別子

認可識別子

順序数生成子を所有するユーザの認可識別子を指定します。

省略した場合，実行するユーザの認可識別子を仮定します。

順序数生成子識別子

削除する順序数生成子の名称を指定します。

WITH PROGRAM

順序数生成子を削除するときに，順序数生成子を使用する手続き，及びトリガの有効な他ユーザのSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，順序数生成子を使用する手続き，及びトリガの有効な他ユーザのSQLオブジェクトがあると，その順序数生成子は削除できません。

(5)　共通規則

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP SEQUENCEは実行できません。

(6)　留意事項

DROP SEQUENCEは，OLTP下のX/Openに従ったUAPからは指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

(7)　使用例

順序数生成子（SEQ1）を削除します。

    DROP SEQUENCE SEQ1

3.29　DROP TABLE（表削除）

3.29.1　DROP TABLEの形式と規則

(1)　機能

表を削除します。

(2)　使用権限

指定する表の所有者

自分が所有する表を削除できます。

DBA権限を持つユーザ

他ユーザの所有する表を削除できます。

(3)　形式

　DROP TABLE 〔認可識別子.〕表識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子〔WITH PROGRAM〕

認可識別子

表を所有するユーザの認可識別子を指定します。

省略した場合，実行するユーザの認可識別子を仮定します。

表識別子

削除する表の名称を指定します。

WITH PROGRAM

表を削除する場合，その表をSQL手続き文で使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，表を使用する手続き，及びトリガの有効なSQLオブジェクト（削除する表が参照する被参照表に，内部的に定義されている参照制約動作を行うためのトリガを除きます）があると，その表は削除できません。

参照表を削除した場合，次の表に示す手続き，及びトリガの有効なSQLオブジェクトを無効にします。

表3‒37　無効になるオブジェクト

作成バージョン

オブジェクトの内容

オブジェクトの種類

無効になる条件

07-00以降

手続き，及びトリガのオブジェクト

参照表が参照する被参照表を使用したUPDATE文又は，DELETE文を含む場合

07-00より前

参照表が参照する被参照表を使用したSQL文を含む場合

(5)　共通規則

表を削除すると，その表に対して定義したインデクス，ビュー表（パブリックビューも含む），コメント，アクセス権限，及びトリガは，削除されます。

参照表を削除した場合は，被参照表に内部的に定義されている参照制約動作を行うためのトリガも合わせて削除されます。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP TABLEは実行できません。

インナレプリカ機能を使用している場合のDROP TABLEの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

表に定義しているLOB列，又はLOB属性の列を格納するRDエリアに更新凍結指定を指定している場合，その表は削除できません。

指定した表が改竄防止表で，かつその改竄防止表に行がある場合，表は削除できません。

DBA権限を持つユーザは，他ユーザが所有する表を削除できますが，監査人の所有する監査証跡表は削除できません。

外部キーで参照される被参照表は削除できません。

SQLセッション固有一時表を使用しているSQLセッション中で，使用中のSQLセッション固有一時表は削除できません。

(6)　留意事項

DROP TABLEは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して無効にしたトリガのSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

表を定義し直して，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成する。

無効にしたトリガをDROP TRIGGERで削除してから，削除した表を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

(条件)

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

(7)　使用例

在庫表（ZAIKO）を削除します。

    DROP TABLE ZAIKO

3.30　DROP TRIGGER（トリガ削除）

3.30.1　DROP TRIGGERの形式と規則

(1)　機能

トリガを削除します。

(2)　使用権限

トリガの所有者

自分が所有するトリガを削除できます。

DBA権限を持つユーザ

自分が所有するトリガ，及び他ユーザの所有するトリガを削除できます。

(3)　形式

　DROP TRIGGER 〔認可識別子.〕トリガ識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕トリガ識別子〔WITH PROGRAM〕

認可識別子

削除するトリガの所有者の認可識別子を指定します。

省略した場合，DROP TRIGGERを実行するユーザの認可識別子を仮定します。

トリガ識別子

削除するトリガの名称を指定します。

WITH PROGRAM

トリガを削除するときに，そのトリガを使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，トリガを使用する手続き，及びトリガの有効なSQLオブジェクトがあると，そのトリガは削除できません。

(5)　共通規則

次の条件を満たす場合，Java手続き中からDROP TRIGGERは実行できません。

実行中のSQLオブジェクトが無効になる，又は削除される場合

実行中のJava手続きが削除される場合

(6)　留意事項

DROP TABLEは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

(7)　使用例

トリガ（TRIG1）を削除します。

    DROP TRIGGER TRIG1

3.31　DROP 〔PUBLIC〕VIEW（ビュー表の削除，パブリックビュー表の削除）

3.31.1　DROP VIEW（ビュー表の削除）

(1)　機能

ビュー表を削除します。

(2)　使用権限

指定するビュー表の所有者

自分が所有するビュー表を削除できます。

DBA権限を持つユーザ

他ユーザの所有するビュー表を削除できます。

(3)　形式

　DROP VIEW 〔認可識別子.〕表識別子〔WITH PROGRAM〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子〔WITH PROGRAM〕

認可識別子

ビュー表を所有するユーザの認可識別子を指定します。省略した場合，実行するユーザの認可識別子を仮定します。

表識別子

削除するビュー表の名前を指定します。

WITH PROGRAM

ビュー表を削除する場合，そのビュー表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

WITH PROGRAMを省略した場合，そのビュー表を使用する手続き，及びトリガの有効なSQLオブジェクトがあると，そのビュー表は削除できません。

(5)　共通規則

ビュー表を削除すると，そのビュー表に対するアクセス権限，及び削除するビュー表から定義したビュー表も削除されます。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からDROP VIEWは実行できません。

(6)　留意事項

DROP VIEWは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE又はALTER PROCEDUREを実行して手続き，及びトリガのSQLオブジェクトを再作成しておく必要があります。

WITH PROGRAMを指定して無効にしたトリガのSQLオブジェクトを実行するためには，次のどちらかの操作をする必要があります。

ビュー表を定義し直して，ALTER TRIGGER又はALTER ROUTINEを実行してトリガのSQLオブジェクトを再作成する。

無効にしたトリガをDROP TRIGGERで削除してから，削除したビュー表を使用しないようにCREATE TRIGGERでトリガを再定義します。ただし，次のすべての条件を満たすトリガがある場合は，それらもすべてDROP TRIGGERで削除し，定義していた順にCREATE TRIGGERで再定義しないと，トリガ動作の実行順序が変わります。

(条件)

・無効にしたトリガよりも定義したのが後である。

・無効にしたトリガと定義した表が同じである。

・無効にしたトリガとトリガ契機（INSERT，UPDATE，又はDELETE）が同じである（ただし，UPDATEの場合は，トリガ契機列の指定の有無，及び内容に関係なく同じとみなされます）。

・無効にしたトリガとトリガ動作時期（BEFORE又はAFTER）が同じである。

・無効にしたトリガとトリガの動作する単位（行単位又は文単位）が同じである。

(7)　使用例

在庫表（ZAIKO）から定義したビュー表（VZAIKO1）を削除します。

    DROP VIEW VZAIKO1

3.31.2　DROP PUBLIC VIEW（パブリックビューの削除）

(1)　機能

すべてのユーザから，認可識別子で表識別子を修飾しなくても使用できるビュー表（パブリックビュー）を削除します。

(2)　使用権限

指定するパブリックビューの所有者（定義者）

自分が所有する（定義した）パブリックビューを削除できます。

DBA権限を持つユーザ

他ユーザの所有するパブリックビューを削除できます。

(3)　形式

　DROP PUBLIC VIEW 表識別子〔WITH PROGRAM〕

(4)　オペランド

PUBLIC，表識別子以外の説明については，「DROP VIEW（ビュー表の削除）」を参照してください。

(a)　PUBLIC

パブリックビューを削除する場合に指定します。

(b)　表識別子

削除するパブリックビューの名前を指定します。

(5)　共通規則

「DROP VIEW（ビュー表の削除）」の共通規則と同じです。

(6)　留意事項

「DROP VIEW（ビュー表の削除）」の留意事項と同じです。

(7)　使用例

在庫表（ZAIKO）から定義したパブリックビュー（PVZAIKO1）を削除します。

    DROP PUBLIC VIEW PVZAIKO1

3.32　GRANT　形式1（権限定義）

3.32.1　GRANT DBA（DBA権限定義），GRANT SCHEMA（スキーマ定義権限定義），GRANT CONNECT（CONNECT権限定義），GRANT RDAREA（RDエリア利用権限定義）

(1)　機能

ユーザにDBA権限，スキーマ定義権限，CONNECT権限，私用RDエリアの利用権限を与えます。

(2)　使用権限

DBA権限を持つユーザ

DBA権限，スキーマ定義権限，CONNECT権限，及び私用RDエリアの利用権限を与えます。

CONNECT権限を持つユーザ

パスワードを変更できます。

(3)　形式

　GRANT｛DBA   TO 認可識別子〔，認可識別子〕…
　　　　　　　〔IDENTIFIED ｛BY パスワード〔，パスワード〕…｜USING OS｝〕
　　　　　｜SCHEMA  TO 認可識別子〔，認可識別子〕…
　　　　　｜CONNECT TO 認可識別子〔，認可識別子〕…
　　　　　　　〔IDENTIFIED ｛BY パスワード〔，パスワード〕…｜USING OS｝〕
　　　　　｜RDAREA RDエリア名〔，RDエリア名〕…
　　　　　　　TO｛認可識別子〔，認可識別子〕…｜ PUBLIC ｝｝

(4)　オペランド

(a)　DBA TO 認可識別子〔，認可識別子〕…〔IDENTIFIED ｛BY パスワード〔，パスワード〕…｜USING OS｝〕

DBA TO

ユーザにDBA権限を与える場合に指定します。

認可識別子〔，認可識別子〕…

DBA権限を与えるユーザの認可識別子を指定します。

IDENTIFIED BY パスワード〔，パスワード〕…

DBA権限を与えるユーザのパスワードを指定します。

既にDBA権限，又はCONNECT権限を持つ簡易認証ユーザの場合，指定できません。

IDENTIFIED BY句とユーザの権限の関係を次の表に示します。

表3‒38　GRANT DBA文のIDENTIFIED BY句とユーザの権限の関係

ユーザの権限

GRANT DBA文のIDENTIFIED BY

指定あり

指定なし

既にCONNECT権限あり

パスワードあり

DBA権限を与えて，指定されたパスワードに変更

DBA権限を与える

パスワードなし

DBA権限を与えて，指定されたパスワードに変更

KFPA11571エラー

CONNECT権限なし

CONNECT権限，DBA権限，及び指定されたパスワードを与える

KFPA11571エラー

IDENTIFIED USING OS

簡易認証ユーザとしてDBA権限を与える場合に指定します。

既にDBA権限，又はCONNECT権限を持つ非簡易認証ユーザの場合，指定できません。

(b)　SCHEMA TO 認可識別子〔，認可識別子〕…

SCHEMA TO

ユーザにスキーマ定義権限を与える場合に指定します。

認可識別子〔，認可識別子〕…

スキーマ定義権限を与える場合，ユーザの認可識別子を指定します。

(c)　CONNECT TO 認可識別子〔，認可識別子〕…〔IDENTIFIED ｛BY パスワード〔，パスワード〕…｜USING OS｝〕

CONNECT TO

ユーザにCONNECT権限を与える場合に指定します。

CONNECT権限を与える場合の規則を次に示します。

簡易認証ユーザとしてCONNECT権限を与える場合は，IDENTIFIED USING OSを指定してください。

簡易認証ユーザに対して，パスワードの変更をする指定（IDENTIFIED BY句を指定，又はIDENTIFIED句の指定を省略）はできません。

非簡易認証ユーザに対して，簡易認証ユーザに変更する指定（IDENTIFIED USING OS句の指定）はできません。

認可識別子〔，認可識別子〕…

CONNECT権限を与えるユーザの認可識別子を指定します。

IDENTIFIED BY パスワード〔，パスワード〕…

CONNECT権限を与えるユーザのパスワードを指定します。

IDENTIFIED BY句とユーザの権限の関係を次の表に示します。

表3‒39　GRANT CONNECT文のIDENTIFIED BY句とユーザの権限の関係

ユーザの権限

パスワード文字制限定義

GRANT CONNECT文のIDENTIFIED BY句

指定あり

指定なし

既にCONNECT権限あり

パスワードあり

DBA権限あり

−

指定されたパスワードに変更

KFPA11571-Eエラー

DBA権限なし

なし

指定されたパスワードに変更

パスワードなしに変更

あり

指定されたパスワードに変更

KFPA19634-Eエラー

パスワードなし

DBA権限なし

なし

指定されたパスワードに変更

パスワードなしに変更

あり

指定されたパスワードに変更

KFPA19634-Eエラー

CONNECT権限なし

なし

CONNECT権限とパスワードを与える

パスワードなしでCONNECT権限だけを与える

あり

CONNECT権限とパスワードを与える

KFPA19634-Eエラー

（凡例）　−：該当しません。

IDENTIFIED USING OS

簡易認証ユーザとしてCONNECT権限を与える場合に指定します。

(d)　RDAREA RDエリア名〔，RDエリア名〕…TO｛認可識別子〔，認可識別子〕…｜ PUBLIC｝

RDAREA RDエリア名〔，RDエリア名〕

ユーザに利用権限を与えるRDエリアの名称を指定します。

認可識別子〔，認可識別子〕…

利用権限を与えるユーザの認可識別子を指定します。

PUBLIC

指定したRDエリアを公用RDエリアにする場合に指定します。

(5)　共通規則

GRANT RDAREAでレプリカRDエリアに利用権限は与えられません。

インナレプリカ機能を使用している場合のGRANTの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

パスワード文字制限強化機能を使用している場合，GRANT DBA文，及びGRANT CONNECT文実行時にパスワード文字制限のチェックを行います。

RDエリア名には，一時表用RDエリアを指定できません。

(6)　留意事項

このSQL文中に，最大16個の私用RDエリアと，最大1,600個の認可識別子が指定できます。

DBA権限，又はCONNECT権限のないユーザには，スキーマ定義権限を与えられません。

PUBLIC指定のRDエリア利用権限のあるRDエリアに対して，個別のユーザへRDエリア利用権限を与えられません。また，個別のユーザに権限を与えたRDエリアは，PUBLICを指定して公用RDエリアとして定義できません。

DBA権限を与えると，CONNECT権限も与えられます。

DBA権限を与えるユーザには，パスワードを指定してください。なお，DBA権限が与えられていても，パスワードのないユーザはDBA権限を使用できません。

自分自身にGRANT CONNECTを指定すると，パスワードの変更ができます。この場合，GRANT実行者はCONNECT権限だけでパスワードの変更ができます。

GRANTは，OLTP下のX/Openに従ったUAPから指定できません。

GRANT DBA文とGRANT CONNECT文で，複数の認可識別子を指定し，同時に複数のユーザに権限を与える場合，IDENTIFIED BY句で指定するパスワードは一部だけの省略はできません。パスワードは指定した認可識別子の数だけ指定するか，又はIDENTIFIED BY句全体を省略してください。ただし，GRANT CONNECT文ではIDENTIFIED BY句全体を省略した場合，パスワードのないDBAを登録するような指定があるとエラーとなり（表「GRANT DBA文のIDENTIFIED BY句とユーザの権限の関係」，表「GRANT CONNECT文のIDENTIFIED BY句とユーザの権限の関係」を参照），GRANT文全体が無効になります。この場合，エラーとなるユーザを別のGRANT文でIDENTIFIED BY句を指定して実行してください。

パスワード文字制限機能使用時にGRANT DBA文とGRANT CONNECT文で，複数の認可識別子を指定し，同時に複数のユーザに権限を与える場合，一人でもパスワード文字制限に違反する指定をした場合，エラーとなり（表「GRANT DBA文のIDENTIFIED BY句とユーザの権限の関係」，表「GRANT CONNECT文のIDENTIFIED BY句とユーザの権限の関係」を参照），GRANT文全体が無効となります。

パスワード無効アカウントロック状態のユーザにはGRANT DBA文でDBA権限の付与，又はパスワードの変更はできません。GRANT CONNECT文でパスワード無効アカウントロック状態を解除後，GRANT DBA文を実行してください。

監査人には，DBA権限は与えられません。

RDエリア利用権限が監査人にだけ与えられているRDエリアに対して，他ユーザのRDエリア利用権限は与えられません。

既にCONNECT権限を持つ簡易認証ユーザに対してDBA権限を与える場合は，USING OSを指定してください。

(7)　使用例

ユーザ（認可識別子：USER1）にDBA権限を与えます。このとき，パスワードは，PSWDとします。

  GRANT DBA TO USER1 IDENTIFIED BY PSWD

ユーザ（認可識別子：USER2）にスキーマ定義権限を与えます。

  GRANT SCHEMA TO USER2

ユーザ（認可識別子：USER3）にCONNECT権限を与えます。このとき，パスワードは，PSWDとします。

  GRANT CONNECT TO USER3
      IDENTIFIED BY PSWD

ユーザ（認可識別子：USER3）のパスワードをABCDに変更します。

  GRANT CONNECT TO USER3
      IDENTIFIED BY ABCD

ユーザ（認可識別子：USER4〜6）にRDエリア（RDA1，RDA2）の利用権限を与えます。

  GRANT RDAREA RDA1,RDA2
      TO USER4,USER5,USER6

RDエリア（RDA3）を公用RDエリアとして定義します。

  GRANT RDAREA RDA3 TO PUBLIC

3.32.2　GRANT アクセス権限（アクセス権限定義）

(1)　機能

ユーザに表のアクセス権限を与えます。

(2)　使用権限

表の所有者

自分が所有する実表，及び自分の実表，ビュー表から定義した自分の所有するビュー表に対して，自分が持つアクセス権限をほかのユーザに与えられます。ただし，他人が所有する表に対するSELECT権限を受け取って，ビュー表を定義すると，以降このビュー表に対して自分が持つアクセス権限を，ほかのユーザに与えることはできません。

(3)　形式

　GRANT｛アクセス権限〔，アクセス権限〕…｜ALL〔PRIVILEGES〕｝
　　　ON〔認可識別子.〕表識別子
　　　TO｛認可識別子〔，認可識別子〕…｜PUBLIC｝

　アクセス権限：：＝｛SELECT｜INSERT｜DELETE｜UPDATE｝

(4)　オペランド

(a)　｛アクセス権限〔，アクセス権限〕…｜ ALL〔PRIVILEGES〕｝

アクセス権限

認可するアクセス権限を指定します。なお，同じアクセス権限は指定できません。

ALL〔PRIVILEGES〕

指定した表に対して，アクセス権限で指定できるすべてのアクセス権限を与える場合，指定します。

ビュー表に対して指定した場合，ビュー表所有者の持つアクセス権限をすべて与えます。

(b)　アクセス権限：：＝｛ SELECT ｜ INSERT｜ DELETE｜ UPDATE｝

SELECT

SELECT権限を与える場合に指定します。

INSERT

INSERT権限を与える場合に指定します。

DELETE

DELETE権限を与える場合に指定します。

UPDATE

UPDATE権限を与える場合に指定します。

(c)　ON〔認可識別子.〕表識別子

認可識別子

アクセス権限を与える表の所有者の認可識別子を指定します。

パブリックビューのアクセス権限を与える場合は，認可識別子にPUBLICを指定してください。

表識別子

アクセス権限を与える表の名前を指定します。

(d)　TO｛認可識別子〔，認可識別子〕…｜PUBLIC｝

認可識別子

アクセス権限を与えるユーザの認可識別子を指定します。ユーザの認可識別子は，最大1,600個指定できます。ただし，同じ認可識別子は指定できません。

PUBLIC

指定したアクセス権限を，すべてのユーザに与える場合に指定します。

(5)　共通規則

インナレプリカ機能を使用している場合のGRANTの実行条件については，マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

一時表に対するアクセス権限をほかのユーザに与える場合，指定できるのはALL 〔PRIVILEDGE〕だけです。

(6)　留意事項

GRANTは，OLTP下のX/Openに従ったUAPから指定できません。

監査人以外のユーザに監査証跡表又は監査証跡表を基表としたビュー表のINSERT，UPDATE，DELETE権限を与えることはできません。

(7)　使用例

ユーザ（認可識別子：USER1）に在庫表（ZAIKO）を検索する権限（SELECT権限）を与えます。

  GRANT SELECT
      ON ZAIKO TO USER1

すべてのユーザに対して，在庫表（ZAIKO）をアクセスするすべての権限を与えます。

  GRANT ALL
      ON ZAIKO TO PUBLIC

3.33　GRANT　形式2（監査人のパスワード変更）

3.33.1　GRANT形式2の形式と規則

(1)　機能

監査人のパスワードを変更します。

(2)　使用権限

監査権限を持つユーザ

監査権限を持つユーザが，監査人のパスワードを変更できます。

(3)　形式

　GRANT AUDIT IDENTIFIED BY パスワード

(4)　オペランド

(a)　パスワード

監査人の新しいパスワードを指定します。

英字の大文字，小文字を区別したい場合は，引用符（"）で囲んで指定してください。

(5)　使用例

監査人のパスワードを，「a0h7Fc3」に変更します。

  GRANT AUDIT IDENTIFIED BY "a0h7Fc3"

3.34　REVOKE（権限削除）

3.34.1　REVOKE DBA（DBA権限削除），REVOKE SCHEMA（スキーマ定義権限削除），REVOKE CONNECT（CONNECT権限削除），REVOKE RDAREA（RDエリア利用権限削除）

(1)　機能

ユーザに与えているDBA権限，スキーマ定義権限，CONNECT権限，私用RDエリアの利用権限を取り消します。

(2)　使用権限

DBA権限を持つユーザ

DBA権限，スキーマ定義権限，CONNECT権限，及びRDエリアの利用権限を取り消します。

(3)　形式

　REVOKE｛ DBA   FROM 認可識別子〔，認可識別子〕…
　　　　　　｜SCHEMA  FROM 認可識別子〔，認可識別子〕…
　　　　　　｜CONNECT FROM 認可識別子〔，認可識別子〕…
　　　　　　｜RDAREA  RDエリア名〔，RDエリア名〕…
　　　　　　　　FROM｛認可識別子〔，認可識別子〕…｜PUBLIC｝｝

(4)　オペランド

(a)　DBA FROM 認可識別子〔，認可識別子〕…

DBA FROM

DBA権限を取り消す場合に指定します。

認可識別子〔，認可識別子〕…

DBA権限を取り消すユーザの認可識別子を指定します。

(b)　SCHEMA FROM 認可識別子〔，認可識別子〕…

SCHEMA FROM

スキーマ定義権限を取り消す場合に指定します。

認可識別子〔，認可識別子〕…

スキーマ定義権限を取り消すユーザの認可識別子を指定します。

(c)　CONNECT FROM 認可識別子〔，認可識別子〕…

CONNECT FROM

CONNECT権限を取り消す場合に指定します。

認可識別子〔，認可識別子〕…

CONNECT権限を取り消すユーザの認可識別子を指定します。

(d)　RDAREA RDエリア名〔，RDエリア名〕…FROM｛認可識別子〔，認可識別子〕…｜ PUBLIC ｝

RDエリア名〔，RDエリア名〕

利用権限を取り消すRDエリアの名称を指定します。

認可識別子〔，認可識別子〕…

利用権限を取り消すユーザの認可識別子を指定します。

PUBLIC

指定した公用RDエリアの利用権限を取り消す場合に指定します。

(5)　留意事項

認可していない権限，又は既に取り消している権限を再度，取り消しできます。

RDエリアの利用権限を取り消されるユーザがそのRDエリア中に表，インデクス，又は順序数生成子を持っている場合，RDエリアの権限を取り消すことはできません。

スキーマに表がある場合，スキーマ権限を取り消すことはできません。

最大16個の私用RDエリア名を指定できます。

最大1,600個のユーザの認可識別子を指定できます。

GRANTのPUBLICで与えた権限は，REVOKEのPUBLICで取り消してください。

自分自身のDBA権限を取り消すことはできません。

DBA権限，又はスキーマを持っているユーザのCONNECT権限を取り消すことはできません。

CONNECT権限を取り消すと，スキーマ定義権限も取り消されます。

REVOKEは，OLTP下のX/Openに従ったUAPから指定できません。

監査人のスキーマ定義権限，及びCONNECT権限を取り消すことはできません。

RDエリア名には，一時表用RDエリアを指定できません。

pdplgrgstを実行する場合は，DBA権限を持つ非簡易認証ユーザが必要です。

(6)　使用例

ユーザ（認可識別子：USER1）に与えているDBA権限を取り消します。

  REVOKE DBA FROM USER1

ユーザ（認可識別子：USER2）に与えているスキーマ定義権限を取り消します。

  REVOKE SCHEMA FROM USER2

ユーザ（認可識別子：USER3）に与えているCONNECT権限を取り消します。

  REVOKE CONNECT FROM USER3

ユーザ（認可識別子：USER4〜6）に与えているRDエリア（RDA1，RDA2）の利用権限を取り消します。

  REVOKE RDAREA RDA1,RDA2
      FROM USER4,USER5,USER6

公用RDエリアとして定義したRDエリア（RDA3）を私用RDエリアとして再定義します（USER1にRDエリア利用権限を与えます）。

  REVOKE RDAREA RDA3 FROM PUBLIC
      GRANT RDAREA RDA3 TO USER1

3.34.2　REVOKE アクセス権限（アクセス権限削除）

(1)　機能

ユーザに与えている表のアクセス権限を取り消します。

(2)　使用権限

表の所有者

GRANT（アクセス権限定義）で与えたアクセス権限を取り消すことができます。

(3)　形式

　REVOKE ｛アクセス権限〔，アクセス権限〕…｜ALL〔PRIVILEGES〕｝
　　　ON 〔認可識別子.〕表識別子
　　　FROM｛認可識別子〔，認可識別子〕…｜PUBLIC｝
　　　　　〔WITH PROGRAM〕

　アクセス権限：：＝｛SELECT｜INSERT｜DELETE｜UPDATE｝

(4)　オペランド

(a)　｛アクセス権限〔，アクセス権限〕…｜ALL〔PRIVILEGES〕｝

アクセス権限

アクセス権限を取り消す場合に指定します。なお，同じアクセス権限は指定できません。

ALL〔PRIVILEGES〕

指定した表に対して，アクセス権限で指定できるすべてのアクセス権限を取り消す場合に指定します。

(b)　アクセス権限：：＝｛SELECT｜INSERT｜DELETE｜UPDATE｝

SELECT

SELECT権限を取り消す場合に指定します。

INSERT

INSERT権限を取り消す場合に指定します。

DELETE

DELETE権限を取り消す場合に指定します。

UPDATE

UPDATE権限を取り消す場合に指定します。

(c)　ON〔認可識別子.〕表識別子

認可識別子

アクセス権限を取り消す表の所有者の認可識別子を指定します。

パブリックビューのアクセス権限を取り消す場合は，認可識別子にPUBLICを指定してください。

表識別子

アクセス権限を取り消す表の名前を指定します。

(d)　FROM｛認可識別子〔，認可識別子〕…｜PUBLIC｝〔WITH PROGRAM〕

認可識別子

アクセス権限を取り消すユーザの認可識別子を指定します。ユーザの認可識別子は，最大1,600個指定できます。ただし，同じ認可識別子は指定できません。

PUBLIC

GRANTのPUBLIC指定で与えたアクセス権限を取り消す場合に指定します。

WITH PROGRAM

ビュー表の基になる表のSELECT権限を取り消すときに，SELECT権限の取消によって削除されるビュー表を使用する手続き，及びトリガの有効なSQLオブジェクトを無効にしたいときに指定します。

(5)　共通規則

自分自身の持っているアクセス権限を取り消すことはできません。

与えていない権限，又は既に取り消した権限を再度取り消すこともできます。

GRANTのPUBLICで与えた権限は，REVOKEのPUBLICで取り消してください。

PUBLICを指定して権限が与えられている場合，特定のユーザのアクセスを許さないようにするためには，PUBLICを指定して権限を削除し，認可識別子を指定して必要なユーザに対して権限を与え直してください。

表の所有者が他人に与えたSELECT権限を取り消した場合，その他人がその表を利用して定義したビュー表は削除されます。

ビュー定義で使用した表に対するアクセス権限，又はビュー表の基の表に対するアクセス権限を，ビュー表所有者から取り消す場合の規則を次に示します。

<ビュー表V1の定義>

  CREATE VIEW V1※1(VSCODE,VSNAME,VTANKA)
      AS SELECT SCODE,SNAME,TANKA
          FROM ZAIKO※2 WHERE SCODE =
              (SELECT SCODE FROM JUTYU※3)

<ビュー表V2の定義>

  CREATE VIEW V2※4(VSSCODE,VSNYUKOBI)
      AS SELECT SCODE,NYUKOBI
          FROM NYUKO※5

<ビュー表V1からのビュー表VV1の定義>

  CREATE VIEW VV1※6(VVSCODE,VVTANKA)
      AS SELECT VSCODE,VTANKA
          FROM V1※1 WHERE SCODE =
              (SELECT VSSCODE FROM V2※4
                  WHERE VSNYUKOBI > DATE('1995-09-21'))

ビュー表所有者からビュー定義で使用した表（※2，※3，※5）に対するSELECT権限を取り消す場合，そのビュー表（※1，※4），及びそのビュー表を使用して定義するビュー表（※6）も削除されます。

（例1）

ビュー表所有者からJUTYU（※3）に対するSELECT権限を取り消す場合，V1（※1）及びVV1（※6）が削除されます。

（例2）

ビュー表所有者からNYUKO（※5）に対するSELECT権限を取り消す場合，V2（※4），及びVV1（※6）が削除されます。

ビュー表所有者からビュー表の基になる表（※2，※5）に対するアクセス権限を取り消す場合，そのビュー表（※1，※4），及びそのビュー表を基に定義するビュー表（※6）に対するアクセス権限も取り消されます。なお，ここでいうアクセス権限とは，SELECT権限を除いた権限です。

（例1）

ビュー表所有者からZAIKO（※2）に対するアクセス権限を取り消す場合，V1（※1），及びVV1（※6）に対するアクセス権限も削除されます。

（例2）

ビュー表所有者からNYUKO（※5）に対するアクセス権限を取り消す場合，V2（※4）に対するアクセス権限も削除されます。

取り消されたアクセス権限を再度与えるには，取り消したビュー表の基になる表に対するアクセス権限をビュー表所有者に再度与えて，そのビュー表を削除してからビュー表を再度定義してください。

（例1）の場合，ZAIKO（※2）に対するアクセス権限をビュー表所有者に与えて，V1（※1）を削除してから（V1を削除するとVV1も削除されます），V1（※1），VV1（※6）の順で再度定義します。

（例2）の場合，NYUKO（※5）に対するアクセス権限をビュー表所有者に与えて，V2（※4）を削除してからV2（※4）を再度定義します。

WITH PROGRAMを省略した場合，SELECT権限の取り消しによって削除される，ビュー表を使用する手続き及びトリガの有効なSQLオブジェクトがあると，その権限は削除できません。

実行中のSQLオブジェクトが無効になる場合，Java手続き中からREVOKEは実行できません。

一時表に対するアクセス権限を取り消す場合，指定できるのはALL 〔PRIVILEDGE〕だけです。

(6)　留意事項

PUBLICに対して与えた権限，又は特定ユーザに与えた権限の取り消しについては，組み合わせによって結果が異なります。組み合わせを次の図に示します。

図3‒1　PUBLICに与えた権限，又は特定ユーザに与えた権限の取り消し

REVOKEは，OLTP下のX/Openに従ったUAPから指定できません。

WITH PROGRAMを指定して手続き，及びトリガの有効なSQLオブジェクトを無効にした場合，ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった手続き，及びトリガの情報は削除されます。

WITH PROGRAMを指定して無効にした手続き，及びトリガのSQLオブジェクトを実行するためには，ALTER ROUTINE，ALTER PROCEDURE，又はALTER TRIGGERを実行して手続き，及びトリガの有効なSQLオブジェクトを再作成しておく必要があります。

(7)　使用例

ユーザ（認可識別子：USER1）に与えた在庫表（ZAIKO）を検索する権限 （SELECT権限）を取り消します。

  REVOKE SELECT ON ZAIKO FROM USER1

すべてのユーザに対して与えた在庫表（ZAIKO）をアクセスするすべての権限の中で，DELETE権限だけを取り消します。

  REVOKE DELETE ON ZAIKO FROM PUBLIC

4　操作系SQL

この章では，操作系SQLの構文形式，及び文法について説明します。

4.1　全般規則

4.1.1　操作系SQLの全般規定

(1)　操作系SQLの種類と機能

操作系SQLは，表のデータを操作（検索，追加，削除，更新）するときに使用します。

操作系SQLの種類と機能を次の表に示します。

表4‒1　操作系SQLの種類と機能

種　類

機　能

ALLOCATE CURSOR文 形式1（文カーソル割当て）

PREPARE文で前処理したSELECT文，又は手続きから返却された結果集合の組に対してカーソルを割り当てます。

ALLOCATE CURSOR文 形式2（結果集合カーソル割当て）

ASSIGN LIST文　形式1（リスト作成）

実表からリストを作成します。

ASSIGN LIST文　形式2（リスト作成）

CALL文（手続きの呼び出し）

手続きを呼び出します。

CLOSE文（カーソルクローズ）

カーソルを閉じます。

DEALLOCATE PREPARE文（SQLの前処理無効化）

PREPARE文で前処理したSQLを無効にし，SQL文識別子，又は拡張文名の割当てを解除します。

DECLARE CURSOR　形式1（カーソル宣言）

SELECT文の検索結果をFETCH文で1行ずつ取り出すために，カーソルを宣言します。

DECLARE CURSOR　形式2（カーソル宣言）

DELETE文　形式1（行削除）

指定した探索条件を満足する行，又はカーソルが指している行を削除します。

DELETE文　形式2（配列を使用した行削除）

準備可能動的DELETE文：位置付け（前処理可能なカーソルを使用した行削除）

指定したカーソルが指している行を削除します。動的に実行する場合に使用します。

DESCRIBE文　形式1（検索情報，入出力情報の受け取り）

PREPARE文で前処理したSQLの検索情報，若しくは出力情報，又は入力情報を，SQL記述領域に返します。

DESCRIBE文　形式2（検索情報，入出力情報の受け取り）

DESCRIBE CURSOR文（カーソルの検索情報の受け取り）

手続きから返却された結果集合を参照するカーソルの検索情報を，SQL記述領域に返します。

DESCRIBE TYPE文（ユーザ定義型の定義情報の受け取り）

PREPARE文で前処理したSQLの検索項目情報に直接又は間接的に含まれるユーザ定義型の定義情報（各属性のデータコード，データ長など）をSQL記述領域に受け取ります。

DROP LIST文（リスト削除）

リストを削除します。

EXECUTE文　形式1（SQLの実行）

PREPARE文で前処理したSQLを実行します。

EXECUTE文　形式2（配列を使用したSQLの実行）

PREPARE文で前処理したSQLを，配列を使用して複数行分一括して実行します。

EXECUTE IMMEDIATE文（SQLの前処理と実行）

文字列で与えられたSQLを，前処理して実行します。

FETCH文　形式1（データの取り出し）

取り出す行を示すカーソルの位置を次の行に進め，その行の列の値をINTO句で指定した埋込み変数に読み込みます。

FETCH文　形式2（データの取り出し）

検索結果中の1行，又は複数行を，SQL記述領域に指定した受け取り領域に読み込みます。

FETCH文　形式3（データの取り出し）

検索結果中の複数行を，INTO句で指定した埋込み変数に一度に読み込みます。

FREE LOCATOR文（位置付け子の無効化）

位置付け子を無効にします。

INSERT文　形式1（行挿入）

表に，行を列単位で挿入します。直接，値を指定して一つの行の挿入ができます。また，問合せ式本体を使用して，一つ，又は複数の行の挿入もできます。

INSERT文　形式2（行挿入）

行全体を一つのデータとみなして，FIX属性の表に，行を行単位で挿入します。直接，値を指定して一つの行の挿入ができます。また，問合せ式本体を使用して，一つ，又は複数の行の挿入もできます。

INSERT文　形式3（配列を使用した行挿入）

配列形式の埋込み変数を指定して複数の行の挿入ができます。表に，行を列単位で複数行挿入します。

INSERT文　形式4（配列を使用した行挿入）

配列形式の埋込み変数を指定して複数の行の挿入ができます。行全体を一つのデータとみなして，FIX属性の表に，行を行単位で複数行挿入します。

OPEN文　形式1（カーソルオープン）

カーソルを開きます。DECLARE CURSORで宣言したカーソル，又はALLOCATE CURSOR文で割り当てたカーソルを，検索結果の先頭の行の直前に位置づけて，検索結果を取り出せる状態にします。

OPEN文　形式2（カーソルオープン）

PREPARE文（SQLの前処理）

文字列で与えられたSQLを実行するための前処理をしてそのSQLに名称（SQL文識別子，又は拡張文名）を付けます。

PURGE TABLE文（全行削除）

実表中のすべての行を削除します。

1行SELECT文（1行検索）

表のデータを検索します。表から1行だけデータを取り出す場合は，カーソルを使用しないでデータを取り出す1行SELECT文を指定します。

動的SELECT文　形式1（動的検索）

表のデータを検索します。動的SELECT文は，PREPARE文で前処理します。検索するときは，DECLARE CURSORによってカーソルを宣言するか，ALLOCATE CURSOR文によってカーソルを割り当ててから，そのカーソルを使用して検索結果を1行ずつ取り出します。

動的SELECT文　形式2（動的検索）

リストを介して表を検索します。

UPDATE文　形式1（データ更新）

表内の，指定した探索条件を満足する行，又はカーソルが指している行の指定した列の値を更新します。

UPDATE文　形式2（データ更新）

表内の，指定した探索条件を満足する行，又はカーソルが指している行の値を行単位で更新します。

UPDATE文　形式3（配列を使用した行更新）

配列形式の埋込み変数を指定して，複数の更新処理を実行できます。表内の，指定した探索条件を満足する行の値を列単位で複数回更新します。

UPDATE文　形式4（配列を使用した行更新）

配列形式の埋込み変数を指定して，複数の更新処理を実行できます。FIX指定の表内の，指定した探索条件を満足する行の値を行単位で複数回更新します。

準備可能動的UPDATE文：位置付け 形式1（前処理可能なカーソルを使用したデータ更新）

表内のカーソルが指している行の指定した列を更新します。PREPARE文で前処理してからEXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

準備可能動的UPDATE文：位置付け 形式2（前処理可能なカーソルを使用したデータ更新）

FIX指定の表内のカーソルが指している行の指定した列を更新します。PREPARE文で前処理してからEXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

代入文　形式1（SQL変数，又はSQLパラメタへの値の代入）

SQL変数，又はSQLパラメタに値を代入します。

代入文　形式2（埋込み変数，又は？パラメタへの値の代入）

埋込み変数，又は？パラメタに値を代入します。

4.2　ALLOCATE CURSOR文 形式1（文カーソル割当て）

4.2.1　ALLOCATE CURSOR文 形式1の形式と規則

(1)　機能

PREPARE文で前処理したSELECT文（動的SELECT文）に対してカーソルを定義して割当てます。

(2)　使用権限

なし。

(3)　形式１＜PREPARE文で前処理したSELECT文（動的SELECT文）に対するカーソル割当て＞

　ALLOCATE 拡張カーソル名 CURSOR 〔WITH HOLD〕FOR 拡張文名

(4)　オペランド

(a)　拡張カーソル名

割当てるカーソルの拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　〔WITH HOLD〕

ホールダブルカーソルとして割当てる場合に指定します。ただし，次の場合，ホールダブルカーソルは使用できません。

FROM句に，ホールダブルカーソルに未対応のプラグイン※を使用した抽象データ型を含む表を指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定して導出した，名前付きの導出表に対する問合せ

リストを介した検索

ON COMMIT DELETE ROWSを指定して定義した一時表に対する問合せ

なお，ホールダブルカーソルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注※

プラグインのホールダブルカーソルへの対応状況については，ディクショナリ表SQL_PLUGINSのPLUGIN_HOLDABLE列で確認できます。ディクショナリ表SQL_PLUGINSについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(c)　拡張文名

有効範囲内で，PREPARE文で前処理したSELECT文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(5)　共通規則

割当てられたカーソルは，閉じた状態になります。

同じSELECT文を識別する拡張文名に対して，複数のカーソルを割当てた場合，WITH HOLD指定のあるカーソル割当てと，WITH HOLD指定のないカーソル割当てを混在させることはできません。

(6)　留意事項

指定した拡張カーソル名が既にその有効範囲内で割当てられている場合はエラーとなります。

(7)　使用例

在庫表（ZAIKO）から，行を1行ずつ取り出すためにカーソル（拡張カーソル名cr（有効範囲：GLOBAL））を割当てます。

PREPARE GLOBAL :sel FROM 'SELECT * FROM ZAIKO'
ALLOCATE GLOBAL :cr CURSOR FOR GLOBAL :sel

在庫表（ZAIKO）から，カーソル（拡張カーソル名：cr（有効範囲：GLOBAL，値：'CR1'））を使用してすべての行を検索しながら，動的にカーソル位置の行の単価（TANKA）を1割引に更新します。

<埋込み変数selに任意の名称を設定>
PREPARE GLOBAL :sel FROM 'SELECT * FROM ZAIKO FOR UPDATE'
＜埋込み変数crに'CR1'を設定＞
ALLOCATE GLOBAL :cr CURSOR FOR GLOBAL :sel
PREPARE PRE1 FROM
'UPDATE SET TANKA = ＜単価の１割引の値＞ WHERE CURRENT OF GLOBAL CR1'
OPEN GLOBAL :cr
FETCH GLOBAL :cr INTO ＜各列を取り出す変数名＞
EXECUTE PRE1
CLOSE GLOBAL :cr
DEALLOCATE PREPARE GLOBAL :sel

4.3　ALLOCATE CURSOR文 形式2（結果集合カーソル割当て）

4.3.1　ALLOCATE CURSOR文 形式2の形式と規則

(1)　機能

手続きから返却された順序付けられた結果集合の組に対してカーソルを割り当てます。

(2)　使用権限

なし。

(3)　形式２＜手続きから返却された結果集合の組に対するカーソル割当て＞

　ALLOCATE 拡張カーソル名 FOR
　　　　PROCEDURE 〔認可識別子.〕ルーチン識別子

(4)　オペランド

(a)　拡張カーソル名

割り当てるカーソルの拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　〔認可識別子.〕ルーチン識別子

認可識別子

カーソルを割り当てる結果集合を返却した手続きの，所有者の認可識別子を指定します。

パブリック手続きに対してカーソルを割り当てる場合は，認可識別子に引用符（"）で囲んだ大文字のPUBLICを指定します。

ルーチン識別子

カーソルを割り当てる結果集合を返却した手続きの，ルーチンの名前を指定します。

(5)　共通規則

現行SQLセッション（HiRDBの接続から切断まで）内で既に呼び出した手続きを指定してください。

現行SQLセッション内で指定した手続きを2回以上呼び出した場合は，最後に呼び出したときに手続きが返却した結果集合の組にカーソルを割り当てます。

指定した手続きのうち，最後に呼び出した手続きが返却した結果集合の組に，既にカーソルを割り当てている場合はエラーとなります。

指定した手続きが一つも結果集合を返却しない場合，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02001'

ALLOCATE CURSOR文を実行すると，カーソルは，手続きから返却された結果集合のうち，最初の結果集合を参照し，FETCH文によってその結果集合のデータを取り出せます。2個目以降の結果集合を参照するには，CLOSE文を実行します。CLOSE文を実行し，次のリターンコードが設定された場合，次の結果集合が存在し，カーソルは次の結果集合を参照します。

SQL連絡領域のSQLCODE領域に121

SQLCODE変数に121

SQLSTATE変数に'0100D'

また，CLOSE文を実行し，次のリターンコードが設定された場合，次の結果集合は存在しません。この場合，拡張カーソル名はどのカーソルも識別しなくなります。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02001'

割り当てられたカーソルの定義は，参照している結果集合を生成した手続き中のカーソル宣言と同じになります。

割り当てられたカーソルは，開いた状態となります。

割り当てられたカーソルの位置は，手続き終了時のカーソル位置となります。

パブリック手続きに対してカーソルを割り当てる場合は，認可識別子に引用符（"）で囲んだ大文字のPUBLICを必ず指定してください。

(6)　留意事項

指定した拡張カーソル名が既にその有効範囲内で割り当てられている場合はエラーとなります。

(7)　使用例

使用例については，「結果集合返却機能」を参照してください。

4.4　ASSIGN LIST文　形式1（リスト作成）

4.4.1　ASSIGN LIST文 形式1の形式と規則

(1)　機能

実表からリストを作成します。

(2)　使用権限

実表に対するSELECT権限を持つユーザが，その実表からリストを作成できます。

(3)　形式1＜実表からのリストの作成＞

  ASSIGN LIST リスト名 FROM （〔認可識別子.〕表識別子）
            〔WHERE 探索条件〕
            〔WITHOUT LOCK 〔｛WAIT｜NOWAIT｝〕〕
            〔｛WITH ROLLBACK｜NO WAIT｝〕

(4)　オペランド

(a)　リスト名

作成するリストの名前を指定します。

既にあるリスト名を指定した場合，そのリストを削除し新しく作成したリストを有効とします。

(b)　（〔認可識別子.〕表識別子）

認可識別子には，表の所有者の認可識別子を指定します。

表識別子には，作成するリストの基になる実表の名前を指定します。

表識別子には，以下の表は指定できません。

共用表

WITHOUT ROLLBACKを指定した表

ビュー表

既定文字集合以外の文字集合を指定した列を含む表

一時表

(c)　〔WHERE探索条件〕

探索条件には，取り出す行を選択する条件を指定します。

探索条件を省略した場合は，指定した表のすべての行がリストになります。

ASSIGN LIST文の探索条件には，論理演算子としてANDNOTも指定できます。論理演算の評価の優先順位は，ANDと同じです。

ANDNOT論理演算をした場合の述語の結果を次に示します。

左辺

右辺

T

F

？

T

F

T

T※

F

F

F

F

？

F

？

？

（凡例）

Ｔ：真であることを示します。

Ｆ：偽であることを示します。

？：不定であることを示します。

注※

C1=V1 ANDNOT C2=V2は，C1=V1 AND NOT C2=V2と等価ではありません。

述語１=（述語２ANDNOT述語３）とすると，述語１を満たす集合は，述語２を満たす集合と述語３を満たす集合の差となります。

述語１=（述語２AND NOT述語３）とすると，述語は述語２とNOT述語３とのAND論理演算をした結果になります。

したがって，AND NOTの場合，上記真理値表の※は？（不定）となります。

探索条件についての規則を次に示します。

探索条件中に，次のものは指定できません。

副問合せ（NOT指定のないIN述語中での，外への参照のない表副問合せは指定できます）

コストベース最適化モード1の場合，四則演算，日付演算，時刻演算，連結演算，スカラ関数，CASE式，及びCAST指定

コストベース最適化モード1の場合，列指定　比較演算子　列指定

両辺が列指定を含まない値式だけから成る述語

コストベース最適化モード1の場合，値式1が列指定で，値式2，又は値式3が列指定のBETWEEN述語

コンポネント指定

コストベース最適化モード1の場合，関数呼出し（インデクスを使用するロジックを実装したプラグイン提供関数は指定できます）

IS FALSE，IS UNKNOWNの論理述語（コストベース最適化モード2の場合で，値式がインデクス型プラグイン専用関数ではなく，かつ，値式中に列指定を含むときは指定できます）

XMLPARSE，及び列指定のXML問合せ文脈項目の指定がないXMLQUERY，XMLEXISTS述語

予備列

OR論理演算子の中にインデクスを使用しないで評価する条件，又はインデクスを一部使用しない条件を指定する場合，そのOR論理演算子の中に次のどれかを指定している。

・構造化繰返し述語

・インデクス型プラグイン専用関数

・XMLEXISTS述語（XQueryにhi-fn:containsを指定）

BLOB型，又は定義長が32,000バイトより大きいBINARY型のどちらかの列

探索条件中の列名には，表名，及び相関名を指定できません。

コストベース最適化モード1の場合，探索条件中に繰返し列を指定した場合は，添字としてANYを指定する必要があります。

コストベース最適化モード1の場合，探索条件で指定したすべての列にインデクス（IS NULL述語に指定した列に対して，除外キーを持つインデクスを除く）が定義されていなければなりません。コストベース最適化モード2では，すべての列にインデクスを定義する必要はありません。ただし，すべての列にインデクスを定義した方がASSIGN LIST文の性能がよいため，インデクスを定義することを推奨します。

構造化繰返し述語に対しては，コストベース最適化モードに関係なく，構造化繰返し述語の探索条件中に指定した，すべての繰返し列を構成列に含む複数列インデクスが定義されていなければなりません。

繰返し列と繰返し列以外の列の両方を構成列に含むインデクスを使用して，繰返し列でない列の述語を評価する場合，繰返し列のどれかの列に条件を指定していればインデクスは使用できます。

表副問合せを指定したIN述語中の列には，次のどちらかのインデクスが定義されていなければなりません。なお，表副問合せを指定したIN述語中の列を先頭とする複数列インデクスは，SQL最適化モードがコストベース最適化モード2の場合に限ります。

単一列インデクス

表副問合せを指定したIN述語中の列を先頭とする複数列インデクス

表副問合せを指定したIN述語中の列が複数列インデクスの先頭でない場合でも，この列より前のインデクス構成列に，比較述語（＝），NULL述語（IS NULL），又は右辺が値指定のIN述語（IN）のどれかが指定されていればかまいません。ただし，繰返し列をインデクス構成列に含むインデクスは除きます。また，右辺が値指定のIN述語（IN）の場合は，値指定の個数がシステム共通定義pd_apply_search_ats_numに対して，次のどちらかの条件を満たしている必要があります。

INが1列だけの場合，値指定の個数は↓pd_apply_search_ats_numの値÷44↓以下

INが2列以上の場合，それぞれの列に指定した値指定の個数の積が↓pd_apply_search_ats_numの値÷44↓以下

コストベース最適化モード1の場合，探索条件を指定しない場合は，リストの基になるすべての表について，繰返し列以外のどれかの列にインデクス（プラグインインデクス，除外キーを持つインデクスを除く）が定義されていなければなりません。

コストベース最適化モード1の場合，繰返し列を指定した述語は論理演算子NOTで否定できません。

ANDNOT論理演算を含む述語は論理演算子NOTで否定できません。

副問合せ中の探索条件，及び探索CASE式のWHENの探索条件にはANDNOTは指定できません。

ANDNOT論理演算の左右のどちらかにインデクスを使用しないで評価する条件，又はインデクスを一部使用しないで評価する条件を指定している場合，ANDNOTは指定できません。

値式がインデクス型プラグイン専用関数の論理述語はNOTで否定できません。

表副問合せを指定したIN述語は論理演算子NOTで否定できません。

(d)　〔WITHOUT LOCK 〔｛WAIT｜NOWAIT｝〕〕

このオペランドを省略した場合は，一度検索したデータの内容をトランザクションが終了するまで保証します。

WITHOUT LOCK WAIT

一度検索したデータの内容をトランザクション終了まで保証する必要がない場合に指定します。

WITHOUT LOCK〔WAIT〕を指定した場合，HiRDBはトランザクション終了を待たないで排他制御を解除するので，同時実行性を向上できます。

WITHOUT LOCK NOWAIT

ほかのユーザが更新中のデータでも，更新の完了を待たないで参照し，一度検索したデータの内容をトランザクション終了まで保証する必要がない場合に指定します。

WITHOUT LOCK NOWAITを指定した場合，HiRDBは排他制御をしません。更新中の表に対しても排他待ちしないで検索できるので，より同時実行性を向上できます。しかし，更新中の表を検索した場合は，タイミングによっては不正なデータが得られる場合があります。

(e)　〔｛WITH ROLLBACK｜NO WAIT｝〕

このオペランドを省略した場合は，検索する表をほかのユーザが使用中ならば，使用中のユーザのトランザクションが終了するまで待ち，その後実行します（WITHOUT LOCK NOWAIT指定の場合を除く）。

WITH ROLLBACK

検索する表をほかのユーザが使用中の場合，トランザクションを取り消して無効にしたいときに指定します。

NO WAIT

検索する表をほかのユーザが使用中の場合，トランザクションを取り消さないでエラーにしたいときに指定します。ただし，このSQLの実行中に掛けた排他は解除されません。

(5)　共通規則

リストは所有者だけ使用でき，権限定義，権限削除の対象とはなりません。実行ユーザとリストの所有者が異なる場合は，SET SESSION AUTHORIZATION文を使用して，実行ユーザを変更してください。

リストはHiRDBから切り離しをしても削除されません。

リストはHiRDB停止時に自動的に削除されます。

障害発生時には，リストは次の条件のとおり検索できなくなるため（検索するとエラー），検索できないリストは削除，又は再作成する必要があります。

条件1

すべてのユニットが異常終了した場合

すべてのリストが自動的に削除されます。

条件2

一部のユニットが異常終了した場合

異常終了したユニットで作成したリストが検索できなくなります。

リストがある間，リストの基表に対して次の操作はできません。

スキーマの削除

表の削除

表の定義変更

リストを作成した場合，作成した行数をSQLCAのSQLERRD[2]に返します。

リストは，SQLルーチン中には指定できません。

ASSIGN LIST文は動的に実行できますが，直接ホストプログラムに埋め込んで実行できません。

同一ユーザが，複数同時にHiRDBと接続してリストを操作できません。

一つのリスト用RDエリアに格納できるリストの最大数は，データベース初期設定ユティリティ（pdinit），又はデータベース構成変更ユティリティ（pdmod）で指定する最大リスト登録数（500〜50,000）で決まります。

(6)　留意事項

リストは基表と同一サーバ上のリスト用RDエリアに作成します。あらかじめリスト用RDエリアを準備しておいてください。

リストはHiRDBから切り離しをしても削除されません。不要になったリストは，DROP LIST文で削除してください。

リストがある間，リストの基表に対して次の操作をした場合は，リストを作り直してください。

PURGE TABLE文

表の再編成

作成モードのデータロード

RDエリアの再初期化

(7)　使用例

使用例については，「ASSIGN LIST文　形式2（リスト作成）」の使用例を参照してください。

4.5　ASSIGN LIST文　形式2（リスト作成）

4.5.1　ASSIGN LIST文 形式2の形式と規則

(1)　機能

リストの複写，又はリスト間の集合演算をして，結果をリストとして作成します。また，リストの名前も変更できます（リスト名変更）。

(2)　使用権限

リストの所有者

自分の所有するリストからリストを作成できます。

(3)　形式2＜リストからのリストの作成，リストの名前の変更＞

  ASSIGN LIST リスト名 FROM リスト名１
            〔｛｛ AND｜OR｜AND NOT｜ANDNOT｝ リスト名２｜FOR ALTER LIST｝〕

(4)　オペランド

(a)　リスト名

作成するリストの名前を指定します。

既にあるリスト名を指定した場合，そのリストを削除して，新しく作成したリストを有効とします。

(b)　リスト名１ 〔｛｛AND｜OR｜AND NOT｜ANDNOT｝ リスト名２｜FOR ALTER LIST｝〕

リスト名１，リスト名２に指定するリストの基表は，同じでなければなりません。

リスト名，リスト名１，及びリスト名２に指定するリストの名前はすべて異なっていなければなりません。

リスト名１

リストの複写をする場合に指定します。

リスト名１ANDリスト名２

リスト間の積集合を求める場合に指定します。

リスト名１ORリスト名２

リスト間の和集合を求める場合に指定します。

リスト名１ { AND NOT｜ANDNOT } リスト名２

リスト間の差集合を求める場合に指定します。

リスト名１FOR ALTER LIST

リストの名前を変更する場合に指定します。

(5)　共通規則

形式１の共通規則と同じです。

(6)　リストの名前を変更する場合の規則

リストの名前を変更した場合，システム共通定義pd_list_rowcount_in_renameオペランドの指定値に従って次の値をSQLCAのSQLERRD[2]に返します。

表4‒2　リスト名変更時にSQLCAのSQLERRD[2]に返却する値

システム共通定義pd_list_rowcount_in_renameオペランドの指定値

SQLCAのSQLERRD[2]への返却値

Y

リストの行数

N

0

(7)　留意事項

形式１の留意事項と同じです。

(8)　使用例

表T1から列CHECK1がYのリスト（LIST1）を作成します。

ASSIGN LIST LIST1 FROM (T1) WHERE CHECK1='Y'

表T1から列CHECK2がYのリスト（LIST2）を作成します。

ASSIGN LIST LIST2 FROM (T1) WHERE CHECK2='Y'

LIST1とLIST2の積集合を求めて，リスト（LIST3）を作成します。

ASSIGN LIST LIST3 FROM LIST1 AND LIST2

4.6　CALL文（手続きの呼び出し）

4.6.1　CALL文の形式と規則

(1)　機能

手続きを呼び出します。

(2)　使用権限

DBA権限又はCONNECT権限を持つユーザ

手続きを呼び出せます。ただし，手続き中の各SQL文が実行されるときに，それぞれのSQLの実行権限が必要です。

(3)　形式

　CALL 〔認可識別子.〕ルーチン識別子
　　　　（〔引数〔，引数〕…〕）
　引数：：＝｛｛IN｜OUT｜INOUT｝ ：埋込み変数〔：標識変数〕
　　　　　　　｜〔｛IN｜OUT｜INOUT｝〕 ｛SQL変数｜SQLパラメタ｜？パラメタ｝
　　　　　　　｜〔IN〕 値式｝

(4)　オペランド

(a)　〔認可識別子.〕ルーチン識別子

認可識別子

呼び出す手続きの所有者の認可識別子を指定します。

パブリック手続きを呼び出す場合は，認可識別子にPUBLICを指定します。

ルーチン識別子

呼び出す手続きのルーチンの名前を指定します。

(b)　引数

：：＝｛｛IN｜OUT｜INOUT｝ ：埋込み変数〔：標識変数〕
　　　　｜〔｛IN｜OUT｜INOUT｝〕 ｛SQL変数｜SQLパラメタ｜？パラメタ｝
　　　　｜〔IN〕 値式｝

呼び出す手続きのパラメタに対する引数を指定します。IN，OUT，又はINOUTは，CREATE PROCEDUREで指定した手続きのパラメタの入出力モード（パラメタモード）を指定します。

IN，OUT，及びINOUTの指定規則を次の表に示します。

表4‒3　IN，OUT，及びINOUTの指定規則

指定する引数の種別

CALL文の種別

動的実行

UAP埋込み

ルーチン定義中

：埋込み変数〔：標識変数〕

×

○※２

×

SQL変数，SQLパラメタ

×

×

○※１

SQL変数，SQLパラメタを基にしたコンポネント指定

×

×

○※１

？パラメタ

○※１

×

×

上記以外の値式

○※３

○※３

○※３

（凡例）

○：指定できます。

×：指定できません。

注※1

IN，OUT，又はINOUTを指定できます。また，省略もできます。

注※2

IN，OUT，又はINOUTを必ず指定します。

注※3

INを指定できます。また，省略もできます。

(5)　共通規則

引数は，指定した順序でパラメタと対応します。

引数のデータ型は，対応するパラメタのデータ型と互換性がなければなりません。

対応するパラメタのパラメタモードがOUT，又はINOUTの場合で，そのパラメタ値としてNULL値が出力される場合，受け取る引数には標識変数が必要です。

パラメタモードがIN，OUT，又はINOUTのパラメタに対する引数として指定した?パラメタは，それぞれ入力?パラメタ，出力?パラメタ，又は入力?パラメタかつ出力?パラメタになります。

値式中の？パラメタは，入力？パラメタになります。

入力パラメタ，及び出力パラメタには，BOOLEAN型を指定できません。

埋込み変数（標識変数），？パラメタは単純構造にしてください。

パラメタモードがINの引数に，次の指定は記述できません。

集合関数を含む値式

ウィンドウ関数を含む値式

列指定を含む値式

抽象データ型列の属性を示したコンポネント指定を含む値式

パラメタモードがOUT又はINOUTの引数に，抽象データ型列の属性を示したコンポネント指定は記述できません。

引数には，結果のデータ型がBLOB，又は最大長が32,001バイト以上のBINARYとなるスカラ関数SUBSTRを，単独の値式として指定できません。

引数に指定する値式中に，副問合せは指定できません。

手続き定義でDYNAMIC RESULT SETS句に1以上を指定した手続きを呼び出した場合，手続きから次の表に示す結果集合の組が返却されます。ただし，次の表に示す結果集合がDYNAMIC RESULT SETS句に指定した数より多い場合は，DYNAMIC RESULT SETS句に指定した数までの結果集合だけが返却されます。

表4‒4　 手続きから返却される結果集合とその順序

手続きの種類

返却される結果集合

返却順序

Java手続き

手続き定義の外部ルーチン指定で指定したJavaメソッドのjava.sql.ResultSet[]型のパラメタに設定した結果集合

パラメタ指定順序

SQL手続き

手続き中で宣言された結果集合カーソルのうち，手続き終了時に開いた状態であるカーソルの結果集合

カーソルをオープンした順序

呼び出した手続きが結果集合を返却した場合は，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に120

SQLCODE変数に120

SQLSTATE変数に'0100C'

ただし，手続き終了時に開いた状態である結果集合カーソルの数が手続き定義のDYNAMIC RESULT SETS句に指定した数より多い場合は，SQLSTATE変数には'0100E'が設定されます。

(6)　留意事項

インデクスの追加又は削除によって，手続きのSQLオブジェクト中のインデクス情報が無効になった場合は手続きを実行できなくなるため，手続きのSQLオブジェクトを再作成する必要があります。

PURGE TABLE文，COMMIT文，及びROLLBACK文を使用した手続きは，次の環境では実行できません。

OLTP下のUAPから手続きを呼び出す場合

認可識別子を省略した場合の仮定値については，「スキーマパス」を参照してください。

4.7　CLOSE文（カーソルクローズ）

4.7.1　CLOSE文の形式と規則

(1)　機能

カーソルを閉じ，FETCH文による検索結果の取り出しを終わらせます。

(2)　使用権限

なし。

(3)　形式

　CLOSE ｛カーソル名｜拡張カーソル名｝

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

閉じるカーソル名を指定します。閉じるカーソルとは，OPEN文で開いているカーソルです。

拡張カーソル名

閉じるカーソルを識別する拡張カーソル名を指定します。閉じるカーソルとは，OPEN文で開いているカーソル，又は手続きから返却された結果集合の組に割り当てられ，結果集合を参照しているカーソルです。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(5)　共通規則

次のSQLを実行した場合，その時点で開いているカーソルはすべて閉じられます。また，暗黙的ロールバックありのエラーが発生した場合にも，カーソルはすべて閉じられます。

定義系SQL（クライアント環境定義PDCMMTBFDDLにYESを指定している場合）

PURGE TABLE文

COMMIT文

DISCONNECT文

ROLLBACK文

PREPARE文（クライアント環境定義PDPRPCRCLSにYESを指定している場合）

内部DISCONNECT（DISCONNECT文を実行しないでUAPを終了する）

ただし，ホールダブルカーソルは，COMMIT文を実行した場合は閉じられません。PURGE TABLE文を実行し，ホールダブルカーソルで開いている表が検査保留状態に設定された場合，ホールダブルカーソルは閉じられます。

ALLOCATE CURSOR文 形式2で手続きが返却した結果集合の組に割り当てられたカーソルに対してCLOSE文を実行した場合，現在参照している結果集合の次の結果集合が存在するときは，現在参照している結果集合は閉じられます。カーソルは次の結果集合を参照し，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に121

SQLCODE変数に121

SQLSTATE変数に'0100D'

また，このときカーソルは開いた状態となります。

一方，次の結果集合が存在しない場合は，現在参照している結果集合は閉じられ，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02001'

また，このとき拡張カーソル名はどのカーソルも識別しなくなります。

手続きから返却された結果集合の組に対してカーソルを割り当てた場合の一連の操作については，「結果集合返却機能」を参照してください。

(6)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

(7)　使用例

カーソル（CR1）を閉じます。

CLOSE CR1

4.8　DEALLOCATE PREPARE文（SQLの前処理無効化）

4.8.1　DEALLOCATE PREPARE文の形式と規則

(1)　機能

PREPARE文で前処理したSQLを無効にし，SQL文識別子，又は拡張文名の割当てを解除します。

(2)　使用権限

なし。

(3)　形式

　DEALLOCATE PREPARE ｛SQL文識別子｜拡張文名｝

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

PREPARE文で前処理したSQLを識別するために付けた名称を指定します。

SQL文識別子については，「名前の指定」を参照してください。

HiRDBの予約語も使用できますが，使用する場合，予約語と同じ名称でも引用符（"）で囲まないでください。ただし，'SELECT'，及び'WITH'は使用できません。

拡張文名

PREPARE文で前処理したSQLを識別するために付けた拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(5)　共通規則

指定したSQL文識別子，又は拡張文名が識別しているSQLに対してDECLARE CURSORによって宣言された，又はALLOCATE CURSOR文によって割り当てられたカーソルが存在し，そのカーソルが開いた状態である場合は無効にできません。

指定したSQL文識別子，又は拡張文名に対して宣言された，又は割り当てられた閉じた状態のカーソルもすべて無効となります。また，そのカーソルを参照する前処理されたSQLもすべて無効となります。

(6)　留意事項

無効にしたSQL文識別子のSQLがホールダブルカーソルの場合は，ロールバックしてもSQL文識別子は有効にはなりません。

SQL文識別子は，埋込み変数名と同様にコンパイル単位のモジュール内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

(7)　使用例

PREPARE文に指定したSQL文識別子（PRESQL）が識別するSQL文の前処理結果を解放します。

DEALLOCATE PREPARE PRESQL

4.9　DECLARE CURSOR　形式1（カーソル宣言）

4.9.1　DECLARE CURSOR 形式1の形式と規則

(1)　機能

問合せ指定の検索結果をFETCH文で1行ずつ取り出すために，カーソルを宣言します。

形式1では，直接指定したカーソル指定に対するカーソルの宣言をします。

(2)　使用権限

なし。

(3)　形式1<直接指定したカーソル指定に対するカーソルの宣言>

　DECLARE カーソル名 CURSOR
〔WITH HOLD〕〔｛WITH RETURN ｜ WITHOUT RETURN｝〕 FOR
　〈カーソル指定　形式1〉
　　〈問合せ式〉
　　　〈問合せ指定〉
　　　｛SELECT 〔｛ALL｜DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝
　　　　〈表式〉
　　　　FROM 表参照〔，表参照〕…
　　　　　　　〔WHERE  探索条件〕
　　　　　　　〔GROUP  BY  値式〔，値式〕…〕
　　　　　　　〔HAVING  探索条件〕
　　　　｜ 問合せ式 ｝
　　　　〔ORDER BY ｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕
　　　　　　　〔，｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕〕… 〕
　　　　〔LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝
　　　　　　　　｜ ｛リミット行数｜ALL｝ 〔OFFSET オフセット行数〕｝〕
　〈排他オプション〉
　　〔〔｛WITH ｛SHARE｜EXCLUSIVE｝LOCK
　　　　｜WITHOUT LOCK〔｛WAIT｜NOWAIT｝〕｝〕
　　〔｛WITH ROLLBACK｜NO WAIT｝〕〕
　　　　〔FOR｛UPDATE 〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝〕
　　　　〔UNTIL DISCONNECT〕

(4)　オペランド

(a)　カーソル名

カーソルの名称を指定します。

UAP中に指定する場合は，SQLの予約語と同じ名称でも，引用符（"）で囲まないでください。ただし，SQLの予約語と同じ名称を手続き中に指定する場合は，引用符（"）で囲んでください。

カーソル名については，「名前の指定」を参照してください。

(b)　〔WITH HOLD〕

ホールダブルカーソルを使用する場合に指定します。

WITH HOLDは，UNTIL DISCONNECTを指定した場合の機能と同じなので，説明はUNTIL DISCONNECTを参照してください。また，この指定がUNTIL DISCONNECTと重複してもしなくても，機能差はありません。

(c)　〔｛WITH RETURN ｜ WITHOUT RETURN｝〕

SQL手続き中のカーソル宣言で，そのカーソルの結果集合の返却可能性を指定します。

WITH RETURNを指定して宣言したカーソルを結果集合カーソルといいます。

SQL手続き中で宣言された結果集合カーソルを，開いた状態のまま手続きを終了すると，カーソルの結果集合を手続きの呼出し元に返却できます。

結果集合カーソルを宣言するSQL手続き定義のDYNAMIC RESULT SETS句には1以上の値を指定してください。

返却した結果集合の使用方法については，「結果集合返却機能」を参照してください。

(d)　カーソル指定　形式1

問合せの内容を表すカーソルを指定します。

カーソル指定については「カーソル指定　形式1」を，問合せ式については「問合せ式」を，問合せ指定については「問合せ指定」を，表式については「表式」を，探索条件については「探索条件」を参照してください。

(e)　排他オプション

問合せをする場合の排他制御モードと，ほかのユーザが資源を占有していた場合の処置を指定します。

排他オプションについては，「排他オプション」を参照してください。

(f)　〔FOR｛UPDATE 〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝〕

FOR UPDATE 〔OF列名〔，列名〕…〕をFOR UPDATE句といいます。

FOR UPDATE

カーソルを使用して検索中の表に対して，そのカーソルを使用した行の更新，又は削除をして，更にカーソルを使用しない行の更新，削除，又は追加をする場合に指定します。

指定したカーソルを使用して行を更新するUPDATE文，又は削除するDELETE文がモジュール中に含まれている場合に，FOR UPDATE OFを省略するとFOR UPDATEが仮定され，すべての列を更新，追加，又は削除できます。

カーソルを使用して検索中の表に対して，そのカーソル，及びほかのカーソルを使用した行の更新，削除がなく，カーソルを使用しない行の更新，削除，及び追加もしない場合は，オペランドを省略してください。SQL中の排他オプションを省略した場合，排他オプションはpd_isolation_levelの指定値，PDISLLVLの指定値，又はSQLコンパイルオプションで指定するデータ保証レベルの指定値によって決まりますが，PDFORUPDATEEXLOCKにYES，又はSQLコンパイルオプションのデータ保証レベルの後にFOR UPDATE EXCLUSIVEを指定することで，この指定のあるカーソルに対する排他オプションはWITH EXCLUSIVE LOCKに仮定されます。詳細については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

OF列名〔，列名〕…

カーソルを使用して検索中の表に対して，そのカーソルを使用した検索行の更新だけをする場合に，更新する列を指定します。

SELECT文の選択式で指定していない列でも指定できます。ただし，同じ列を2回以上指定できません。また，予備列は指定できません。

カーソルを使用して検索中の表に対して，そのカーソル及びほかのカーソルを使用した行の更新，削除がなく，カーソルを使用しない行の更新，削除，及び追加もしない場合には，オペランドを省略してください。

指定する列名は，AS列名に指定した列名ではなく，最も外側の問合せ指定のFROM句に指定した表の列を指定します。

〔NOWAIT〕

FOR UPDATE句を指定し，かつ排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合と同じ動作をします。ただし，排他オプションを指定した場合，NOWAITは指定できません。

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合の動作については，「排他オプション」を参照してください。

FOR READ ONLY

カーソルを使用して検索中にほかのカーソル，又は直接探索条件を指定して更新する場合に指定します。この指定は，検索中の更新が検索結果に影響を与えないようにするためです。

(g)　〔UNTIL DISCONNECT〕

ホールダブルカーソルを使用する場合に指定します。

この指定をしたときの機能は，WITH HOLDを指定した場合と全く同じです。また，この指定がWITH HOLDと重複してもしなくても，機能差は生じません。

なお，ホールダブルカーソルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

ホールダブルカーソルについての規則を次に示します。

次の場合，ホールダブルカーソルは使用できません。

ホールダブルカーソルに未対応のプラグイン※を使用した抽象データ型の列を指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定して導出した，名前付きの導出表に対する問合せを指定した場合

ON COMMIT DELETE ROWSを指定して定義した一時表に対する問合せ

ホールダブルカーソルが開いている場合，定義系SQLは実行できません。

ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行後，そのSELECT文中で使用している表に対してPURGE TABLE文を実行すると，カーソルは閉じた状態になります。

ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行してからDISCONNECTするまでの間に，そのSELECT文中で使用している表に対して，ほかのユーザが定義系SQL文を発行すると，定義系SQLは排他待ちの状態になります。また，ホールダブルカーソルを使用したSELECT文に対する前処理が有効な間に，そのSELECT文中で使用している表に対して，ほかのユーザが定義系SQL文を発行すると，定義系SQLは排他待ちの状態になります。

注※

プラグインのホールダブルカーソルへの対応状況については，ディクショナリ表SQL_PLUGINSのPLUGIN_HOLDABLE列で確認できます。ディクショナリ表SQL_PLUGINSについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

宣言したカーソルは，閉じた状態になります。

DECLARE CURSOR中のSELECT文で指定した埋込み変数，SQL変数，又はSQLパラメタの値は，カーソルを開いてからカーソルを閉じるまでこのカーソルのOPEN文実行時の値が有効です。値を変更したい場合は，いったんカーソルを閉じてから，再度開いてください。

1個のUAPでは，最大1,023個のカーソルを宣言できます。

カーソル指定又は排他オプション中に次のどれかの指定を含む場合は，そのカーソルを使用した更新及び削除はできません。また，FOR UPDATE句の指定もできません。

(5-a) UNION 〔ALL〕，又はEXCEPT〔ALL〕

(5-b) 最も外側の問合せ指定のFROM句に指定した表を，副問合せのFROM句に指定

(5-c) 最も外側の問合せ指定での表の結合

(5-d) 最も外側の問合せ指定でのFROM句の導出表

(5-e) 最も外側の問合せ指定でのSELECT DISTINCT

(5-f) 最も外側の問合せ指定でのGROUP BY句

(5-g) 最も外側の問合せ指定でのHAVING句

(5-h) 最も外側の問合せ指定に対する集合関数

(5-i) 最も外側の問合せ指定に対するウィンドウ関数

(5-j) 最も外側の問合せ指定のFROM句中で，次に示すどれかのビュー表を指定

ビュー定義文で上記(5-a)〜(5-i)を指定して定義したビュー表

ビュー定義文で最も外側の問合せ指定のSELECT句に，列指定以外の値式を指定して定義したビュー表

ビュー定義文でREAD ONLYを指定したビュー表

(5-k) WITHOUT LOCK NOWAIT

(5-l) WITH句を指定した問合せ式本体の最も外側の問合せ指定のFROM句に問合せ名を指定

そのカーソルを指定した行の更新，又は削除がある場合FOR READ ONLY句は指定できません。

FOR READ ONLY句を指定した場合，次に示す制限があります。

(5-a) 選択式中に，結果が次のデータ型になるスカラ演算，関数呼出し，及びコンポネント指定は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

(5-b) 選択式中のWRITE指定の出力BLOB値には，列指定だけ指定できます。

(5-c) GET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

(6)　参照制約に関する規則

ホールダブルカーソルを使用して，外部キーの定義されている表を検索している場合，検索中の表が検査保留状態となったときは，カーソルは閉じた状態になります。

(7)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

カーソル宣言は，この宣言で使用したカーソル名を参照するどのSQL文よりも先行して記述する必要があります。

DECLARE CURSORは実行文ではないため，SQLCODEにリターンコードは返されません。したがって，リターンコードの判定はしないでください。

SQL最適化オプションの更新SQLの作業表作成抑止を適用して，更にインデクスキー値無排他機能を使用すると，FOR UPDATE又はFOR UPDATE OFを指定しないカーソルの使用中に，行の更新，追加，又は削除ができます。

FOR READ ONLYを指定している場合，HiRDBが作業表を作成することがあります。このとき，作業表の行長によっては，FOR READ ONLYの処理が制限されることがあります。作業表の行長については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(8)　使用例

在庫表（ZAIKO）から，行を1行ずつ取り出すためにカーソル（CR1）を宣言します。

DECLARE CR1 CURSOR FOR
    SELECT SCODE,SNAME,COL,TANKA,ZSURYO
        FROM ZAIKO

在庫表（ZAIKO）から，単価（TANKA）が5,000円以上の行を1行ずつ取り出すためにカーソル（CR1）を宣言します。

DECLARE CR1 CURSOR FOR
    SELECT * FROM ZAIKO
        WHERE TANKA >= 5000

在庫表（ZAIKO）から，カーソル（CR1）を使用してすべての行を検索しながら単価（TANKA）を1割引にし，更に行を挿入します。

DECLARE CR1 CURSOR FOR
    SELECT * FROM ZAIKO
        FOR UPDATE
OPEN CR1
  FETCH CR1 INTO ＜各列を取り出す変数名＞
UPDATE ZAIKO
    SET TANKA = ＜単価の１割引の値＞
        WHERE CURRENT OF CR1
INSERT INTO ZAIKO VALUES(＜各列の挿入値＞)
CLOSE CR1

在庫表（ZAIKO）から，カーソル（CR1）を使用してすべての行を検索しながら単価（TANKA）を1割引にします。

DECLARE CR1 CURSOR FOR
    SELECT * FROM ZAIKO
        FOR UPDATE OF TANKA
OPEN CR1
FETCH CR1 INTO ＜各列を取り出す変数名＞
UPDATE ZAIKO
    SET TANKA = ＜単価の１割引の値＞
        WHERE CURRENT OF CR1
CLOSE CR1

在庫表（ZAIKO）からカーソル（CR1）を使用してすべての行を検索中に，カーソルを使用しないで，直接商品名（SNAME）がセーターの行を削除します。

DECLARE CR1 CURSOR FOR
    SELECT * FROM ZAIKO
        FOR READ ONLY
OPEN CR1
FETCH CR1 INTO ＜各列を取り出す変数名＞
DELETE FROM ZAIKO
    WHERE SNAME=N'セーター'
CLOSE CR1

4.10　DECLARE CURSOR　形式2（カーソル宣言）

4.10.1　DECLARE CURSOR 形式2の形式と規則

(1)　機能

問合せ指定の検索結果をFETCH文で1行ずつ取り出すために，カーソルを宣言します。

形式2では，PREPARE文で前処理したSELECT文（動的SELECT文）に対するカーソルの宣言をします。

(2)　使用権限

なし。

(3)　形式2 <PREPARE文で前処理したSELECT文（動的SELECT文）に対するカーソルの宣言>

　DECLARE カーソル名 CURSOR
　　　〔WITH HOLD〕〔｛WITH RETURN ｜ WITHOUT RETURN｝〕 FOR SQL文識別子

(4)　オペランド

(a)　カーソル名

カーソルの名称を指定します。

UAP中で指定する場合は，SQLの予約語と同じ名称でも，引用符（"）で囲まないでください。ただし，SQLの予約語と同じ名称を手続き中に指定する場合は，引用符（"）で囲んでください。

カーソル名については，「名前の指定」を参照してください。

(b)　〔WITH HOLD〕

ホールダブルカーソルを使用する場合に指定します。ただし，次の場合，ホールダブルカーソルは使用できません。

ホールダブルカーソルに未対応のプラグイン※を使用した抽象データ型の列を指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定して導出した，名前付きの導出表に対する問合せを指定した場合

リストを介した検索の場合

なお，ホールダブルカーソルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

注※

プラグインのホールダブルカーソルへの対応状況については，ディクショナリ表SQL_PLUGINSのPLUGIN_HOLDABLE列で確認できます。ディクショナリ表SQL_PLUGINSについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(c)　〔｛WITH RETURN ｜ WITHOUT RETURN｝〕

SQL手続き中のカーソル宣言で，そのカーソルの結果集合の返却可能性を指定します。WITH RETURNを指定して宣言したカーソルを結果集合カーソルといいます。SQL手続き中で宣言された結果集合カーソルを，開いた状態のまま手続きを終了すると，カーソルの結果集合を手続きの呼出し元に返却できます。返却した結果集合の使用方法については，「結果集合返却機能」を参照してください。

(d)　SQL文識別子

PREPARE文で前処理したSELECT文に付けられたSQL文識別子を指定します。

(5)　共通規則

宣言したカーソルは，閉じた状態になります。

宣言したカーソルを，UPDATE文，又はDELETE文で使用できません。

同じ名前のSQL文識別子に対して，複数のカーソル宣言をした場合，WITH HOLD指定のあるカーソル宣言と，WITH HOLD指定のないカーソル宣言を混在させることはできません。

(6)　参照制約に関する規則

ホールダブルカーソルを使用して，外部キーの定義されている表を検索している場合，検索中の表が検査保留状態となったときは，カーソルは閉じた状態になります。

(7)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

対応するPREPARE文は，カーソル宣言より先に記述してください。

カーソル宣言は，この宣言で使用したカーソル名を参照するどのSQL文よりも先に記述する必要があります。

DECLARE CURSORは実行文ではないため，SQLCODEにリターンコードは返されません。したがって，リターンコードの判定はしないでください。

SQL最適化オプションの更新SQLの作業表作成抑止を適用して，更にインデクスキー値無排他機能を使用すると，FOR UPDATE又はFOR UPDATE OFを指定しないカーソルの使用中に，行の更新，追加，又は削除ができます。

(8)　使用例

前処理したSELECT文（SQL文識別子：SEL）によって指定した行を1行ずつ取り出すために，カーソル（CR1）を宣言します。

DECLARE CR1 CURSOR FOR SEL

4.11　DELETE文　形式1（行削除）

4.11.1　DELETE文 形式1の形式と規則

(1)　機能

表から指定した探索条件を満足する行，又はカーソルが指している行を削除します。

(2)　使用権限

表に対するDELETE権限を持つユーザが，その表の行を削除できます。

ただし，探索条件中に副問合せを指定する場合は，その副問合せ指定の表に対してSELECT権限が必要です。

(3)　形式

　DELETE FROM 〔認可識別子.〕表識別子
　　　　　　　　　〔IN （RDエリア名指定）〕〔〔AS〕相関名〕
　　　　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　　　〔WHERE ｛探索条件｜CURRENT OF ｛カーソル名｜拡張カーソル名｝｝〕
　　　　　　　　　〔WITH ROLLBACK〕
　　　　　　　　　〔WRITE IMMEDIATE〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子

認可識別子

表を所有するユーザの認可識別子を指定します。

認可識別子に，"MASTER"は指定できません。認可識別子を省略した場合については，「名前の修飾」を参照してください。

表識別子

削除する行がある表を指定します。

表識別子についての規則を次に示します。

読み込み専用のビュー表は，行の挿入，更新，及び削除ができません。

読み込み専用のビュー表については，「CREATE 〔PUBLIC〕VIEW（ビュー定義，パブリックビュー定義）」の共通規則を参照してください。

ビュー表からの行の削除を指定した場合は，そのビュー表の操作の対象の基になる実表から行を削除します。

表名の有効範囲はDELETE文全体です。

(b)　〔IN （RDエリア名指定）〕

IN

アクセス対象のRDエリアを指定します。なお，表識別子に指定した表が一時表の場合は指定できません。

RDエリア名指定：：＝値指定

表識別子に指定した表を格納しているRDエリアのうち，アクセスするRDエリアの名称をVARCHAR型，CHAR型，MVARCHAR型，又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ（，）で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については，「名前の指定」を参照してください。また，値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符（"）で囲んだ場合は，引用符（"）の外側の空白だけを無視します。

カーソル名又は拡張カーソル名の指定がある場合は，カーソル宣言で宣言したカーソルで指定したRDエリアと同じRDエリアの集合を指定してください（順不同）。指定しない場合はエラーとなります。

インナレプリカ機能を適用しているRDエリアを指定する場合，オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は，カレント切り替えコマンド（pddbchgコマンド），又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

(c)　〔AS〕相関名

削除対象の表に対して相関名を使用する場合に指定します。

相関名の有効範囲はDELETE文全体です。削除対象の表識別子は有効範囲を持ちません。

(d)　使用インデクスのSQL最適化指定

使用インデクスのSQL最適化指定については，「SQL最適化指定」を参照してください。

(e)　WHERE｛探索条件｜CURRENT OF ｛カーソル名｜拡張カーソル名｝｝

WHERE

WHERE句を省略すると，指定した表のすべての行が削除されます。SQL連絡領域のSQLWARN4領域に警告フラグ"W"が設定されます。

探索条件

削除する行を選択する条件を指定します。

探索条件中に埋込み変数，?パラメタ，SQL変数，又はSQLパラメタを指定できます。ただし，PREPARE文で前処理されるDELETE文の探索条件中では，?パラメタだけ指定できます。

SQL手続き中では，SQL変数，又はSQLパラメタを使用します。Java手続き中の指定値については，マニュアル「HiRDB Version 9 UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。

探索条件については，「探索条件」を参照してください。

カーソル名

削除する行を指すカーソルの名称を指定します。

カーソル名で指定するカーソルは，カーソル宣言で宣言されたカーソルです。

カーソル名で指定するカーソルは，OPEN文で開き，FETCH文で削除する行に位置づけてください。なお，そのカーソルに対するOPEN文，FETCH文，CLOSE文及びDELETE文は，同一トランザクション内で実行してください（ただし，ホールダブルカーソルの場合を除く）。

カーソル名で指定するカーソルは，DELETE文実行後は，指している行がありません。削除した行より後の行を更新，又は削除する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させてください。

拡張カーソル名

削除する行を指すカーソルを識別する拡張カーソル名を指定します。

ALLOCATE CURSOR文で割り当てられたカーソルを識別している拡張カーソル名を指定してください。ただし，結果集合カーソルは指定できません。

拡張カーソル名が識別するカーソルは，開いた状態であり，かつ削除する行に位置づけられている必要があります。

拡張カーソル名が識別するカーソルは，DELETE文実行後は指している行がありません。削除した行より後の行を更新，又は削除する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させてください。

拡張カーソル名を指定する場合は，FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については，「動的SELECT文　形式1（動的検索）」のオペランド規則のFOR UPDATE句を参照してください。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(f)　WITH ROLLBACK

削除する表がほかのユーザで使用されているとき，トランザクションを取り消して無効にする場合に指定します。

WITH ROLLBACKを省略した場合は，削除する表がほかのユーザのトランザクションで使用されているとき，そのトランザクションが終了してから実行します。

(g)　WRITE IMMEDIATE

表オプションにWITHOUT ROLLBACKの指定がある表に対する更新処理で，更新完了時にシステムログを書き出す場合，このオプションを指定してください。WITHOUT ROLLBACK指定のない表に対して，このオプションを指定しても無効になります。

更新完了時にシステムログを書き出す効果については，マニュアル「HiRDB Version 9 UAP開発ガイド」の採番業務で使用する表を参照してください。

(5)　共通規則

DELETE文が正常に実行された場合は，SQL連絡領域のSQLERRD[2]領域に削除した行数が設定されます。

削除の対象になる行がない場合は，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

LOB列又はLOB属性を格納するユーザLOB用RDエリアが更新凍結状態の場合，そのLOB列又はLOB属性は削除できません（削除しようとすると凍結済みエラーとなります）。

表が改竄防止表であり，かつ指定した探索条件を満足する行の中に削除禁止期間の行がある場合は，探索条件を満足するすべての行を削除しないでエラーとなります。

表が改竄防止表であり，かつ指定したカーソルが指している行が削除禁止期間である場合，行を削除しないでエラーとなります。

WITHOUT ROLLBACKを指定した表に対して，DELETE文を実行する場合，インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

共用表の行を削除する場合，事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表の行を削除しようとすると，エラーとなり行を削除できません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(6)　参照制約に関する規則

被参照表，参照表の行を削除する場合の規則は「CREATE TABLE（表定義）」の参照動作を参照してください。

制約動作がRESTRICTで定義された被参照表の行を削除する場合，削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため，参照表を検索します。このとき，参照表の検索時のデータ保証レベルは共用モードになります。そのため，制約動作がRESTRICTで定義された被参照表の行を削除するときに，ほかのトランザクションによって参照表に対する操作が行われていると，そのトランザクションが決着するまでその行削除は待ち状態になります。

次の条件が重なった場合，参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また，制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

参照表の行を削除するトランザクションと，被参照表の行を更新，又は削除するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で削除する行の主キー構成列の値と，被参照表で更新，又は削除する行の外部キー構成列の値と同じである

参照表の行を削除するトランザクションをコミット，被参照表の行を更新，又は削除するトランザクションをロールバックする

(7)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

表が改竄防止表であり，かつ削除禁止期間を指定している場合，削除対象行の挿入日付と削除禁止期間の和が9999年12月31日を超えるとオーバフローが発生します。

(8)　使用例

在庫表（ZAIKO）から商品コード（SCODE）列が302Sの行を削除します。

DELETE FROM ZAIKO
     WHERE SCODE = '302S'

在庫表（ZAIKO）から埋込み変数（：XSCODE）に読み込まれた商品コード（SCODE）列の行を削除します。

DELETE FROM ZAIKO
    WHERE SCODE = :XSCODE

在庫表（ZAIKO）からカーソル（CR1）で指定した行を削除します。

DELETE FROM ZAIKO
    WHERE CURRENT OF CR1

4.12　DELETE文　形式2（配列を使用した行削除）

4.12.1　DELETE文 形式2の形式と規則

(1)　機能

表から，指定した探索条件を満足する行を削除します。配列形式の埋込み変数を指定して，複数回の削除処理を一括して実行できます。

(2)　使用権限

表に対するDELETE権限を持つユーザが，その表の行を削除できます。

ただし，探索条件中に副問合せを指定する場合は，その副問合せ指定の表に対してSELECT権限が必要です。

(3)　形式<埋込み変数配列を指定して，複数回の削除を実行>

　FOR ：埋込み変数
　DELETE FROM 〔認可識別子.〕表識別子
　 　　　　　　　〔IN （RDエリア名指定）〕〔〔AS〕相関名〕
　　　　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　　　WHERE 探索条件
　　　　　　　　　〔WITH ROLLBACK〕
　　　　　　　　　〔WRITE IMMEDIATE〕

(4)　オペランド

FOR，IN (RDエリア名指定)，探索条件以外のオペランド，及びオペランド規則については，「DELETE文　形式1（行削除）」を参照してください。

(a)　FOR ：埋込み変数

埋込み変数配列を使用して削除を行う回数を設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は1から4,096までの範囲で，かつ埋込み変数配列，及び標識変数配列の要素数以下にしてください。0及び負の値は設定できません。範囲外の値を設定した場合は実行時にエラーとなります。

埋込み変数配列

配列形式で宣言した埋込み変数です。NULL値以外の値で探索条件として使用するための配列変数を指定します。探索条件として使用する値を埋込み変数配列の各要素に設定してください。探索条件として使用する値にNULL値を含む場合は，埋込み変数配列と標識変数配列を両方指定します。

標識変数配列

配列形式で宣言した標識変数です。埋込み変数配列の各要素の値がNULL値かどうかを示す値を，標識変数配列の対応する要素に設定してください。設定する値については，「標識変数の値の設定」を参照してください。

(b)　〔IN （RDエリア名指定）〕

RDエリア名指定を埋込み変数で指定する場合は，埋込み変数配列で指定してください。配列でない埋込み変数を指定した場合はエラーとなります。そのほかのオペランド規則については，「DELETE文　形式1（行削除）」を参照してください。

(c)　WHERE探索条件

探索条件

削除する行を選択する条件を指定します。探索条件に配列形式でない埋込み変数は指定できません。

(5)　共通規則

FOR句以外に埋込み変数配列を一つ以上指定してください。指定しない場合はエラーとなります。

FOR句以外に配列形式でない埋込み変数を指定するとエラーとなります。

埋込み変数配列のデータ型は対応する列のデータ型，又は変換できるデータ型にしてください。

埋込み変数配列，及び標識変数配列の要素数は1から4,096までの範囲にしてください。範囲外の値を指定した場合はエラーとなります。また，"FOR ：埋込み変数"で指定する要素数の最大値以上になるようにしてください。

各埋込み変数配列，及び標識変数配列で１回の削除処理によって評価される要素は同じ要素番号の要素となります。

DELETE文形式2は埋込み変数配列，及び標識変数配列を含むため，PREPARE文で前処理することはできません。動的に実行する場合については，「EXECUTE文　形式2（配列を使用したSQLの実行）」を参照してください。

配列を使用したDELETEは手続きの中では使えません。

配列を使用したDELETEでは，BLOB型，最大長が32,001バイト以上のBINARY型及び抽象データ型は扱えません。

DELETE文が正常に実行された場合は，SQL連絡領域のSQLERRD[2]領域に削除した行数が設定されます。

削除の対象になる行がない場合は，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

表が改竄防止表であり，かつ指定した探索条件を満足する行の中に削除禁止期間の行がある場合は，探索条件を満足するすべての行を削除しないでエラーとなります。

削除するどれかの行でエラーが発生した場合，ロールバックされます。

WITHOUT ROLLBACKを指定した表に対して，DELETE文を実行する場合，インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

共用表の行を削除する場合，事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表の行を削除削除しようとすると，エラーとなり行を削除できません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(6)　参照制約に関する規則

被参照表，参照表の行を削除する場合の規則は「CREATE TABLE（表定義）」の参照動作を参照してください。

制約動作がRESTRICTで定義された被参照表の行を削除する場合，削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため，参照表を検索します。このとき，参照表の検索時のデータ保証レベルは共用モードになります。そのため，制約動作がRESTRICTで定義された被参照表の行を削除するときに，ほかのトランザクションによって参照表に対する操作が行われていると，そのトランザクションが決着するまでその行削除は待ち状態になります。

次の条件が重なった場合，参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また，制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

参照表の行を削除するトランザクションと，被参照表の行を更新，又は削除するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で削除する行の主キー構成列の値と，被参照表で更新，又は削除する行の外部キー構成列の値と同じである

参照表の行を削除するトランザクションをコミット，被参照表の行を更新，又は削除するトランザクションをロールバックする

(7)　使用例

Ｃ言語の配列変数に設定した商品コード（SCODE）の値別に，在庫表（ZAIKO）の行の削除を複数回分一括して実行します。

XDELETE_NUM = 5;
EXEC SQL FOR :XDELETE_NUM
      DELETE FROM ZAIKO
WHERE SCODE = :XSCODE:ISCODE;

4.13　準備可能動的DELETE文：位置付け（前処理可能なカーソルを使用した行削除）

4.13.1　準備可能動的DELETE文：位置付けの形式と規則

(1)　機能

カーソルが指している行を削除します。PREPARE文で前処理してからEXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

(2)　使用権限

表に対するDELETE権限を持つユーザが，その表の行を削除できます。

(3)　形式

　DELETE 〔FROM 〔認可識別子.〕表識別子
　　　　　　　　　〔IN （RDエリア名指定）〕〔〔AS〕 相関名〕
　　　　　　　　　〔使用インデクスのSQL最適化指定〕〕
　　　　　　　　　   WHERE CURRENT OF GLOBAL カーソル名
　　　　　　　　　〔WITH ROLLBACK〕
　　　　　　　　　〔WRITE IMMEDIATE〕

(4)　オペランド

GLOBAL，カーソル名以外のオペランド，及びオペランド規則については，「DELETE文　形式1（行削除）」を参照してください。

(a)　WHERE CURRENT OF GLOBALカーソル名

GLOBAL

カーソル名の有効範囲としてGLOBALを指定します。

カーソル名

削除する行を指すカーソルの名称を指定します。

カーソル名で指定するカーソルは，ALLOCATE CURSOR文で指定した拡張カーソル名が識別するカーソルです。ALLOCATE CURSOR文で指定した拡張カーソル名の値を指定してください。ただし，結果集合カーソルは指定できません。

実行時には，カーソル名で指定するカーソルは，開いた状態であり，かつ削除する行に位置づけられている必要があります。

カーソル名で指定するカーソルは，DELETE文実行後は，指している行がありません。削除した行より後の行を更新，又は削除する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させてください。

拡張カーソル名を指定する場合は，FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については，「動的SELECT文　形式1（動的検索）」のオペランド規則のFOR UPDATE句を参照してください。

(5)　共通規則

PREPARE文で前処理してから，EXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行ってください。

表識別子を省略する場合は，前処理する前に，ALLOCATE CURSOR文によって動的SELECT文にカーソルが割り当てられている必要があります。このとき，カーソルを割り当てた動的SELECT文に指定している検索対象の表を仮定します。表識別子を指定する場合には，前処理する前に，動的SELECT文にカーソルが割り当てられている必要はありません。

そのほかの共通規則については，DELETE文 形式1の共通規則が適用されます。

(6)　参照制約に関する規則

DELETE文 形式1の参照制約に関する規則が適用されます。

(7)　留意事項

DELETE文 形式1の留意事項が適用されます。

(8)　使用例

在庫表（ZAIKO）からカーソル（cr（値：'CR1'））で指定した行を削除します。

PREPARE :sel FOR 'SELECT * FROM ZAIKO FOR UPDATE'
＜埋込み変数crに'CR1'を設定＞
ALLOCATE CURSOR GLOBAL :cr FOR GLOBAL :sel
OPEN GLOBAL :cr
FETCH GLOBAL :cr INTO ＜各列を取り出す変数名＞
PREPARE PRE1 FOR
    'DELETE FROM ZAIKO WHERE CURRENT OF GLOBAL CR1'
EXECUTE PRE1
DEALLOCATE PREPARE GLOBAL :sel

4.14　DESCRIBE文　形式1（検索情報，入出力情報の受け取り）

4.14.1　DESCRIBE文 形式1の形式と規則

(1)　機能

PREPARE文で前処理したSQLの検索項目情報，又は出力?パラメタ情報をSQL記述領域（データコード，データ長など）に受け取ります。

受け取り情報の詳細は，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。PREPARE文で前処理したSQLがSQLの検索項目情報，又は出力?パラメタ情報を持たない場合には，SQL記述領域のSQLD領域に0が設定されます。

(2)　使用権限

なし。

(3)　形式1 <検索項目情報，又は出力?パラメタ情報の受け取り>

　DESCRIBE 〔OUTPUT〕 ｛SQL文識別子｜拡張文名｝ INTO
　　　　　　　〔：〕SQL記述領域名〔〔：〕列名記述領域名〕
　　　　　　　〔TYPE〔：〕型名記述領域名〕
　　　　　　　〔CHARACTER_SET〔：〕文字集合名記述領域名〕

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

PREPARE文で指定したSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　〔：〕SQL記述領域名〔〔：〕列名記述領域名〕

SQL記述領域名

SQLの検索項目情報（前処理したSQLがSELECT文の場合），又は出力?パラメタ情報（前処理したSQLがCALL文の場合）を受け取るSQL記述領域の名称を指定します。

SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

列名記述領域名

検索項目の名称，又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

列名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(c)　〔TYPE〔：〕型名記述領域名〕

型名記述領域名

検索項目のユーザ定義型名を受け取る型名記述領域を指定します。

型名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(d)　〔CHARACTER_SET〔：〕文字集合名記述領域名〕

文字集合名記述領域名

検索項目情報（前処理したSQLがSELECT文の場合），又は出力？パラメタ情報（前処理したSQLがCALL文の場合）の文字集合名を受け取る文字集合名記述領域を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

UAPは，DESCRIBE文を実行する前に，SQL記述領域にSQLVARの数（SQLN領域）を設定してください。

SQLDATAとSQLINDはDESCRIBE文実行時にクリアされるので，DESCRIBE文を使用する場合は，その実行後に値を設定してください。

列名記述領域名を指定する場合は，対応するPREPARE文でWITH SQLNAME OPTIONを指定してください。

列名記述領域名は，検索項目の名称，又はルーチンのパラメタ名を受け取る場合だけ指定してください。ただし，ルーチンのパラメタ名は，CALL文の引数に単独で？パラメタを指定した場合にだけ受け取ることができます。？パラメタを含む値式を指定した場合は，列名記述領域の名称の長さが0になります。

型名記述領域名を指定する場合は，対応するPREPARE文でWITH〔ALL〕TYPE OPTIONを指定してください。

型名記述領域名は，検索項目のユーザ定義型名を受け取る場合だけ指定してください。

文字集合名記述領域は，検索項目情報（前処理したSQLがSELECT文の場合），又は出力？パラメタ情報（前処理したSQLがCALL文の場合）のデータ型が文字データ型で，文字集合を指定している場合だけ指定してください。

(6)　留意事項

SQL文識別子は，埋込み変数名と同様に，コンパイル単位のファイル内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

出力？パラメタがユーザ定義型の手続きの場合，ユーザ定義型の出力？パラメタに対して型名情報は設定されません。

DESCRIBE〔OUTPUT〕文を使用しなくても，PREPARE文でOUTPUTを指定した場合，DESCRIBE〔OUTPUT〕で得られる情報と同様の情報を得ることもできます。

ユーザ定義型の所有者名の長さが9文字以上の場合，型名記述領域を使用できません。

(7)　使用例

PREPARE文で前処理したSELECT文（SQL文識別子：PRESQL）の検索項目情報，及び検索項目の名称，又はルーチンのパラメタ名を，SQL記述領域，及び列名記述領域に指定します。

DESCRIBE PRESQL INTO :SQLDA :SQLCNDA

PREPARE文で前処理したSELECT文（拡張文名：pre）の検索項目情報，及び検索項目の名称を，SQL記述領域，及び列名記述領域に指定します。

PREPARE GLOBAL :pre FOR :sel WITH SQLNAME OPTION
DESCRIBE GLOBAL :pre INTO :SQLDA :SQLCNDA

4.15　DESCRIBE文　形式2（検索情報，入出力情報の受け取り）

4.15.1　DESCRIBE文 形式2の形式と規則

(1)　機能

PREPARE文で前処理したSQLの入力?パラメタ情報をSQL記述領域（データコード，データ長など）に受け取ります。

受け取り情報の詳細は，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。PREPARE文で前処理したSQLが入力?パラメタ情報を持たない場合には，SQL記述領域のSQLD領域に0が設定されます。

(2)　使用権限

なし。

(3)　形式2 <入力?パラメタ情報の受け取り>

　DESCRIBE INPUT ｛SQL文識別子｜拡張文名｝ INTO
　　　　　　　〔：〕SQL記述領域名〔〔：〕列名記述領域名〕
　　　　　　　〔CHARACTER_SET〔：〕文字集合名記述領域名〕

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

PREPARE文で指定したSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　〔：〕SQL記述領域名〔〔：〕列名記述領域名〕

SQL記述領域名

入力?パラメタ情報を受け取るSQL記述領域の名称を指定します。

SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

列名記述領域名

検索項目の名称，又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

列名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(c)　〔CHARACTER_SET〔：〕文字集合名記述領域名〕

文字集合名記述領域名

入力？パラメタ情報の文字集合名を受け取る文字集合名記述領域を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

UAPは，DESCRIBE文を実行する前に，SQL記述領域にSQLVARの数（SQLN領域）を設定してください。

SQLDATAとSQLINDはDESCRIBE文実行時にクリアされるので，DESCRIBE文を使用する場合は，その実行後に値を設定してください。

列名記述領域名を指定する場合は，対応するPREPARE文でWITH SQLNAME OPTIONを指定してください。

列名記述領域名は，検索項目の名称，又はルーチンのパラメタ名を受け取る場合だけ指定してください。ただし，ルーチンのパラメタ名は，CALL文の引数に単独で？パラメタを指定した場合にだけ受け取ることができます。？パラメタを含む値式を指定した場合は，列名記述領域の名称の長さが0になります。

文字集合名記述領域は，入力？パラメタ情報のデータ型が文字データ型で，文字集合を指定している場合だけ指定してください。

(6)　留意事項

SQL文識別子は，埋込み変数名と同様に，コンパイル単位のファイル内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

DESCRIBE INPUT文を使用しなくても，PREPARE文でINPUTを指定した場合，DESCRIBE INPUTで得られる情報と同様の情報を得ることができます。

4.16　DESCRIBE CURSOR文（カーソルの検索情報の受け取り）

4.16.1　DESCRIBE CURSOR文の形式と規則

(1)　機能

手続きから返却された結果集合を参照するカーソルの問合せの検索項目情報をSQL記述領域（データコード，データ長など）に受け取ります。

受け取り情報の詳細は，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(2)　使用権限

なし。

(3)　形式1 <カーソルの検索項目情報の受け取り>

　DESCRIBE 〔OUTPUT〕 CURSOR 拡張カーソル名 STRUCTURE  INTO
　　　　　　　〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

(4)　オペランド

CURSOR 拡張カーソル名 STRUCTURE以外のオペランドについては，「DESCRIBE文　形式1（検索情報，入出力情報の受け取り）」を参照してください。

(a)　CURSOR 拡張カーソル名 STRUCTURE

拡張カーソル名

ALLOCATE CURSOR文 形式2で手続から返却された結果集合の組に割り当てられたカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

SQL記述領域名

カーソルの検索項目情報を受け取るSQL記述領域の名称を指定します。

SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

文字集合名記述領域名

カーソルの検索項目情報の文字集合名を受け取る文字集合名記述領域を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

UAPは，DESCRIBE文を実行する前に，SQL記述領域にSQLVARの数（SQLN領域）を設定してください。

SQLDATAとSQLINDはDESCRIBE文実行時にクリアされるので，DESCRIBE文を使用する場合は，その実行後に値を設定してください。

(6)　使用例

手続きPROC1から返却された結果集合の組みに対して割り当てたカーソル（拡張カーソル名：cr，有効範囲：GLOBAL）の検索項目情報を，SQL記述領域に設定します。

CALL PROC1()
ALLOCATE GLOBAL :cr FOR PROCEDURE PROC1
DESCRIBE CURSOR GLOBAL :cr STRUCTURE INTO :SQLDA

4.17　DESCRIBE TYPE文（ユーザ定義型の定義情報の受け取り）

4.17.1　DESCRIBE TYPE文の形式と規則

(1)　機能

PREPARE文で前処理したSQLの検索項目情報にユーザ定義型が直接又は間接的に含まれる場合，そのユーザ定義型の定義情報（各属性のデータコード，データ長など）をSQL記述領域に受け取ります。※

PREPARE文でWITH ALL TYPE OPTIONを指定しないで前処理した場合，ユーザ定義型の定義情報は受け取れません。また，受け取ろうとするユーザ定義型の属性の隠蔽レベルがすべてPUBLIC以外の場合，SQL記述領域のSQLD領域に0が設定されます。

注※

直接ユーザ定義型が含まれる場合とは，検索項目情報の列がユーザ定義型のことをいい，間接的にユーザ定義型が含まれる場合とは，検索項目情報の列がユーザ定義型で，更にその列にユーザ定義型の属性がある状態（つまりユーザ定義型がネストしている状態）をいいます。

(2)　使用権限

なし。

(3)　形式

　DESCRIBE TYPE ：埋込み変数1 ：埋込み変数2 FOR ｛SQL文識別子｜拡張文名｝ INTO
　　　　　　　　　〔：〕SQL記述領域名 〔〔：〕列名記述領域名〕
　　　　　　　　　〔TYPE 〔：〕型名記述領域名〕

(4)　オペランド

(a)　TYPE ：埋込み変数1 ：埋込み変数2 FOR ｛SQL文識別子｜拡張文名｝

埋込み変数1

ユーザ定義型の所有者を格納したVARCHAR(30)の埋込み変数を指定します。

埋込み変数2

ユーザ定義型のデータ型識別子を格納したVARCHAR(30)の埋込み変数を指定します。

SQL文識別子

PREPARE文で指定したSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　〔：〕SQL記述領域名 〔〔：〕列名記述領域名〕 〔TYPE 〔：〕型名記述領域名〕

SQL記述領域名

ユーザ定義型の属性の情報を受け取るSQL記述領域の名称を指定します。SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

列名記述領域名

ユーザ定義型の属性名を受け取る列名記述領域を指定します。列名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

型名記述領域名

ユーザ定義型の属性がユーザ定義型の場合，そのユーザ定義型のユーザ定義型名を受け取る型名記述領域を指定します。型名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

UAP中では，DESCRIBE TYPE文を実行する前に，SQL記述領域にSQLVARの数（SQLN領域）を設定しておく必要があります。

ユーザ定義型の属性のデータ型がSQL記述領域に，属性の名称が列名記述領域に，属性のデータ型がユーザ定義型の場合のユーザ定義型名が型名記述領域にそれぞれ設定されます。

指定した抽象データ型が上位のデータ型の属性を継承している場合，継承している属性の情報も設定されます。この場合，設定される順序は，継承している属性，固有の属性の順です。

PREPARE文で指定したSQLの検索項目に直接又は間接的に含まれるユーザ定義型以外のユーザ定義型は指定できません。

隠蔽レベルがPUBLIC以外の属性は定義情報を取得できません。

列名記述領域名を指定する場合は，対応するPREPARE文でWITH SQLNAME OPTIONを指定してください。

(6)　留意事項

SQL文識別子は，埋込み変数と同様にコンパイル単位のファイル内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

ユーザ定義型の所有者名の長さが9文字以上の場合，型名記述領域を使用できません。

(7)　使用例

PREPARE文で前処理したSELECT文（SQL文識別子：PRESQL）で取得したユーザ定義型名（埋込み変数1：WUSERID，埋込み変数2：WTYPENAME）の属性情報，属性名，及び属性のユーザ定義型名を，SQL記述領域，列名記述領域，及び型名記述領域に指定します。

DESCRIBE TYPE :WUSERID :WTYPENAME
    FOR PRESQL INTO :SQLDA :SQLCNDA :SQLTNDA

4.18　DROP LIST文（リスト削除）

4.18.1　DROP LIST文の形式と規則

(1)　機能

リストを削除します。

(2)　使用権限

リストの作成者

自分の作成したリストを削除できます。

(3)　形式

  DROP { LISTリスト名 | ALL LIST }

(4)　オペランド

(a)　LISTリスト名

削除するリストの名前を指定します。

(b)　ALL LIST

自分の所有するリストをすべて削除します。

(5)　共通規則

DROP LIST文はROLLBACK文の対象とはなりません。

DROP LIST文は動的に実行できますが，直接ホストプログラムに埋め込んで実行できません。

同一ユーザが，複数同時にHiRDBと接続してリストを操作できません。

(6)　留意事項

DROP ALL LISTを実行した場合，削除するリストがなくてもエラーにはなりません。

(7)　使用例

扶養家族（FAMILYT）リストを削除します。

DROP LIST FAMILYT

自分の所有するリストをすべて削除します。

DROP ALL LIST

4.19　EXECUTE文　形式1（SQLの実行）

4.19.1　EXECUTE文 形式1の形式と規則

(1)　機能

PREPARE文で前処理したSQLを実行します。

(2)　使用権限

なし。

(3)　形式1 <前処理したSQL文の実行>

　EXECUTE ｛SQL文識別子｜拡張文名｝
　〔｛INTO ：埋込み変数〔：標識変数〕
　　　　　　　〔，：埋込み変数〔：標識変数〕〕…
　　　｜INTO DESCRIPTOR 〔：〕SQL記述領域名
                       〔CHARACTER_SET〔：〕文字集合名記述領域名〕｝〕
　〔｛USING ：埋込み変数〔：標識変数〕
　　　　　　　　〔，：埋込み変数〔：標識変数〕〕…
　　　｜USING DESCRIPTOR 〔：〕SQL記述領域名
　　　〔CHARACTER_SET〔：〕文字集合名記述領域名〕｝〕

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

PREPARE文で前処理したSQLに付けられたSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　INTO：埋込み変数〔：標識変数〕〔，：埋込み変数〔：標識変数〕〕…

埋込み変数

PREPARE文で前処理した1行SELECT文の検索結果を受け取る場合，又はPREPARE文で前処理したCALL文に出力?パラメタが含まれる場合，その値を埋込み変数で受け取るときに，その検索結果の列の値，又は出力?パラメタを受け取る埋込み変数を指定します。

標識変数

埋込み変数に返される検索結果の列，又は出力パラメタの値がナル値かどうかを示す値が返される標識変数を指定します。

標識変数は，SMALLINTのデータ型を持つ埋込み変数として，埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は，ナル値を受け取れません。

(c)　INTO DESCRIPTOR〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

SQL記述領域名

PREPARE文で前処理した1行SELECT文の検索結果，又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに，その検索結果の列の値，又は出力?パラメタの値を受け取るための変数を記述したSQL記述領域の名称を指定します。

文字集合名記述領域名

PREPARE文で前処理した1行SELECT文の検索結果，又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに，その検索結果の列の値，又は出力?パラメタの値を受け取るための変数の文字集合名を記述した文字集合名記述領域の名称を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(d)　USING：埋込み変数〔：標識変数〕〔，：埋込み変数〔：標識変数〕〕…

埋込み変数

PREPARE文で前処理したSQLに入力?パラメタが含まれる場合，その値を埋込み変数で与えるときに，その入力?パラメタに与える値を持つ埋込み変数を指定します。

USING句で指定する埋込み変数の数と，EXECUTE文で実行するSQLに含まれる入力?パラメタの数を同じにしてください。なお，埋込み変数と入力?パラメタは，それぞれ並びの順に先頭から対応付けられます。

USING句で指定する埋込み変数のデータ型は，対応する入力?パラメタに対して許されるデータ型にしてください。

標識変数

埋込み変数の値がナル値かどうかを示す標識変数を指定します。

標識変数は，SMALLINTのデータ型を持つ埋込み変数として，埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は，埋込み変数の値はナル値以外と仮定されます。

(e)　USING DESCRIPTOR〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

SQL記述領域名

PREPARE文で前処理したSQLに入力?パラメタが含まれる場合，その値をSQL記述領域で与えるときに，その入力?パラメタの情報を格納したSQL記述領域名を指定します。

文字集合名記述領域名

PREPARE文で前処理したSQLの入力?パラメタの値を，SQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数の文字集合名を記述した文字集合名記述領域の名称を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

EXECUTE文で実行するSQLは，PREPARE文で前処理しておく必要があります。

PREPARE文とそのPREPARE文で前処理したSQLを実行するEXECUTE文は，同じトランザクション内で実行してください。

SQL文識別子は，埋込み変数と同様に，コンパイル単位のファイル内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

INTO句で指定する埋込み変数の数と，EXECUTE文で実行する1行SELECT文の検索結果の列の数，又はCALL文の出力?パラメタの数を同じにしてください。実行するSQLが1行SELECT文の場合，埋込み変数の数と，列の数が同じでないときは，SQL連絡領域のSQLWARN3領域に警告フラグ"W"が設定されます。なお，埋込み変数と検索結果の列，又は埋込み変数と出力?パラメタは，それぞれ並びの順に先頭から対応付けられます。

INTO句で指定する埋込み変数のデータ型は，対応する検索結果の列，又は出力?パラメタに対して許されるデータ型にしてください。

INTO句で指定する固定長文字列（各国文字列，及び混在文字列を含む）の埋込み変数に取り出すデータが，その埋込み変数の定義長より短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

検索結果の列の値又はCALL文の出力?パラメタの値がナル値の場合，対応する埋込み変数の値は保証しません。

INTO句に指定した埋込み変数が既定文字集合の文字データ型でかつ，検索結果の列又はCALL文の出力?パラメタの文字集合が異なる文字データ型の場合，自動的に埋込み変数の文字集合に変換します。

USING句に指定した埋込み変数が既定文字集合の文字データ型で，かつ入力?パラメタの文字集合と異なる場合，自動的に入力?パラメタの文字集合に変換します。

(6)　留意事項

PREPARE文で前処理した一つのSQLに対して，EXECUTE文は，何回でも実行できます。

SQL記述領域の設定内容については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(7)　使用例

PREPARE文で前処理したSQL（SQL文識別子：PRESQL）を実行します。ただし，PRESQLの?パラメタに値を与える埋込み変数（HATENA）を指定します。

EXECUTE PRESQL USING :HATENA

PREPARE文で前処理したSQL（SQL文識別子：PRESQL）を実行します。ただし，PRESQLの?パラメタに値を与える情報を格納したSQL記述領域（SQLDA）を指定します。

EXECUTE PRESQL USING DESCRIPTOR SQLDA

PREPARE文で前処理したSQL（SQL文識別子：PRESQL）を実行します。

CALL PROC1（?，?，?）

ただし，手続きPROC1の第1SQLパラメタのパラメタモードをIN，第2SQLパラメタのパラメタモードをINOUT，第3SQLパラメタのパラメタモードをOUTとします。また，第1SQLパラメタに対しては埋込み変数XPARAM1，第2SQLパラメタに対しては埋込み変数XPARAM2，第3SQLパラメタに対しては埋込み変数XPARAM3を指定します。

EXECUTE PRESQL
    INTO  :XPARAM2,:XPARAM3
    USING :XPARAM1,:XPARAM2

4.20　EXECUTE文　形式2（配列を使用したSQLの実行）

4.20.1　EXECUTE文 形式2の形式と規則

(1)　機能

PREPARE文で前処理したSQLを，配列を使用して複数行分一括して実行します。

(2)　使用権限

なし。

(3)　形式2 <前処理したSQL（INSERT文，UPDATE文，又はDELETE文）の複数行分又は複数回分の一括実行>

　EXECUTE ｛SQL文識別子｜拡張文名｝
　　　　　｛USING ：埋込み変数配列〔：標識変数配列〕
　　　　　　　　　　　〔，：埋込み変数配列〔：標識変数配列〕〕…
　　　　　　｜USING DESCRIPTOR 〔：〕SQL記述領域名
                      〔CHARACTER_SET〔：〕文字集合名記述領域名〕｝
　　　　　BY ：埋込み変数〔ROWS〕

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

PREPARE文で前処理したSQLに付けられたSQL文識別子を指定します。

拡張文名

PREPARE文で前処理したSQL文を識別する拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　USING ：埋込み変数配列〔：標識変数配列〕〔，埋込み変数配列〔：標識変数配列〕〕…

埋込み変数配列

PREPARE文で前処理した，SQLに含まれる入力？パラメタの値を埋込み変数で与える場合に，入力？パラメタに与える値を持つ配列形式の埋込み変数を指定します。

USING句で指定する埋込み変数配列の数と，EXECUTE文で実行するSQLに含まれる入力？パラメタの数を同じにしてください。なお，埋込み変数配列と入力？パラメタは，それぞれの並びの順に先頭から対応付けられます。

USING句で指定する埋込み変数配列のデータ型は，対応する入力？パラメタに対して許されるデータ型にしてください。

標識変数配列

埋込み変数の値が，ナル値かどうかを示す配列形式の標識変数を指定します。

標識変数配列は，SMALLINTのデータ型を持つ配列形式の埋込み変数として，埋込みSQL宣言節で宣言してください。

標識変数配列を省略した場合は，埋込み変数配列の値はナル値以外と仮定されます。

(c)　USING DESCRIPTOR 〔：〕SQL記述領域名〔CHARACTER_SET 〔：〕文字集合名記述領域名〕

SQL記述領域名

PREPARE文で前処理した，SQLの入力?パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数を記述した，SQL記述領域の名称を指定します。

文字集合名記述領域名

PREPARE文で前処理した，SQLの入力?パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数の文字集合名を記述した，文字集合名記述領域の名称を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(d)　BY ：埋込み変数〔ROWS〕

埋込み変数

PREPARE文で前処理したSQL文がINSERT文の場合，処理（挿入）する行数を設定します。PREPARE文で前処理したSQL文がUPDATE文又はDELETE文の場合，処理（更新又は削除）を実行する回数を設定した埋込み変数を指定します。

SMALLINT型の埋込み変数を指定してください。

指定できる値の範囲を次に示します。

オペランドに"USING ：埋込み変数配列〔：標識変数配列〕〔，：埋込み変数配列〔：標識変数配列〕〕…"を指定する場合

値の範囲は，1〜4,096です。

オペランドに"USING DESCRIPTOR 〔：〕SQL記述領域名"を指定する場合

値の範囲は，1〜30,000です。

0，及び負の値は設定できません。範囲外の値を設定した場合は，実行時にエラーとなります。

ROWは指定してもしなくても意味は変わりません。

(5)　共通規則

EXECUTE文で実行するSQLは，PREPARE文で前処理しておく必要があります。

EXECUTE文の形式2は，PREPARE文で前処理したSQL文が次に示すINSERT文，UPDATE文，又はDELETE文の場合にだけ使用できます。

INSERT INTO 〔認可識別子.〕表識別子 〔（列名〔，列名〕…）〕

｛VALUES（挿入値〔，挿入値〕…）

｜ 問合せ式本体 ｝

〔WITH ROLLBACK〕

INSERT INTO 〔認可識別子.〕表識別子（ROW）

｛VALUES（：埋込み変数配列〔：標識変数配列〕）

｜問合せ式本体 ｝

〔WITH ROLLBACK〕

UPDATE 〔認可識別子.〕表識別子 〔〔AS〕相関名〕

〔使用インデクスのSQL最適化指定〕

　　SET｛更新対象＝更新値

　　　　｜（更新対象，更新対象〔，更新対象〕）＝行副問合せ｝

　　　　〔，｛更新対象＝更新値

　　　　　　｜（更新対象，更新対象〔，更新対象〕…）＝行副問合せ｝〕…

〔WHERE探索条件〕

〔WITH ROLLBACK〕

UPDATE 〔認可識別子.〕表識別子 〔〔AS〕相関名〕

〔使用インデクスのSQL最適化指定〕

SET ROW＝行更新値

〔WHERE探索条件〕

〔WITH ROLLBACK〕

DELETE FROM 〔認可識別子.〕表識別子

〔〔AS〕相関名〕

〔使用インデクスのSQL最適化指定〕

〔WHERE探索条件〕

〔WITH ROLLBACK〕

PREPARE文で前処理したSQL文が上記の形式でない場合，実行時にエラーとなります。

PREPARE文と，そのPREPARE文で前処理したSQLを実行するEXECUTE文は，同じトランザクション内で実行してください。

SQL文識別子は，埋込み変数と同様に，コンパイル単位のファイル内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

オペランドに"USING ：埋込み変数配列〔：標識変数配列〕〔，：埋込み変数配列〔：標識変数配列〕〕…"を指定する場合，次の規則に従ってください。

埋込み変数配列，及び標識変数配列の要素数は，1〜4,096の範囲にしてください。範囲外の値を指定した場合はエラーとなります。

埋込み変数配列，及び標識変数配列の要素数は，"BY ：埋込み変数〔ROWS〕"で指定する行数の最大値以上になるようにしてください。

オペランドに"USING DESCRIPTOR 〔：〕SQL記述領域名"を指定する場合，次の規則に従ってください。

SQL記述領域名で指定した，SQL記述領域のSQLDATAが指す領域に，入力？パラメタの値を設定する場合は，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。このとき，配列の要素数は，"BY ：埋込み変数〔ROWS〕"で指定する行数の最大値以上になるようにしてください。

SQL記述領域名で指定したSQL記述領域のSQLSYS領域に，データ型に応じた値を設定してください。

・可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の場合は，文字列の長さを格納する領域と境界調整によって生じる要素間のギャップも含めた１要素分の長さを設定してください。

(例)

Ｃ言語では，次のようなVARCHAR型の配列変数の場合，SQLSYSに設定する値は，sizeof( vchr[0])となります。

　struct {

　　　short len;

　　　char str[257];

　} vchr[128];

・ほかのデータ型の場合は，0を設定してください。

BLOB型，最大長が32,001バイト以上のBINARY，及び抽象データ型は指定できません。

USING句に指定した埋込み変数配列が既定文字集合の文字データ型で，かつ入力?パラメタの文字集合と異なる場合，自動的に入力?パラメタの文字集合に変換します。

(6)　留意事項

PREPARE文で前処理した一つのSQLに対して，EXECUTE文は何回でも実行できます。

EXECUTE文形式2では，"BY ：埋込み変数"で指定する行数分の処理をするため，埋込み変数配列，標識変数配列，又は入力？パラメタの値を設定する，SQLDATAが指す領域には，必ず指定する行数分の値を設定しておいてください。

(7)　使用例

C言語の配列変数に設定した50行分のデータを，在庫表に一括して挿入します。

EXEC SQL BEGIN DECLARE SECTION;
  short   XINSERT_NUM;
  long    XSCODE[50];
  short   ISCODE[50];
  char    XSNAME[50][17];
  short   ISNAME[50];
EXEC SQL END DECLARE SECTION;

EXEC SQL
  PREPARE PRESQL FROM
      'INSERT INTO ZAIKO(SCODE, SNAME) VALUES (?, ?)';

                 :
    各変数配列の要素に値を設定
                 :

XINSERT_NUM = 50;
EXEC SQL
  EXECUTE PRESQL USING :XSCODE:ISCODE, :XSNAME:ISNAME
      BY :XINSERT_NUM ROWS;

C言語の配列変数に設定した商品コード（SCODE）及び在庫量（ZSURYO）の値別に，在庫量（ZSURYO）を次の表で示す値に更新します。

表4‒5　表に格納された商品コードと在庫量（更新前）

商品コード

在庫量の更新値

'101M'

40

'101L'

70

'201M'

15

'202M'

28

'302S'

7

表4‒6　更新対象となる行の商品コードと在庫量（埋込み変数配列に設定）

商品コード

在庫量の更新値

'101M'

35

'101L'

62

'201M'

13

'202M'

10

'302S'

6

表4‒7　表に格納された商品コードと在庫量（更新後）

商品コード

在庫量の更新値

'101M'

35

'101L'

62

'201M'

13

'202M'

10

'302S'

6

EXEC SQL BEGIN DECLARE SECTION;
      short   XUPDATE_NUM;
      char    XSCODE[5][5];
      short   ISCODE[5];
      long    XZSURYO[5];
      short   IZSURYO[5];
EXEC SQL END DECLARE SECTION;
EXEC SQL
PREPARE PRESQL FROM
      'UPDATE ZAIKO SET ZSURYO = ? WHERE SCODE = ?';
    ・・・各変数配列の要素に値設定・・・
        XSCODEに{'101M','101L','201M','202M','302S'}を設定
        XZSURYOに{35,62,13,10,6}を設定
XUPDATE_NUM = 5;
EXEC SQL
EXECUTE PRESQL USING :XZSURYO:IZSURYO, :XSCODE:ISCODE
BY :XUPDATE_NUM

4.21　EXECUTE IMMEDIATE文（SQLの前処理と実行）

4.21.1　EXECUTE IMMEDIATE文の形式と規則

(1)　機能

文字列で与えられたSQLを，前処理して実行します。

(2)　使用権限

なし。

(3)　形式

　EXECUTE IMMEDIATE｛'文字列'｜：埋込み変数｝
　〔｛INTO ：埋込み変数〔：標識変数〕
　　　　　　　〔，：埋込み変数〔：標識変数〕〕…
　　　｜INTO DESCRIPTOR 〔：〕SQL記述領域名
                       〔CHARACTER_SET〔：〕文字集合名記述領域名〕｝〕
　〔｛USING ：埋込み変数〔：標識変数〕
　　　　　　　　〔，：埋込み変数〔：標識変数〕〕…
　　　｜USING DESCRIPTOR 〔：〕SQL記述領域名
                       〔CHARACTER_SET〔：〕文字集合名記述領域名〕｝〕

(4)　オペランド

(a)　｛'文字列'｜：埋込み変数｝

文字列

実行するSQLの文字列を直接文字定数として指定します。

実行するSQLを文字定数として指定する場合で，SQL中に1個のアポストロフィを表すには，2個のアポストロフィを続けて指定してください。

埋込み変数

実行するSQLの文字列を埋込み変数で指定します。

埋込み変数を指定する場合は，前に：（コロン）を付けます。

(b)　INTO：埋込み変数〔：標識変数〕〔，：埋込み変数〔：標識変数〕〕…

埋込み変数

1行SELECT文の検索結果を受け取る場合，又はCALL文に出力?パラメタが含まれる場合，その値を埋込み変数で受け取るときに，その検索結果の列の値，又は出力?パラメタの値を受け取る埋込み変数を指定します。

標識変数

埋込み変数に返される検索結果の列の値がナル値かどうかを示す値が返される標識変数を指定します。

標識変数は，SMALLINTのデータ型を持つ埋込み変数として，埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は，ナル値を受け取れません。

(c)　INTO DESCRIPTOR〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

SQL記述領域名

1行SELECT文の検索結果，又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに，その検索結果の列の値，又は出力?パラメタの値を受け取るための変数を記述した，SQL記述領域の名称を指定します。

文字集合名記述領域名

1行SELECT文の検索結果，又はCALL文の出力?パラメタの値をSQL記述領域を用いて受け取るときに，その検索結果の列の値，又は出力?パラメタの値を受け取るための変数の文字集合名を記述した，文字集合名記述領域の名称を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(d)　USING：埋込み変数〔：標識変数〕〔，：埋込み変数〔：標識変数〕〕…

埋込み変数

SQLに入力?パラメタが含まれる場合，その値を埋込み変数で与えるときに，その入力?パラメタに与える値を持つ埋込み変数を指定します。

USING句で指定する埋込み変数の数と，EXECUTE IMMEDIATE文で実行するSQLに含まれる入力?パラメタの数を同じにしてください。なお，埋込み変数と入力?パラメタは，それぞれ並びの順に先頭から対応付けられます。

USING句で指定する埋込み変数のデータ型は，対応する入力?パラメタに対して許されるデータ型にしてください。

標識変数

埋込み変数の値がナル値かどうかを示す標識変数を指定します。

標識変数は，SMALLINTのデータ型を持つ埋込み変数として，埋込みSQL宣言節で宣言してください。

標識変数を省略した場合は，埋込み変数の値はナル値以外と仮定されます。

(e)　USING DESCRIPTOR〔：〕SQL記述領域名〔CHARACTER_SET〔：〕文字集合名記述領域名〕

SQL記述領域名

入力？パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数を記述した，SQL記述領域の名称を指定します。

文字集合名記述領域名

入力?パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数の文字集合名を記述した，文字集合名記述領域の名称を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

実行するSQL文字列中に，SQL先頭子，及びSQL終了子は指定できません。

実行するSQLの最大長は，2,000,000バイトです。ただし，SQLの文字列を文字定数で指定した場合は，UAP記述言語の文字定数の最大長です。

埋込み変数の型は，次に示す構造体です。

  struct {
        long  xxxxxxx;      /* SQL文の有効長   */
        char  yyyyyyy[n];   /* SQL文格納エリア */
  } zzzzzzz;

（凡例）

xxxxxxxは，文字配列yyyyyyy中に格納した文字列の有効長を示します。

1 ≦ （xxxxxxxの値） ≦ 2000000

なお，文字列の有効長に文字列の終わりを示す'￥0'は含みません。

nは，任意です。

INTO句で指定する埋込み変数の数と，検索結果の列の数を同じにしてください。実行するSQLが1行SELECT文の場合，埋込み変数の数と，列の数が同じでないときは，SQL連絡領域のSQLWARN3領域に警告フラグ"W"が設定されます。なお，埋込み変数と検索結果の列，又は埋込み変数と出力?パラメタは，それぞれ並びの順に先頭から対応付けられます。

INTO句で指定する埋込み変数のデータ型は，対応する列，出力パラメタのデータ型，又は変換できるデータ型にしてください。

INTO句で指定する固定長文字列（各国文字列，及び混在文字列を含む）の埋込み変数に取り出すデータが，その埋込み変数の定義長より短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

検索結果の列の値又はCALL文の出力?パラメタの値がナル値の場合，対応する埋込み変数の値は保証しません。

INTO句に指定した埋込み変数が既定文字集合の文字データ型でかつ，検索結果の列又はCALL文の出力?パラメタの文字集合が異なる文字データ型の場合，自動的に埋込み変数の文字集合に変換します。

USING句に指定した埋込み変数が既定文字集合の文字データ型で，かつ入力?パラメタの文字集合と異なる場合，自動的に入力?パラメタの文字集合に変換します。

(6)　留意事項

EXECUTE IMMEDIATE文は，次に示すSQLを実行する場合と同じです。文字列で指定したSQLを繰り返して実行する場合は，一度PREPARE文で前処理して，EXECUTE文で繰り返し実行することをお勧めします。

PREPARE SQL文識別子FROM｛'文字列'｜：埋込み変数｝

EXECUTE SQL文識別子

EXECUTE IMMEDIATE文で前処理・実行できるSQLを次に示します。

操作系SQL

ASSIGN LIST文，CALL文，DELETE文，準備可能動的DELETE文：位置付け，DROP LIST文，INSERT文，PURGE TABLE文，1行SELECT文，UPDATE文，準備可能動的UPDATE文：位置付け

制御系SQL

LOCK TABLE文

定義系SQL

ALTER INDEX，ALTER PROCEDURE，ALTER ROUTINE，ALTER TABLE，ALTER TRIGGER，COMMENT，CREATE AUDIT，CREATE CONNECTION SECURITY，CREATE FUNCTION，CREATE INDEX，CREATE PROCEDURE，CREATE SCHEMA，CREATE SEQUENCE，CREATE TABLE，CREATE TRIGGER，CREATE TYPE，CREATE VIEW，DROP AUDIT，DROP CONNECTION SECURITY，DROP DATA TYPE，DROP FUNCTION，DROP INDEX，DROP PROCEDURE，DROP SCHEMA，DROP SEQUENCE，DROP TABLE，DROP TRIGGER，DROP VIEW，GRANT，REVOKE

(7)　使用例

文字列として与えたSQL'PURGE TABLE ZAIKO'を前処理して実行します。

EXECUTE IMMEDIATE 'PURGE TABLE ZAIKO'

埋込み変数（：ZAIX）として定義したSQLを前処理して実行します。

EXECUTE IMMEDIATE :ZAIX

文字列として与えたSQL'SELECT SNAME FROM ZAIKO WHERE SCODE = ?'を前処理して実行し，検索結果を埋込み変数（:XSNAME），標識変数(:ISNAME)に読み込みます。このとき，?パラメタに与える値の情報を格納した埋込み変数（:XSCODE），標識変数(:ISCODE)を指定します。

EXECUTE IMMEDIATE 'SELECT SNAME FROM ZAIKO WHERE SCODE = ?'
      INTO :XSNAME:ISNAME
      USING :XSCODE:ISCODE

4.22　FETCH文　形式1（データの取り出し）

4.22.1　FETCH文 形式1の形式と規則

(1)　機能

取り出す行を示すカーソルの位置を次の行に進め，その1行の列の値をINTO句で指定した埋込み変数に読み込みます。

(2)　使用権限

なし。

(3)　形式1 <検索結果中の1行を変数に読み込む>

　FETCH ｛カーソル名｜拡張カーソル名｝ INTO
　　｛：埋込み変数〔：標識変数〕
　　　｜〔文ラベル.〕SQL変数名
　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…｝
　　　　　〔，｛：埋込み変数〔：標識変数〕
　　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　　　　　..属性名〔..属性名〕…｝〕…

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

検索結果を取り出すカーソルの名称を指定します。

拡張カーソル名

検索結果を取り出すカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　：埋込み変数〔：標識変数〕

埋込み変数

ナル値以外の列の値を読み込むための埋込み変数を指定します。

ナル値を含む列の値を受け取る場合は，埋込み変数と，標識変数を指定します。

標識変数

埋込み変数に読み込まれる列の値がナル値かどうかを示す値が返される標識変数を指定します。

(c)　〔文ラベル.〕SQL変数名

SQL手続き中で列の値を受け取るために，SQL変数を指定します。

(d)　〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名

SQL手続き中で列の値を受け取るために，SQLパラメタを指定します。

パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は，認可識別子にPUBLICを指定してください。

(e)　〔文ラベル.〕SQL変数名..属性名〔..属性名〕…

SQL手続き中で，列中の属性の値を受け取るために指定します。

(f)　〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…

SQL手続き中で，列中の属性の値を受け取るために指定します。

パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は，認可識別子にPUBLICを指定してください。

(5)　共通規則

FETCH文で指定するカーソルは，ALLOCATE CURSOR文 形式2（結果集合カーソルの割当て）で割り当てた場合以外は，OPEN文で開いておいてください。

検索結果の列の個数（カーソル宣言，又はALLOCATE CURSOR文に指定したSELECT文で指定した選択式の個数）と，FETCH文のINTO句で指定した埋込み変数，SQL変数，又はSQLパラメタの個数は同じにしてください。個数が異なる場合は，個数が少ない方に合わせて列の値を埋込み変数に読み込みます。このとき，SQL連絡領域のSQLWARN3領域に警告フラグ（W）が設定されます。

INTO句で指定する埋込み変数のデータ型は，対応する検索項目のデータ型，又は変換できるデータ型にしてください。

埋込み変数が既定文字集合の文字データ型で，かつ検索結果がその埋込み変数の文字集合と異なる文字データ型の場合，自動的に埋込み変数の文字集合に変換します。

固定長文字列（各国文字列，及び混在文字列を含む）の埋込み変数に取り出すデータが，検索項目の長さより短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

取り出す行がない場合，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

ただし，リストを介した検索でリスト作成時にあった行が削除された場合，又は属性値が削除，更新された場合，それぞれ110,110,'R2000'が設定されます。

(6)　留意事項

検索結果の列の値がナル値の場合は，対応する埋込み変数の値は保証しません。

カーソル名は，埋込み変数名と同様に，コンパイル単位のファイル内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のファイルにわたって使用できません。

(7)　使用例

カーソル（CR1）による在庫表（ZAIKO）の検索結果を商品コード（SCODE）列，商品名（SNAME）列，色（COL）列，単価（TANKA）列，在庫量（ZSURYO）列に対応する埋込み変数，及び標識変数に読み込みます。

＜埋込み変数を指定した場合＞

FETCH CR1
    INTO :XSCODE,:XSNAME,:XCOL,
        :XTANKA,:XZSURYO

＜埋込み変数，標識変数を指定した場合＞

FETCH CR1
    INTO :XSCODE:ISCODE,
         :XSNAME:ISNAME,
         :XCOL:ICOL,
         :XTANKA:ITANKA,
         :XZSURYO:IZSURYO

4.23　FETCH文　形式2（データの取り出し）

4.23.1　FETCH文 形式2の形式と規則

(1)　機能

検索結果中の1行，又は複数行を，SQL記述領域に指定した受け取り領域に読み込みます。

(2)　使用権限

なし。

(3)　形式2 <検索結果中の1行，又は複数行を，SQL記述領域に指定した受け取り領域に読み込む>

　FETCH ｛カーソル名｜拡張カーソル名｝
       USING DESCRIPTOR 〔：〕SQL記述領域名
                    〔CHARACTER_SET〔：〕文字集合名記述領域名〕
　　　　 〔BY ：埋込み変数〔ROWS〕〕

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

検索結果を取り出すカーソルの名称を指定します。

拡張カーソル名

検索結果を取り出すカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　〔：〕SQL記述領域名

検索結果を受け取るために必要な情報を設定したSQL記述領域の名称を指定します。

(c)　〔CHARACTER_SET〔：〕文字集合名記述領域名〕

検索結果の文字集合名を受け取るために必要な情報を設定した文字集合名記述領域の名称を指定します。

(d)　〔BY ：埋込み変数〔ROWS〕〕

SQL記述領域に設定された配列を使用して，FETCH用の領域の大きさを要素数で設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は1〜30,000の範囲にしてください。0及び負の値を設定した場合はエラーとなります。また，バージョン05-03より前のクライアントライブラリを使用した場合には，動作が保証されません。

(5)　共通規則

FETCH文で指定するカーソルは，ALLOCATE CURSOR文 形式2（結果集合カーソルの割当て）で割り当てた場合以外は，OPEN文で開いておいてください。

UAPがFETCH文を実行するときに必要な情報は，SQL記述領域名で指定したSQL記述領域中に設定しておいてください。SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

取り出す行がない場合，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

ただし，リストを介した検索でリスト作成時にあった行が削除された場合，又は属性値が削除，更新された場合，それぞれ110,110,'R2000'が設定されます。

SQL記述領域で指定する受取り領域のデータ型は，対応する検索項目のデータ型と変換できるデータ型です。

検索結果が文字データ型で，検索結果の文字集合が文字集合名記述領域に指定した文字集合と異なる場合，自動的に文字集合名記述領域に指定した文字集合に変換します。

BY ：埋込み変数〔ROWS〕を指定する場合，SQL記述領域のSQLSYSにデータ型に対応した値を設定しておく必要があります。

可変長文字列（VARCHAR，NVARCHAR，又はMVARCHAR）の場合

文字列の長さを格納する領域と，境界調整によって生じる要素間のギャップも含めた1要素分の値を設定してください。

例えば，次のようなVARCHAR型の配列変数の場合は，SQLSYSに設定する値はsizeof(vchr[0])となります。

    struct {
        short   len;
        char    str[257];
    } vchr[128];

ほかのデータ型の場合

0を設定してください。

(6)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

(7)　使用例

カーソル（CR2）による在庫表の検索結果を，SQL記述領域に指定した受け取り領域に読み込みます。

FETCH CR2
    USING DESCRIPTOR SQLDA

4.24　FETCH文　形式3（データの取り出し）

4.24.1　FETCH文 形式3の形式と規則

(1)　機能

検索結果中の複数行を，INTO句で指定した埋込み変数に一度に読み込みます。

(2)　使用権限

なし。

(3)　形式3 <検索結果中の複数行を，INTO句で指定した埋込み変数に一度に読み込む>

　FETCH ｛カーソル名｜拡張カーソル名｝  INTO ：埋込み変数配列〔：標識変数配列〕
　　　　　　　　　　　〔，：埋込み変数配列〔：標識変数配列〕〕…

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

検索結果を取り出すカーソルの名称を指定します。

拡張カーソル名

検索結果を取り出すカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　：埋込み変数配列〔：標識変数配列〕〔，：埋込み変数配列〔：標識変数配列〕〕…

埋込み変数配列

ナル値以外の列の値を読み込むための配列変数（配列形式で宣言した埋込み変数）を指定します。ナル値を含む列の値を受け取る場合は，埋込み変数と標識変数を指定します。

標識変数配列

埋込み変数配列に読み込まれる列の値がナル値かどうかを示す値が返される標識変数（配列形式で宣言した標識変数）を指定します。

(5)　共通規則

FETCH文で指定するカーソルは，ALLOCATE CURSOR文 形式2（結果集合カーソルの割当て）で割り当てた場合以外は，OPEN文で開いておいてください。

埋込み変数配列，及び標識変数配列の配列の要素数は，すべて同じ大きさにしてください。異なっている場合，取り出す行数は指定された配列の中で最も小さい配列の要素数に合わせます。

実際に取り出した行の累積行数は，SQL連絡領域のSQLERRD2（Ｃ言語の場合），又はSQLERRD(3)（COBOL言語の場合）に設定されます。

配列を使用したFETCHは，手続きの中では使えません。

配列を使用したFETCHでは，LOBデータは扱えません。

配列を使用したFETCHでは，ブロック転送の指定は無効です。

取り出し中に取り出す行がなくなった場合，次のリターンコードが設定されます。この場合，なくなる直前までの行のデータは返されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

また，リストを介した検索で，リスト作成時にあった行が削除された場合，又は属性値が削除，更新された場合，それを示すリターンコードは設定されません。この場合，無視して検索が継続されます。

取り出したどれかの行で警告する必要がある事象が発生した場合，SQL連絡領域のSQLWARNに警告情報が設定されます。

取り出した行のどれかの行でエラーが発生した場合，その行までのデータは返されます。

配列を使用したFETCHは，添字なし繰返し列の検索には使用できません。

(6)　留意事項

検索結果の列の値がナル値の場合は，それに対応する埋込み変数配列の要素の値は保証しません。

配列でない変数と配列型の変数は混在できません。

SQL記述領域は指定できません。

カーソルはFETCHをした最後の行に位置づけられます。カーソルを使用した更新を実行すると，FETCHをした最後の行が更新されます。

(7)　使用例

カーソル（CR3）による在庫表の検索結果を，Ｃ言語の配列変数に読み込みます。

EXEC  SQL  BEGIN  DECLARE  SECTION;
  long    XSCODE[50];
  short   ISCODE[50];
  char    XSNAME[50][17];
  short   ISNAME[50];
EXEC  SQL  END  DECLARE  SECTION;

EXEC  SQL  FETCH  CR3
    INTO   :XSCODE  :ISCODE,
             :XSNAME  :INAME;

4.25　FREE LOCATOR文（位置付け子の無効化）

4.25.1　FREE LOCATOR文の形式と規則

(1)　機能

位置付け子と割り当てられたデータの関連を削除し，その位置付け子を無効にします。

(2)　使用権限

なし。

(3)　形式

FREE LOCATOR 位置付け子参照〔, 位置付け子参照〕…
位置付け子参照：：＝：埋込み変数

(4)　オペランド

(a)　位置付け子参照：：＝：埋込み変数

無効にする位置付け子の埋込み変数を指定します。

(5)　共通規則

無効な位置付け子の値を持つ埋込み変数を指定した場合はエラーとなります。また，複数の埋込み変数を指定し，その中に無効な位置付け子の値を持つ埋込み変数が含まれていた場合はエラーとなりますが，有効な位置付け子はすべて無効となります。

4.26　INSERT文　形式1（行挿入）

4.26.1　INSERT文 形式1の形式と規則

(1)　機能

表に，行を列単位で挿入します。直接，値を指定して一つの行の挿入ができます。また，問合せ式本体を使用して，一つ，又は複数の行の挿入もできます。

(2)　使用権限（形式1）

表に対するINSERT権限を持つユーザが，その表に行を挿入できます。

ただし，INSERT文中に問合せ指定を指定する場合は，その問合せ指定の表に対してSELECT権限が必要です。

(3)　形式1<列単位で表に行を挿入する>

　INSERT INTO 〔認可識別子.〕表識別子
　　　　｛〔（列名〔，列名〕…）〕
　　　　　　｛VALUES（挿入値〔，挿入値〕…）
　　　　　｜問合せ式本体｝
　　　　　｜DEFAULT VALUES｝
　　　　〔WITH ROLLBACK〕
　　　　〔WRITE IMMEDIATE〕

　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝
　問合せ指定　：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝表式
　表式　　　　：：＝FROM  表参照〔，表参照〕…
　　　　　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　　　　　〔HAVING 探索条件〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子

認可識別子

表の所有者の認可識別子を指定します。

認可識別子に，"MASTER"は指定できません。

表識別子

行を挿入する表の名称を指定します。

(b)　〔（列名〔，列名〕…）〕

データを挿入する列の名称の並びを指定します。

列名の並びを省略した場合は，表定義で表を定義したときの列の指定順序に従って，すべての列（予備列を除く）を指定したことになります。予備列には，予備列の定義長分の0x00が自動的に挿入されます。

列名についての規則を次に示します。

読み込み専用のビュー表は，行の挿入，更新，及び削除ができません。読み込み専用のビュー表については，「共通規則」を参照してください。

ビュー表への行の挿入を指定した場合，そのビュー表の基の実表に行を挿入します。ビュー表の基の実表の列でビュー表の列に対応しない列はナル値になります。したがって，FIX属性の実表から定義したビュー表の場合，ビュー表の基の実表の列でビュー表の列に対応しない列があるときは行は挿入できません。

指定されていない列の値は列の規定値になります。DEFAULT句がある場合は，指定した既定値となります。DEFAULT句の指定がなく，WITH DEFAULTの指定がある場合は，WITH DEFAULTの既定値となります。DEFAULT句，及びWITH DEFAULTのどちらの指定もない場合，NULLが既定値となります。予備列の場合は予備列の定義長分の0x00になります。

指定されていない繰返し列の要素数は0になります。

列名には添字を指定できません。

列名には予備列を指定できません。

(c)　VALUES（挿入値〔，挿入値〕…）

挿入値

列名で指定した各列に対応した挿入値を指定します。指定できる項目を次に示します。

値式

NULL（ナル値を表します）

DEFAULT

ARRAY ［要素の値〔，要素の値〕…］※

注※

要素の値には，次の項目を指定できます。

値式

NULL（ナル値を表します）

DEFAULT

挿入値についての規則を次に示します。

挿入値は，列名の指定順序に従って指定します。

挿入値にナル値を入れる場合は，NULLと指定します。

挿入値，又は挿入値の要素の値にDEFAULTを指定した場合，挿入の対象となる列の既定値を挿入します。DEFAULT句がある場合は，指定した既定値となります。DEFAULT句の指定がなく，WITH DEFAULTの指定がある場合は，WITH DEFAULTの既定値となります。DEFAULT句，及びWITH DEFAULTのどちらの指定もない場合，NULLが既定値となります。

挿入値に対応する列にSYSTEM GENERATEDを指定している場合，指定した挿入値は無視され，DATE型の場合は現在の日付（CURRENT_DATE），TIME型の場合は現在の時刻（CURRENT_TIME）を挿入します。

PREPARE文で前処理する場合は，埋込み変数，標識変数を指定できません。

埋込み変数は，対応する列の列構造と同じ構造の埋込み変数を指定します。

?パラメタに値を指定するための埋込み変数の場合も，対応する列と同じ構造の埋込み変数を指定します。

ARRAY ［要素の値〔，要素の値〕…］は，対応する列が繰返し列の場合にだけ指定できます。要素の値は，最大30,000個指定できます。ただし，挿入する列の最大要素数以下にしてください。要素の値の埋込み変数（標識変数），？パラメタは，単純構造にしてください。

挿入値に列名又は集合関数を含む値式は指定できません。

挿入値にWRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

(d)　問合せ式本体

：：＝｛問合せ指定
　　　　｜（問合せ式本体）
　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　｛問合せ指定｜（問合せ式本体）｝｝

挿入するデータを取り出す問合せ式本体を指定します。

問合せ式本体については，「問合せ式」を参照してください。

(e)　問合せ指定：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕

｛選択式〔，選択式〕…｜＊｝表式

問合せ指定については，「問合せ指定」を参照してください。

取り出したデータを挿入する列が繰返し列の場合，その列に対応する問合せ指定の選択式には，添字なしで繰返し列を指定します。

(f)　表式

：：＝FROM  表参照〔，表参照〕…
　〔WHERE 探索条件〕
　〔GROUP BY 値式〔，値式〕…〕
　〔HAVING 探索条件〕

表式については，「表式」，表参照については，「表参照」，探索条件については，「探索条件」を参照してください。

(g)　DEFAULT VALUES

挿入する行のすべての列に既定値を挿入します。

DEFAULT VALUESは，次の形式を指定する場合と同じ意味になります。

VALUES(DEFAULT,DEFAULT,…)

上記のDEFAULTの数は，挿入対象の表の列数と同じです。

(h)　〔WITH ROLLBACK〕

挿入の対象となる表が，ほかのユーザで使用されているときは，トランザクションを取り消して無効にする場合，指定します。

WITH ROLLBACKを省略した場合は，挿入の対象となる表が，ほかのユーザで使用されているとき，使用中のユーザのトランザクションが終了してから実行します。

(i)　〔WRITE IMMEDIATE〕

表オプションにWITHOUT ROLLBACKの指定がある表に対する更新処理で，更新完了時にシステムログを書き出す場合，このオプションを指定してください。WITHOUT ROLLBACK指定のない表に対して，このオプションを指定しても無効になります。

更新完了時にシステムログを書き出す効果については，マニュアル「HiRDB Version 9 UAP開発ガイド」の採番業務で使用する表を参照してください。

(5)　共通規則

埋込み変数，SQL変数，又はSQLパラメタのデータ型は対応する列のデータ型，又は変換できるデータ型にしてください。

INSERT文で?パラメタが指定できるのは，PREPARE文で前処理された場合だけです。?パラメタに対して与える値は，前処理したPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

埋込み変数，標識変数は，PREPARE文で前処理されるINSERT文，及びSQL手続き中では使用できません。

SQL手続き中では，SQL変数，又はSQLパラメタを使用します。Java手続き中の指定値については，マニュアル「HiRDB Version 9 UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。

挿入する1行分の列の個数は，列名で指定した列の個数と同じにしてください。

また，それらの値は，列のデータ型，又は変換できるデータ型にしてください（ただし，データを挿入する列が各国文字データ型で，挿入値に文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます）。複数の行を挿入する場合，問合せ式本体で検索する列の個数と列名で指定した列の個数を同じにしてください。また，対応する列のデータ型は変換できるデータ型にしてください（ただし，データを挿入する列が各国文字データ型で，問合せ式本体の選択式に文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます）。

固定小数点，又は浮動小数点のデータを次に示すデータ型の列に挿入する場合は，端数（小数）部分は切り捨てられます。

INTEGER

SMALLINT

また，固定小数点のデータをDECIMAL型の列に挿入する場合は，列の位取りより下位のけた部分が切り捨てられます。

表を定義したときに指定した長さ以上の文字データは，挿入できません。

列に定義されているデータ型の範囲外の数データは，挿入できません。

固定長文字列（各国文字列，及び混在文字列を含む）の列に挿入するデータが，列の長さより短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

データ型がBLOBの列にデータを挿入する場合，挿入値には，埋込み変数，?パラメタ，SQL変数，SQLパラメタ，スカラ関数SUBSTR，関数呼出し，又はNULLが指定できます。

抽象データ型の列にデータを挿入する場合，挿入値には埋込み変数及び？パラメタは指定できません。

問合せ式本体の選択式にコンポネント指定は指定できません。

抽象データ型の列にデータを挿入する場合，挿入値には，表定義時にLOB属性格納用RDエリア名を指定していないBLOB属性を含む抽象データ型の値は指定できません。

問合せ式本体の選択式には，WRITE指定及びGET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

WITHOUT ROLLBACKを指定した表に対して，INSERT文を実行する場合，インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

共用表にデータを挿入する場合，事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表にデータ挿入した場合，エラーとなります。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

文字データ型の列にデータを挿入する場合，挿入対象の列と，対応する挿入値の文字集合を同じにしてください。ただし，挿入値が埋込み変数（既定文字集合），?パラメタ，又は文字列定数の場合，自動的に挿入対象の列の文字集合に変換します。

(6)　参照制約に関する規則

被参照表，参照表に行を挿入する場合の規則は「CREATE TABLE（表定義）」の参照動作の説明を参照してください。

(7)　使用例

在庫表（ZAIKO）のすべての列に，埋込み変数に読み込まれた値の行を挿入します。

INSERT INTO ZAIKO
    VALUES(:XSCODE,:XSNAME,:XCOL,
            :XTANKA,:XZSURYO)

在庫表（ZAIKO）の商品コード（SCODE）列，商品名（SNAME）列，在庫量（ZSURYO）列の各列に，埋込み変数に読み込まれた値の行を挿入します。

INSERT INTO ZAIKO
    (SCODE,SNAME,ZSURYO)
    VALUES(:XSCODE,:XSNAME,:XZSURYO)

在庫表（ZAIKO）に在庫表と同じ列定義情報を持つ在庫表2（ZAIKO2）のすべての表データを挿入します。

INSERT INTO ZAIKO
    SELECT * FROM ZAIKO2

在庫表（ZAIKO）の商品コード（SCODE），商品名（SNAME），色（COL）の各列に，612S，ズボン，白のデータを挿入します。

INSERT INTO ZAIKO(SCODE,SNAME,COL)
    VALUES('612S',N'ズボン',N'白')

受注表（JUTYU）の各列に，02561，TT001，302S，50，現在の日付（CURRENT_DATE），現在の時刻（CURRENT_TIME）を挿入します。

INSERT INTO JUTYU
    VALUES('02561','TT001','302S',50,CURRENT_DATE,CURRENT_TIME)

4.27　INSERT文　形式2（行挿入）

4.27.1　INSERT文 形式2の形式と規則

(1)　機能

行全体を一つのデータとみなして，FIX属性の表に，行を行単位で挿入します。直接，値を指定して一つの行の挿入ができます。また，問合せ式本体を使用して，一つ，又は複数の行の挿入もできます。

(2)　使用権限（形式2）

表に対するINSERT権限を持つユーザが，その表に行を挿入できます。

ただし，INSERT文中に問合せ指定を指定する場合は，その問合せ指定の表に対してSELECT権限が必要です。

(3)　形式2<FIX属性の表に，一つの行全体を一つのデータとみなして行単位で行を挿入>

　INSERT INTO 〔認可識別子.〕表識別子（ROW）
　　　｛VALUES（行挿入値）
　　　　｜問合せ式本体 ｝
　　　〔WITH ROLLBACK〕
　　　〔WRITE IMMEDIATE〕
　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝
　問合せ指定　：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝表式
　表式　　　　：：＝FROM  表参照〔，表参照〕…
　　　　　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　　　　　〔HAVING 探索条件〕

(4)　オペランド

ROW及びVALUES以外の説明については，「INSERT文　形式1（行挿入）」を参照してください。

(a)　（ROW）

行単位でデータを挿入する場合に指定します。ROWを指定する場合の規則を次に示します。

FIX属性の実表に対してだけ指定できます。ROWは行全体（予備列を含む）意味し，これを指定することで行全体を一つのデータとして，一つの領域から挿入します。挿入するデータのデータ型は，各列のデータ型に関係なく，ROW型（ROW型に対しては，CHAR（n）〔nは行長〕に対応する変数，又は同じ長さの構造体を指定できます。ただし，構造体中に境界調整による空きがあってはいけません）にしてください。また，データ長は行長（各列のデータ長の総和）にしてください。

UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では，ROWは使用できません。例えば，WindowsのUAPでROWを使用する場合は，HiRDBサーバも同じエンディアンのWindows版を使用してください。

(b)　｛VALUES（行挿入値）｜問合せ式本体 ｝

行挿入値

ROWに対応した行の挿入値を指定します。指定できる項目を次に示します。

：埋込み変数〔：標識変数〕

?パラメタ

SQL変数，又はSQLパラメタ

(c)　問合せ式本体

：：＝｛問合せ指定
　　　　｜（問合せ式本体）
　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　｛問合せ指定｜（問合せ式本体）｝｝

挿入するデータを取り出す問合せ式本体を指定します。

問合せ式本体については，「問合せ式」を参照してください。

(d)　問合せ指定

：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕
　｛選択式〔，選択式〕…｜＊｝表式

問合せ指定については，「問合せ指定」を参照してください。

(e)　表式

：：＝FROM  表参照〔，表参照〕…
　〔WHERE 探索条件〕
　〔GROUP BY 値式〔，値式〕…〕
　〔HAVING 探索条件〕

表式については，「表式」，表参照については，「表参照」，探索条件については，「探索条件」を参照してください。

(5)　留意事項

挿入する表の列のデータ型がDECIMAL，又は各国文字列の場合に，対応する部分だけ行挿入値の内容をチェックします。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の日付データ型の部分は4バイトであり，X'YYYYMMDD'の形式にしてください。行単位（ROW指定）インタフェースを使用し，日付データを既定の文字列表現で受け渡しする場合，列定義時に日付データ型ではなく，CHAR（10）として列を定義してください。さらに，日付演算は，スカラ関数DATEを使用し，日付データ型に変換した後に指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻データ型の部分は3バイトであり，X'hhmmss'の形式にしてください。行単位（ROW指定）インタフェースを使用し，時刻データを既定の文字列表現で受け渡しする場合，列定義時に時刻データ型ではなく，CHAR（8）として列を定義してください。さらに，時刻演算は，スカラ関数TIMEを使用し，時刻データ型に変換した後に指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻印データ型の部分は，（7＋p/2）バイトであり，X'YYYYMMDDhhmmss〔nn…n〕'の形式にしてください。行単位（ROW指定）インタフェースを使用し，時刻印データを既定の文字列表現で受け渡しをする場合，列定義時に時刻印データ型ではなく，長さが19，22，24，又は26バイトのCHARとして列を定義してください。

挿入する表の列にSYSTEM GENERATEDを指定している場合，対応する部分のデータは無視され，DATE型の場合は現在の日付（CURRENT_DATE），TIME型の場合は現在の時刻（CURRENT_TIME）を挿入します。

挿入する表に予備列が定義されている場合，対応する部分のデータは無視され，予備列の定義長分の0x00を挿入します。

(6)　共通規則

SELECT文を指定した場合の共通規則は，「INSERT文　形式1（行挿入）」の共通規則を参照してください。

WITHOUT ROLLBACKを指定した表に対して，INSERT文を実行する場合，インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

共用表にデータを挿入する場合，事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表にデータ挿入した場合，エラーとなります。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

挿入する表に既定文字集合以外の文字データ型の列が存在する場合，行単位のデータ挿入はできません。

(7)　参照制約に関する規則

SELECT文を指定した場合の参照制約に関する規則は，「INSERT文　形式1（行挿入）」の参照制約に関する規則を参照してください。

参照表に行を挿入する場合，外部キー構成列の値が被参照表の主キー構成列の値に含まれるかどうかを確認するため，被参照表を検索します。このとき，被参照表の検索時のデータ保証レベルは共用モードになります。そのため，参照表への行の挿入時，ほかのトランザクションによって被参照表に対する操作が行われている場合は，そのトランザクションが決着されるまで参照表への行の挿入は待ち状態になります。

(8)　使用例

在庫表（ZAIKO）に埋込み変数（XROW）に読み込まれた1行分の値をまとめて挿入します。

INSERT INTO ZAIKO(ROW)
    VALUES(:XROW)

4.28　INSERT文　形式3，形式4（配列を使用した行挿入）

4.28.1　INSERT文 形式3，形式4の形式と規則

(1)　機能

配列形式の埋込み変数を指定して複数の行の挿入ができます。

形式3

表に，行を列単位で複数行挿入します。

形式4

行全体を一つのデータとみなして，FIX属性の表に，行を行単位で複数行挿入します。

(2)　使用権限

表に対するINSERT権限を持つユーザが，その表に行を挿入できます。

ただし，INSERT 文中に問合せ指定を指定する場合は，その問合せ指定の表に対してSELECT権限が必要です。

(3)　形式3 <埋込み変数配列を指定して，表に列単位で複数行を挿入>

　FOR ：埋込み変数
　INSERT INTO 〔認可識別子.〕表識別子
　　　　〔（列名〔，列名〕…）〕
　　　　　　｛VALUES（挿入値〔，挿入値〕…）
　　　　　　｜問合せ式本体 ｝
　　　　〔WITH ROLLBACK〕
　　　　〔WRITE IMMEDIATE〕

　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝
　問合せ指定　：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝表式
　表式　　　　：：＝FROM  表参照〔，表参照〕…
　　　　　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　　　　　〔HAVING 探索条件〕

(4)　形式4 <埋込み変数配列を指定して，FIX属性の表に行単位で複数行を挿入>

　FOR ：埋込み変数
　INSERT INTO 〔認可識別子.〕表識別子（ROW）
　　　｛VALUES（：埋込み変数配列〔：標識変数配列〕）
　　　｜ 問合せ式本体 ｝
　　　〔WITH ROLLBACK〕
　　　〔WRITE IMMEDIATE〕

　問合せ式本体：：＝｛問合せ指定
　　　　　　　　　　　｜（問合せ式本体）
　　　　　　　　　　　｜問合せ式本体｛UNION｜EXCEPT｝〔ALL〕
　　　　　　　　　　　　｛問合せ指定｜（問合せ式本体）｝｝
　問合せ指定　：：＝SELECT〔｛ ALL ｜ DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝表式
　表式　　　　：：＝FROM  表参照〔，表参照〕…
　　　　　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　　　　　〔HAVING 探索条件〕

(5)　オペランド

FOR，VALUES，及びROW以外の説明については，「INSERT文　形式1（行挿入）」，及び「INSERT文　形式2（行挿入）」を参照してください。

(a)　<形式3のオペランド>

VALUES（挿入値〔，挿入値〕…）

挿入値

列名で指定した各列に対応した挿入値を指定します。指定できる項目を次に示します。

：埋込み変数配列〔：標識変数配列〕

値式

NULL（ナル値を表します）

DEFAULT

ただし，挿入値には配列形式でない埋込み変数は指定できません。

(b)　<形式4のオペランド>

（ROW）

行単位でデータを挿入する場合に指定します。ROWを指定する場合の規則を次に示します。

FIX属性の実表に対してだけ指定できます。ROWは行全体（予備列も含む）を意味し，これを指定することで行全体を一つのデータとして，一つの領域から挿入します。挿入するデータのデータ型は，各列のデータ型に関係なく，ROW型（ROW型に対しては，CHAR（n）〔nは行長〕に対応する変数，又は同じ長さの構造体を指定できます。ただし，構造体中に境界調整による空きがあってはいけません）にしてください。また，データ長は行長（各列のデータ長の総和）にしてください。

UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では，ROWは使用できません。例えば，WindowsのUAPでROWを使用する場合は，HiRDBサーバも同じエンディアンのWindows版を使用してください。

(c)　<形式3及び形式4で共通のオペランド>

FOR ：埋込み変数

埋込み変数配列を使用して，挿入する行数を設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は，1〜4,096の範囲で，かつ埋込み変数配列，及び標識変数配列の要素数以下にしてください。0及び負の値は設定できません。範囲外の値を設定した場合は実行時にエラーとなります。

埋込み変数配列

配列形式で宣言した埋込み変数を指定します。NULL値以外の値を挿入するための配列変数を指定してください。

それぞれの行に挿入する値を，埋込み変数配列の各要素に設定してください。挿入する値にNULL値を含む場合は，埋込み変数配列と標識変数配列を両方指定します。

標識変数配列

配列形式で宣言した標識変数を指定します。埋込み変数配列の各要素に挿入する値がNULL値でないことを示す値を，標識変数配列の対応する要素に設定してください。設定する値については，「標識変数の値の設定」を参照してください。FIX属性の実表には，NULL値を挿入できない点に注意してください。

(6)　共通規則

(a)　形式3の共通規則

埋込み変数配列のデータ型は，対応する列のデータ型，又は変換できるデータ型にしてください。

挿入する１行分の列の個数は，列名で指定した列の個数と同じにしてください。また，それらの値は，列のデータ型，又は変換できるデータ型にしてください。

配列を使用したINSERT文では，BLOB型，最大長が32,001バイト以上のBINARY型，及び抽象データ型は扱えません。

配列を使用したINSERT文では，繰返し列への挿入はできません。

固定小数点，又は浮動小数点のデータを，次に示すデータ型の列に挿入する場合，端数（小数）部分は切り捨てられます。

INTEGER

SMALLINT

また，固定小数点のデータをDECIMAL型の列に挿入する場合には，列の位取りより下位のけた部分が切り捨てられます。

表を定義したときに指定した長さ以上の文字データは，挿入できません。

列に定義されているデータ型の範囲外の数データは，挿入できません。

固定長文字列（各国文字列，及び混在文字列を含む）の列に挿入するデータが，列の長さより短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

文字データ型の列にデータを挿入する場合，挿入対象の列と，対応する挿入値の文字集合を同じにしてください。ただし，挿入値が埋込み変数配列（既定文字集合）の場合，自動的に挿入対象の列の文字集合に変換します。

(b)　形式4の共通規則

挿入対象の表に，既定文字集合以外の文字データ型の列が存在する場合，行単位のデータ更新はできません。

(c)　形式3及び形式4の共通規則

FOR句以外に埋込み変数配列を一つ以上指定してください。指定しない場合はエラーとなります。

FOR句以外に配列形式でない埋込み変数を指定するとエラーとなります。

埋込み変数配列，及び標識変数配列の要素数は，1〜4,096の範囲にしてください。範囲外の値を指定した場合はエラーとなります。また，"FOR ：埋込み変数"で指定する行数の最大値以上になるようにしてください。

INSERT文形式3は，埋込み変数配列，及び標識変数配列を含むため，PREPARE文で前処理できません。動的に実行する場合については，「EXECUTE文　形式2（配列を使用したSQLの実行）」を参照してください。

配列を使用したINSERT文は，手続きの中では使用できません。

挿入するどれかの行で警告する必要のある事象が発生した場合，SQL連絡領域のSQLWARNに警告情報が設定されます。

挿入するどれかの行でエラーが発生した場合，ロールバックされます。

WITHOUT ROLLBACKを指定した表に対して，INSERT文を実行する場合，インデクスの定義有無によって行排他の解除タイミングが異なります。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

共用表にデータを挿入する場合，事前にその表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表にデータ挿入した場合，エラーとなります。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

(7)　参照制約に関する規則

埋込み変数配列で挿入する場合，又は行単位で挿入する場合の参照制約に関する規則は，「INSERT文　形式1（行挿入）」の参照制約に関する規則を参照してください。

参照表に行を挿入する場合，外部キー構成列の値が被参照表の主キー構成列の値に含まれるかどうかを確認するため，被参照表を検索します。このとき，被参照表の検索時のデータ保証レベルは共用モードになります。そのため，参照表への行の挿入時，ほかのトランザクションによって被参照表に対する操作が行われている場合は，そのトランザクションが決着されるまで参照表への行の挿入は待ち状態になります。

(8)　使用例

C言語の配列変数に設定した50行分のデータを，在庫表に一括して挿入します。

EXEC SQL BEGIN DECLARE SECTION;
  short   XINSERT_NUM;
  long    XSCODE[50];
  short   ISCODE[50];
  char    XSNAME[50][17];
  short   ISNAME[50];
EXEC SQL END DECLARE SECTION;
            :
各変数配列の要素に値を設定
            :
XINSERT_NUM = 50;
EXEC SQL FOR :XINSERT_NUM
    INSERT INTO ZAIKO(SCODE,SNAME)
      VALUES (:XSCODE:ISCODE,:XSNAME:ISNAME);

C言語の配列変数に設定した行全体の値を，在庫表（ZAIKO）に50行分まとめて挿入します。

EXEC SQL BEGIN DECLARE SECTION;
  short   XINSERT_NUM;
  char    XROWS[50][31];
EXEC  SQL  END  DECLARE  SECTION;
             :
各変数配列の要素に値を設定
             :
XINSERT_NUM = 50;
EXEC  SQL  FOR :XINSERT_NUM
    INSERT INTO ZAIKO(ROW) VALUES(:XROWS);

4.29　OPEN文　形式1（カーソルオープン）

4.29.1　OPEN文 形式1の形式と規則

(1)　機能

カーソルを開きます。DECLARE CURSORで宣言したカーソル，又はALLOCATE CURSOR文で割り当てたカーソルを，検索結果の先頭の行の直前に位置づけて，検索結果を取り出せる状態にします。

形式1では，埋込み変数によって，?パラメタに値を与えてカーソルを開きます。

(2)　使用権限

SELECT権限を持つユーザ

カーソル宣言中やALLOCATE CURSOR文に，指定したすべての表に対してSELECT権限を持っている必要があります。

(3)　形式1 <（埋込み変数によって，?パラメタに値を与えて）カーソルを開く場合>

　OPEN ｛カーソル名｜拡張カーソル名｝  〔USING ：埋込み変数〔，：埋込み変数〕…〕

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

開くカーソルの名称を指定します。

拡張カーソル名

開くカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　USING ：埋込み変数〔，：埋込み変数〕…

DECLARE CURSOR中のSELECT文で指定した埋込み変数を別の埋込み変数に変更したい場合は，変更後の埋込み変数を指定します。

PREPARE文で前処理したSELECT文中に指定した?パラメタに値を与える場合は，値を与える埋込み変数を指定します。

DECLARE CURSOR中のSELECT文で指定した埋込み変数，又は?パラメタの値は，カーソルを閉じるまでこのSQL実行時の値が有効です。値を変更したい場合は，一度カーソルを閉じてから，再度開いてください。

USING句で指定した埋込み変数は指定した順序に，カーソル宣言中のSELECT文で指定した埋込み変数と置き換えられます。

USING句で指定した埋込み変数は指定した順序に，前処理したSELECT文で指定した?パラメタに値を与えます。

(5)　留意事項

一度開いたカーソルを再度開く場合は，いったんカーソルを閉じてから，再度開いてください。

内部的にCLOSE文を発行してカーソルを閉じる契機については，「CLOSE文（カーソルクローズ）」の共通規則1を参照してください。

FETCH文を実行する場合は，OPEN文でカーソルを開いてから，そのカーソルに対するFETCH文を実行してください。

USING句で埋込み変数を指定する場合は，埋込み変数に値を設定してからOPEN文を実行してください。

USING句に指定した埋込み変数が既定文字集合の文字データ型で，かつSELECT文で指定した？パラメタ又は埋込み変数に関連する項目と異なる文字集合の文字データ型の場合，自動的にSELECT文で指定した？パラメタ又は埋込み変数の文字集合に変換します。

OPEN文実行時はカーソルの位置づけをし，対応するFETCH文実行時に排他制御をします。

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

手続き中では，USING句は指定できません。

同一の表に対して，複数のホールダブルカーソルを開くことはできません。

(6)　使用例

在庫表（ZAIKO）の検索結果を取り出すために，カーソル（CR1）を開きます。

OPEN CR1

4.30　OPEN文　形式2（カーソルオープン）

4.30.1　OPEN文 形式2の形式と規則

(1)　機能

カーソルを開きます。DECLARE CURSORで宣言したカーソル，又はALLOCATE CURSOR文で割り当てたカーソルを，検索結果の先頭の行の直前に位置づけて，検索結果を取り出せる状態にします。

形式2では，SQL記述領域によって?パラメタに値を与えてカーソルを開きます。

(2)　使用権限

SELECT権限を持つユーザ

カーソル宣言中やALLOCATE CURSOR文に，指定したSELECT文に含まれるすべての表に対してSELECT権限を持っている必要があります。

(3)　形式2 <SQL記述領域によって?パラメタに値を与えてカーソルを開く場合>

　OPEN ｛カーソル名｜拡張カーソル名｝ USING DESCRIPTOR 〔：〕SQL記述領域名
                        〔CHARACTER SET〔：〕文字集合名記述領域名〕

(4)　オペランド

(a)　｛カーソル名｜拡張カーソル名｝

カーソル名

開くカーソルの名称を指定します。

拡張カーソル名

開くカーソルを識別する拡張カーソル名を指定します。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(b)　〔：〕SQL記述領域名

SQL記述領域名

PREPARE文で前処理した，SELECT文中で指定した?パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数を記述したSQL記述領域の名称を指定します。

SQL記述領域のSQLVAR配列で指定した変数は，指定した順序に，前処理したSELECT文で指定した?パラメタに値を与えます。

(c)　〔CHARACTER SET〔：〕文字集合名記述領域名〕

文字集合名記述領域名

PREPARE文で前処理した，SELECT文中で指定した?パラメタの値をSQL記述領域を用いて与えるときに，その入力?パラメタの値を与えるための変数の文字集合名を記述した，文字集合名記述領域の名称を指定します。

(5)　留意事項

一度開いたカーソルを再度開く場合は，いったんカーソルを閉じてから，再度開いてください。

内部的にCLOSE文を発行してカーソルを閉じる契機については，「CLOSE文（カーソルクローズ）」の共通規則1を参照してください。

FETCH文を実行する場合は，OPEN文でカーソルを開いてから，そのカーソルに対するFETCH文を実行してください。

OPEN文を実行するまでに，UAPはSQL記述領域及び文字集合名記述領域に必要な情報を設定してください。SQL記述領域及び文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

同一の表に対して，複数のホールダブルカーソルを開くことはできません。

(6)　使用例

在庫表の検索結果を取り出すために，カーソル（CR2）を開きます。ただし，PREPARE文で前処理したSELECT文中で指定した?パラメタの値を与えるための情報（SQLDA）を指定します。

OPEN CR2
    USING DESCRIPTOR SQLDA

4.31　PREPARE文（SQLの前処理）

4.31.1　PREPARE文の形式と規則

(1)　機能

文字列で与えられたSQLを実行するための前処理をして，そのSQLにSQL文識別子，又は拡張文名を付けます。また，OUTPUT，INPUTを指定することで，DESCRIBE〔OUTPUT〕文，DESCRIBE INPUT文で得られる検索情報，入出力情報を取得することもできます。

(2)　使用権限

なし。

(3)　形式

　PREPARE ｛SQL文識別子｜拡張文名｝FROM｛'文字列'｜：埋込み変数｝
　　　　　　　　　　　　　〔WITH ｛SQLNAME｜〔ALL〕TYPE｝
　　　　　　　　　　　　　〔，｛SQLNAME｜〔ALL〕TYPE｝〕OPTION〕
　　　　　　　　　　　　　〔OUTPUT〔:〕SQL記述領域名〔〔:〕列名記述領域名〕
　　　　　　　　　　　　　　　　　　　　　　　　　　　　〔TYPE〔:〕型名記述領域名〕〕
                                     〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕
　　　　　　　　　　　　　〔INPUT  〔:〕SQL記述領域名〔〔:〕列名記述領域名〕
                                      〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕

(4)　オペランド

(a)　｛SQL文識別子｜拡張文名｝

SQL文識別子

前処理するSQLを識別するためにSQL文に付けた名称を指定します。

SQL文識別子については，「名前の指定」を参照してください。

HiRDBの予約語も使用できますが，使用する場合，予約語と同じ名称でも引用符（"）で囲まないでください。ただし，'SELECT'，及び'WITH'は使用できません。

拡張文名

ALLOCATE CURSOR文でカーソルを割り当てる場合に，前処理するSQLを識別するためにSQL文に付けた拡張文名を指定します。

拡張文名については，「拡張文名」を参照してください。

(b)　｛'文字列'｜：埋込み変数｝

文字列

前処理するSQLの文字列を直接文字定数として指定します。

前処理する文字列中に，SQL先頭子，及びSQL終了子は指定できません。

前処理するSQLを文字定数として指定する場合で，SQL中に1個のアポストロフィを表すには，2個のアポストロフィを続けて指定します。

前処理するSQLの文字列の最大長は，2,000,000バイトです。ただし，埋込み型で，前処理するSQLを直接文字定数で指定した場合は，ホスト言語の文字定数の最大長です。

埋込み変数

可変長文字型の埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

(c)　〔WITH ｛SQLNAME｜〔ALL〕TYPE｝〔，｛SQLNAME｜〔ALL〕TYPE｝〕OPTION〕

SQLNAME

DESCRIBE文，DESCRIBE TYPE文で列名記述領域名を指定して，検索項目の列名情報，ユーザ定義型の属性名を受け取る場合に指定します。OUTPUT又はINPUT句で，列名記述領域名を指定した場合は，SQLNAMEを省略できます。

〔ALL〕TYPE

DESCRIBE文で型名記述領域を指定して，検索項目の型名情報を受け取る場合に指定します。OUTPUT句で型名記述領域名を指定した場合は，TYPEを省略できます。ALL TYPEは，DESCRIBE TYPE文でユーザ定義型の定義情報を受け取る場合に指定します。OUTPUT句で型名記述領域名を指定しても，ALL TYPEは省略できません。

(d)　〔OUTPUT〔:〕SQL記述領域名〔〔:〕列名記述領域名〕〔TYPE〔:〕型名記述領域名〕〕〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕

SQL記述領域名

SQLの検索項目情報（前処理したSQLがSELECT文の場合），又は出力?パラメタ情報（前処理したSQLがCALL文の場合）を受け取るSQL記述領域の名称を指定します。

SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

列名記述領域名

検索項目の名称，又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

列名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

型名記述領域名

検索項目のユーザ定義型名を受け取る型名記述領域を指定します。

型名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

文字集合名記述領域名

検索項目情報（前処理したSQLがSELECT文の場合），又は出力?パラメタ情報（前処理したSQLがCALL文の場合）の文字集合名を受け取る文字集合名記述領域を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(e)　〔INPUT 〔:〕SQL記述領域名〔〔:〕列名記述領域名〕〕〔CHARACTER_SET 〔:〕文字集合名記述領域名〕〕

SQL記述領域名

入力?パラメタ情報を受け取るSQL記述領域の名称を指定します。

SQL記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

列名記述領域名

検索項目の名称，又はルーチンのパラメタ名を受け取る列名記述領域を指定します。

列名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

文字集合名記述領域名

入力?パラメタ情報の文字集合名を受け取る文字集合名記述領域を指定します。

文字集合名記述領域については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　共通規則

埋込み変数の型は，次に示す構造体です。

    struct {
        long  xxxxxxx;     /* SQL文の有効長   */
        char  yyyyyyy[n];  /* SQL文格納エリア */
    } zzzzzzz;

（凡例）

xxxxxxxは，文字配列yyyyyyy中に格納した文字列の有効長を示します。

1 ≦ （xxxxxxxの値） ≦ 2000000

なお，文字列の有効長に文字列の終わりを示す0（ゼロ）は含みません。

nは，任意です。

SQLNAMEは重複して指定できません。また，〔ALL〕TYPEも重複して指定できません。

UAPは，PREPARE文を実行する前に，SQL記述領域にSQLVARの数（SQLN領域）を設定してください。

SQLDATAとSQLINDはDESCRIBE文実行時，又はINPUT，OUTPUTを指定したPREPARE文実行時にクリアされるので，DESCRIBE文を使用する，又はINPUT，OUTPUTを指定してPREPARE文を使用する場合は，その実行後に値を設定してください。

列名記述領域名は，検索項目の名称，又はルーチンのパラメタ名を受け取る場合だけ指定してください。ただし，ルーチンのパラメタ名は，CALL文の引数に単独で？パラメタを指定した場合にだけ受け取ることができます。？パラメタを含む値式を指定した場合は，列名記述領域の名称の長さが0になります。

型名記述領域名は，検索項目のユーザ定義型名を受け取る場合だけ指定してください。

文字集合名記述領域名は，文字集合名を受け取る場合だけ指定してください。

(6)　留意事項

前処理した結果は，そのトランザクション内だけで有効です。したがって，前処理したSQLに対するDESCRIBE文，EXECUTE文，OPEN文，FETCH文及びCLOSE文は同じトランザクション内で実行してください。ただし，前処理したSQLがホールダブルカーソルの場合は次のようになります。

該当するトランザクションで前処理し，コミットした場合

前処理した結果は，DISCONNECT文を実行するまで有効です。

該当するトランザクションで前処理し，ロールバックした場合

該当するトランザクション内でだけ有効です。

PREPARE文で前処理できるSQLは，PREPARE文で前処理しておく必要があります。PREPARE文で前処理できるSQLを次に示します。

操作系SQL

ASSIGN LIST文（EXECUTE文で実行します）

CALL文（EXECUTE文で実行します）

DELETE文（EXECUTE文で実行します）

準備可能動的DELETE文：位置付け（EXECUTE文で実行します）

DROP LIST文（EXECUTE文で実行します）

INSERT文（EXECUTE文で実行します）

PURGE TABLE文（EXECUTE文で実行します）

1行SELECT文（EXECUTE文で実行します）

動的SELECT文（OPEN文，FETCH文，及びCLOSE文で実行します）

UPDATE文（EXECUTE文で実行します）

準備可能動的UPDATE文：位置付け（EXECUTE文で実行します）

代入文（EXECUTE文で実行します）

制御系SQL

LOCK TABLE文（EXECUTE文で実行します）

SET SESSION AUTHORIZATION文（EXECUTE文で実行します）

定義系SQL

ALTER INDEX，ALTER PROCEDURE，ALTER ROUTINE，ALTER TABLE，ALTER TRIGGER，COMMENT，CREATE AUDIT，CREATE CONNECTION SECURITY，CREATE FUNCTION，CREATE INDEX，CREATE PROCEDURE，CREATE SCHEMA，CREATE SEQUENCE，CREATE TABLE，CREATE TRIGGER，CREATE TYPE，CREATE VIEW，DROP AUDIT，DROP CONNECTION SECURITY，DROP DATA TYPE，DROP FUNCTION，DROP INDEX，DROP PROCEDURE，DROP SCHEMA，DROP SEQUENCE，DROP TABLE，DROP TRIGGER，DROP VIEW，GRANT，REVOKE

（定義系SQLは，すべてEXECUTE文で実行します）

SQL文識別子は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じSQL文識別子に対する複数のSQLを，複数のモジュールにわたって使用できません。

PREPARE文で前処理した動的SELECT文の実行中（OPEN文を実行してからCLOSE文を実行するまでの間）に，その動的SELECT文のFROM句に指定した表を別のSQL文で更新しないでください。

指定したSQL文識別子，又は拡張文名が既にほかのSQL文を識別している場合は，暗黙的にDEALLOCATE PREPARE文が実行され，前に識別していたSQL文は無効になります。その後，指定したSQL文識別子，又は拡張文名はこのPREPARE文で前処理したSQL文を識別します。ただし，暗黙的に実行されたDEALLOCATE PREPARE文でエラーが発生した場合は，前に識別していたSQL文を識別したままとなります。

PREPARE文でOUTPUTを指定した場合，DESCRIBE〔OUTPUT〕を実行した場合と同様に扱われます。また，PREPARE文でINPUTを指定した場合，DESCRIBE〔INPUT〕を実行した場合と同様に扱われます。OUTPUT，INPUTについては，「DESCRIBE文　形式1（検索情報，入出力情報の受け取り）」及び「DESCRIBE文　形式2（検索情報，入出力情報の受け取り）」を参照してください。

ユーザ定義型の所有者名の長さが9文字以上の場合，型名記述領域を使用できません。

(7)　使用例

文字列で与えられたSQL'SELECT * FROM ZAIKO'を実行するために前処理します。前処理後のSQL文字列に付けるSQL識別子の名称は，'PRESQL'とします。

PREPARE PRESQL FROM
    'SELECT * FROM ZAIKO'

埋込み変数（XSQL）中に指定したSQL文字列を前処理します。前処理後のSQL文字列に付けるSQL識別子の名称は，'PRESQL'とします。

PREPARE PRESQL FROM :XSQL

4.32　PURGE TABLE文（全行削除）

4.32.1　PURGE TABLE文の形式と規則

(1)　機能

実表中の行をすべて削除します。

(2)　使用権限

表に対するDELETE権限を持つユーザが，その表の行を削除できます。

(3)　形式

　｛PURGE｜TRUNCATE｝ TABLE〔認可識別子.〕表識別子
　　　　　　　　〔｛WITH ROLLBACK｜NO WAIT｝〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子

認可識別子

表を所有するユーザの認可識別子を指定します。

認可識別子に"MASTER"は指定できません。認可識別子を省略した場合については，「名前の修飾」を参照してください。

表識別子

行をすべて削除する実表の名称を指定します。

(b)　〔｛ WITH ROLLBACK ｜ NO WAIT ｝〕

WITH ROLLBACK，又はNO WAITを省略した場合は，すべての行を削除する表がほかのユーザのトランザクションによって使用されていたら，そのトランザクションが終了してから実行します。

システム定義のpd_check_pendingオペランドにUSEを指定した場合，すべての行を削除する表を被参照表とする参照表がほかのユーザのトランザクションによって使用されていたときは，トランザクションが終了してから参照表を検査保留状態に設定します。

WITH ROLLBACK

行をすべて削除する表がほかのユーザで使用されていたら，トランザクションを取り消して無効にします。

システム定義のpd_check_pendingオペランドにUSEを指定した場合，行をすべて削除する表を被参照表とする参照表がほかのユーザのトランザクションに使用されているときは，トランザクションを取り消して無効にします。

NO WAIT

行をすべて削除する表がほかのユーザで使用されていたら，トランザクションを取り消さないで，このSQLを無効にします。

システム定義のpd_check_pendingオペランドにUSEを指定した場合，行をすべて削除する表を被参照表とする参照表がほかのユーザのトランザクションによって使用されているときは，トランザクションを取り消さないで，このSQLを無効にします。

(5)　共通規則

PURGE TABLE文が正常に実行された場合は，処理完了と同時にCOMMITされます。

LOB列又はLOB属性を格納するユーザLOB用RDエリアが更新凍結状態の場合，そのLOB列又はLOB属性がある表に対してPURGE TABLE文は実行できません（実行すると凍結済みエラーとなります）。

改竄防止表に対してPURGE TABLE文は実行できません。

共用表に対してPURGE TABLE文を実行した場合，共用表のEXCLUSIVE指定のLOCK文相当の排他が掛かります。HiRDB/パラレルサーバの場合，全バックエンドサーバで掛かります。

(6)　検査保留状態に関する規則

システム定義のpd_check_pendingオペランドにUSEを指定した場合，操作対象表が被参照表のときは，操作対象表を参照する参照表を検査保留状態に設定します。

操作対象表が検査保留状態である場合，操作対象表の検査保留状態を解除します。ただし，次の条件のどちらかを満たす場合，ディクショナリ表中の検査保留状態は解除されません。そのため，整合性チェックユティリティを使用し，ディクショナリ表中の検査保留状態を解除してください。

システム定義のpd_check_pendingオペランドにNOUSEを指定している。

インナレプリカ機能を使用している。

(7)　留意事項

PURGE TABLE文はビュー表に対して指定できません。

PURGE TABLE文は，OLTP下のX/Openに従ったUAPから指定できません。また，OLTP下のUAPから手続きを呼び出す場合，PURGE TABLE文を使用した手続きは実行できません。

PURGE TABLE文は，トリガの動作中は実行できません。

システム定義のpd_check_pendingオペランドにUSEを指定するか，又は指定を省略した場合，コマンド又はユティリティとPURGE TABLE文を同時に実行できないことがあります。詳細については，マニュアル「HiRDB Version 9 システム定義」のpd_check_pendingオペランドの説明を参照してください。

(8)　使用例

在庫表（ZAIKO）のすべての行を削除します。

PURGE TABLE ZAIKO
TRUNCATE TABLE ZAIKO

4.33　1行SELECT文（1行検索）

4.33.1　1行SELECT文の形式と規則

(1)　機能

表のデータを検索します。

表から1行だけデータを取り出す場合は，カーソルを使用しないでデータを取り出す1行SELECT文を指定します。

1行SELECT文は，問合せ指定のSELECT句とオペランドは同じですが，問合せ指定でのSELECT句のように集合に対する操作をする文ではありません。

また，1行SELECT文は検索した結果を受け取る領域についての指定をするINTO句を含んでいます。

(2)　使用権限

問合せ指定の権限と同じです。

(3)　形式<1行以下のデータを，指定された埋込み変数に取り出し>

　SELECT〔｛ALL｜DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝
　　〔INTO｛：埋込み変数〔：標識変数〕
　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　　　　..属性名〔..属性名〕…｝
　　　　　〔，｛：埋込み変数〔：標識変数〕
　　　　　　　　｜〔文ラベル.〕SQL変数名
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　　　　　..属性名〔..属性名〕…｝〕…〕
　　〈表式〉
　　　　FROM　表参照〔，表参照〕…
　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　〔HAVING 探索条件〕
　　〈排他オプション〉
　　　〔〔｛WITH｛SHARE｜EXCLUSIVE｝LOCK
　　　　　｜WITHOUT LOCK〔｛WAIT｜NOWAIT｝〕｝〕〕
　　　〔｛WITH ROLLBACK｜NO WAIT｝〕
　　　　　〔FOR UPDATE 〔OF 列名〔，列名〕…〕〔NOWAIT〕〕

(4)　オペランド

SELECT句については「問合せ指定」を，表式については「表式」を，排他オプションについては「排他オプション」をそれぞれ参照してください。

(a)　INTO句

INTO句は，SELECT文を単独でUAP，又は手続き中に直接記述する場合は，必ず指定してください。

ただし，次の箇所には指定できません。

PREPARE文で前処理するSQL中のSELECT文

EXECUTE IMMEDIATE文で前処理・実行するSQL中のSELECT文

カーソル宣言中のSELECT文

(b)　：埋込み変数〔：標識変数〕

埋込み変数

一つの行の列の値を読み込む埋込み変数を指定します。

標識変数

埋込み変数に読み込まれる列の値がナル値の可能性がある場合に指定します。

(c)　〔文ラベル.〕SQL変数名

SQL手続き中で列の値を受け取るために，SQL変数を指定します。Java手続き中の指定値については，マニュアル「HiRDB Version 9 UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。

(d)　〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名

SQL手続き中で列の値を受け取るために，SQLパラメタを指定します。Java手続き中の指定値については，マニュアル「HiRDB Version 9 UAP開発ガイド」のJDBCドライバ又はSQLJを参照してください。

パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は，認可識別子にPUBLICを指定してください。

(e)　〔文ラベル.〕SQL変数名..属性名〔..属性名〕…

SQL手続き中で，列中の属性の値を受け取るために指定します。

(f)　〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…

SQL手続き中で，列中の属性の値を受け取るために指定します。

パブリック手続き定義のSQL手続き文中で認可識別子を指定する場合は，認可識別子にPUBLICを指定してください。

(g)　〔FOR UPDATE 〔OF 列名〔，列名〕…〕〔NOWAIT〕〕

FOR UPDATE〔OF列名〔，列名〕…〕をFOR UPDATE句といいます。

FOR UPDATE 〔OF 列名〔，列名〕…〕

1行SELECT文で取り出したデータを使用して，行の更新，削除，又は追加をする場合に指定します。1行SELECT文で取り出したデータを使用した行の更新，削除，又は追加もしない場合は，オペランドを省略してください。SQL中の排他オプションを省略した場合，排他オプションはpd_isolation_levelの指定値，PDISLLVLの指定値，又はSQLコンパイルオプションで指定するデータ保証レベルの指定値によって決まりますが，PDFORUPDATEEXLOCKにYES，又はSQLコンパイルオプションのデータ保証レベルの後にFOR UPDATE EXCLUSIVEを指定することで，この指定のあるカーソルに対する排他オプションはWITH EXCLUSIVE LOCKが仮定されます。詳細については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

〔OF 列名〔，列名〕…〕

一般的には指定する必要がありません。

1行SELECT文の選択式で指定していない列でも指定できます。ただし，同じ列を2回以上指定できません。また，予備列は指定できません。

指定する列名は，AS列名に指定した列名ではなく，最も外側の問合せ指定のFROM句に指定した表の列を指定します。

〔NOWAIT〕

FOR UPDATE句を指定し，かつ排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合と同じ動作をします。ただし，排他オプションを指定した場合，NOWAITは指定できません。

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合の動作については，「排他オプション」を参照してください。

(5)　共通規則

検索結果が1行以下の場合は，カーソルを使用しないでINTO句を指定して検索できます。ただし，検索結果が2行以上の場合，検索できません。

検索結果の列の個数と，INTO句で指定した埋込み変数の個数は同じにしてください。列の個数と，埋込み変数の個数が同じでない場合は，SQL連絡領域のSQLWARN3領域に警告フラグ"W"が設定されます。

INTO句で指定する埋込み変数のデータ型は，対応する列のデータ型，又は変換できるデータ型にしてください。

埋込み変数が既定文字集合の文字データ型で，かつ検索結果がその埋込み変数と異なる文字集合の文字データ型の場合，自動的に埋込み変数の文字集合に変換します。

固定長文字列（各国文字列，及び混在文字列を含む）の埋込み変数に取り出すデータが，検索項目の長さより短い場合は，左詰めに挿入され，余りの部分に空白が設定されます。

検索結果の列の値がナル値の場合，対応する埋込み変数の値は保証しません。

検索結果の列の値がナル値の場合は，対応する標識変数を指定してください。

取り出す行がない場合，次のリターンコードが設定されます。

SQL連絡領域のSQLCODE領域に100

SQLCODE変数に100

SQLSTATE変数に'02000'

「カーソル指定　形式1」，及び「問合せ指定」の規則に従って，UNION〔ALL〕，EXCEPT〔ALL〕，ORDER BY句，及びLIMIT句を指定できます。

UNION〔ALL〕，及びEXCEPT〔ALL〕を指定した場合のINTO句は，最初のSELECT句の次に一度だけ指定してください。

1行SELECT文又は排他オプション中に次のどれかの指定を含む場合は，FOR UPDATE句の指定はできません。

(5-a) UNION〔ALL〕，又はEXCEPT〔ALL〕

(5-b) 最も外側の問合せ指定のFROM句に指定した表を，副問合せのFROM句に指定

(5-c) 最も外側の問合せ指定での表の結合

(5-d) 最も外側の問合せ指定でのFROM句の導出表

(5-e) 最も外側の問合せ指定でのSELECT DISTINCT

(5-f) 最も外側の問合せ指定でのGROUP BY句

(5-g) 最も外側の問合せ指定でのHAVING句

(5-h) 最も外側の問合せ指定に対する集合関数

(5-i) 最も外側の問合せ指定でのウィンドウ関数

(5-j) 最も外側の問合せ指定のFROM句中で，次に示すどれかのビュー表を指定

ビュー定義文で上記(5-a)〜(5-i)を指定して定義したビュー表

ビュー定義文で最も外側の問合せ指定のSELECT句に，列指定以外の値式を指定して定義したビュー表

ビュー定義文中で，READ ONLYを指定して定義したビュー表

(5-k) WITHOUT LOCK NOWAIT

(6)　使用例

使用例については，「DECLARE CURSOR　形式1（カーソル宣言）」を参照してください。

4.34　動的SELECT文　形式1（動的検索）

4.34.1　動的SELECT文 形式1の形式と規則

(1)　機能

次に示す検索ができます。

一つ以上の表からデータを検索します。

動的にSELECT文を実行する場合に指定します。

動的SELECT文は，PREPARE文で前処理します。検索するときは，DECLARE CURSORによってカーソルを宣言してから，そのカーソルを使用して検索結果を1行ずつ取り出します。

(2)　使用権限

「カーソル指定　形式1」を参照してください。

(3)　形式

　〈カーソル指定　形式1〉
　　〈問合せ式〉
　　　〈問合せ指定〉
　　　　｛SELECT〔｛ALL｜DISTINCT｝〕｛選択式〔，選択式〕…｜＊｝
　　　　〈表式〉
　　　　FROM 表参照〔，表参照〕…
　　　　　　　　〔WHERE 探索条件〕
　　　　　　　　〔GROUP BY 値式〔，値式〕…〕
　　　　　　　　〔HAVING 探索条件〕
　　　　　｜ 問合せ式 ｝
　　　　〔ORDER BY ｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕
　　　　　　　〔，｛列指定｜ソート項目指定番号｝〔｛ASC｜DESC｝〕〕… 〕
　　　　〔LIMIT ｛〔オフセット行数，〕｛リミット行数｜ALL｝
　　　　　　　　｜ ｛リミット行数｜ALL｝ 〔OFFSET オフセット行数〕｝〕
　〈排他オプション〉
　　〔〔｛WITH｛SHARE｜EXCLUSIVE｝LOCK
　　　　　｜WITHOUT LOCK〔｛WAIT｜NOWAIT｝〕｝〕
　　〔｛WITH ROLLBACK｜NO WAIT｝〕〕
　　　　　〔FOR ｛UPDATE 〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝〕
　　　　　〔UNTIL DISCONNECT〕

(4)　オペランド

次の項目については，それぞれの箇所を参照してください。

カーソル指定　形式1：「カーソル指定　形式1」

問合せ式：「問合せ式」

問合せ指定：「問合せ指定」

表式：「表式」

探索条件：「探索条件」

排他オプション：「排他オプション」

(a)　FOR ｛UPDATE〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝

FOR UPDATE 〔OF列名〔，列名〕…〕をFOR UPDATE句といいます。

FOR UPDATE

カーソルを使用して検索中の表に対して，そのカーソルを使用した行の更新，又は削除をして，更にほかのカーソル，又は直接探索条件を指定して行を更新，追加，又は削除する場合に指定します。

FOR UPDATEを省略した場合，そのカーソルを使用して検索中の表に対して行の更新，追加，又は削除はできません。

カーソル指定，又は排他オプション中に次のどれかの指定を含む場合は，FOR UPDATE句の指定はできません。

(4-a) UNION〔ALL〕，又はEXCEPT〔ALL〕

(4-b) 最も外側の問合せ指定のFROM句に指定した表を，副問合せのFROM句に指定

(4-c) 最も外側の問合せ指定での表の結合

(4-d) 最も外側の問合せ指定でのFROM句の導出表

(4-e) 最も外側の問合せ指定でのSELECT DISTINCT

(4-f) 最も外側の問合せ指定でのGROUP BY句

(4-g) 最も外側の問合せ指定でのHAVING句

(4-h) 最も外側の問合せ指定に対する集合関数

(4-i) 最も外側の問合せ指定に対するウィンドウ関数

(4-j) 最も外側の問合せ指定のFROM句中で，次に示すどれかのビュー表を指定

ビュー定義文で上記(4-a)〜(4-i)を指定して定義したビュー表

ビュー定義文で最も外側の問合せ指定のSELECT句に，列指定以外の値式を指定して定義したビュー表

ビュー定義文中で，READ ONLYを指定して定義したビュー表

(4-k) WITHOUT LOCK NOWAIT

(4-l) WITH句を指定した問合せ式本体の最も外側の問合せ指定のFROM句に問合せ名を指定

OF列名〔，列名〕…

カーソルを使用して検索中の表に対して，そのカーソルを使用した検索行の更新だけをする場合に，更新する列を指定します。

SELECT文の選択式で指定していない列でも指定できます。ただし，同じ列を2回以上指定できません。また，予備列は指定できません。

カーソルを使用して検索中の表に対して，そのカーソル及びほかのカーソルを使用した行の更新，削除がなく，カーソルを使用しない行の更新，削除，及び追加もしない場合には，オペランドを省略してください。

指定する列名は，AS列名に指定した列名ではなく，最も外側の問合せ指定のFROM句に指定した表の列を指定します。

〔NOWAIT〕

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合と同じ動作をします。ただし，排他オプションを指定した場合，FOR UPDATE句にNOWAITは指定できません。

排他オプションにWITH EXCLUSIVE LOCK NO WAITを指定した場合の動作については，「排他オプション」を参照してください。

FOR READ ONLY

カーソルを使用して検索中に，ほかのカーソル，又は直接探索条件を指定して更新する場合に指定します。検索中の更新が検索結果に影響を与えないようにする場合にFOR READ ONLYを指定します。

FOR READ ONLY句を指定した場合，次の制限があります。

(4-a) 選択式中に，結果が次のデータ型になるスカラ演算，関数呼出し，及びコンポネント指定は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

BOOLEAN

抽象データ型

(4-b) 選択式中のWRITE指定の出力BLOB値には，列指定だけ指定できます。

(4-c) GET_JAVA_STORED_ROUTINE_SOURCE指定は指定できません。

(b)　〔UNTIL DISCONNECT〕

ホールダブルカーソルを使用する場合に指定します。ホールダブルカーソルについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

ホールダブルカーソルについての規則を次に示します。

次の場合，ホールダブルカーソルは使用できません。

ホールダブルカーソルに未対応のプラグイン※を使用した抽象データ型の列を指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定した場合

ホールダブルカーソルに未対応のプラグイン※を使用した関数呼出しを指定して導出した，名前付きの導出表に対する問合せを指定した場合

ON COMMIT DELETE ROWSを指定して定義した一時表に対する問合せ

ホールダブルカーソルが開いている場合，定義系SQLは実行できません。また，ホールダブルカーソルが閉じている場合，定義系SQLを実行するとホールダブルカーソルを使用している前処理は無効になります。

ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行後，そのSELECT文中で使用している表に対してPURGE TABLE文を実行すると，カーソルは閉じた状態になります。

ホールダブルカーソルを使用したSELECT文に対してOPEN文を実行してからDISCONNECTするまでの間に，そのSELECT文中で使用している表に対して，ほかのユーザが定義系SQL文を発行すると，定義系SQLは排他待ちの状態になります。また，ホールダブルカーソルを使用したSELECT文に対する前処理が有効な間に，そのSELECT文中で使用している表に対して，ほかのユーザが定義系SQL文を発行すると，定義系SQLは排他待ちの状態になります。

注※

プラグインのホールダブルカーソルへの対応状況については，ディクショナリ表SQL_PLUGINSのPLUGIN_HOLDABLE列で確認できます。ディクショナリ表SQL_PLUGINSについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(5)　参照制約に関する規則

ホールダブルカーソルを使用して，外部キーの定義されている表を検索している場合，検索中の表が検査保留状態となったときには，カーソルは閉じた状態になります。

(6)　留意事項

FOR UPDATEを指定すると作業表が作成されるのでカーソルを使用して検索中の表に対して，行の更新，追加，又は削除をしない場合は，このオペランドを省略してください。

SQL最適化オプションの更新SQLの作業表作成抑止を適用して，更にインデクスキー値無排他機能を使用すると，FOR UPDATE又はFOR UPDATE OFを指定しないカーソルの使用中に，行の更新，追加，又は削除ができます。

(7)　使用例

使用例については，「DECLARE CURSOR　形式1（カーソル宣言）」，及び「ALLOCATE CURSOR文 形式1（文カーソル割当て）」を参照してください。

4.35　動的SELECT文　形式2（動的検索）

4.35.1　動的SELECT文 形式2の形式と規則

(1)　機能

リストを介して表を検索します。

(2)　使用権限

自分の所有するリストを介して表を検索できます。

(3)　形式2＜リストを介した表のデータの検索＞

　〈カーソル指定　形式2〉
　SELECT ｛｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝
　　　　　　　　　 〔〔AS〕 列名〕
　　　　　　〔，｛値式｜WRITE指定｜GET_JAVA_STORED_ROUTINE_SOURCE指定｝
　　　　　　　　　　 〔〔AS〕 列名〕〕…
　　　　　　 ｜＊｝
　　　FROM LIST リスト名
　〈排他オプション〉
　　〔〔｛WITH｛SHARE｜EXCLUSIVE｝LOCK
　　　　　｜WITHOUT LOCK〔｛WAIT｜NOWAIT｝〕｝〕
　　〔｛WITH ROLLBACK｜NO WAIT｝〕

(4)　オペランド

カーソル指定については「カーソル指定　形式2」を，排他オプションについては「排他オプション」を参照してください。

(a)　〔排他オプション〕

リストを介して検索する場合，検索する実表に対する排他制御について指定します。

(5)　共通規則

リスト作成時にあった行が検索時にない場合には，SQLコード+110を返します。この場合，検索は続行します。

同一ユーザが，複数同時にHiRDBと接続してリストを操作できません。

(6)　留意事項

リストを作成後，基表の行を削除した場合，検索時にその行は検索されません。

リストを作成後，基表の行を更新した場合，更新後のデータが検索されます。

リストを作成後，基表に対して，行を削除後に行を挿入した場合，挿入した行が検索されることがあります。

リストを介した表の検索をするSQLをPREPARE文で前処理した後，OPEN文を実行するまでの間に，同一リスト名のASSIGN LIST文を実行しないようにしてください。

4.36　UPDATE文　形式1（データ更新）

4.36.1　UPDATE文 形式1の形式と規則

(1)　機能

表内の，指定した探索条件を満足する行，又はカーソルが指している行の指定した列の値を更新します。

(2)　使用権限

表に対するUPDATE権限を持つユーザが，その表の行の値を更新できます。

ただし，探索条件中に副問合せを指定する場合は，その副問合せ指定の表に対してSELECT権限が必要です。

(3)　形式1 <列単位で表内の行を更新>

　UPDATE 〔認可識別子.〕表識別子
　　　　　　　〔IN （RDエリア名指定）〕〔〔AS〕 相関名〕
　　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　｛SET ｛更新対象＝更新値
　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕）＝行副問合せ｝
　　　　　　　　　　　〔，｛更新対象＝更新値
　　　　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕…）＝行副問合せ｝〕…
　　　　　　　　｜ADD繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　＝｛ARRAY ［要素の値〔，要素の値〕…］
　　　　　　　　　　　　　　　｜？パラメタ｜：埋込み変数〔：標識変数〕｝
　　　　　　　　　　　　〔，繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　　　　＝｛ARRAY ［要素の値〔，要素の値〕…］
　　　　　　　　　　　　　　　　　　｜？パラメタ｜：埋込み変数〔：標識変数〕｝〕…
　　　　　　　　｜DELETE繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　 〔，繰返し列名 ［｛添字｜＊｝］〕…｝
　〔WHERE｛探索条件｜CURRENT OF｛カーソル名｜拡張カーソル名｝｝〕
　〔WITH ROLLBACK〕
　〔WRITE IMMEDIATE〕

　更新対象：：＝｛列名｜コンポネント指定｜列名［｛添字｜＊｝］｝

(4)　オペランド

(a)　〔認可識別子.〕表識別子

更新する表を指定します。

規則を次に示します。

読み込み専用のビュー表は行の更新ができません。読み込み専用のビュー表については，「CREATE 〔PUBLIC〕VIEW（ビュー定義，パブリックビュー定義）」の共通規則を参照してください。

ビュー表の列の更新を指定した場合は，そのビュー表の列に対応する基の実表を更新します。

表名の有効範囲はUPDATE文全体です。

SET句，又はADD句に指定した副問合せ中に，更新する表の列を外への参照で指定し，かつ副問合せの選択式に次に示す属性の値式を指定した場合，副問合せのFROM句の表名と同じ名称は指定できません。

BLOB

最大長が32,001バイト以上のBINARY

繰返し列

抽象データ型

ただし，副問合せのFROM句の表名にビュー表を指定した場合は，そのビュー表定義の導出問合せ式中で指定したすべての表名が対象になります。

認可識別子

表の所有者の認可識別子を指定します。認可識別子に"MASTER"は指定できません。

表識別子

更新する表の名称を指定します。

(b)　〔IN （RDエリア名指定）〕

IN

アクセス対象のRDエリアを指定します。表識別子に指定した表が一時表の場合は指定できません。

RDエリア名指定：：＝値指定

表識別子に指定した表を格納しているRDエリアのうち，アクセスするRDエリアの名称をVARCHAR型，CHAR型，MVARCHAR型，又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ（，）で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については，「名前の指定」を参照してください。また，値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符（"）で囲んだ場合は，引用符（"）の外側の空白だけを無視します。

カーソル名又は拡張カーソル名の指定がある場合は，カーソル宣言で宣言したカーソルで指定したRDエリアと同じRDエリアの集合を指定してください（順不同）。指定しない場合はエラーとなります。

インナレプリカ機能を適用しているRDエリアを指定する場合，オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は，カレント切り替えコマンド（pddbchgコマンド），又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

(c)　〔AS〕 相関名

更新対象の表に対して相関名を使用する場合に指定します。

相関名の有効範囲はUPDATE文全体です。更新対象の表識別子は有効範囲を持ちません。

(d)　使用インデクスのSQL最適化指定

使用インデクスのSQL最適化指定については，「SQL最適化指定」を参照してください。

(e)　SET更新対象＝更新値

列の値，又は抽象データ型の属性の値を更新する場合に指定します。

列名

更新する列の名称を指定します。

コンポネント指定

更新する抽象データ型の属性を指定します。

列名 ［｛添字｜＊｝］

列名

要素を更新する繰返し列を指定します。

［｛添字｜＊｝］

添字には，更新する要素の位置を指定します。＊は，要素の最後を更新する場合に指定します。

＊を指定した場合，更新対象となっている繰返し列の要素が0のときは，＊の指定は無効となります。

更新値

更新値の列の値として次に示す項目が指定できます。

列名

コンポネント指定

定数

値式（四則演算，連結演算を含みます）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表します）

DEFAULT（更新対象の列の既定値を表します）

：埋込み変数〔：標識変数〕

?パラメタ

SQL変数，又はSQLパラメタ

ARRAY ［要素の値〔，要素の値〕…］※

注※

要素の値には，次の項目を指定できます。

繰返し列以外の列名

添字付き繰返し列

定数

値式（四則演算，連結演算を含みます）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表します）

DEFAULT

：埋込み変数〔：標識変数〕

?パラメタ

SQL変数，又はSQLパラメタ

更新値の規則

更新値として列名を指定する場合は，更新対象になる列，又は属性と同じデータ型，又は変換できるデータ型の列名を指定します。

更新値としてスカラ副問合せを指定する場合，スカラ副問合せで得られる列のデータ型は，更新対象の列又は属性と同じデータ型，又は変換できるデータ型にしてください。

更新対象のデータ型が文字データ型の場合，更新対象と更新値の文字集合は同じにしてください。ただし，更新値として埋込み変数（既定文字集合），?パラメタ，又は文字列定数を指定した場合は，自動的に更新対象の文字集合に変換します。

更新対象に添字のない繰返し列を指定する場合，更新値の列名，又はスカラ副問合せの選択式には，添字のない繰返し列の列名を指定してください。

更新対象に添字のある繰返し列を指定する場合，更新値の列名，又はスカラ副問合せの選択式に添字のない繰返し列の列名は指定できません。

埋込み変数，標識変数は，PREPARE文で前処理するUPDATE文，又は手続き中には指定できません。手続き中では，SQL変数，又はSQLパラメタを使用します。

埋込み変数（標識変数），?パラメタ，SQL変数，又はSQLパラメタを指定する場合，埋込み変数（?パラメタの場合は，それに値を与えるために指定する埋込み変数），SQL変数，又はSQLパラメタのデータ型は，更新する列又は属性のデータ型，又は変換できるデータ型にしてください。

また，更新対象となる列が繰返し列の場合，更新値の埋込み変数（標識変数），？パラメタは繰返し構造にしてください。

標識変数を指定した場合は，標識変数の値が負の場合，埋込み変数の値がナル値と解釈され，対応する列にナル値が設定されます。標識変数の値が0，又は正の場合，埋込み変数の値が対応する列に設定されます。

?パラメタは，PREPARE文で前処理をするUPDATE文の場合だけ指定できます。

?パラメタに与える値は，前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

更新値は，更新対象になる列又は属性と変換，比較できるデータ型にしてください。

ただし，更新対象になる列又は属性が各国文字データ型で，更新値として文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードはチェックされないで，文字データの長さだけがチェックされます。

更新する列が添字のない繰返し列の場合，更新値には，定数，値式，USER値関数，CURRENT_DATE値関数，CURRENT_TIME値関数，CURRENT_TIMESTAMP値関数，SQL変数，又はSQLパラメタは指定できません。

ARRAY ［要素の値〔，要素の値〕…］は，更新対象になる列が繰返し列の場合にだけ指定できます。

ARRAY ［要素の値〔，要素の値〕…］の中の要素の値は，最大30,000個指定できます。ただし，更新する列の最大要素数以下にしてください。

更新値としてDEFAULTを指定する場合の既定値は，次のようになります。

・更新対象の列にDEFAULT句の指定がある場合は，指定した既定値となります。

・DEFAULT句の指定がなく，WITH DEFAULTの指定がある場合は，WITH DEFAULTの既定値となります。

・DEFAULT句，及びWITH DEFAULTのどちらの指定もない場合，NULLが既定値となります。

要素の値の規則

規則を次に示します。

埋込み変数，標識変数は，PREPARE文で前処理するUPDATE文，及び手続き中には指定できません。手続き中では，SQL変数又はSQLパラメタを使用します。

埋込み変数（標識変数），？パラメタ，SQL変数，又はSQLパラメタを指定する場合，埋込み変数（？パラメタの場合は，それに値を与えるために指定する埋込み変数），SQL変数，又はSQLパラメタのデータ型は，更新する列のデータ型，又は変換できるデータ型にしてください。また，埋込み変数（標識変数），？パラメタの構造は単純構造にしてください。

標識変数を指定した場合は，標識変数の値が負のとき，埋込み変数の値がナル値と解釈され，対応する列にナル値が設定されます。標識変数の値が0又は正の場合，埋込み変数の値が対応する列に設定されます。

？パラメタは，PREPARE文で前処理をするUPDATE文の場合にだけ指定できます。？パラメタに与える値は，前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

要素の値には，更新対象になる列と変換・比較できるデータ型にしてください。ただし，更新対象になる列が各国文字データ型で，更新値として文字列定数を指定した場合，文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合，文字コードのチェックはしないで，文字データの長さだけチェックします。

要素の値としてスカラ副問合せを指定する場合は，スカラ副問合せの選択式に添字のない繰返し列を指定できません。

要素の値としてDEFAULTを指定する場合，既定値はナル値となります。

連結演算を使用してBLOB型，又は定義長が32,001バイト以上のBINARY型の列を更新する場合の規則

規則を次に示します。

連結演算の第1演算項には，列指定が指定できます。第2演算項には，埋込み変数，？パラメタ，SQL変数，及びSQLパラメタを指定できます。

更新値としてBLOB型，又は定義長が32,001バイト以上のBINARY型の連結演算を指定する場合，更新対象と連結演算の第1演算項には，必ず同じ列を指定してください。

連結演算の結果に対して，連結演算は指定できません。

BLOB型と連結できるデータ型は，BLOB型だけです。数データ，文字データ，各国文字データ，又は混在文字データとは連結できません。

BINARY型と連結できるデータ型は，BINARY型だけです。数データ，文字データ，各国文字データ，及び混在文字データとは連結できません。

連結演算の結果は，第1演算項又は第2演算項の値の非ナル値制約の有無に関係なく，ナル値を許します。

連結演算の結果の実長が，BLOB型，又はBINARY型の最大長（2,147,483,647バイト）を超えた場合はエラーになります。

更新対象の表に次の定義がある場合，連結演算を使用した更新はエラーになります。

・更新対象の表にUPDATEトリガを定義している

・連結演算を使用して更新する列を検査制約の探索条件に指定している

(f)　SET （更新対象，更新対象〔，更新対象〕…）＝行副問合せ

行副問合せの結果で，複数の列の値を更新する場合に指定します。なお，更新対象は2個以上指定してください。

列名

更新する列の名称を指定します。

コンポネント指定

更新する抽象データ型の属性を指定します。

列名 ［｛添字｜＊｝］

列名

要素を更新する繰返し列を指定します。

［｛添字｜＊｝］

添字には，更新する要素の位置を指定します。＊は，要素の最後を更新する場合に指定します。

＊を指定した場合，更新対象となっている繰返し列の要素が0のときは，＊の指定は無効となります。

行副問合せ

更新するデータを取り出す行副問合せを指定します。行副問合せについては，「副問合せ」を参照してください。

行副問合せについての規則を次に示します。

更新対象の数と，行副問合せの選択式の数は同じにしてください。

行副問合せで得られる列のデータ型は，更新対象の列又は属性と同じデータ型，又は変換できるデータ型にしてください。

更新対象のデータ型が文字データ型の場合，更新対象の文字集合と行副問合せで得られる列の文字集合は同じにしてください。

更新対象に添字のない繰返し列を指定する場合，行副問合せの選択式の列は添字のない繰返し列の列名を指定してください。

更新対象に添字のある繰返し列を指定する場合，行副問合せの選択式の列に添字のない繰返し列の列名は指定できません。

SET句共通規則

SET句で添字を指定して繰返し列の要素を更新する場合，同じSET句内で同じ列の同じ要素に対する更新は，1回だけ指定できます。

SET句で添字を指定しないで繰返し列を更新する場合，同じSET句内で添字を指定してその繰返し列を更新できません。

添字に＊を指定して繰返し列を更新する場合，同じSET句内でその繰返し列を更新できません。

更新する列に予備列は指定できません。

(g)　ADD繰返し列名 ［｛添字｜＊｝］＝｛ARRAY［要素の値〔，要素の値〕…］｜？パラメタ｜：埋込み変数〔：標識変数〕｝

繰返し列の要素を追加する場合に指定します。

繰返し列名 ［｛添字｜＊｝］

繰返し列名

要素を追加する繰返し列を指定します。

［｛添字｜＊｝］

添字には，追加する要素の位置を指定します。＊は，最後に要素を追加する場合に指定します。

ARRAY ［要素の値〔，要素の値〕…］

要素の値として，次に示す項目が指定できます。

繰返し列以外の列名

添字付き繰返し列

定数

値式（四則演算，連結演算を含みます）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表します）

DEFAULT

：埋込み変数〔：標識変数〕

?パラメタ

SQL変数，又はSQLパラメタ

要素の値の規則については，SET更新対象＝更新値の「要素の値の規則」を参照してください。

？パラメタ

？パラメタのデータ型は，更新する列のデータ型，又は変換できるデータ型にしてください。また，？パラメタの構造は繰返し構造にしてください。

？パラメタは，PREPARE文で前処理をするUPDATE文の場合にだけ指定できます。？パラメタに与える値は，前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

：埋込み変数〔：標識変数〕

埋込み変数，標識変数は，PREPARE文で前処理するUPDATE文，又は手続き中には指定できません。

埋込み変数（標識変数）のデータ型は，更新する列のデータ型，又は変換できるデータ型にしてください。また，埋込み変数（標識変数）の構造は，繰返し構造にしてください。

標識変数を指定した場合は，標識変数の値が負のとき，埋込み変数の値がナル値と解釈され，対応する列にナル値が設定されます。標識変数の値が0又は正の場合，埋込み変数の値が対応する列に設定されます。

ADD句共通規則

一つのADD句には，一つの列に対する要素の追加は，1回だけ指定できます。

要素を追加する場合，追加後の要素数が最大要素数を超えないようにしてください。

ARRAY ［要素の値〔，要素の値〕…］の中の要素の値は，最大30,000個指定できます。

添字で指定した場所より後ろの要素は，新しく追加した要素の後ろに移動します。添字に，要素追加の対象となっている繰返し列の要素の数よりも2以上大きい数を指定した場合は，その繰返し列の要素の数が（指定した要素）-1になるまでナル値を追加して，その後ろに要素の値を追加します。

追加対象列に複数列インデクスが定義されている場合，そのインデクスを構成するすべての繰返し列に，一つのADD句で同じ数の要素を同じ要素の位置で指定して追加してください。

WHERE句にCURRENT OFカーソル名を指定して，カーソルを用いた要素の追加をする場合，ADD句の要素の値には列名及び値式を指定できません。

要素の値としてDEFAULTを指定する場合，既定値はナル値になります。

(h)　DELETE繰返し列名 ［｛添字｜＊｝］

繰返し列の要素を削除する場合に指定します。

繰返し列名

要素を削除する繰返し列を指定します。

［｛添字｜＊｝］

添字には，削除する要素の位置を指定します。＊は，最後の要素を削除する場合に指定します。

DELETE句共通規則

DELETE句で添字を指定して要素を削除する場合は，同じDELETE句内で同じ列の同じ要素に対する削除は1回だけ指定できます。

添字に，要素の削除対象になっている列の要素の数より大きい数を指定できません。

要素に＊を指定して繰返し列の要素を削除する場合は，同じDELETE句内でその列の要素を同時に指定できません。

削除された要素よりも後ろの要素は，一つずつ繰り上がります。

削除対象の列に複数列インデクスが定義されている場合，そのインデクスを構成するすべての繰返し列に，一つのDELETE句で同じ数の要素を同じ要素の位置で指定して削除してください。

(i)　〔WHERE｛探索条件｜ CURRENT OF｛カーソル名｜拡張カーソル名｝｝〕

省略すると，指定した表のすべての行が更新されます。

探索条件

更新の対象となる行を選択する条件を指定します。

この探索条件を満足するすべての行を更新します。

カーソル名

更新する行を指すカーソルの名称を指定します。

PREPARE文で前処理する場合は，指定できません。

カーソル名で指定するカーソルは，カーソル宣言で宣言されたカーソルにしてください。カーソル宣言のFOR UPDATE句に，UPDATE文で値を更新する列名を指定しておいてください。

カーソル名を指定する場合は，カーソル宣言で指定したカーソルが更新できなければなりません。更新できるカーソルについては，「DECLARE CURSOR　形式1（カーソル宣言）」の共通規則4.を参照してください。

カーソル名で指定するカーソルは，OPEN文で開き，FETCH文で更新する行に位置づけてください。

カーソル名で指定するカーソルの位置は，UPDATE文実行後も同じです。更新した行よりも後の行を更新する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させます。

拡張カーソル名

更新する行を指すカーソルを識別する拡張カーソル名を指定します。

PREPARE文で前処理する場合は，指定できません。

ALLOCATE CURSOR文で割り当てられたカーソルを識別している拡張カーソル名を指定してください。ただし，結果集合カーソルは指定できません。

拡張カーソル名を指定する場合は，FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については，「動的SELECT文　形式1（動的検索）」のオペランド規則のFOR UPDATE句を参照してください。

拡張カーソル名が識別するカーソルは，開いた状態であり，かつ更新する行に位置づけられている必要があります。

拡張カーソル名が識別するカーソルの位置は，UPDATE文実行後も同じです。更新した行よりも後の行を更新する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させます。

拡張カーソル名については，「拡張カーソル名」を参照してください。

(j)　〔WITH ROLLBACK〕

更新の対象となる表が，ほかのユーザで使用されているとき，トランザクションを取り消して無効にする場合，指定します。

WITH ROLLBACKを省略した場合は，更新する表がほかのユーザで使用されているとき，使用中のユーザのトランザクションが終了してから実行します。

(k)　〔WRITE IMMEDIATE〕

表オプションにWITHOUT ROLLBACKの指定がある表に対する更新処理で，更新完了時にシステムログを書き出す場合，このオプションを指定してください。WITHOUT ROLLBACK指定のない表に対して，このオプションを指定しても無効になります。

更新完了時にシステムログを書き出す効果については，マニュアル「HiRDB Version 9 UAP開発ガイド」の採番業務で使用する表を参照してください。

(5)　共通規則

INTEGER，又はSMALLINTのデータ型の列を，固定小数点，又は浮動小数点数のデータで更新する場合は，端数（小数）部分は更新前に切り捨てられます。また，DECIMAL型の列を固定小数点のデータで更新する場合，列の位取りより下位のけた部分が，更新前に切り捨てられます。

更新する列の値として，表の定義時に指定した長さ以上の文字データ，BLOBデータ，又はBINARYデータは入力できません。

更新する列の値として，定義域の範囲外の数データは入力できません。

固定長文字列（各国文字列，及び混在文字列を含む）の列を更新するデータが列の長さより短い場合は，左詰めに挿入され，余りの部分に余白が設定されます。

データ型がBLOBの列又は属性を更新する場合，更新値には列指定，コンポネント指定，埋込み変数，?パラメタ，SQL変数，SQLパラメタ，連結演算，スカラ関数SUBSTR，関数呼出し，副問合せ，又はNULLが指定できます。

データ型がBLOBの列又は属性を更新する場合，データベース中に新しいデータを書き込んだ後，既存のデータを削除します。このため，データを更新するLOB用RDエリアには，新しいデータを書き込めるだけの空き領域が必要になります。空き領域が確保できない場合は，RDエリア満杯エラーになります。

抽象データ型の列又は属性を更新する場合，更新値には埋込み変数及び？パラメタは指定できません。

抽象データ型の列又は属性を更新する場合，更新値には表定義時にLOB属性格納用RDエリア名を指定していないBLOB属性を含む抽象データ型の値は指定できません。

要素を更新，削除する場合，指定した添字がその列の現在要素数より大きいとき，又は添字として＊を指定して現在要素数が0のときは，更新，削除する要素がないため，その行に対する更新，削除指定は無視されます。この場合，SQLCAのSQLWARN7に'W'が設定されます。

SET句，ADD句，及びDELETE句は，一つのSQL文中にそれぞれ1回だけ指定できます。

SET句，ADD句，及びDELETE句内の項目は，それぞれ最大30,000個指定できます。

SET句，ADD句，及びDELETE句は，指定した順に左から実行されます。

LOB列又はLOB属性を格納するユーザLOB用RDエリアが更新凍結状態の場合，そのLOB列又はLOB属性は更新できません（更新しようとすると凍結済みエラーとなります）。

改竄防止表に対してUPDATE文は実行できません。ただし更新可能列は更新できます。

改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

○

ナル値

非ナル値

○

非ナル値

ナル値

×

非ナル値

非ナル値※

×

（凡例）

○：更新できます。

×：更新できません。

注

繰返し列の場合は，ナル値（要素数が0の値）から添え字指定無しでの列単位更新だけ実行できます。

注※

更新前の値と同値を含みます。

WITHOUT ROLLBACKを指定した表のインデクス構成列を更新対象列とする場合，インデクス構成列に対する更新値が同値更新以外の場合は実行できません。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

更新対象表が共用表で，かつ更新対象列にインデクスを定義している場合，更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表のインデクスを定義した列の値を更新した場合，エラーとなります。ただし，インデクスを定義している列の値に変更がない場合は，LOCK文を実行する必要はありません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

更新対象表が次の条件をすべて満たす場合，その列をDEFAULTで更新するには，更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで更新した場合，エラーとなります。

更新対象表が共用表である

更新対象列が時刻印データ型である

表定義時に既定値としてCURRENT_TIMESTAMP USING BESを指定している

探索条件にカーソル名，又は拡張カーソル名を指定した場合，更新対象表をFROM句に指定した副問合せを，SET句中に指定できません。

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(6)　参照制約に関する規則

被参照表の主キーの更新，参照表の外部キーの更新をする場合の規則については，「CREATE TABLE（表定義）」の参照動作の説明を参照してください。

参照表の外部キー構成列の値を更新する場合，その更新値が被参照表の主キー構成列の値に含まれるかどうかを確認するため，被参照表を検索します。このとき，被参照表の検索時のデータ保証レベルは共用モードになります。そのため，参照表への更新時，ほかのトランザクションによって被参照表に対する操作が行われている場合，そのトランザクションが決着されるまでその更新は待ち状態になります。

制約動作がRESTRICTで定義された被参照表の行を削除する場合，削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため，参照表を検索します。このとき，参照表の検索時のデータ保証レベルは共用モードになります。そのため，制約動作がRESTRICTで定義された被参照表の行を削除するときに，ほかのトランザクションによって参照表に対する操作が行われていると，そのトランザクションが決着するまでその行削除は待ち状態になります。

次の条件が重なった場合，参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また，制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

参照表の行を削除するトランザクションと，被参照表の行を更新，又は削除するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で削除する行の主キー構成列の値と，被参照表で更新，又は削除する行の外部キー構成列の値と同じである

参照表の行を削除するトランザクションをコミット，被参照表の行を更新，又は削除するトランザクションをロールバックする

(7)　留意事項

カーソル名は，埋込み変数名と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって使用できません。

(8)　使用例

在庫表（ZAIKO）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）列を100に変更します。

UPDATE ZAIKO
    SET ZSURYO = 100
    WHERE SCODE = '302S'

在庫表（ZAIKO）の商品コード（SCODE）列で，最後の文字がSの商品の，単価（TANKA）を2割引きにします。

UPDATE ZAIKO
    SET TANKA=TANKA*0.8
    WHERE SCODE LIKE'%S'

在庫表（ZAIKO）の単価（TANKA）列，在庫量（ZSURYO）列を，埋込み変数に読み込まれた値に変更します。

UPDATE ZAIKO
    SET TANKA=:XTANKA,ZSURYO=:XZSURYO

在庫表（ZAIKO）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）を，在庫表と同じ列定義情報を持つ在庫表2（ZAIKO2）の商品コード（SCODE）列が302Sの商品の在庫量（XSURYO）に変更します。

UPDATE ZAIKO
    SET ZSURYO=
        (SELECT ZSURYO FROM ZAIKO2 WHERE SCODE='302S')
    WHERE SCODE='302S'

在庫表（ZAIKO）の商品コード（SCODE）列が302Sの商品の在庫量（ZSURYO）と単価（TANKA）列を，在庫表と同じ列定義情報を持つ在庫表2（ZAIKO2）の商品コード（SCODE）列が302Sの商品の在庫量（XSURYO）と単価（TANKA）に変更します。

UPDATE ZAIKO
    SET (TANKA,ZSURYO)=
        (SELECT TANKA,ZSURYO FROM ZAIKO2 WHERE SCODE='302S')
    WHERE SCODE='302S'

4.37　UPDATE文　形式2（データ更新）

4.37.1　UPDATE文 形式2の形式と規則

(1)　機能

表内の，指定した探索条件を満足する行，又はカーソルが指している行の値を行単位で更新します。

(2)　使用権限

表に対するUPDATE権限を持つユーザが，その表の行の値を更新できます。

ただし，探索条件中に副問合せを指定する場合は，その副問合せ指定の表に対してSELECT権限が必要です。

(3)　形式2 <FIX指定の表内の行を行単位で更新>

　UPDATE 〔認可識別子.〕表識別子
　　　　　　〔IN （RDエリア名指定）〕 〔〔AS〕 相関名〕
　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　SET ROW＝行更新値
　　　　　　〔WHERE｛探索条件｜CURRENT OF ｛カーソル名｜拡張カーソル名｝｝〕
　　　　　　〔WITH ROLLBACK〕
　　　　　　〔WRITE IMMEDIATE〕

(4)　オペランド

ROW指定以外のオペランド，及びオペランド規則は，UPDATE文の形式1と同じです。ROWを指定する場合の規則を次に示します。

行単位の更新は，FIX属性の実表に対してだけ使用できます。ROWは行全体（予備列を含む）を意味し，これを指定すると行全体を一つのデータとして，一つの領域のデータで更新します。更新するデータのデータ型は，各列のデータ型に関係なく，ROW型（ROW型に対しては，CHAR（n）〔nは行長〕に対する変数，又は同じ長さの構造体を指定できます。ただし，構造体中に境界調整による空きがあってはいけません）になります。また，データ長は，行長（各列のデータ長の総和）になります。

UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では，ROWは使用できません。例えば，WindowsのUAPでROWを使用する場合は，HiRDBサーバも同じエンディアンのWindows版を使用してください。

(a)　SET句

列の値を更新します。

(b)　SET ROW＝行更新値

ROW

行単位でデータを更新する場合に指定します。

行更新値

ROWに対応した行更新値として，次に示す項目が指定できます。

：埋込み変数〔：標識変数〕

?パラメタ

SQL変数，又はSQLパラメタ

(5)　共通規則

行単位でのUPDATE文はすべての列の値を更新するため，少なくとも1列は更新不可となる改竄防止表に対して行単位でのUPDATE文は実行できません。

既定文字集合以外の文字データ型の列を含む表に対して，行単位でのUPDATE文は実行できません。

WITHOUT ROLLBACKを指定し，かつインデクスを定義した表を表識別子に指定する場合，インデクス構成列に対する更新値が同値更新以外の場合は実行できません。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

更新対象表が共用表で，かつどれかの列にインデクスを定義している場合，更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表を行単位（ROW指定）で更新した場合，エラーとなります。ただし，インデクスを定義している列の値に変更がない場合はLOCK文を実行する必要はありません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(6)　参照制約に関する規則

被参照表，参照表に対して行単位で更新する場合の規則については，「CREATE TABLE（表定義）」の参照動作の説明を参照してください。

制約動作がRESTRICTで定義された被参照表の主キー構成列の値を更新する場合，その更新値が参照表の外部キー構成列の値に含まれるかどうかを確認するため，参照表を検索します。このとき，参照表の検索時のデータ保証レベルは共用モードになります。そのため，制約動作がRESTRICTで定義された被参照表の行を削除するときに，ほかのトランザクションによって参照表に対する操作が行われていると，そのトランザクションが決着するまでその行削除は待ち状態になります。

次の条件が重なった場合，参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また，制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

参照表の行を削除するトランザクションと，被参照表の行を更新，又は削除するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で削除する行の主キー構成列の値と，被参照表で更新，又は削除する行の外部キー構成列の値と同じである

参照表の行を削除するトランザクションをコミット，被参照表の行を更新，又は削除するトランザクションをロールバックする

次の条件が重なった場合，被参照表を操作するトランザクションと参照表を操作するトランザクション間でデッドロックが発生することがあります。また，制約動作がRESIRICT，CASCADEのどれかの場合でも発生することがあります。被参照表と参照間のデッドロックについては，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

参照表の行を更新するトランザクションと，被参照表の行を更新するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で更新する行の外部キー構成列の値と，被参照表で削除する行の主キー構成列が同じである

(7)　留意事項

更新する表の列のデータ型がDECIMAL，又は各国文字列の場合に，対応する部分だけ行更新の内容をチェックします。

カーソル名は，埋込み変数と同様に，コンパイル単位のモジュール内で有効な名前であり，同じカーソルに対する複数のSQLを，複数のモジュールにわたって指定できません。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の日付データ型の部分は4バイトであり，X'YYYYMMDD'の形式にしてください。

行単位（ROW指定）インタフェースを使用し，日付データを既定の文字列表現で受け渡しする場合，列定義時に日付データ型ではなく，CHAR（10）として列を定義してください。

さらに，日付演算は，スカラ関数DATEを使用し，日付データ型に変換した後に指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻データ型の部分は3バイトであり，X'hhmmss'の形式にしてください。

行単位（ROW指定）インタフェースを使用し，時刻データを既定の文字列表現で受け渡しする場合，列定義時に時刻データ型ではなく，CHAR（8）として列を定義してください。さらに，時刻演算は，スカラ関数TIMEを使用し，時刻データ型に変換した後に指定してください。

行単位（ROW指定）の検索，又は更新をする場合，ROWに対する埋込み変数，SQL変数，又はSQLパラメタ中の時刻印データ型の部分は（7+p/2）バイトであり，X'YYYYMMDDhhmmss〔nn…n〕'の形式にしてください。

行単位（ROW指定）インタフェースを使用し，時刻印データを文字列表現で受け渡しする場合，列定義時に時刻印データ型ではなく，長さが19，22，24，又は26バイトのCHARとして列を定義してください。

更新する表に予備列が定義されている場合，対応する部分のデータは無視され，予備列の定義長分の0x00で更新します。

(8)　使用例

在庫表（ZAIKO）のカーソル（CR1）が指定した行のデータを埋込み変数（XROW）の内容でまとめて更新します。

UPDATE ZAIKO
    SET ROW = :XROW
    WHERE CURRENT OF CR1

4.38　UPDATE文　形式3，形式4（配列を使用した行更新）

4.38.1　UPDATE文 形式3，形式4の形式と規則

(1)　機能

配列形式の埋込み変数を指定して，複数の更新処理を実行できます。

形式3

表内の，指定した探索条件を満足する行の値を列単位で複数回更新します。

形式4

FIX指定の表内の，指定した探索条件を満足する行の値を行単位で複数回更新します。

(2)　使用権限

表に対するUPDATE権限を持つユーザが，その表の列の値を更新できます。

ただし，探索条件中に副問合せを指定する場合は，その副問合せ指定の表に対してSELECT権限が必要です。

(3)　形式3 <埋込み変数配列を指定して，列単位で表内の行を複数回更新>

　FOR :埋込み変数
　UPDATE 〔認可識別子.〕表識別子
　　　　　　　〔IN （RDエリア名指定）〕 〔〔AS〕 相関名〕
　　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　SET ｛更新対象＝更新値
　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕）＝行副問合せ｝
　　　　　　　　　　　〔，｛更新対象＝更新値
　　　　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕…）＝行副問合せ｝〕…
　〔WHERE 探索条件〕
　〔WITH ROLLBACK〕
　〔WRITE IMMEDIATE〕

　更新対象：：＝｛列名｜コンポネント指定｜列名［｛添字｜＊｝］｝

(4)　形式4 <埋込み変数配列を指定して，FIX指定の表内の行を行単位で複数回更新>

　FOR ：埋込み変数
　UPDATE 〔認可識別子.〕表識別子
　　　　　　　〔IN （RDエリア名指定）〕 〔〔AS〕 相関名〕
　　　　　　　〔使用インデクスのSQL最適化指定〕
　　　　　　　SET ROW＝行更新値
　　　　　　〔WHERE 探索条件〕
　　　　　　〔WITH ROLLBACK〕
　　　　　　〔WRITE IMMEDIATE〕

(5)　オペランド

FOR，IN（RDエリア名指定），SET句，探索条件以外のオペランド，及びオペランド規則については，「UPDATE文 形式１（データ更新）」及び「UPDATE文 形式2（データ更新）」を参照してください。

(a)　形式3のオペランド及びオペランド規則

SET句

列の値を更新します。

更新値

更新値の列の値として，次に示す項目が指定できます。

：埋込み変数配列〔：標識変数配列〕

列名

定数

値式（四則演算，連結演算を含みます）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表します）

DEFAULT（更新対象の列の既定値を表します）

?パラメタ

ただし，更新値には配列形式でない埋込み変数は指定できません。

(b)　形式4のオペランド及びオペランド規則

SET句

列の値を更新します。

ROW

行単位でデータを更新する場合に指定します。

行更新値

ROWに対応した行更新値として，次に示す項目が指定できます。

：埋込み変数配列〔：標識変数配列〕

ROWを指定する場合の規則を次に示します。

行単位の更新は，FIX属性の実表に対してだけ使用できます。ROWは行全体（予備列を含む）を意味し，これを指定すると行全体を一つのデータとして，一つの領域のデータで更新します。更新するデータのデータ型は，各列のデータ型に関係なく，ROW型になります。ROW型に対しては，CHAR（n）〔nは行長〕に対する変数，又は同じ長さの構造体を指定できます。ただし，構造体中に境界調整による空きがあってはいけません。また，データ長は，行長（各列のデータ長の総和）になります。

UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では，ROWは使用できません。例えば，WindowsのUAPでROWを使用する場合は，HiRDBサーバも同じエンディアンのWindows版を使用してください。

(c)　形式3及び形式4に共通するオペランド及びオペランド規則

FOR ：埋込み変数

埋込み変数配列を使用して更新を行う回数を設定した埋込み変数を指定します。SMALLINT型の埋込み変数を指定してください。設定値は1から4,096までの範囲で，かつ埋込み変数配列，及び標識変数配列の要素数以下にしてください。0及び負の値は設定できません。範囲外の値を設定した場合は実行時にエラーとなります。

埋込み変数配列

配列形式で宣言した埋込み変数です。NULL値以外の更新値を指定するための配列変数を指定します。それぞれの行を更新する値を埋込み変数配列の各要素に設定してください。更新する値にNULL値を含む場合は，埋込み変数配列と標識変数配列を両方指定します。

標識変数配列

配列形式で宣言した標識変数です。埋込み変数配列の各要素を更新する値が，NULL値かどうかを示す値を，標識変数配列の対応する要素に設定してください。設定する値については，「標識変数の値の設定」を参照してください。

〔IN （RDエリア名指定）〕

RDエリア名指定を埋込み変数で行う場合は，埋込み変数配列にしてください。配列でない埋込み変数を指定した場合はエラーとなります。そのほかのオペランド規則については，形式１を参照してください。

〔 WHERE探索条件 〕

省略すると，指定した表のすべての行が更新されます。

探索条件

更新の対象となる行を選択する条件を指定します。この探索条件を満足するすべての行を更新します。探索条件に埋込み変数を使用する場合，配列形式でない埋込み変数は指定できません。

(6)　共通規則

(a)　形式3の規則

埋込み変数配列のデータ型は対応する列のデータ型，又は変換できるデータ型にしてください。

配列を使用したUPDATEでは，BLOB型，最大長が32,001バイト以上のBINARY型及び抽象データ型は扱えません。

配列を使用したUPDATEでは，繰返し列の複数要素の更新はできません。

INTEGER，又はSMALLINTのデータ型の列を，固定小数点，又は浮動小数点数のデータで更新する場合は，端数（小数）部分は更新前に切り捨てられます。また，DECIMALデータ型の列を固定小数点のデータで更新する場合には，列の位取りから下位のけたの部分が更新前に切り捨てられます。

更新する列の値として，表の定義時に指定した長さ以上の文字データ又はBINARYデータは入力できません。

更新する列の値として，定義域の範囲外の数データは入力できません。

固定長文字列（各国文字列，混在文字列を含む）の列を更新するデータが列の長さより短い場合は，左詰めに挿入され，余りの部分に余白が設定されます。

SET句は，一つのSQL文中にそれぞれ1回だけ指定できます。

SET句内の項目は，それぞれ最大30,000個指定できます。

改竄防止表に対してUPDATE文は実行できません。ただし，更新可能列は更新できます。

改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

○

ナル値

非ナル値

○

非ナル値

ナル値

×

非ナル値

非ナル値※

×

（凡例）

○：更新できます。

×：更新できません。

注

繰返し列の場合は，ナル値（要素数が0の値）から添え字指定無しでの列単位更新だけ実行できます。

改竄防止表で，指定した探索条件を満たす行のうち，UPDATE ONLY FROM NULLを指定した列の値に非ナル値の行がある場合，エラーになります。

注※

更新前の値と同値を含みます。

更新対象列を含む表にWITHOUT ROLLBACKを指定し，かつ更新対象列にインデクスを定義している場合にエラーとなります。

WITHOUT ROLLBACKを指定した表のインデクス構成列を更新対象列とする場合，インデクス構成列に対する更新値が同値更新以外のときは実行できません。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

更新対象表が共用表で，かつ更新対象列にインデクスを定義している場合，更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表のインデクスを定義した列の値を更新した場合，エラーとなります。ただし，インデクスを定義している列の値に変更がない場合はLOCK文を実行する必要はありません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

更新対象表が次の条件をすべて満たす場合，その列をDEFAULTで更新するには更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで更新した場合，エラーとなります。

更新対象表が共用表である

更新対象列が時刻印データ型である

表定義時に既定値としてCURRENT_TIMESTAMP USING BESを指定している

(b)　形式4の規則

WITHOUT ROLLBACKを指定し，かつインデクスを定義した表を表識別子に指定する場合，インデクス構成列に対する更新値が同値更新以外の場合は実行できません。詳細は「CREATE TABLE（表定義）」のWITHOUT ROLLBACKの規則を参照してください。

更新対象表が共用表で，かつどれかの列にインデクスを定義している場合，更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表を行単位（ROW指定）で更新した場合，エラーとなります。ただし，インデクスを定義している列の値に変更がない場合はLOCK文を実行する必要はありません。共用表に対する更新については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文（表の排他制御）」の留意事項を参照してください。

行単位でのUPDATE文はすべての列の値を更新するため，1列でも更新不可である改竄防止表に対して，行単位でのUPDATE文は実行できません。

既定文字集合以外の文字データ型の列を含む表に対しては，行単位でのUPDATE文は実行できません。

(c)　形式3及び形式4の共通規則

FOR句以外に埋込み変数配列を一つ以上指定してください。指定しない場合はエラーとなります。

FOR句以外に配列形式でない埋込み変数を指定するとエラーとなります。

埋込み変数配列，及び標識変数配列の要素数は1から4,096までの範囲にしてください。範囲外の値を指定した場合はエラーとなります。また，"FOR ：埋込み変数"で指定する要素数の最大値以上になるようにしてください。

各埋込み変数配列，及び標識変数配列で１回の更新処理によって評価される要素は同じ要素番号の要素となります。

配列の先頭の要素から順に評価されます。

複数回更新を行う場合の更新対象は，前回の配列要素を使用して更新が行われた後の更新対象となります。

SQL連絡領域のSQLERRD[2]領域には，重複して更新された行数も含めた更新行数の総和が設定されます。

UPDATE文形式３は埋込み変数配列，及び標識変数配列を含むため，PREPARE文で前処理することはできません。動的に実行する場合については，「EXECUTE文　形式2（配列を使用したSQLの実行）」を参照してください。

配列を使用したUPDATEは手続きの中では使えません。

更新するどれかの行で警告する必要のある事象が発生した場合，SQL連絡領域のSQLWARNに警告情報が設定されます。

更新するどれかの行でエラーが発生した場合，ロールバックされます。

UPDATE文は改竄防止表に対して指定できません。ただし，更新可能列を定義している場合は形式３及び形式4の規則に従ってください。

RDエリア名指定を指定した場合，分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定した問合せのためにインデクスを定義する場合は，分割数が表の分割数と等しいインデクスを定義してください。

(7)　参照制約に関する規則

被参照表の主キーの更新，参照表の外部キーの更新をする場合，又は被参照表，参照表に対して行単位で更新する場合の規則については，「CREATE TABLE（表定義）」の参照動作の説明を参照してください。

制約動作がRESTRICTで定義された被参照表の主キー構成列の値を更新する場合，その更新値が参照表の外部キー構成列の値に含まれるかどうかを確認するため，参照表を検索します。このとき，参照表の検索時のデータ保証レベルは共用モードになります。そのため，制約動作がRESTRICTで定義された被参照表の行を削除するときに，ほかのトランザクションによって参照表に対する操作が行われていると，そのトランザクションが決着するまでその行削除は待ち状態になります。

次の条件が重なった場合，参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また，制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。

参照表の行を削除するトランザクションと，被参照表の行を更新，又は削除するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で削除する行の主キー構成列の値と，被参照表で更新，又は削除する行の外部キー構成列の値と同じである

参照表の行を削除するトランザクションをコミット，被参照表の行を更新，又は削除するトランザクションをロールバックする

次の条件が重なった場合，被参照表を操作するトランザクションと参照表を操作するトランザクション間でデッドロックが発生することがあります。また，制約動作がRESIRICT，CASCADEのどれかの場合でも発生することがあります。

参照表の行を更新するトランザクションと，被参照表の行を更新するトランザクションが異なる

上記二つのトランザクションが同時に実行される

参照表で更新する行の外部キー構成列の値と，被参照表で削除する行の主キー構成列が同じである

(8)　使用例

UPDATE文形式１を使用して，Ｃ言語の配列変数に設定した商品コード（SCODE）及び在庫量（ZSURYO）の値別に，在庫量（ZSURYO）を次の表で示す値に更新します。

表4‒8　表に格納された商品コードと在庫量（更新前）

商品コード

在庫量の更新値

'101M'

40

'101L'

70

'201M'

15

'202M'

28

'302S'

7

表4‒9　更新対象となる行の商品コードと在庫量（埋込み変数配列に設定）

商品コード

在庫量の更新値

'101M'

35

'101L'

62

'201M'

13

'202M'

10

'302S'

6

表4‒10　表に格納された商品コードと在庫量（更新後）

商品コード

在庫量の更新値

'101M'

35

'101L'

62

'201M'

13

'202M'

10

'302S'

6

EXEC SQL BEGIN DECLARE SECTION;
      short   XUPDATE_NUM;
      char    XSCODE[5][5];
      short   ISCODE[5];
      long    XZSURYO[5];
      short   IZSURYO[5];
EXEC SQL END DECLARE SECTION;
    ・・・各変数配列の要素に値設定・・・
        XSCODEに{'101M','101L','201M','202M','302S'}を設定
        XZSURYOに{35,62,13,10,6}を設定
XUPDATE_NUM = 5;
EXEC SQL FOR :XUPDATE_NUM
UPDATE ZAIKO SET ZSURYO = :XZSURYO:IZSURYO
WHERE SCODE = :XSCODE:ISCODE;

UPDATE文形式２を使用して，Ｃ言語の配列変数に設定した商品コード（SCODE）の値別に，在庫表（ZAIKO）の行全体を，埋込み変数配列(XROW)の内容でまとめて更新します。

XUPDATE_NUM = 5;
EXEC SQL FOR :XUPDATE_NUM
UPDATE ZAIKO SET ROW = :XROW
WHERE SCODE = :XSCODE:ISCODE;

4.39　準備可能動的UPDATE文：位置付け 形式1（前処理可能なカーソルを使用したデータ更新）

4.39.1　準備可能動的UPDATE文：位置付け 形式1の形式と規則

(1)　機能

表内のカーソルが指している行の指定した列を更新します。PREPARE文で前処理してからEXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

(2)　使用権限

表に対するUPDATE権限を持つユーザが，その表の列の値を更新できます。

(3)　形式1 <列単位で表内の行をカーソルを使用して更新（前処理可能）>

　UPDATE 〔〔認可識別子.〕表識別子
　　　　　　　〔IN （RDエリア名指定）〕 〔〔AS〕 相関名〕
　　　　　　　〔使用インデクスのSQL最適化指定〕〕
　　　　　　　｛SET ｛更新対象＝更新値
　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕）＝行副問合せ｝
　　　　　　　　　　　〔，｛更新対象＝更新値
　　　　　　　　　　　　　　｜（更新対象，更新対象〔，更新対象〕…）＝行副問合せ｝〕…
　　　　　　　　｜ADD繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　＝｛ARRAY ［要素の値〔，要素の値〕…］
　　　　　　　　　　　　　　　｜？パラメタ｝
　　　　　　　　　　　　〔，繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　　　　＝｛ARRAY ［要素の値〔，要素の値〕…］
　　　　　　　　　　　　　　　　　　｜？パラメタ｝〕…
　　　　　　　　｜DELETE繰返し列名 ［｛添字｜＊｝］
　　　　　　　　　　　　　 〔，繰返し列名 ［｛添字｜＊｝］〕…｝
　WHERE CURRENT OF GLOBAL カーソル名
　〔WITH ROLLBACK〕
　〔WRITE IMMEDIATE〕

　更新対象：：＝｛列名｜コンポネント指定｜列名［｛添字｜＊｝］｝

(4)　オペランド

SET句の更新値とARRAY ［要素の値〔，要素の値〕 …］，WHERE CURRENT OF GLOBAL カーソル名以外のオペランド，及びオペランド規則については，「UPDATE文　形式1（データ更新）」を参照してください。

(a)　SET句

更新値

更新値の列の値として次に示す項目が指定できます。

列名

コンポネント指定

定数

値式（四則演算，連結演算を含む）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表す）

DEFAULT（更新対象の列の既定値を表す）

?パラメタ

ARRAY ［要素の値〔，要素の値〕…］※

注※

要素の値には，次の項目を指定できます。

繰返し列以外の列名

添字付き繰返し列

定数

値式（四則演算，連結演算を含みます）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表します）

DEFAULT

?パラメタ

更新値の規則

埋込み変数，標識変数，SQL変数，及びSQLパラメタを含む更新値は指定できません。

そのほかの更新値の規則については，UPDATE文 形式1の更新値の規則が適用されます。

要素の値の規則

埋込み変数，標識変数，SQL変数，及びSQLパラメタを含む要素の値は指定できません。

そのほかの要素の値の規則については，UPDATE文 形式1の要素の値の規則が適用されます。

ARRAY ［要素の値〔，要素の値〕…］

要素の値として，次に示す項目が指定できます。

繰返し列以外の列名

添字付き繰返し列

定数

値式（四則演算，連結演算を含む）

スカラ副問合せ

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

NULL（ナル値を表す）

DEFAULT

?パラメタ

要素の値の規則については，「UPDATE文　形式1（データ更新）」のSET句の「要素の値の規則」を参照してください。

(b)　WHERE CURRENT OF GLOBALカーソル名

GLOBAL

カーソル名の有効範囲としてGLOBALを指定します。

カーソル名

更新する行を指すカーソルの名称を指定します。

カーソル名で指定するカーソルは，ALLOCATE CURSOR文で指定した拡張カーソル名が識別するカーソルです。ALLOCATE CURSOR文で指定した拡張カーソル名の値を指定してください。ただし，結果集合カーソルは指定できません。

実行時には，カーソル名で指定するカーソルは，開いた状態であり，かつ更新する行に位置づけられている必要があります。

カーソル名で指定するカーソルの位置は，UPDATE文実行後も同じです。更新した行よりも後の行を更新する場合は，そのカーソルに対してFETCH文を実行して，カーソルを移動させてください。

拡張カーソル名を指定する場合は，FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については，「動的SELECT文　形式1（動的検索）」のオペランド規則のFOR UPDATE句を参照してください。

(5)　共通規則

PREPARE文で前処理してから，EXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行います。

表識別子を省略する場合は，前処理する前に，ALLOCATE CURSOR文によって動的SELECT文にカーソルが割り当てられている必要があります。このとき，カーソルを割り当てた動的SELECT文に指定している検索対象の表を仮定します。表識別子を指定する場合には，前処理する前に，動的SELECT文にカーソルが割り当てられている必要はありません。

そのほかの共通規則については，UPDATE文 形式1の共通規則が適用されます。

(6)　参照制約に関する規則

UPDATE文 形式1の参照制約に関する規則が適用されます。

(7)　使用例

在庫表（ZAIKO）内のカーソル（cr（有効範囲：GLOBAL，値：'CR1'））が指している行の単価（TANKA）を1割引に更新するSQLを動的に実行します。

<埋込み変数selに任意の名称を設定>
PREPARE GLOBAL :sel FROM 'SELECT * FROM ZAIKO FOR UPDATE'
＜埋込み変数crに'CR1'を設定＞
ALLOCATE GLOBAL :cr CURSOR FOR GLOBAL :sel
PREPARE PRE1 FOR
    'UPDATE SET TANKA = ＜単価の１割引の値＞ WHERE CURRENT OF GLOBAL CR1'
OPEN GLOBAL :cr
FETCH GLOBAL :cr INTO ＜各列を取り出す変数名＞
EXECUTE PRE1
CLOSE GLOBAL :cr
DEALLOCATE PREPARE GLOBAL :sel

4.40　準備可能動的UPDATE文：位置付け 形式2（前処理可能なカーソルを使用したデータ更新）

4.40.1　準備可能動的UPDATE文：位置付け 形式2の形式と規則

(1)　機能

FIX指定の表内のカーソルが指している行の指定した列を更新します。PREPARE文で前処理してからEXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

(2)　使用権限

表に対するUPDATE権限を持つユーザが，その表の列の値を更新できます。

(3)　形式2 <FIX指定の表内の行をカーソルを使用して行単位で更新（前処理可能）>

　UPDATE 〔〔認可識別子.〕表識別子
　　　　　　〔IN （RDエリア名指定）〕 〔〔AS〕 相関名〕
　　　　　　〔使用インデクスのSQL最適化指定〕〕
　　　　　　　SET ROW＝行更新値
　　　　　　WHERE CURRENT OF GLOBAL カーソル名
　　　　　　〔WITH ROLLBACK〕
　　　　　　〔WRITE IMMEDIATE〕

(4)　オペランド

SET句の行更新値，及びWHERE CURRENT OF GLOBAL カーソル名以外のオペランド，及びオペランド規則については，「UPDATE文　形式2（データ更新）」を参照してください。

また，WHERE CURRENT OF GLOBAL カーソル名のオペランド，及びオペランド規則については，「準備可能動的UPDATE文：位置付け 形式1（前処理可能なカーソルを使用したデータ更新）」を参照してください。

(a)　SET句

行更新値

ROWに対応した行更新値として，次に示す項目が指定できます。

?パラメタ

(5)　共通規則

PREPARE文で前処理してから，EXECUTE文で実行，又はEXECUTE IMMEDIATE文で前処理と実行を一度に行います。

表識別子を省略する場合は，前処理する前に，ALLOCATE CURSOR文によって動的SELECT文にカーソルが割り当てられている必要があります。このとき，カーソルを割り当てた動的SELECT文に指定している検索対象の表を仮定します。表識別子を指定する場合には，前処理する前に，動的SELECT文にカーソルが割り当てられている必要はありません。

そのほかの共通規則については，UPDATE文 形式2の共通規則が適用されます。

(6)　参照制約に関する規則

UPDATE文 形式2の参照制約に関する規則が適用されます。

(7)　留意事項

UPDATE文 形式2の留意事項が適用されます。

(8)　使用例

在庫表（ZAIKO）内のカーソル（cr（値：'CR1'））が指している行のデータを埋込み変数（XROW）の内容でまとめて更新するSQLを動的に実行します。

PREPARE GLOBAL :sel FOR 'SELECT * FROM ZAIKO FOR UPDATE'
＜埋込み変数crに'CR1'を設定＞
ALLOCATE GLOBAL :cr CURSOR FOR GLOBAL :sel
PREPARE PRE1 FOR
    'UPDATE SET ROW = ? WHERE CURRENT OF GLOBAL CR1'
OPEN GLOBAL :cr
FETCH GLOBAL :cr INTO ＜各列を取り出す変数名＞
EXECUTE PRE1 USING :XROW
CLOSE GLOBAL :cr
DEALLOCATE PREPARE GLOBAL :sel

4.41　代入文　形式1（SQL変数，又はSQLパラメタへの値の代入）

4.41.1　代入文 形式1の形式と規則

(1)　機能

SQL変数，又はSQLパラメタに値を代入します。

(2)　使用権限

なし。

(3)　形式　<SQL変数，又はSQLパラメタへの代入>

　SET 代入先 ＝ 代入値

　代入先：：＝｛〔文ラベル.〕SQL変数名
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　　　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　　　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…｝
　代入値：：＝｛値式｜NULL | DEFAULT｝

(4)　オペランド

(a)　代入先

：：＝｛〔文ラベル.〕SQL変数名
　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名
　　　　｜〔文ラベル.〕SQL変数名..属性名〔..属性名〕…
　　　　｜〔〔認可識別子.〕ルーチン識別子.〕SQLパラメタ名..属性名〔..属性名〕…｝

値を代入するSQL変数，SQLパラメタ，又はSQL変数の属性名，SQLパラメタの属性名を指定します。

パブリック手続き定義，又はパブリック関数定義のSQL手続き文中で認可識別子を指定する場合は，認可識別子にPUBLICを指定してください。

(b)　代入値：：＝｛値式｜NULL｜DEFAULT｝

代入する値を指定します。

(5)　共通規則

代入先には，SQLルーチンで指定した入出力モード（パラメタモード）がINのSQLパラメタ名を指定できません。また，関数のSQLパラメタ名も指定できません。

代入先のデータ型は，代入値のデータ型と互換性がなければなりません。

代入先と代入値のデータ型が異なる場合には型変換され，同じ場合にはそのまま代入値が代入先に代入されます。

代入値が文字データ型の場合，代入先と代入値の文字集合は同じでなければなりません。ただし，代入値が文字列定数の場合は，代入先と代入値の文字集合が異なっていても，自動的に代入先の文字集合に変換してから代入します。

代入値に指定する値式中に，副問合せは指定できません。

代入値にDEFAULTを指定した場合，代入の対象となるSQL変数の既定値を代入します。SQL変数の既定値の宣言は「複合文（複数文実行）」を参照してください。代入先にSQLパラメタを指定し，代入値にDEFAULTを指定した場合，代入先のSQLパラメタにナル値を代入します。トリガSQL文中に指定した代入文（形式１）の代入先に新旧値相関名で修飾された列名を指定し，代入値にDEFAULTを指定した場合，代入先の列の既定値を代入します。ただし，代入先の新旧値相関名で修飾された列の既定値がUSING BESを指定したCURRENT_TIMESTAMPの場合は，代入値にDEFAULTを指定できません。トリガSQL文については「CREATE TRIGGER（トリガ定義）」を参照してください。

(6)　留意事項

代入文の形式1は，SQLルーチン中にだけ指定できます。SQLルーチン以外で代入文を指定する場合は，代入文の形式2を指定してください。

4.42　代入文　形式2（埋込み変数，又は？パラメタへの値の代入）

4.42.1　代入文 形式2の形式と規則

(1)　機能

埋込み変数，又は？パラメタに値を代入します。

(2)　使用権限

なし。

(3)　形式　<埋込み変数，又は？パラメタへの代入>

　SET  代入先 = 代入値
　代入先：：=｛：埋込み変数〔：標識変数〕| ？パラメタ｝
　代入値：：=｛：埋込み変数〔：標識変数〕ASデータ型
　　　　　　　　｜？パラメタASデータ型
　　　　　　　　｜LENGTH（値式）
　　　　　　　　｜SUBSTR（値式1，値式2 〔，値式3〕）
　　　　　　　　｜POSITION（値式1 IN値式2 〔FROM値式3〕）｝

(4)　オペランド

(a)　代入先：：＝｛：埋込み変数〔：標識変数〕｜？パラメタ｝

値を代入する埋込み変数，又は？パラメタを指定します。

(b)　代入値

：：＝｛：埋込み変数〔：標識変数〕 ASデータ型
　　　　｜？パラメタASデータ型
　　　　｜LENGTH（値式）
　　　　｜SUBSTR（値式1，値式2 〔，値式3〕）
　　　　｜POSITION（値式1 IN値式2 〔FROM値式3〕）｝

代入する値を指定します。

：埋込み変数〔：標識変数〕 ASデータ型

指定できるデータ型はBLOB型，又はBINARY型だけです。AS句で埋込み変数のデータ型を指定してください。このとき，埋込み変数で与えるデータの実長（位置付け子の場合は位置付け子に割り当てられたデータの実長）がAS句で指定したデータ型の最大長より大きい場合はエラーとなります。

？パラメタASデータ型

指定できるデータ型はBLOB型，又はBINARY型だけです。AS句で？パラメタのデータ型を指定してください。このとき，？パラメタに与えるデータの実長（位置付け子の場合は位置付け子に割り当てられたデータの実長）がAS句で指定したデータ型の最大長より大きい場合はエラーとなります。

LENGTH（値式）

SUBSTR（値式1，値式2，〔値式3〕）

POSITION（値式1 IN値式2 〔FROM値式3〕)

スカラ関数LENGTHの値式，スカラ関数SUBSTRの値式1，及びスカラ関数POSITIONの値式2に指定できるデータ型はBLOB型，又はBINARY型だけです。指定できるものは埋込み変数，？パラメタだけです。そのほかの指定方法は各スカラ関数の規則に従ってください。

(5)　共通規則

代入先のデータ型は，代入値のデータ型と互換性がなければなりません。

代入先と代入値のデータ型が異なる場合には型変換され，同じ場合にはそのまま代入値が代入先に代入されます。

代入値に指定する値式中に，以下のものは指定できません。

列指定

コンポネント指定

スカラ副問合せ

(6)　留意事項

代入文の形式2はSQLルーチン中には指定できません。SQLルーチン中に代入文を指定する場合は，代入文の形式1を指定してください。

(7)　使用例

BLOB位置付け子の埋込み変数（XLOC）に割り当てられたBLOBデータの一部をBLOB型の埋込み変数（XDATA）に代入します。

SET :XDATA = SUBSTR(:XLOC AS BLOB(1M), 100, 1024)

5　制御系SQL

この章では，制御系SQLの構文形式，及び文法について説明します。

5.1　全般規定

5.1.1　制御系SQLの全般規定

(1)　制御系SQLの種類と機能

制御系SQLは，HiRDBとの接続・切り離し，及び表の排他制御に使用するSQLです。

制御系SQLの種類と機能を次の表に示します。

表5‒1　制御系SQLの種類と機能

種　類

機　能

CALL COMMAND文（コマンド又はユティリティの実行）

HiRDBのコマンド・ユティリティを実行します。

COMMIT文（トランザクションの正常終了）

現在のトランザクションを正常終了させて，同期点を設定し1コミットメント単位を生成します。そのトランザクションが更新したデータベースの内容を有効にします。

CONNECT文（HiRDBとの接続）

HiRDBに認可識別子，及びパスワードを連絡して，UAPがHiRDBを使用できる状態にします。

DISCONNECT文（HiRDBとの切り離し）

現在のトランザクションを正常終了させて，同期点を設定し1コミットメント単位を生成します。その後，UAPをHiRDBから切り離します。

LOCK文（表の排他制御）

指定した表に排他制御をします。

ROLLBACK文（トランザクションの取り消し）

現在のトランザクションを取り消して，そのトランザクション内でのデータベースの更新を無効にします。

SET SESSION AUTHORIZATION文（実行ユーザの変更）

HiRDBに認可識別子，及びパスワードを連絡して，接続中のユーザを変更します。

(2)　制御系SQL指定時の留意事項

トランザクションは，論理的な仕事の単位であり，回復や同時実行の基本単位です。同時実行性向上のためには，一つのトランザクションの期間をできるだけ短くすることが望ましいです。特に大量データの更新をする場合には，排他期間，排他リソース数，ログ量などに留意する必要があります。そして，場合によってはトランザクションを分割することも必要です。

(3)　OLTP下のX/Openに従ったUAPでの留意事項

OLTP下のX/Openに従ったUAPでは，次に示すSQL文は使用できません。

COMMIT文

CONNECT文

DISCONNECT文

ROLLBACK文

5.2　CALL COMMAND文（コマンド又はユティリティの実行）

5.2.1　CALL COMMAND文の形式と規則

(1)　機能

HiRDBのコマンド又はユティリティを実行し，実行結果（標準出力，標準エラー出力，戻り値）を取得できます。

(2)　使用権限

システム共通定義のpd_sql_command_exec_usersオペランドで指定されている認可識別子を持つユーザ

(3)　形式

  CALL COMMAND｛：埋込み変数１｜？パラメタ１｜定数１｝
        〔WITH｛：埋込み変数２｜？パラメタ２｜定数２｝〔，｛：埋込み変数２｜？パラメタ２｜定数２｝〕…〕
        〔INPUT｛：埋込み変数３｜？パラメタ３｜定数３｝〕
        〔OUTPUT TO｛：埋込み変数４　：標識変数１｜？パラメタ４｝〕
        〔ERROR TO｛：埋込み変数５　：標識変数２｜？パラメタ５｝〕
        〔RETURN CODE TO｛：埋込み変数６｜？パラメタ６｝〕
        〔ENVIRONMENT｛：埋込み変数７｜？パラメタ７｜定数４｝〕
        〔SERVER｛：埋込み変数８｜？パラメタ８｜定数５｝〕

(4)　オペランド

(a)　：埋込み変数１｜？パラメタ１｜定数１

実行するコマンドやユティリティの名称を格納した埋込み変数，？パラメタ又は定数を指定します。コマンド又はユティリティの名称に，相対パスや絶対パスは指定できません。埋込み変数及び？パラメタのデータ型は，最大長が30バイト以下の可変長文字列にしてください。ただし，埋込み変数及び？パラメタに文字集合名UTF16を指定した場合，最大長が60バイト以下の可変長文字列になります。定数の長さは，30バイト以下にしてください。

(b)　WITH｛：埋込み変数２｜？パラメタ２｜定数２｝〔，｛：埋込み変数２｜？パラメタ２｜定数２｝〕…

コマンドやユティリティに渡す引数を格納した埋込み変数，？パラメタ又は定数を指定します。引数の並びが長いために，一つの埋込み変数，？パラメタ又は定数で指定できない場合は，複数の埋込み変数，？パラメタ又は定数を用いて指定してください。この場合は，指定した順序で文字列を結合します。複数の引数を与えたい場合は，セミコロンで区切って記述してください。セミコロン自身を引数に指定する場合は，2個の連続するセミコロンを指定してください。埋込み変数及び？パラメタのデータ型は，最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは，32,000バイト以下にしてください。引数の中にパスを含む場合は，絶対パスで指定してください。

(c)　INPUT｛：埋込み変数３｜？パラメタ３｜定数３｝

実行するコマンドやユティリティに渡す標準入力の内容を格納した埋込み変数，？パラメタ又は定数を指定します。埋込み変数及び？パラメタのデータ型は，最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは，32,000バイト以下にしてください。パスワードの入力を要求するコマンドやユティリティに対して，INPUT句を用いてパスワードを与えることはできません。

(d)　OUTPUT TO｛：埋込み変数４　：標識変数１｜？パラメタ４｝

実行したコマンドやユティリティの標準出力の内容を格納する埋込み変数又は？パラメタを指定します。埋込み変数及び？パラメタのデータ型は，最大長が2ギガバイト以下のバイナリデータ列（BLOB）です。標準出力が埋込み変数又は？パラメタの最大長を超える場合は，出力の先頭から最大長までの情報が格納され，それ以降の情報は切り捨てられます。この場合，標識変数には出力を切り捨てたことを示す標準出力の長さが格納されます。埋込み変数を使用する場合は，必ず標識変数を指定してください。

(e)　ERROR TO｛：埋込み変数５　：標識変数２｜？パラメタ５｝

実行したコマンドやユティリティの標準エラー出力の内容を格納する埋込み変数又は？パラメタを指定します。埋込み変数及び？パラメタのデータ型は，最大長が2ギガバイト以下のバイナリデータ列（BLOB）です。標準エラー出力が埋込み変数又は？パラメタの最大長を超える場合は，出力の先頭から最大長までの情報が格納され，それ以降の情報は切り捨てられます。この場合，標識変数には出力を切り捨てたことを示す標準エラー出力の長さが格納されます。埋込み変数を使用する場合は，必ず標識変数を指定してください。

(f)　RETURN CODE TO｛：埋込み変数６｜？パラメタ６｝

実行したコマンドやユティリティの戻り値を格納する埋込み変数又は？パラメタを指定します。埋込み変数及び？パラメタのデータ型は，整数型です。

(g)　ENVIRONMENT｛：埋込み変数７｜？パラメタ７｜定数４｝

コマンドやユティリティを実行する時のクライアント環境定義を格納した埋込み変数，？パラメタ又は定数を指定します。埋込み変数及び？パラメタのデータ型は，最大長が32,000バイト以下の可変長文字列にしてください。定数の長さは，32,000バイト以下にしてください。

クライアント環境定義は，「クライアント環境定義名＝値」の形式で指定してください。複数のクライアント環境定義を指定したい場合は，セミコロンで区切って記述してください。セミコロン自身を引数に指定する場合は，2個の連続するセミコロンを指定してください。

指定できるクライアント環境定義の詳細は，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

なお，ENVIRONMENTで指定できない環境変数を変更したい場合は，システム共通定義にputenv形式で設定するか，又はHiRDB管理者の環境変数を変更してください。

(h)　SERVER｛：埋込み変数８｜？パラメタ８｜定数５｝

コマンドやユティリティを実行するサーバ名を格納した埋込み変数，？パラメタ又は定数を指定します。サーバ名とは，システム共通定義のpdstartオペランドの-sオプションで指定されているサーバ名のことです。埋込み変数及び？パラメタのデータ型は，最大長が8バイト以下の可変長文字列にしてください。ただし，埋込み変数及び？パラメタに文字集合名UTF16を指定した場合，最大長が16バイト以下の可変長文字列になります。定数の長さは，8バイト以下にしてください。HiRDB/パラレルサーバでシステムマネジャユニットを指定する場合は，MGRを指定してください。SERVER句が省略された場合，HiRDB/パラレルサーバではMGR，HiRDB/シングルサーバではSDSのサーバ名が仮定されます。

(5)　共通規則

実行したコマンドやユティリティによってトランザクションが発生する場合，SQLを実行したトランザクションとは別のものになります。

SQLを実行したトランザクションと，実行したコマンドやユティリティによって発生したトランザクションとの間に，排他待ち又はデッドロックが発生する可能性があります。

応答を要求するコマンドやユティリティを実行する場合，そのコマンドやユティリティを正しく終了させることができない標準入力の内容を与えると，システムが無応答になる場合がありますので注意してください。

（例）

HiRDBファイルシステム（/hirdb/ios/db0）のバックアップ（pdfbkup）を実行する場合

コマンドライン上でpdfbkupコマンドを実行すると，バックアップの続行又は終了を確認するため，「G」又は「T」の入力と，改行（CR）の入力が要求されます。

  % pdfbkup /hirdb/ios/db0 /hirdb/ios/db0.backup
  1605756 19:27:29 SQA2          KFPI21514-Q HiRDB file system area
  /hirdb/ios/db0 backup to /hirdb/ios/db0.backup. [G:continue, T:terminate]

次のようなCALL COMMAND文で，改行を含まない標準入力をpdfbkupコマンドに渡すと，システムは無応答になってしまいます。

  EXEC SQL CALL COMMAND 'pdfbkup' WITH '/hirdb/ios/db0;/hirdb/ios/db0.backup' INPUT 'G';

pkfbkupコマンドを正しく実行させるためには，INPUT句には下記のように改行を含めた標準入力を指定してください。

  EXEC SQL BEGIN DECLARE SECTION;
          char input_data[10];
  EXEC SQL END DECLARE SECTION;
  sprintf(input_data, "G¥n");
  EXEC SQL CALL COMMAND 'pdfbkup' WITH '/hirdb/ios/db0;
  /hirdb/ios/db0.backup' INPUT :input_data;

システムが無反応になった場合は，HiRDBのプロセス（HiRDB/パラレルサーバの場合はFES，HiRDB/シングルサーバの場合はSDS），及びコマンドやユティリティのプロセスをpdcancelコマンドで終了させてください。

(6)　注意事項

コマンドやユティリティのタイムアウトが必要な場合には，クライアント環境定義のPDCALCMDWAITTIMEオペランドを指定してください。コマンド又はユティリティの実行中にタイムアウトした場合，制御用コマンド（pdcmdexec）のプロセス，及び実行中のコマンド又はユティリティのプロセスをpdkillコマンド（UNIX版の場合はOSのkillコマンド）で終了してください。

実行するプラットフォームの制限によって，コマンドやユティリティの実行に失敗する場合があります。次の表に，コマンド又はユティリティを実行できなかった場合に取得する情報と情報の格納先を示します。

表5‒2　コマンド又はユティリティを実行できなかった場合に取得する情報と情報の格納先

取得する情報

取得する情報の格納先

エラーが発生したシステム関数名※

エラーコード※

埋込み変数５又は？パラメタ５

OSのシステム関数の終了コード

埋込み変数６又は？パラメタ６

注※

エラーが発生したシステム関数及びエラーコードは，func=aa....aa,errno=bb....bbの形式で出力されます（errnoは，エラーの状態を表す外部整数変数です）。

aa....aa：エラーが発生したシステム関数

bb....bb：エラーコード（エラーコードを取得できない場合，何も格納しません）

対策

エラーコードを調査し，errno.h又はユーザが使用するOSのマニュアルを参照して，エラーの原因を取り除き，再度実行してください。

OSのシステム関数の実行に失敗する原因の一つとして，コマンドやユティリティに指定した引数が，OSで定義されているコマンドライン引数長の限界値を超えたことが考えられます。この問題を解決するためには，OSをチューニングしてコマンドライン引数長の限界値を大きくしてください。

(7)　使用例

HiRDBシステムの状態表示（pdfls）を使用して，HiRDBファイルシステム領域（/hirdb/ios/rdfiles）内に存在するHiRDBファイルの一覧を取得します。実行結果はOUTPUT TO句に指定した埋込み変数（output）に代入されます。コマンドライン上から‘pdfls -H /hirdb/ios/rdfiles’を実行する場合と同じ結果が得られます。

  EXEC SQL BEGIN DECLARE SECTION;
          SQL TYPE IS BLOB(1M) OUTPUT;
  EXEC SQL END DECLARE SECTION;
  EXEC SQL CALL COMMAND 'pdfls' WITH '-H;/hirdb/ios/rdfiles' OUTPUT TO :OUTPUT;

RDエリアの閉塞コマンド（pdhold）を使用して，RDエリア（RU01，RU02及びRU03）を閉塞します。実行結果はOUTPUT TO句に指定した埋込み変数（output）に代入されます。コマンドライン上から‘pdhold -r RU01,RU02,RU03’を実行する場合と同じ結果が得られます。

  EXEC SQL BEGIN DECLARE SECTION;
          SQL TYPE IS BLOB(1M) OUTPUT;
  EXEC SQL END DECLARE SECTION;
  EXEC SQL CALL COMMAND 'pdhold' WITH '-r;RU01,RU02,RU03' OUTPUT TO :OUTPUT;

WITH句に複数の定数を指定したい場合は，次のように記述することもできます。

  EXEC SQL BEGIN DECLARE SECTION;
          SQL TYPE IS BLOB(1M) OUTPUT;
  EXEC SQL END DECLARE SECTION;
  EXEC SQL CALL COMMAND 'pdhold' WITH '-r;RU01',',RU02,RU03' OUTPUT TO :OUTPUT;

WITH句に定数及び埋込み変数を指定したい場合は，次のように記述することもできます。

  EXEC SQL BEGIN DECLARE SECTION;
          SQL TYPE IS BLOB(1M) OUTPUT;
          char RDAREAS[100];
  EXEC SQL END DECLARE SECTION;
  sprintf(RDAREAS, "RU01,RU02,RU03");
  EXEC SQL CALL COMMAND 'pdhold' WITH '-r;',:RDAREAS OUTPUT TO :OUTPUT;

5.3　COMMIT文（トランザクションの正常終了）

5.3.1　COMMIT文の形式と規則

(1)　機能

現在のトランザクションを正常終了させ，同期点を設定し1コミットメント単位を生成します。そのトランザクションが更新したデータベースの内容を有効にします。

(2)　使用権限

なし。

(3)　形式

　COMMIT 〔WORK〕〔RELEASE〕

(4)　オペランド

(a)　WORK

指定しても，指定しなくてもトランザクションの正常終了の機能は変わりません。JIS規格と互換のためサポートしています。

(b)　RELEASE

トランザクションを正常終了させた後にUAPをHiRDBから切り離す場合に指定します。

(5)　共通規則

COMMIT文を実行すると，ホールダブルカーソル以外の開いているカーソルはすべて閉じられます。

ホールダブルカーソルで使用している排他資源以外は解放されます。

COMMIT文を実行すると，有効な位置付け子はすべて無効となります。

RELEASEを省略したCOMMIT文を実行すると，ON COMMIT DELETE ROWSを指定して定義した一時表の行データは削除されます。RELEASEを指定したCOMMIT文を実行すると，ON COMMITの指定に関係なく，一時表の行データは削除されます。

(6)　留意事項

COMMIT文は，OLTP下のX/Openに従ったUAPから指定できません。また，OLTP下のUAPから手続きを呼び出す場合，COMMIT文を使用した手続きは実行できません。

手続き中からCOMMIT文を実行する場合，RELEASEオペランドは指定できません。

COMMIT文は，トリガの動作中は実行できません。

(7)　使用例

COMMIT文を使用してトランザクションを終了させ，再びHiRDBと接続するためにRELEASEオぺランド指定のCOMMIT文を使用します。

手続き内，又は手続き終了後にCOMMIT文を使用してトランザクションを終了させます。

5.4　CONNECT文（HiRDBとの接続）

5.4.1　CONNECT文の形式と規則

(1)　機能

HiRDBに認可識別子，及びパスワードを連絡して，UAPがHiRDBを使用できる状態にします。これをHiRDBとの接続といいます。

(2)　使用権限

DBA権限又はCONNECT権限を持つユーザ

HiRDBとの接続ができます。

(3)　形式

　CONNECT〔｛USER  ：埋込み変数1〔USING  ：埋込み変数2〕
　　　　　　　　｜：埋込み変数1 〔IDENTIFIED BY ：埋込み変数2〕｝〕

(4)　オペランド

(a)　埋込み変数1

認可識別子を値として持つ埋込み変数を指定します。

認可識別子の大文字，小文字を区別して扱う場合，認可識別子を引用符（"）で囲んだ文字列を埋込み変数に設定してください。

UAPの記述言語がC言語の場合，33バイト以下の固定長文字列のデータ型で，文字列はナル文字で終わらせてください。ナル文字で終わらないと，（エリア長−1）の文字列を認可識別子として使用します。ただし，埋め込み変数としてポインタを使用する場合は，文字列を必ずナル文字で終わらせてください。

UAPの記述言語がCOBOLの場合，このオペランドは32バイト以下の固定長文字列のデータ型で，認可識別子がエリア長より短い場合は右端に空白詰めしてください。文字列をナル文字で終わらせる必要はありません。

既定文字集合以外の文字集合は指定できません。

CONNECTだけを指定し，USER以降のオペランドをすべて省略すると，環境変数PDUSERに指定した認可識別子とパスワードを使用して，HiRDBと接続します。

大文字，小文字を区別して扱う場合，引用符（"）で囲んでください。

(b)　埋込み変数2

パスワードを値として持つ埋込み変数を指定します。

パスワードの大文字，小文字を区別して扱う場合，パスワードを引用符（"）で囲んだ文字列を埋込み変数に設定してください。

UAPの記述言語がC言語の場合，33バイト以下の固定長文字列のデータ型で，文字列はナル文字で終わらせてください。ナル文字で終わらないと，（エリア長-1）の文字列をパスワードとして使用します。

ただし，埋込み変数としてポインタを使用した場合は，最大エリア長として31バイトを仮定するため，指定できるパスワード長が引用符を含めて30バイトに制限されます。引用符を含めて31バイト以上のパスワードを指定する場合はポインタを使用しないでください。ポインタを使用する場合は，文字列をナル文字で終わらせてください。31バイト目までにナル文字がないと，30バイト目までの文字列をパスワードとして使用します。

なお，UAPの記述言語がCOBOL，又はOOCOBOLの場合，このオペランドは32バイト以下の固定長文字列のデータ型で，パスワードがエリア長より短い場合は右端に空白詰めしてください。文字列をナル文字で終わらせる必要はありません。

既定文字集合以外の文字集合は指定できません。

パスワードのないユーザを使用する場合は，USING句，IDENTIFIED BY句を省略するか，埋込み変数に任意の文字列を指定してください。

(5)　共通規則

HiRDBと接続した場合は，DISCONNECT文によって一度HiRDBからの切り離しをしなければ，再びHiRDBと接続できません。

(6)　留意事項

CONNECT文は，OLTP下のX/Openに従ったUAPから指定できません。

(7)　使用例

HiRDBを使用するユーザの認可識別子（埋込み変数USER1），パスワード（埋込み変数PSWD1）を連絡してHiRDBと接続します。

    CONNECT USER :USER1 USING :PSWD1

5.5　DISCONNECT文（HiRDBとの切り離し）

5.5.1　DISCONNECT文の形式と規則

(1)　機能

現在のトランザクションを正常終了させ，同期点を設定し1コミットメント単位を生成します。その後，UAPをHiRDBから切り離します。

(2)　使用権限

なし。

(3)　形式

　DISCONNECT

(4)　共通規則

DISCONNECT文を実行すると，HiRDBがCOMMIT文を実行した後に，HiRDBからUAPを切り離します。このときホールダブルカーソルもすべて閉じられます。

DISCONNECT文を実行しないでUAPが終了すると，そのUAPのトランザクションをROLLBACKします。

DISCONNECT文を実行すると，一時表の行データは削除されます。

(5)　留意事項

DISCONNECT文は，OLTP下のX/Openに従ったUAPから指定できません。

(6)　使用例

UAPをHiRDBから切り離します。

    DISCONNECT

5.6　LOCK文（表の排他制御）

5.6.1　LOCK文の形式と規則

(1)　機能

指定した表に排他制御をします。HiRDBが自動的に排他制御する行，又はキー値単位より大きな単位で排他制御をするため，行，又はキー値単位の場合に比べて排他制御によるオーバヘッドを削減できます。

(2)　使用権限

表に対するSELECT権限を持つユーザが，その表に共用モードの排他を掛けられます。

表に対するINSERT権限，UPDATE権限，又はDELETE権限を持つユーザが，その表に排他モードの排他を掛けられます。

(3)　形式

　LOCK TABLE 〔認可識別子.〕表識別子
　　　　　　　　〔，〔認可識別子.〕表識別子〕…
　　　　　　　　〔IN｛SHARE｜EXCLUSIVE ｝ MODE〕
　　　　　　　　〔UNTIL DISCONNECT〕
　　　　　　　　〔｛WITH ROLLBACK｜NO WAIT｜NOWAIT｝〕

(4)　オペランド

(a)　〔認可識別子.〕表識別子〔，〔認可識別子.〕表識別子〕…

認可識別子

排他制御をする表の所有者の認可識別子を指定します。

表識別子

排他制御をする表の名称を指定します。

表識別子にビュー表を指定した場合は，ビュー表の基になる実表に対して排他制御をします。この場合，ビュー表には排他制御はしません。

表識別子に一時表を指定した場合，指定は無視されます。

表名は最大128個指定できます。また，表名は重複してもかまいません。

(b)　〔IN SHARE MODE〕

排他制御をする表のデータを，ほかのユーザが参照することは許すが，更新することは許さない（共用モード）場合に指定します。このオペランドを指定したLOCK文発行後の表アクセス時に，共用モードの行，及びキー値の排他資源が削減されます。

(c)　〔IN EXCLUSIVE MODE〕

排他制御をする表のデータを，ほかのユーザが参照することも，更新することも許さない（排他モード）場合に指定します。ただし，ほかのユーザが排他オプションWITHOUT LOCK NOWAITを指定して検索した場合を除きます。このオペランドを指定したLOCK文発行後の表アクセス時に，共用モードの行，キー値，及び排他モードの行，キー値の排他資源が削減されます。

(d)　〔UNTIL DISCONNECT〕

DISCONNECTするまで排他制御をする場合に指定します。省略した場合，トランザクションの終了まで排他制御をします。

(e)　｛WITH ROLLBACK｜NO WAIT｜NOWAIT｝

ほかのユーザと排他が競合した場合，待たないでエラーを受け取るときに指定します。省略した場合，排他が競合したときは，排他が解除されるまで，又はシステム定義のpd_lck_wait_timeoutオペランドで指定した時間まで待ちます。

WITH ROLLBACK

排他制御をする表をほかのユーザが使用している場合，トランザクションを取り消して無効にするときに指定します。

NO WAIT

排他制御をする表が他ユーザで使用されているとき，トランザクションを取り消さないでこのSQL文を無効にする場合，指定します。

NOWAIT

NO WAITを指定した場合と同じです。

(5)　共通規則

排他制御をする実表が重複する場合は，重複排除されます。一つのLOCK文で排他制御できる実表の合計は，最大128個です。

データディクショナリ表には，排他制御はできません。

排他制御をしているとき，更にLOCK文を実行した場合，排他期間は長い方へ，又排他レベルは強い方へ遷移します。このため，排他期間を短くする，又は排他レベルを下げる指定をしたLOCK文を実行しても，排他期間及び排他レベルは変更されません。

排他期間の長さと排他レベルの強弱を次の図に示します。

図5‒1　排他期間の長さと排他レベルの強弱

LOCK文発行後にPURGE TABLE文を実行すると，排他レベルがEXCLUSIVEに遷移します。この場合，PURGE TABLE文実行前にトランザクションを終了させると，PURGE TABLE文を実行してもEXCLUSIVEには遷移しません。

UNTIL DISCONNECTを指定して排他制御をしている表が，DROP TABLE文などで削除された場合，その表に対する排他制御はHiRDBシステムによって自動的に解除されます。

(6)　留意事項

通常，HiRDBが排他制御をするので，排他制御の単位を変える場合だけLOCK文を使用してください。

UNTIL DISCONNECTを指定した場合，クライアント環境定義のPDXAMODEの指定によって，排他制御の期間が異なります。PDXAMODE及び排他制御については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

共用表に対して排他モード（IN EXCLUSIVE MODE）でLOCK文を実行した場合，共用表のほかに次のRDエリアも排他制御の対象となります。

共用表を格納しているRDエリア

共用表にインデクスが定義されている場合，そのインデクスを格納しているRDエリア

共用表に対する排他制御については，マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

(7)　使用例

同じトランザクション中で，在庫表（ZAIKO）を全件検索するため，この表に共用モードの排他制御をします。

    LOCK TABLE ZAIKO IN SHARE MODE

5.7　ROLLBACK文（トランザクションの取り消し）

5.7.1　ROLLBACK文の形式と規則

(1)　機能

現在のトランザクションを取り消して，そのトランザクション内でのデータベースの更新を無効にします。

(2)　使用権限

なし。

(3)　形式

　ROLLBACK 〔WORK〕〔RELEASE〕

(4)　オペランド

(a)　WORK

指定しても，指定しなくてもトランザクションの取り消しの機能は変わりません。JIS規格と互換のためサポートしています。

(b)　RELEASE

トランザクションを取り消して，データベースの更新を無効にした後に，UAPをHiRDBから切り離す場合に指定します。

(5)　共通規則

ROLLBACK文を実行すると，開いているカーソルはすべて閉じられます。

現行トランザクション中での排他制御は解除されます。ただし，UNTIL DISCONNECT指定のLOCK TABLE文による排他制御は解除されません。

定義系SQLは，ロールバックの対象にはなりません。

ホールダブルカーソル指定の動的SELECT文の前処理については，現行トランザクション中に前処理された場合は無効とし，それ以外は有効とします。

ROLLBACK文を実行すると，有効な位置付け子はすべて無効となります。

RELEASEを省略したROLLBACK文を実行すると，ON COMMIT DELETE ROWSを指定して定義した一時表の行データは削除されます。RELEASEを指定したROLLBACK文を実行すると，ON COMMITの指定に関係なく，一時表の行データは削除されます。

(6)　留意事項

ROLLBACK文は，OLTP下のX/Openに従ったUAPから指定できません。また，OLTP下のUAPから手続きを呼び出す場合，ROLLBACK文を使用した手続きは実行できません。

手続き中からROLLBACK文を実行する場合，RELEASEオペランドは指定できません。

ROLLBACK文は，トリガの動作中は実行できません。

(7)　使用例

現在のトランザクションを取り消します。

    ROLLBACK

手続き内，又は手続き終了後にトランザクションを取り消します。

5.8　SET SESSION AUTHORIZATION文（実行ユーザの変更）

5.8.1　SET SESSION AUTHORIZATION文の形式と規則

(1)　機能

HiRDBに認可識別子，及びパスワードを連絡して，接続中のユーザを変更します。

(2)　使用権限

DBA権限，又はCONNECT権限を持つユーザ

接続中のユーザを変更できます。

(3)　形式

  SET SESSION AUTHORIZATION {:埋込み変数1|？パラメタ1}
        〔｛ USING | IDENTIFIED BY ｝{:埋込み変数2|？パラメタ2 }〕

(4)　オペランド

(a)　埋込み変数1｜？パラメタ1

認可識別子を値として持つ埋込み変数，又は？パラメタを指定します。

認可識別子の大文字，小文字を区別して扱う場合，認可識別子を引用符（"）で囲んだ文字列を埋込み変数又は？パラメタに設定してください。

UAPの記述言語がC言語の場合，33バイト以下の固定長文字列のデータ型で，文字列はナル文字で終わらせてください。ナル文字で終わらないと，(エリア長−1)の文字列を認可識別子として使用します。ただし，埋め込み変数としてポインタを使用する場合は，文字列を必ずナル文字で終わらせてください。

UAPの記述言語がCOBOLの場合，32バイト以下の固定長文字列のデータ型で指定してください。認可識別子がエリア長より短い場合は文字列の右端に空白詰めしてください。文字列をナル文字で終わらせる必要はありません。

埋込み変数1には既定文字集合以外の文字集合は指定できません。？パラメタ1に文字集合名UTF16を指定した場合，64バイト以下の固定長文字列のデータ型で指定してください。

(b)　埋込み変数2｜？パラメタ2

パスワードを値として持つ埋込み変数，又は？パラメタを指定します。

パスワードの大文字，小文字を区別して扱う場合，パスワードを引用符（"）で囲んだ文字列を埋込み変数又は？パラメタに設定してください。

UAPの記述言語がＣ言語の場合，33バイト以下の固定長文字列のデータ型で，文字列はナル文字で終わらせてください。ナル文字で終わらないと，(エリア長−1)の文字列をパスワードとして使用します。

ただし，埋込み変数としてポインタを使用した場合は，エリア長として31バイトを仮定するため，指定できるパスワード長が引用符を含めて30バイトに制限されます。引用符を含めて31バイト以上のパスワードを指定する場合はポインタを使用しないでください。ポインタを使用する場合は，文字列をナル文字で終わらせてください。31バイト目までにナル文字がないと，30バイト目までの文字列をパスワードとして使用します。

UAPの記述言語がCOBOLの場合，32バイト以下の固定長文字列のデータ型で指定してください。パスワードがエリア長より短い場合は文字列の右端に空白詰めしてください。文字列をナル文字で終わらせる必要はありません。

埋込み変数2には既定文字集合以外の文字集合は指定できません。？パラメタ2に文字集合名UTF16を指定した場合，64バイト以下の固定長文字列のデータ型で指定してください。

(5)　共通規則

トランザクションの開始前，又はトランザクション内で最初に実行しなければユーザを変更できません。

PREPARE文で前処理した結果はすべて無効になります。

ホールダブルカーソルが開いている場合には，ユーザを変更できません。

LOCK TABLE文でUNTIL DISCONNECT指定の排他を掛けている場合は，ユーザを変更できません。

OLTP下のX/Openに従ったUAPでSET SESSION AUTHORIZATIONを指定する場合は，tx_begin又はxa_begin関数コール直後に実行するように指定します。

動的SQLのSET SESSION AUTHORIZATIONを実行した場合，処理完了時にCOMMITされます。

ストアドプロシジャ中では実行できません。

SET SESSION AUTHORIZATION文を実行すると，一時表の行データは削除されます。

EXECUTE文を実行するとき，？パラメタ1に設定する変数のデータ長は，最大32まで指定できますが，PREPARE文で前処理したSET SESSION AUTHORIZATION文に対してDESCRIBE INPUT文を実行すると，？パラメタ1のデータ長には30が設定されます。

EXECUTE文を実行するとき，？パラメタ2に設定する変数のデータ長は，最大32まで指定できますが，PREPARE文で前処理したSET SESSION AUTHORIZATION文に対してDESCRIBE INPUT文を実行すると，？パラメタ2のデータ長には30が設定されます。

6　埋込み言語文法

この章では，埋込み言語の構文形式，及び文法について説明します。

6.1　全般規則

6.1.1　埋込み言語の全般規定

(1)　埋込み言語の種類と機能

埋込み言語は，埋込み型のUAPを作成する場合にプログラム用SQLと一緒に使用して，埋込み変数の宣言，及びリターンコードによる処理の宣言をするSQLです。

埋込み言語の種類と機能を次の表に示します。

表6‒1　埋込み言語の種類と機能

種　類

機　能

BEGIN DECLARE SECTION（埋込みSQL開始宣言）

埋込み変数宣言節の始まりを示します。埋込み変数宣言節には SQL中で使用する埋込み変数，及び標識変数を指定します。

END DECLARE SECTION（埋込みSQL終了宣言）

埋込み変数宣言節の終わりを示します。

ALLOCATE CONNECTION HANDLE（接続ハンドルの割り当て）

複数接続機能を使用した環境で，UAPが使用する接続ハンドルを割り当てます。

FREE CONNECTION HANDLE（接続ハンドルの解放）

ALLOCATE CONNECTION HANDLEで割り当てた接続ハンドルを解放します。

DECLARE CONNECTION HANDLE SET（使用する接続ハンドルの宣言）

複数接続機能を使用した環境で，UAP中のSQLが使用する接続ハンドルを宣言します。

DECLARE CONNECTION HANDLE UNSET（使用する接続ハンドルの全解除）

この文以前にDECLARE CONNECTION HANDLE SETで指定した接続ハンドルの，使用の宣言をすべて解除します。

GET CONNECTION HANDLE（接続ハンドル取得）

X/Open XAインタフェース環境下で複数接続機能を使用する場合，UAPが使用する接続ハンドルを割り当てます。

COPY（登録集原文の引き込み）

登録集原文をソースプログラム中に引き込みます。

GET DIAGNOSTICS（診断情報取得）

直前に実行したSQL文がCREATE PROCEDURE，CREATE FUNCTION，CREATE TYPE，ALTER PROCEDURE，ALTER ROUTINE，ALTER TRIGGER，CREATE TRIGGER，CALL文，又はWITH句指定のある動的SELECT文，若しくはカーソル宣言の場合に，そのエラー情報，及び診断情報を診断領域から取得します。

COMMAND EXECUTE（UAPからのコマンド実行）

UAP中から，HiRDBのコマンド，及びOSのコマンドを実行します。

SQL先頭子

SQLの始まりを示します。

SQL終了子

SQLの終わりを示します。

WHENEVER（埋込み例外宣言）

SQLの実行後にHiRDBがSQL連絡領域に設定したリターンコードによって，UAPの処理を宣言します。

SQLCODE変数

SQLの実行後にHiRDBから返されるリターンコードを受け取ります。

SQLSTATE変数

SQLの実行後にHiRDBから返されるリターンコードを受け取ります。

PDCNCTHDL型変数の宣言

複数接続機能を使用した環境で，使用する接続情報を持つハンドルを宣言します。

INSTALL JAR

HiRDBサーバにJARファイルを登録します。

REPLACE JAR

HiRDBサーバにJARファイルを再登録します。

REMOVE JAR

HiRDBサーバのJARファイルを削除します。

INSTALL CLIB

HiRDBサーバにCライブラリファイルを新規登録します。

REPLACE CLIB

HiRDBサーバにCライブラリファイルを再登録します。

REMOVE CLIB

HiRDBサーバのCライブラリファイルを削除します。

DECLARE AUDIT INFO SET

HiRDBサーバにアクセスするアプリケーションのアカウント情報などユーザ任意接続情報を設定します。

6.2　BEGIN DECLARE SECTION（埋込みSQL開始宣言）

6.2.1　BEGIN DECLARE SECTIONの形式と規則

(1)　機能

埋込みSQL宣言節の始まりを示します。埋込みSQL宣言節には，SQL中で使用する埋込み変数，及び標識変数を指定します。

(2)　形式

　BEGIN DECLARE SECTION

(3)　共通規則

埋込みSQL宣言節の終わりは，END DECLARE SECTION（埋込みSQL終了宣言）を指定してください。

SQL中で使用する埋込み変数，及び標識変数は，埋込みSQL宣言節で宣言します。

埋込み型のUAPには，0個以上の埋込みSQL宣言節を指定できます。

埋込みSQL宣言節には，変数の宣言だけ指定できます。ただし，変数の宣言を含まない埋込みSQL宣言節は指定できます。

(4)　使用例

SQL中で使用する埋込み変数を宣言します。

<C言語の場合>

  EXEC SQL BEGIN DECLARE SECTION;
      char  XSCODE[5];
      char  XSNAME[17];
      char  XCOL[3];
      long  XTANKA;
      long  XZSURYO;
  EXEC SQL END DECLARE SECTION;

<COBOL言語の場合>

      EXEC SQL
          BEGIN DECLARE SECTION
      END-EXEC.
  77 XSCODE      PIC X(4).
  77 XSNAME      PIC X(16).
  77 XCOL        PIC X(2).
  77 XTANKA      PIC S9(9) COMP.
  77 XZSURYO     PIC S9(9) COMP.
      EXEC SQL
          END DECLARE SECTION
      END-EXEC.

6.3　END DECLARE SECTION（埋込みSQL終了宣言）

6.3.1　END DECLARE SECTIONの形式と規則

(1)　機能

埋込みSQL宣言節の終わりを示します。

(2)　形式

　END DECLARE SECTION

(3)　共通規則

埋込みSQL宣言節の始まりは，BEGIN DECLARE SECTION（埋込みSQL開始宣言）を指定してください。

SQL中で使用する埋込み変数，及び標識変数は，埋込みSQL宣言節で宣言します。

(4)　使用例

使用例については，「BEGIN DECLARE SECTION（埋込みSQL開始宣言）」を参照してください。

6.4　ALLOCATE CONNECTION HANDLE（接続ハンドルの割り当て）

6.4.1　ALLOCATE CONNECTION HANDLEの形式と規則

(1)　機能

複数接続機能を使用した環境で，UAPが使用する接続ハンドルを割り当てます。

(2)　形式

　ALLOCATE CONNECTION HANDLE ：PDCNCTHDL型変数，
　　　　　　　　　　　　　　　　　：リターンコード受け取り変数
　　　　　　　　　　　　　　　　　〔，｛：接続PDHOST変数，：接続PDNAMEPORT変数
　　　　　　　　　　　　　　　　　　　｜：環境変数グループ名変数｝〕

(3)　オペランド

(a)　：PDCNCTHDL型変数

PDCNCTHDL型として宣言した埋込み変数を指定します。

(b)　：リターンコード受け取り変数

INT型として宣言した埋込み変数を指定します。

リターンコード受け取り変数に返される値を次に示します。

C言語の場合

正常に割り当てられた場合：

p_rdb_RC_NORM

接続ハンドルの値が不正な場合：

p_rdb_RC_ERRPARM

メモリ不足が発生した場合：

p_rdb_RC_MEMERR

これらの値は，pdberrno.hに定義しています。

COBOL言語の場合

正常に割り当てられた場合：

P-RDB-RC-NORM

接続ハンドルの値が不正な場合：

P-RDB-RC-ERRPARM

メモリ不足が発生した場合：

P-RDB-RC-MEMERR

これらの値は，PDBSQLCAMTH.CBLに定義しています。

(c)　：接続PDHOST変数

接続先のホスト名をCHARACTER型（領域長511バイト）の埋込み変数で指定します。ホスト名はクライアント環境定義のPDHOSTオペランドに指定する形式で指定してください。

既定文字集合以外の文字集合は指定できません。

(d)　：接続PDNAMEPORT変数

接続先のポート番号をSMALLINT型の埋込み変数で指定します。ポート番号はクライアント環境定義のPDNAMEPORTオペランドに指定する形式で指定してください。

ただし，接続先のポート番号が65535の場合は，クライアント環境定義のPDHOSTとPDNAMEPORT，又は環境変数グループ名変数を使用して，接続先を指定してください。

(e)　：環境変数グループ名変数

CHAR型（領域長256バイト）として宣言した埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

UNIX環境では，環境変数を記述した通常ファイルのファイル名を絶対パス名（ナル文字を含めて256バイトまで）で指定します。

Windows環境では，環境変数登録ツールで登録したグループ名（ナル文字を含めて31バイトまで），又は環境変数グループファイル名を絶対パス名（ナル文字を含めて256バイトまで）で指定します。「ドライブ名:¥」から始まっていた場合は，すべて環境変数グループファイル名指定とみなします。Windows環境での環境変数グループファイルはWindowsのiniファイルの仕様に準じます。Windows環境での環境変数グループファイル指定の場合，パス名に空白などを含むロングパス指定もできますが，パス名の前後を引用符（"）で囲まないでください。

環境変数グループについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(4)　共通規則

ALLOCATE CONNECTION HANDLEは，CONNECT文より先に発行してください。

使用する埋込み変数は，埋込みSQL宣言節で宣言してください。

接続ハンドルの割り当てに失敗した場合，その障害コードをリターンコード受け取り変数に設定します。

接続PDHOST変数及び接続PDNAMEPORT変数は，両方指定するか，又は両方省略するかのどちらかにしてください。省略した場合は，クライアント環境定義の指定値でデータベースとの接続処理をします。

接続PDHOST変数に設定するホスト名の最後は，ナル文字にしてください。

(5)　留意事項

割り当てた接続ハンドルは，DISCONNECT文の発行時には解放されません。接続ハンドルを解放する場合は，FREE CONNECTION HANDLEを発行してください。

COBOL言語の場合，接続PDHOST変数，及び環境変数グループ名変数に値を設定するときは，設定値の最後をナル文字にしてください。

接続PDHOST変数と接続PDNAMEPORT変数を指定した場合でも，クライアント環境定義で高速接続又はFESホストダイレクト接続を指定しているときは，クライアント環境定義で指定されている接続形態でHiRDBサーバに接続します。接続形態の選択方法については，マニュアル「HiRDB Version 9 UAP開発ガイド」の「HiRDBサーバと接続するための環境変数と接続形態との関係」を参照してください。

(6)　使用例

PDCNCTHDL型変数の使用例を次に示します。

(C言語の場合)

EXEC SQL BEGIN DECLARE SECTION;
  PDCNCTHDL   CnctHdl;
  long        AlchdlRtn;
EXEC SQL END DECLARE SECTION;
EXEC SQL ALLOCATE CONNECTION HANDLE :CnctHdl,
                                    :AlchdlRtn;

(COBOL言語の場合)

DATA DIVISION.
WORKING-STORAGE SECTION.
  EXEC SQL
    BEGIN DECLARE SECTION
  END-EXEC.
01 CNCTHDL     SQL TYPE IS PDCNCTHDL.
01 ALCHDLRTN   PIC S9(9) COMP.
  EXEC SQL
    END DECLARE SECTION
  END-EXEC.
        :
PROCEDURE DIVISION.
        :
  EXEC SQL
    ALLOCATE CONNECTION HANDLE :CNCTHDL,
                               :ALCHDLRTN;
  END-EXEC.

接続PDHOST変数，及び接続PDNAMEPORT変数の使用例を次に示します。

(C言語の場合)

EXEC SQL BEGIN DECLARE SECTION;
  PDCNCTHDL   CnctHdl;
  long        AlchdlRtn;
  char        CnctHost[31];
  short       CnctPort;
EXEC SQL END DECLARE SECTION;
strcpy(CnctHost,"HOST01");
EXEC SQL ALLOCATE CONNECTION HANDLE :CnctHdl,
                                    :AlchdlRtn,
                                    :CnctHost,
                                    :CnctPort;

(COBOL言語の場合)

DATA DIVISION.
WORKING-STORAGE SECTION.
  EXEC SQL
    BEGIN DECLARE SECTION
  END-EXEC.
01 CNCTHDL     SQL TYPE IS PDCNCTHDL.
01 ALCHDLRTN   PIC S9(9) COMP.
01 CNCTHOST    PIC X(31).
01 CNCTPORT    PIC S9(4) COMP.
  EXEC SQL
    END DECLARE SECTION
  END-EXEC.
        :
PROCEDURE DIVISION.
        :
  MOVE 'HOST01' & X'00' TO CNCTHOST.
  EXEC SQL
    ALLOCATE CONNECTION HANDLE :CNCTHDL,
                               :ALCHDLRTN,
                               :CNCTHOST,
                               :CNCTPORT;
  END-EXEC.

環境変数グループ名の使用例を次に示します。

(C言語の場合)

EXEC SQL BEGIN DECLARE SECTION;
  PDCNCTHDL   CnctHdl;
  long        AlchdlRtn;
  char        GroupName[31];
EXEC SQL END DECLARE SECTION;
strcpy(GroupName,"HRD01");
EXEC SQL ALLOCATE CONNECTION HANDLE :CnctHdl,
                                    :AlchdlRtn,
                                    :GroupName;

(COBOL言語の場合)

DATA DIVISION.
WORKING-STORAGE SECTION.
  EXEC SQL
    BEGIN DECLARE SECTION
  END-EXEC.
01 CNCTHDL     SQL TYPE IS PDCNCTHDL.
01 ALCHDLRTN   PIC S9(9) COMP.
01 GROUPNAME   PIC X(31).
  EXEC SQL
    END DECLARE SECTION
  END-EXEC.
        :
PROCEDURE DIVISION.
        :
  MOVE 'HRD01' & X'00' TO GROUPNAME.
  EXEC SQL
    ALLOCATE CONNECTION HANDLE :CNCTHDL,
                               :ALCHDLRTN,
                               :GROUPNAME
  END-EXEC.

6.5　FREE CONNECTION HANDLE（接続ハンドルの解放）

6.5.1　FREE CONNECTION HANDLEの形式と規則

(1)　機能

ALLOCATE CONNECTION HANDLEで割り当てた接続ハンドルを解放します。

(2)　形式

　FREE CONNECTION HANDLE ：PDCNCTHDL型変数，
　　　　　　　　　　　　　　　　　　：リターンコード受け取り変数

(3)　オペランド

(a)　：PDCNCTHDL型変数

ALLOCATE CONNECTION HANDLEで指定したPDCNCTHDL型変数を指定します。

(b)　：リターンコード受け取り変数

ALLOCATE CONNECTION HANDLEで指定したリターンコード受け取り変数を指定します。

リターンコード受け取り変数に返される値を次に示します。

C言語の場合

正常に割り当てられた場合：

p_rdb_RC_NORM

接続ハンドルの値が不正な場合：

p_rdb_RC_ERRPARM

接続ハンドルが現在使用中の場合：

p_rdb_RC_SIMERR

これらの値は，pdberrno.hに定義しています。

COBOL言語の場合

正常に割り当てられた場合：

P-RDB-RC-NORM

接続ハンドルの値が不正な場合：

P-RDB-RC-ERRPARM

接続ハンドルが現在使用中の場合：

P-RDB-RC-SIMERR

これらの値は，SQLCAMTH.CBLに定義しています。

(4)　共通規則

FREE CONNECTION HANDLEは，DISCONNECT文の後に発行してください。

使用する埋込み変数は，埋込みSQL宣言節で宣言してください。

接続ハンドルの解放に失敗した場合，その障害コードをリターンコード受け取り変数に設定します。

(5)　留意事項

予約した接続ハンドルは，DISCONNECT文の発行時には解放されません。接続ハンドルを解放する場合は，FREE CONNECTION HANDLEを発行してください。

OLTP下のX/Openに従ったUAPでは，GET CONNECTION HANDLEで取得した接続ハンドルはOLTPが解放します。このため，FREE CONNECTION HANDLEを発行して，接続ハンドルを解放しないでください。FREE CONNECTION HANDLEを発行して接続ハンドルを解放した場合，その後UAPが不正な動作をして，異常終了するおそれがあります。

(6)　使用例

ALLOCATE CONNECTION HANDLEの例で割り当てた接続ハンドルを解放します。

(C言語の場合)

EXEC SQL BEGIN DECLARE SECTION;
  PDCNCTHDL   CnctHdl;
  long        FrchdlRtn;
EXEC SQL END DECLARE SECTION;
EXEC SQL FREE CONNECTION HANDLE :CnctHdl,
                                :FrchdlRtn;

(COBOL言語の場合)

DATA DIVISION.
WORKING-STORAGE SECTION.
  EXEC SQL
    BEGIN DECLARE SECTION
  END-EXEC.
01 CNCTHDL     SQL TYPE IS PDCNCTHDL.
01 FRCHDLRTN   PIC S9(9) COMP.
  EXEC SQL
    END DECLARE SECTION
  END-EXEC.
        :
PROCEDURE DIVISION.
        :
  EXEC SQL
    FREE CONNECTION HANDLE :CNCTHDL,
                           :FRCHDLRTN;
  END-EXEC.

6.6　DECLARE CONNECTION HANDLE SET（使用する接続ハンドルの宣言）

6.6.1　DECLARE CONNECTION HANDLE SETの形式と規則

(1)　機能

複数接続機能を使用した環境で，UAP中のSQL，又はSQL連絡領域が使用する接続ハンドルを宣言します。

(2)　形式

　DECLARE CONNECTION HANDLE SET ：PDCNCTHDL型変数

(3)　オペランド

(a)　：PDCNCTHDL型変数

PDCNCTHDL型として宣言した埋込み変数を指定します。

(4)　共通規則

DECLARE CONNECTION HANDLE SETで指定した接続ハンドルの有効範囲は，ソースプログラム上での出現位置によって決定します。あるDECLARE CONNECTION HANDLE SETで指定した接続ハンドルの変数は，ソースプログラム上の，次に出現するDECLARE CONNECTION HANDLE SET又はDECLARE CONNECTION HANDLE UNSETまでの，すべてのSQLに対して有効となります。

使用する接続ハンドルの宣言は，同じUAP上で複数回できます。

(5)　留意事項

C言語の場合，DECLARE CONNECTION HANDLE SETの記述以前に発行したSQL文に対しては，そのSQL文が単一接続環境で発行されたものとして処理します。

COBOL言語の場合，複数接続機能を使用したUAPでは，DECLARE CONNECTION HANDLE SETの記述以前にSQL文は記述できません。

DECLARE CONNECTION HANDLE SETで宣言するのは，接続ハンドルの変数の名称であり，値そのものではありません。

複数接続機能を使用したSQL文の実行結果を格納しているSQL連絡領域を，ほかのモジュールから参照する場合は，そのモジュールでDECLARE CONNECTION HANDLE SETを実行しておく必要があります。

(6)　使用例

PDCNCTHDL型変数がCnctHdlの接続ハンドルを宣言します。

(C言語の場合)
  EXEC SQL BEGIN DECLARE SECTION;
      PDCNCTHDL CnctHdl;
  EXEC SQL END DECLARE SECTION;

  EXEC SQL DECLARE CONNECTION HANDLE SET :CnctHdl;

(COBOL言語の場合)
  EXEC SQL BEGIN DECLARE SECTION END-EXEC
      01 CNCTHDL SQL TYPE IS PDCNCTHDL.
  EXEC SQL END DECLARE SECTION END-EXEC

  EXEC SQL DECLARE CONNECTION HANDLE SET :CNCTHDL END-EXEC

6.7　DECLARE CONNECTION HANDLE UNSET（使用する接続ハンドルの全解除）

6.7.1　DECLARE CONNECTION HANDLE UNSETの形式と規則

(1)　機能

この文以前にDECLARE CONNECTION HANDLE SETで指定した接続ハンドルの，使用の宣言をすべて解除します。

(2)　形式

　DECLARE CONNECTION HANDLE UNSET

(3)　共通規則

DECLARE CONNECTION HANDLE UNSETで指定した接続ハンドルの有効範囲は，ソースプログラム上での出現位置によって決定します。あるDECLARE CONNECTION HANDLE UNSETで指定した接続ハンドルを解除した場合，ソースプログラム上の次に出現するDECLARE CONNECTION HANDLE SETまでの，すべてのSQLに対して接続ハンドルの使用を解除します。

DECLARE CONNECTION HANDLE UNSETは，COBOL言語では使用できません。

(4)　留意事項

DECLARE CONNECTION HANDLE UNSET以降に発行されたSQL文に対しては，複数接続機能の処理はしません。

(5)　使用例

宣言した接続ハンドルをすべて解除します。

  DECLARE CONNECTION HANDLE UNSET;

6.8　GET CONNECTION HANDLE（接続ハンドル取得）

6.8.1　GET CONNECTION HANDLEの形式と規則

(1)　機能

X/Open XAインタフェース環境下で複数接続機能を使用する場合，UAPが使用する接続ハンドルを割り当てます。

(2)　形式

　GET CONNECTION HANDLE ：PDCNCTHDL型変数，
　                            ：リターンコード受取変数，
　                            ：環境変数グループ識別子変数

(3)　オペランド

(a)　：PDCNCTHDL型変数

PDCNCTHDL型として宣言した埋込み変数を指定します。

(b)　：リターンコード受け取り変数

INT型として宣言した埋込み変数を指定します。

リターンコード受け取り変数に返される値を次に示します。

C言語の場合

正常に取得された場合：

p_rdb_RC_NORM

何らかの障害が発生した場合：

各障害に対応したエラーコード

これらの値は，pdberrno.hに定義しています。

COBOL言語の場合

正常に取得された場合：

P-RDB-RC-NORM

これらの値は，SQLCAMTH.CBLに定義しています。

(c)　：環境変数グループ識別子変数

CHAR型（5バイト固定）として宣言した埋込み変数を指定します。

既定文字集合以外の文字集合は指定できません。

環境変数グループ識別子変数には，xa_open関数用文字列に指定した環境変数グループ識別子（ナル文字を含めて5バイト固定）を指定してください。

(4)　共通規則

使用する埋込み変数の宣言は，埋込み変数宣言部で行います。

接続ハンドルの取得に失敗した場合，その障害コードをリターンコード受け取り変数に設定します。

(5)　留意事項

ここで取得した接続ハンドルでSQLを発行する場合は，DECLARE CONNECTION HANDLE SETで使用する接続ハンドルの宣言をしてください。

COBOL言語の場合，環境変数グループ識別子変数に値を設定するときは，設定値の最後をナル文字にしてください。

OLTP下のX/Openに従ったUAPでは，GET CONNECTION HANDLEで取得した接続ハンドルはOLTPが解放します。このため，FREE CONNECTION HANDLEを発行して，接続ハンドルを解放しないでください。FREE CONNECTION HANDLEを発行して接続ハンドルを解放した場合，その後UAPが不正な動作をして，異常終了するおそれがあります。

(6)　使用例

PDCNCTHDL型変数がCnctHdl，リターンコード受け取り変数がGetchdlRtn，環境変数グループ識別子変数がGroupNameの接続ハンドルを割り当てます。

(C言語の場合)

EXEC SQL BEGIN DECLARE SECTION;
  PDCNCTHDL   CnctHdl;
  long        GetchdlRtn;
  char        GroupId[5];
EXEC SQL END DECLARE SECTION;
strcpy(GroupId,"HR01") ;
EXEC SQL GET CONNECTION HANDLE  :CnctHdl,
                                :GetchdlRtn,
                                :GroupId;

(COBOL言語の場合)

DATA DIVISION.
WORKING-STORAGE SECTION.
  EXEC SQL
    BEGIN DECLARE SECTION
  END-EXEC.
01 CNCTHDL     SQL TYPE IS PDCNCTHDL.
01 GETCHDLRTN  PIC S9(9) COMP.
01 GROUPID     PIC X(5).
  EXEC SQL
    END DECLARE SECTION
  END-EXEC.
        :
PROCEDURE DIVISION.
        :
  MOVE 'HR01' & X'00' TO GROUPID.
  EXEC SQL
    GET CONNECTION HANDLE :CNCTHDL,
                          :GETCHDLRTN,
                          :GROUPID;
  END-EXEC.

(7)　注意事項

HiRDBサーバが複数接続機能をサポートしていない場合，一つのトランザクションから同一のHiRDBに対して，複数のコネクションハンドルを使ってSQLを実行できません。実行した場合，HiRDBサーバがPac2354のコードでアボートし，トランザクションがロールバックされます。よって，同一トランザクション内で複数のコネクションハンドルを使ったSQL文は同時に実行できません。

接続先がそれぞれ異なるHiRDBであれば，同一トランザクション内で複数のコネクションハンドルを使用できます。

誤りの例を次に示します。

《HiRDB1をRM01とRM02で登録している状態》

tx_begin()
strcpy(grpnm, "RM01")
GET CONNECTION HANDLE :hCnct,:rc,:grpnm;
DECLARE CONNECTION HANDLE SET :hCnct;

SQL実行

strcpy(grpnm, "RM02")
GET CONNECTION HANDLE :hCnct,:rc,:grpnm;
DECLARE CONNECTION HANDLE SET :hCnct;

SQL実行

tx_commit()

6.9　COPY（登録集原文の引き込み）

6.9.1　COPYの形式と規則

(1)　機能

埋込み変数及び標識変数の宣言，又はSQL文を含む登録集原文をソース中に引き込みます。

(2)　形式

　COPY 原文名

(3)　オペランド

(a)　原文名

登録集原文，又はヘッダファイルが登録されているファイルの名称（サフィックスを除く）を30文字以下の文字列で指定します。

(4)　共通規則

SQL先頭子とSQL終了子で囲んでください。また，SQL終了子の後は，行末まで何も記述しないでください。

登録集原文，又はヘッダファイルが登録されているディレクトリは，次に示す順位で検索するため，次に示すどれかのファイルに登録しておいてください。

ディレクトリの検索順位

環境変数で登録したディレクトリ

（COBOL，及びOOCOBOLの場合はPDCBLLIB，C，及びC++の場合はPDCLIB）

カレントディレクトリ

ファイルの検索順位（COBOL，及びOOCOBOLの場合）

環境変数PDCBLFIXで登録したサフィックスが付いたファイル

ファイル名.cbl

ファイル名.CBL

ファイル名.cob

ファイルの検索順位（C，及びC++の場合）

ファイル名.h

COPYで引き込んだ原文中にSQLのCOPYは指定できません。

COBOL，及びOOCOBOLの場合，登録集原文は固定形式正書法で記述してください。

(5)　留意事項

埋込み変数及び標識変数の宣言，又はSQL文を含む登録集原文をソース中に引き込む場合は，SQLのCOPY文を使用します。この場合，次の文，及び命令は使用できません。

COBOL言語及びOOCOBOL言語の，COPY文及びINCLUDE文

C言語，及びC++言語の#include命令

ただし，C言語の#include命令については，例外的に使用できる場合があります。詳細はマニュアル「HiRDB Version 9 UAP開発ガイド」の「SQLの記述規則」を参照してください。

埋込み変数及び標識変数の宣言，又はSQL文のどれも含まない登録集原文若しくはヘッダファイルをソース中に引き込む場合は，次に示すUAP記述言語の機能を使用します。

COBOL言語及びOOCOBOL言語の，COPY文及びINCLUDE文

C言語，及びC++言語の#include命令

(6)　使用例

登録集原文（ファイル名：SAMPLE）をソースプログラム中に引き込みます。

<COBOL言語の場合>

  EXEC SQL
      COPY SAMPLE
  END-EXEC.

6.10　GET DIAGNOSTICS（診断情報取得）

6.10.1　GET DIAGNOSTICSの形式と規則

(1)　機能

直前に実行したSQL文が次のどれかの場合，そのエラー情報及び診断情報を，診断領域から取得します。

定義系SQL

操作系SQL

制御系SQL

埋込み言語文法（INSTALL JAR，REPLACE JAR，REMOVE JAR，INSTALL CLIB，REPLACE CLIB，REMOVE CLIB）

ルーチン制御SQL

ルーチンのSQLオブジェクトの再作成時，この診断情報に，正常に再作成したルーチンの情報が含まれます。

(2)　形式

　GET DIAGNOSTICS
　　　｛：埋込み変数＝文情報項目名
　　　　　　〔，：埋込み変数＝文情報項目名〕…
　　　　｜EXCEPTION 条件番号
　　　　　　：埋込み変数＝条件情報項目名
　　　　　　　　〔，：埋込み変数＝条件情報項目名〕…｝

　文情報項目名：：＝｛NUMBER｜MORE｝
　条件情報項目名：：＝｛RETURNED_SQLCODE
　　　　　　　　　　　　｜ERROR_POSITION
　　　　　　　　　　　　｜ERROR_SQL_NO
　　　　　　　　　　　　｜ERROR_SQL
　　　　　　　　　　　　｜ROUTINE_TYPE
　　　　　　　　　　　　｜ROUTINE_SCHEMA
　　　　　　　　　　　　｜ROUTINE_NAME
　　　　　　　　　　　　｜TRIGGER_SCHEMA
　　　　　　　　　　　　｜TRIGGER_NAME
　　　　　　　　　　　　｜CONSTRAINT_SCHEMA
　　　　　　　　　　　　｜CONSTRAINT_NAME
　　　　　　　　　　　　｜MESSAGE_TEXT
　　　　　　　　　　　　｜QUERY_NAME
　　　　　　　　　　　　｜CONDITION_IDENTIFIER｝

(3)　オペランド

(a)　文情報項目名

NUMBER

診断領域中の診断情報の数を取得する場合に指定します。データ型はSMALLINTを指定してください。

MORE

診断情報の数が，診断領域に格納できる数を超えたかどうかの情報を取得する場合に指定します。

データ型はCHAR，長さは1バイトを指定してください。

診断領域にすべての診断情報が設定されている場合はN，そうでない場合はYが格納されます。

(b)　条件番号

何番目の診断情報を取得するかを示す値を埋込み変数で指定します。

(c)　条件情報項目名

RETURNED_SQLCODE

リターンコード（SQLCODE）の値を取得する場合に指定します。データ型はINTEGERを指定してください。

ERROR_POSITION

構文エラーが発生した場合の，SQL中のエラーの位置を取得するときに指定します。

データ型はINTEGERを指定してください。構文エラー以外のエラーが発生した場合は，0が設定されます。

ERROR_SQL_NO

次のどれかのSQLを実行した場合，そのルーチン中でエラーとなったSQL手続き文を示す番号を取得したいときに指定します。

CREATE PROCEDURE

CREATE FUNCTION

CREATE TYPE

CREATE TRIGGER

ALTER PROCEDURE

ALTER ROUTINE

ALTER TRIGGER

CALL文

トリガを引き起こす操作系SQL（ただし，取得できる情報はトリガの動作についてだけです）

番号は，手続き中のSQL手続き文の開始位置の順序で，各SQL手続き文に0から順に付けたものです。データ型はINTEGERを指定してください。

ERROR_SQL

診断情報のSQLの種別を示す文字列を取得したいときに指定します。

データ型はVARCHAR，長さは32バイト（文字集合名UTF16を指定した場合は64バイト）を指定してください。

設定される文字列を次の表に示します。

表6‒2　 ERROR_SQLに設定される文字列

分類（SQL種別）

文字列設定の有無

設定される文字列

ルーチン

左記以外

定義

実行

前処理

実行

定義系

SQL

ALTER INDEX

×

×

○

○

ALTER INDEX

ALTER PROCEDURE

×

×

○

○

ALTER PROCEDURE

ALTER ROUTINE

×

×

○

○

ALTER ROUTINE

ALTER TABLE

×

×

○

○

ALTER TABLE

ALTER TRIGGER

×

×

○

○

ALTER TRIGGER

COMMENT（表に注釈を付ける）

×

×

○

○

COMMENT TABLE

COMMENT（列に注釈を付ける）

×

×

○

○

COMMENT COLUMN

CREATE AUDIT

×

×

○

○

CREATE AUDIT

CREATE CONNECTION SECURITY

×

×

○

○

CREATE CONNECTION SECURITY

CREATE FUNCTION

×

×

○

○

CREATE FUNCTION

CREATE PUBLIC FUNCTION

×

×

○

○

CREATE FUNCTION

CREATE INDEX

×

×

○

○

CREATE INDEX

CREATE PROCEDURE

×

×

○

○

CREATE PROCEDURE

CREATE PUBLIC PROCEDURE

×

×

○

○

CREATE PROCEDURE

CREATE SCHEMA

×

×

○

○

CREATE SCHEMA

CREATE SEQUENCE

×

×

○

○

CREATE SEQUENCE

CREATE TABLE

×

×

○

○

CREATE TABLE

CREATE TRIGGER

×

×

○

○

CREATE TRIGGER

CREATE TYPE

×

×

○

○

CREATE TYPE

CREATE VIEW

×

×

○

○

CREATE VIEW

CREATE PUBLIC VIEW

×

×

○

○

CREATE VIEW

DROP AUDIT

×

×

○

○

DROP AUDIT

DROP CONNECTION SECURITY

×

×

○

○

DROP CONNECTION SECURITY

DROP DATA TYPE

×

×

○

○

DROP DATA TYPE

DROP FUNCTION

×

×

○

○

DROP FUNCTION

DROP PUBLIC FUNCTION

×

×

○

○

DROP FUNCTION

DROP INDEX

×

×

○

○

DROP INDEX

DROP PROCEDURE

×

×

○

○

DROP PROCEDURE

DROP PUBLIC PROCEDURE

×

×

○

○

DROP PROCEDURE

DROP SCHEMA

×

×

○

○

DROP SCHEMA

DROP SEQUENCE

×

×

○

○

DROP SEQUENCE

DROP TABLE

×

×

○

○

DROP TABLE

DROP TRIGGER

×

×

○

○

DROP TRIGGER

DROP VIEW

×

×

○

○

DROP VIEW

DROP PUBLIC VIEW

×

×

○

○

DROP VIEW

GRANT CONNECT

×

×

○

○

GRANT CONNECT

GRANT DBA

×

×

○

○

GRANT DBA

GRANT RDAREA

×

×

○

○

GRANT RDAREA

GRANT SCHEMA

×

×

○

○

GRANT SCHEMA

GRANT アクセス権限

×

×

○

○

GRANT ACCESS

GRANT AUDIT

×

×

○

○

GRANT AUDIT

REVOKE CONNECT

×

×

○

○

REVOKE CONNECT

REVOKE DBA

×

×

○

○

REVOKE DBA

REVOKE RDAREA

×

×

○

○

REVOKE RDAREA

REVOKE SCHEMA

×

×

○

○

REVOKE SCHEMA

REVOKE アクセス権限

×

×

○

○

REVOKE ACCESS

操作系

SQL

ALLOCATE CURSOR文

×

×

×

○

ALLOCATE CURSOR

ASSIGN LIST文

×

×

○

○

ASSIGN LIST

CALL文

○

○

○

○

CALL

CLOSE文

○

○

×

×

CLOSE

×

×

○

○

（カーソルに指定したSQL種別の，この項目を参照してください）

DEALLOCATE PREPARE文

×

×

×

○

−

DECLARE CURSOR

○

×

×

×

DECLARE CURSOR

×

×

○

○

（動的SELECT文の，この項目を参照してください）

DELETE文

○

○

○

○

DELETE

準備可能動的DELETE文：位置付け

×

×

○

○

DELETE

DESCRIBE文

×

×

○

○

（DESCRIBE文に指定したSQL種別の，この項目を参照してください）

DESCRIBE CURSOR文

×

×

○

○

（DESCRIBE CURSOR文に指定したSQL種別の，この項目を参照してください）

DESCRIBE TYPE文

×

×

○

○

（DESCRIBE TYPE文に指定したSQL種別の，この項目を参照してください）

DROP LIST文

×

×

○

○

DROP LIST

EXECUTE文

×

×

○

○

（EXECUTE文で実行したSQL種別の，この項目を参照してください）

EXECUTE IMMEDIATE文

×

×

○

○

（EXECUTE IMMEDIATE文で実行したSQL種別の，この項目を参照してください）

FETCH文

○

○

×

×

FETCH

×

×

○

○

（カーソルに指定したSQL種別の，この項目を参照してください）

FREE LOCATOR文

×

×

○

○

FREE LOCATOR

INSERT文

○

○

○

○

INSERT

OPEN文

○

○

×

×

OPEN

×

×

○

○

（カーソルに指定したSQL種別の，この項目を参照してください）

PREPARE文

○

○

○

○

（PREPARE文に指定したSQL種別の，この項目を参照してください）

PURGE TABLE文

○

○

○

○

PURGE TABLE

1行SELECT文

○

○

○

○

SELECT

動的SELECT文

×

×

○

○

SELECT

UPDATE文

○

○

○

○

UPDATE

準備可能動的UPDATE文：位置付け

×

×

○

○

UPDATE

代入文

○

○

○

○

SET

制御系

SQL

CALL COMMAND文

○

○

○

○

CALL COMMAND

COMMIT文

○

○

○

○

COMMIT

CONNECT文

×

×

×

×

−

DISCONNECT文

×

×

×

×

−

LOCK文

○

○

○

○

LOCK TABLE

ROLLBACK文

○

○

○

○

ROLLBACK

SET SESSION AUTHORIZATION文

×

×

○

○

SET SESSION AUTHORIZATION

埋込み

言語

文法

BEGIN DECLARE SECTION

×

×

×

×

−

END DECLARE SECTION

×

×

×

×

（該当しません）

ALLOCATE CONNECTION HANDLE

×

×

×

×

−

FREE CONNECTION HANDLE

×

×

×

×

−

DECLARE CONNECTION HANDLE SET

×

×

×

×

（該当しません）

DECLARE CONNECTION HANDLE UNSET

×

×

×

×

（該当しません）

GET CONNECTION HANDLE

×

×

×

×

−

COPY

×

×

×

×

（該当しません）

GET DIAGNOSTICS

×

×

×

×

−

COMMAND EXECUTE

×

×

×

×

−

SQL先頭子

×

×

×

×

（該当しません）

SQL終了子

×

×

×

×

（該当しません）

WHENEVER

×

×

×

×

−

SQLCODE変数

×

×

×

×

（該当しません）

SQLSTATE変数

×

×

×

×

（該当しません）

PDCNCTHDL型変数の宣言

×

×

×

×

（該当しません）

INSTALL JAR

×

×

○

○

INSTALL JAR

REPLACE JAR

×

×

○

○

REPLACE JAR

REMOVE JAR

×

×

○

○

REMOVE JAR

INSTALL CLIB

×

×

○

○

INSTALL CLIB

REPLACE CLIB

×

×

○

○

REPLACE CLIB

REMOVE CLIB

×

×

○

○

REMOVE CLIB

DECLARE AUDIT INFO SET

×

×

×

×

（該当しません）

ルーチ

ン制御

SQL

SQL変数宣言

○

○

×

×

DECLARE

カーソル宣言

○

×

×

×

DECLARE CURSOR

○

○

×

×

SELECT

条件宣言

○

×

×

×

DECLARE CONDITION

ハンドラ宣言

○

×

×

×

DECLARE HANDLER

SQL手続き文

○

○

×

×

（SQL手続き文に指定したSQL種別の，この項目を参照してください）

複合文

○

○

×

×

BEGIN

IF文

○

○

×

×

IF

LEAVE文

○

○

×

×

LEAVE

RETURN文

○

○

×

×

RETURN

WHILE文

○

○

×

×

WHILE

FOR文

○

○

×

×

FOR

WRITE LINE文

○

○

×

×

WRITE LINE

SIGNAL文

○

○

×

×

SIGNAL

RESIGNAL文

○

○

×

×

RESIGNAL

上記に分類できない場合

○

○

○

○

半角空白

（凡例）

○：「設定される文字列」欄に記載されている文字列が設定されます。

×：文字列は設定されません。

−：設定される文字列はありません。

括弧内の表記は，注釈を示します。

ROUTINE_TYPE

エラーとなった関数又は手続きの種別を取得したい場合に指定します。データ型はCHAR，長さは1バイト（文字集合名UTF16を指定した場合は2バイト）を指定してください。種別が手続きの場合はP，関数の場合はFが設定されます。

ROUTINE_SCHEMA

エラーとなった関数又は手続きの認可識別子を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

以下のエラーの場合は認可識別子に"PUBLIC"が設定されます。

パブリック関数，パブリック手続きの定義，削除時のエラー

パブリック手続きのCALL文実行時のエラー

ROUTINE_NAME

エラーとなった関数又は手続きの識別子を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

TRIGGER_SCHEMA

エラーとなったトリガの認可識別子を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

TRIGGER_NAME

エラーとなったトリガの認可識別子を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

CONSTRAINT_SCHEMA

検査制約，参照制約で制約違反エラーとなった制約の認可識別子を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

CONSTRAINT _NAME

検査制約，参照制約で制約違反エラーとなった制約の制約名を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

MESSAGE_TEXT

メッセージテキストを取得したい場合に指定します。データ型はVARCHAR，長さは254バイト（文字集合名UTF16を指定した場合は508バイト）を指定してください。

QUERY_NAME

WITH句指定のある動的SELECT文，及びカーソル宣言を実行した場合，エラーが発生した問合せ指定の問合せ名を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

CONDITION_IDENTIFIER

SQL手続き中又はトリガ中で実行された，SIGNAL文，又はRESIGNAL文に指定した条件名，又はSQLSTATE値を取得したい場合に指定します。データ型はVARCHAR，長さは30バイト（文字集合名UTF16を指定した場合は60バイト）を指定してください。

SQLSTATE値を指定した場合は，'SQLSTATE:XXXXX'（XXXXXは指定したSQLSTATE値）が設定されます。

(4)　共通規則

GET DIAGNOSTICSは，動的に実行できません。

直前に実行したSQLの結果だけ取得できます。取得できるSQLについては，表「ERROR_SQLに設定される文字列」を参照してください。

条件番号を指定する埋込み変数のデータ型は，SMALLINTを指定してください。

文情報項目，及び条件情報項目を受け取る埋込み変数のデータ型は，それぞれの項目のデータ型と同じ型を指定してください。

条件番号には，0以下の値，又は診断領域中のエラーの数を超える値は指定できません。

SQL解析前に発生したエラーはGET DIAGNOSTICSでは診断情報が取得できない場合があります。このとき，GET DIAGNOSTICSを実行すると0件が返ってきます。エラー情報はエラー発生時のSQLCAを参照してください。

条件情報項目名の説明の中で，設定する情報を明記していないSQLについては，1バイトの空白，又は0が設定されます。

関数実行時に発生したエラーに対して，GET DIAGNOSTICSでは次の診断情報が取得できない場合があります。

ROUTINE_TYPE

ROUTINE_SCHEMA

ROUTINE_NAME

(5)　使用例

直前に実行したCREATE FUNCTIONの次の診断情報を取得します。

リターンコード（データ型がINTEGERの埋込み変数XSQLCODE）

構文エラーが発生した場合のSQL中のエラーの位置（データ型がINTEGERの埋込み変数XPOSITION）

ルーチン中でエラーとなったSQL手続き文を示す番号（データ型がINTEGERの埋込み変数XSQL_NO）

ルーチン中でエラーとなったSQL手続き文の種別を示す文字列（データ型がVARCHAR(32)の埋込み変数XSQL）

メッセージテキスト（データ型がVARCHAR(254)の埋込み変数XMESSAGE）

  CREATE FUNCTION NEXT_DAY(INDATE DATE,曜日 NCHAR)
    RETURNS DATE
    BEGIN
      DECLARE SDOW,TDOW INTEGER;
      SET TDOW=(CASE 曜日 WHEN N'日' THEN 0
        WHEN N'月' THEN 1
        WHEN N'火' THEN 2
        WHEN N'水' THEN 3
        WHEN N'木' THEN 4
        WHEN N'金' THEN 5
        ELSE 6 END);
      SET SDOW=MOD(DAYS(INDATE),7);
      RETURN (INDATE + (CASE WHEN TDOW>SDOW THEN TDOW-SDOW
        ELSE 7+TDOW-SDOW END) DAYS);
    END
  GET DIAGNOSTICS EXCEPTION 1
      :XSQLCODE=RETURN_SQLCODE,
      :XPOSITION=ERROR_POSITION,
      :XSQL_NO=ERROR_SQL_NO,
      :XSQL=ERROR_SQL,
      :XMESSAGE=MESSAGE_TEXT

6.11　COMMAND EXECUTE（UAPからのコマンド実行）

6.11.1　COMMAND EXECUTEの形式と規則

(1)　機能

UAP中から，HiRDBのコマンド，及びOSのコマンドを実行します。

COMMAND EXECUTEを実行する場合，HiRDBサーバにHiRDB Control Manager - Agentをインストールしておく必要があります。これは，HiRDB Control Manager - Agentがコマンドを実行するためです。

(2)　形式

　COMMAND EXECUTE ：コマンドライン変数，
　　　　　　　　　　　 ：リターンコード受け取り変数，
　　　　　　　　　　　 ：実行結果受け取り領域長変数，
　　　　　　　　　　　 ：実行結果長受け取り変数，
　　　　　　　　　　　 ：実行結果受け取り変数，
　　　　　　　　　　　 ：実行コマンドリターンコード受け取り変数，
　　　　　　　　　　　 ：環境変数グループ名変数

(3)　オペランド

(a)　：コマンドライン変数

コマンドライン変数には，HiRDBサーバで実行するコマンドのコマンドラインを設定します。

CHAR型（領域長30,000バイト以内）として宣言した埋込み変数を指定してください。また，コマンドラインの最後には，必ずナル文字を指定してください。

既定文字集合以外の文字集合は指定できません。

コマンドライン変数に複数のコマンドは指定しないでください。指定した場合，動作は保証されません。

(b)　：リターンコード受け取り変数

リターンコード受け取り変数には，COMMAND EXECUTE実行時のリターンコードが設定されます。INT型として宣言した埋込み変数を指定してください。

リターンコード受け取り変数には，次の値が設定されます。なお，エラーの場合には，実行結果受け取り変数に詳細情報が設定されます。

p_rdb_RC_NORM：

HiRDBサーバで正常にコマンドが実行された場合

p_rdb_RC_ERRPARM：

引数が不正な場合

p_rdb_PROTO：

通信エラーの場合

p_rdb_RC_NOTF：

環境変数グループがない場合

p_rdb_RC_TIMEOUT：

タイムアウトした場合

p_rdb_RC_SQLERR：

そのほかのエラーの場合

(c)　：実行結果受け取り領域長変数

実行結果受け取り領域長変数には，実行結果受け取り変数の領域長を設定します。INT型として宣言した埋込み変数を指定してください。

実行結果受け取り領域長は，2ギガバイト以内で設定してください。

(d)　：実行結果長受け取り変数

実行結果長受け取り変数には，実行結果受け取り変数への出力長が設定されます。INT型として宣言した埋込み変数を指定してください。

(e)　：実行結果受け取り変数

実行結果受け取り変数には，実行結果受け取り用に確保した領域のアドレスを設定します。PDOUTBUF型として宣言した埋込み変数を指定してください。

COMMAND EXECUTE実行後，実行結果受け取り変数には，次の値が設定されます。ただし，（実行結果受け取り領域長変数の指定値−1）以降のデータは切り捨てられます。また，実行結果の最後には，1バイトのナル文字が設定されます。

リターンコード受け取り変数にp_rdb_RC_NORMが設定されている場合：

HiRDBサーバで実行したコマンドラインの実行結果（標準出力と標準エラー出力）が設定されます。

リターンコード受け取り変数にp_rdb_RC_NORM以外が設定されている場合：

障害コードに対応する詳細メッセージが設定されます。

(f)　：実行コマンドリターンコード受け取り変数

実行コマンドリターンコード受け取り変数には，HiRDBサーバで実行したコマンドラインのリターンコードが設定されます。INT型として宣言した埋込み変数を指定してください。

COMMAND EXECUTEが正常終了（リターンコード受け取り変数にp_rdb_RC_NORMが設定されている場合）したときだけ，実行コマンドリターンコード受け取り変数に有効な値が設定されます。

なお，実行したコマンドが標準出力又は標準エラー出力に情報を出力しない場合は，実行コマンドリターンコード受け取り変数には0が設定されます。

(g)　：環境変数グループ名変数

環境変数グループ名変数には，次の値を指定します。

UNIX版の場合：

クライアント環境定義を記述した通常ファイルの名称（ナル文字を含めて256バイト以内）を，絶対パス名で指定します。

Windows版の場合：

HiRDBクライアント環境変数登録ツールで登録したグループ名（ナル文字を含めて31バイト以内）を指定します。

CHAR型（領域長256バイト以内）として宣言した埋込み変数を指定してください。

既定文字集合以外の文字集合は指定できません。

環境変数グループを使用しない場合は，1バイト目にナル文字を設定してください。

環境変数グループについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(4)　共通規則

使用する埋込み変数は，埋込み変数宣言節で宣言してください。

COMMAND EXECUTEを実行する場合，次のクライアント環境定義を設定しておく必要があります。

PDASTHOST（HiRDB Control Manager - Agentのホスト名）

PDASTPORT（HiRDB Control Manager - Agentのポート番号）

PDSYSTEMID（HiRDB Control Manager - AgentのHiRDB識別子）

PDASTUSER（HiRDBサーバでコマンドを実行する認可識別子）

クライアント環境定義については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

UAPがHiRDBと接続中でもCOMMAND EXECUTEは実行できます。ただし，コマンドが終了するまでUAP側に制御は戻ってこないので，デッドロックが発生しないように注意してください。

応答要求があるコマンドは指定しないでください。HiRDB Control Manager - Agentでは，応答の入力要求は受け付けないため，コマンドがエラーで終了します。

実行するコマンドの入力ファイルは，あらかじめHiRDBサーバに用意しておいてください。

コマンドの実行が長時間になる場合，コマンドが終了するまでUAPに制御は戻ってきません。この場合，クライアント環境定義PDCMDWAITTIMEを指定しておくと，HiRDBクライアント側の長時間待ちを回避できます。

なお，クライアント側がタイムアウトとなった場合，HiRDB Control Manager - Agentのプロセス，又は実行中のコマンドを，OSのkillコマンド（Windows版の場合はpdkillコマンド）で取り消してください。

HiRDBサーバ接続中に，コマンドの実行が長時間になる場合，クライアント環境定義PDSWAITTIME及びPDSWATCHTIMEによってHiRDBサーバ側でタイムアウトを検知して，接続が終了することがあるので注意してください。

(5)　留意事項

COMMAND EXECUTE実行時は，次のクライアント環境定義だけ有効となり，それ以外のものについては無効となります。

PDCLTPATH，PDASTHOST，PDASTUSER，PDUSER，PDASTPORT，PDCMDWAITTIME，PDCMDTRACE，PDSYSTEMID，PDCLTAPNAME

COBOL言語の場合，COMMAND EXECUTEは実行できません。

(6)　使用例

UAP中から，pdlsコマンドを実行します。なお，HiRDB/シングルサーバで実行しているものとします。

EXEC SQL BEGIN DECLARE SECTION;
    char         CmdLine[30000];
    int          ReturnCode;
    int          OutBufLen;
    int          OutDataLen;
    int          DataLength;
    PDOUTBUF     OutBuf ;
    int          CmdRetCode;
    char         EnvGroup[256];
EXEC SQL END DECLARE SECTION;

strcpy(CmdLine,"c:¥HiRDB_S¥bin¥pdls -d trn");
OutBuf = malloc(30000) ;
OutBufLen = 30000 ;
EnvGroup[0] = '¥0';

EXEC SQL COMMAND EXECUTE    :CmdLine,
                            :ReturnCode,
                            :OutBufLen,
                            :DataLength,
                            :OutBuf,
                            :CmdRetCode,
                            :EnvGroup ;

if (ReturnCode == p_rdb_RC_NORM)
{
      if (CmdRetCode == 0)
      {
          printf("%s実行成功¥n",CmdLine) ;
          printf("実行結果：%s¥n",OutBuf) ;
      }
      else
      {
          printf("%s実行失敗¥n",CmdLine) ;
          printf("実行結果：%s¥n",OutBuf) ;
      }
}
else
{
          printf("ReturnCode=%d¥n",ReturnCode) ;
          printf("エラー詳細情報：%s¥n",OutBuf) ;
}

6.12　SQL先頭子

6.12.1　SQL先頭子の形式と規則

(1)　機能

SQLの始まりを示します。

(2)　形式

　EXEC SQL

(3)　共通規則

SQLは，一つのSQLごとにSQL先頭子とSQL終了子で囲んでください。

SQLの記述規則については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(4)　使用例

OPEN文を記述します。

<C言語の場合>

  EXEC SQL
      OPEN CR1;

<COBOL言語の場合>

  EXEC SQL
      OPEN CR1
  END-EXEC.

6.13　SQL終了子

6.13.1　SQL終了子の形式と規則

(1)　機能

SQLの終わりを示します。

(2)　形式

C言語の場合

　；

COBOL言語の場合

　END-EXEC

(3)　共通規則

SQLは，一つのSQLごとにSQL先頭子とSQL終了子で囲んでください。

SQLの記述規則については，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(4)　使用例

使用例については，「SQL先頭子」を参照してください。

6.14　WHENEVER（埋込み例外宣言）

6.14.1　WHENEVERの形式と規則

(1)　機能

SQLの実行後，HiRDBがSQL連絡領域に設定したリターンコード（SQLCODE）によって，UAPの処理を宣言します。

(2)　形式

　WHENEVER
　　｛SQLERROR｜SQLWARNING｜NOT FOUND｝
　　｛CONTINUE｜｛GO TO｜GOTO｝〔：〕ホスト識別子
　　　　　　　　｜〔DO〕PERFORM〔：〕ホスト識別子
　　　　　　　　｜DO ｛break｜continue｜'命令文'｝｝

(3)　オペランド

(a)　SQLERROR

ユーザの誤りやHiRDBの異常によってSQLが正常に実行されなかったとき（SQL連絡領域のSQLCODE領域，及びSQLCODE変数に負の値が返されたとき）の処理を指示する場合に指定します。

(b)　SQLWARNING

SQLは正常に実行されたが，ユーザに警告する状態を検知したとき（SQL連絡領域のSQLWARN0領域にWが返されたとき，又はSQL連絡領域のSQLCODE領域及びSQLCODE変数に100以外の正の値が返されたとき）の処理を指示する場合に指定します。

(c)　NOT FOUND

表の検索で検索結果の検索する行がなくなったとき（SQL連絡領域のSQLCODE領域に100，SQLCODE変数に100，及びSQLSTATE変数に'02000''が返されたとき）の処理を指示する場合に指定します。

(d)　CONTINUE

UAPの実行を続行させる場合に指定します。

(e)　｛GO TO｜GOTO｝〔：〕ホスト識別子

UAPの実行を分岐させる場合，次に示すホスト識別子によって分岐先を指定します。

ラベル（C言語の場合）

節名，又は段落名（COBOL言語の場合）

(f)　〔DO〕PERFORM〔：〕ホスト識別子

指定した手続きを実行させる場合，次に示すホスト識別子によって実行させる手続きを指定します。オブジェクトのメソッドは指定できません。

関数名（C言語の場合）

節名，又は段落名（COBOL言語の場合）

(g)　DO ｛break｜continue｜'命令文'｝

UAPの実行を分岐，又は任意の命令文を実行します。continue，及び'命令文'は，C言語，及びC++言語の場合に使用できます。

DO break

break文を実行します。

DO continue

continue文を実行します。

DO '命令文'

文字列として記述したホスト言語の任意の命令文（引数を指定した関数呼出しなど）を実行します。

(4)　共通規則

埋込み例外宣言を指定しないと，すべてのリターンコードに対してCONTINUEが仮定されます。

埋込み例外宣言は，同じUAP中に複数個指定できます。

SQLERRORの状態で，ROLLBACK文以外のSQLは実行できません。

手続き実行後の制御は，特異状態が発生したSQLの次の命令へ戻ります。

埋込み例外宣言で指定した処理の有効範囲は，ソースプログラム上の位置によって決まります。すなわち，ある一つの埋込み例外宣言で指定された処理は，ソースプログラム上の次の同じ特異状態の処理を指定した埋込み例外宣言までの間にあるすべてのSQLの実行結果で有効になります。

埋込み例外宣言で指定した処理の有効範囲を，次の図に示します。

図6‒1　埋込み例外宣言で指定した処理の有効範囲

SQLERROR，SQLWARNING，NOT FOUNDの有効範囲が重複した場合は，次に示す優先順位でSQLが処理されます。

SQLERROR→NOT FOUND→SQLWARNING

(5)　留意事項

WHENEVER文で宣言した処置が途中のSQLから不要になる場合，同じ特異状態（SQLERRORなど）に対する処置として，CONTINUE（処理を続行する）を指定したWHENEVER文を，不要にする位置に記述してください。

WHENEVER文の記述例を，次の図に示します。

図6‒2　WHENEVER文の記述例（その1）

SQLERROR指定のWHENEVER文によって，あるSQLの実行エラーで分岐した先で，ROLLBACK文を実行する場合，無限ループしないように注意してください。

WHENEVER文の記述例を，次の図に示します。

図6‒3　WHENEVER文の記述例（その2）

埋込み例外宣言は，UAPの複数の関数にわたって有効です。

WHENEVER文で指定したGOTO文の分岐先は，SQL文と同じ関数内に指定してください。関数外への分岐先を指定すると，コンパイル時にエラーになります。

また，必要に応じて，関数ごとにWHENEVER文を宣言し直してください。

WHENEVER文の記述例を，次の図に示します。

図6‒4　WHENEVER文の記述例（その3）

図6‒5　WHENEVER文の記述例（その4）

WHENEVER文は，FREE CONNECTION HANDLEの前で宣言しないでください。

(6)　使用例

処理P1中のSQLを実行した後，SQLCODEに負の値が返された場合，L1へ分岐します。

処理P2中のSQLを実行した後，SQLCODEに負の値が返された場合，IF文を使用して分岐先を決めるため，WHENEVER文による制御を取り消します。

処理P3中の表の検索で，検索する行がなくなった場合はL2へ分岐します。

処理p3中の表の検索でSQLCODEに負の値が返された場合，break文を実行します。

処理p3中の表の検索でユーザに警告する状態を検知した場合，関数を呼び出します。

6.15　SQLCODE変数

SQLを実行するとHiRDBによってリターンコード（SQLCODE）が設定されます。SQLCODE変数に返される値の内容は，SQL連絡領域のSQLCODE領域の内容と同じです。

SQLCODE変数は，プリプロセス実行時にシステムが宣言文をソースプログラム中に埋め込むため，UAPでの宣言は必要ありません。データ型は，C言語ではsigned long int，COBOL言語ではS9 （ 9）COMPUTATIONALで宣言しています。

参照する場合は，変数名称SQLCODEを指定してください。

また，複数接続機能を使用した環境では，DECLARE CONNECTION HANDLE SET文でSQLCODEが使用する接続ハンドルを宣言しておく必要があります。

6.16　SQLSTATE変数

SQLを実行するとHiRDBによってリターンコード（SQLSTATE）が設定されます。SQLSTATE変数は，2けたのクラス，及び3けたのサブクラスで構成されている5けたの文字列です。

SQLSTATE変数は，プリプロセス実行時にシステムが宣言文をソースプログラム中に埋め込むため，UAPでの宣言は必要ありません。データ型は，C言語ではchar[5]，COBOL言語ではPIC X（5）で宣言しています。

参照する場合は，変数名称SQLSTATEを指定してください。

また，複数接続機能を使用した環境では，DECLARE CONNECTION HANDLE SET文でSQLSTATEが使用する接続ハンドルを宣言しておく必要があります。

設定されるSQLSTATEの値は，クライアント環境変数PDSTANDARDSQLSTATE及びシステム共通定義pd_standard_sqlstateの設定によって変わります。SQLSTATEについては，マニュアル「HiRDB Version 9 メッセージ」を参照してください。

クラスの意味とサブクラスの関係を次に示します。

クラス

サブクラス

設定条件

00

000

正常終了

01

nnn

正常終了（ただし，警告あり）

02

000

データがない

40

nnn

異常終了（トランザクションはロールバックした）

R2

000

データがない（ただし，リストを使用した検索で，リスト作成時には存在した行が返らなかった場合）

mm

nnn

異常終了

注

mm及びnnnの意味を次に示します。

mm：マニュアル「HiRDB Version 9 メッセージ」で示すSQLSTATEのクラスが設定されます。

nnn：マニュアル「HiRDB Version 9 メッセージ」で示すSQLSTATEのサブクラスが設定されます。

ただし，mm及びnnnはHiRDBの機能拡張によって値が変わる場合があります。

6.17　PDCNCTHDL型変数の宣言

機能

複数接続機能を使用した環境で，使用する接続ハンドル型の変数を宣言します。

6.17.1　C言語の場合

(1)　形式1

　PDCNCTHDL 接続ハンドル変数名

(2)　オペランド

(a)　接続ハンドル変数名

使用する接続ハンドルの名前を指定します。

(3)　共通規則

PDCNCTHDL型変数は，複数接続機能を使用した環境でSQLを実行する場合に宣言します。

(4)　留意事項

PDCNCTHDL型変数は，埋込みSQL宣言節で宣言します。

PDCNCTHDL型変数は，配列として定義できません。

(5)　使用例

CnctHdlという名称のPDCNCTHDL型変数を宣言します。

  EXEC SQL BEGIN DECLARE SECTION;
      PDCNCTHDL    CnctHdl;
  EXEC SQL END DECLARE SECTION;

6.17.2　COBOL語の場合

(1)　形式2

　接続ハンドル変数名 SQL TYPE IS PDCNCTHDL.

(2)　オペランド

(a)　接続ハンドル変数名

使用する接続ハンドルの名前を指定します。

(3)　共通規則

PDCNCTHDL型変数は，複数接続機能を使用した環境でSQLを実行する場合に宣言します。

(4)　留意事項

PDCNCTHDL型変数は，埋込みSQL宣言節で宣言します。

PDCNCTHDL型変数は，OCCURS句を使用できません。

(5)　使用例

CONNECTHDLという名称のPDCNCTHDL型変数を宣言します。

  EXEC SQL BEGIN DECLARE SECTION END-EXEC
    01 CONNECTHDL SQL TYPE IS PDCNCTHDL.
  EXEC SQL END DECLARE SECTION END-EXEC

6.18　INSTALL JAR（JARファイルの登録）

6.18.1　INSTALL JARの形式と規則

(1)　機能

HiRDBサーバにJARファイルを登録します。接続している認可識別子に対応するJARファイル格納ディレクトリに登録してください。

(2)　形式

　INSTALL JAR ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

登録するJARファイルの名称を指定します。JARファイルは，絶対パス名又は相対パス名で指定してください。

：埋込み変数

JARファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

JARファイルの名称を文字列定数で指定します。

(4)　共通規則

INSTALL JARを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ほかのサーバマシンのJARファイルは指定できません。

ワイルドカードは使用できません。

既に同じ名称のJARファイルが登録されている場合，上書きはしないでエラーとします。

INSTALL JARは，トランザクションの開始前に実行してください。

(5)　使用例

JARファイル（c:¥work¥sampleproc.jar）を埋込み変数で指定して登録します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"c:¥work¥sampleproc.jar") ;
filename.len = strlen(filename.str) ;
EXEC SQL INSTALL JAR :filename ;

6.19　REPLACE JAR（JARファイルの再登録）

6.19.1　REPLACE JARの形式と規則

(1)　機能

HiRDBサーバにJARファイルを再登録します。接続している認可識別子に対応するJARファイル格納ディレクトリに再登録してください。

(2)　形式

　REPLACE JAR ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

再登録するJARファイルの名称を指定します。JARファイルは，絶対パス名又は相対パス名で指定してください。

：埋込み変数

JARファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

JARファイルの名称を文字列定数で指定します。

(4)　共通規則

REPLACE JARを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ほかのサーバマシンのJARファイルは指定できません。

ワイルドカードは使用できません。

既に同じ名称のJARファイルが登録されている場合は上書きします。

REPLACE JARは，トランザクションの開始前に実行してください。

(5)　使用例

JARファイル（c:¥work¥sampleproc.jar）を埋込み変数で指定して再登録します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"c:¥work¥sampleproc.jar") ;
filename.len = strlen(filename.str) ;
EXEC SQL REPLACE JAR :filename ;

6.20　REMOVE JAR（JARファイルの削除）

6.20.1　REMOVE JARの形式と規則

(1)　機能

HiRDBサーバのJARファイルを削除します。接続している認可識別子に対応するJARファイル格納ディレクトリから削除してください。

(2)　形式

　REMOVE JAR ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

削除するJARファイルの名称を指定します。JARファイルは，絶対パス名又は相対パス名では指定できません。

：埋込み変数

JARファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

JARファイルの名称を文字列定数で指定します。

(4)　共通規則

REMOVE JARを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ほかのサーバマシンのJARファイルは指定できません。

ワイルドカードは使用できません。

REMOVE JARは，トランザクションの開始前に実行してください。

(5)　使用例

JARファイル（sampleproc.jar）を埋込み変数で指定して削除します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"sampleproc.jar") ;
filename.len = strlen(filename.str) ;
EXEC SQL REMOVE JAR :filename ;

6.21　INSTALL CLIB（外部Cライブラリファイルの新規登録）

6.21.1　INSTALL CLIBの形式と規則

(1)　機能

外部Cストアドルーチンを実行するために，UAP実行マシンにある，外部Cストアドルーチンを実装した外部CライブラリファイルをHiRDBサーバに新規登録します。

(2)　形式

　INSTALL CLIB ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

登録する外部Cライブラリファイルの名称を指定します。外部Cライブラリファイルの名称は，絶対パス名又は相対パス名で指定してください。

：埋込み変数

外部Cライブラリファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

外部Cライブラリファイルの名称を文字列定数で指定します。

(4)　共通規則

INSTALL CLIBを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ほかのサーバマシンの外部Cライブラリファイルは指定できません。

ワイルドカードは使用できません。

既に同じ名称の外部Cライブラリファイルが登録されている場合，上書きはしないでエラーとします。

INSTALL CLIBは，トランザクションの開始前に実行してください。

外部Cライブラリファイルの登録先と同じプラットフォームで，外部Cライブラリファイルを作成してください。

(5)　使用例

外部Cライブラリファイル（c:¥work¥sampleproc.dll）を埋込み変数で指定して新規登録します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"c:¥¥work¥¥sampleproc.dll") ;
filename.len = strlen(filename.str) ;
EXEC SQL INSTALL CLIB :filename ;

6.22　REPLACE CLIB（外部Cライブラリファイルの再登録）

6.22.1　REPLACE CLIBの形式と規則

(1)　機能

外部Cストアドルーチンを実行するために，UAP実行マシンにある，外部Cストアドルーチンを実装した外部CライブラリファイルをHiRDBサーバに再登録します。

(2)　形式

　REPLACE CLIB ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

再登録する外部Cライブラリファイルの名称を指定します。外部Cライブラリファイルの名称は，絶対パス名又は相対パス名で指定してください。

：埋込み変数

外部Cライブラリファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

外部Cライブラリファイルの名称を文字列定数で指定します。

(4)　共通規則

REPLACE CLIBを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ほかのサーバマシンの外部Cライブラリファイルは指定できません。

ワイルドカードは使用できません。

既に同じ名称の外部Cライブラリファイルが登録されている場合は上書きします。

HiRDBサーバに外部Cライブラリファイルが登録されていない場合，外部CライブラリファイルをHiRDBサーバに登録します。

REPLACE CLIBは，トランザクションの開始前に実行してください。

外部Cライブラリファイルの再登録先と同じプラットフォームで，外部Cライブラリファイルを作成してください。

トランザクションの実行中は，Ｃライブラリファイルの再登録を行わないでください。

(5)　使用例

外部Cライブラリファイル（c:¥work¥sampleproc.dll）を埋込み変数で指定して再登録します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"c:¥¥work¥¥sampleproc.dll") ;
filename.len = strlen(filename.str) ;
EXEC SQL REPLACE CLIB :filename ;

6.23　REMOVE CLIB（外部Cライブラリファイルの削除）

6.23.1　REMOVE CLIBの形式と規則

(1)　機能

HiRDBサーバに登録されている，外部Cストアドルーチンを実装した外部Cライブラリファイルを削除します。

(2)　形式

　REMOVE CLIB ｛：埋込み変数｜'文字列'｝

(3)　オペランド

(a)　｛：埋込み変数｜'文字列'｝

削除する外部Cライブラリファイルの名称を指定します。ディレクトリパスは指定しないで，ファイル名だけを指定してください。

：埋込み変数

外部Cライブラリファイルの名称をVARCHAR型の埋込み変数で指定します。

既定文字集合以外の文字集合は指定できません。

'文字列'

外部Cライブラリファイルの名称を文字列定数で指定します。

(4)　共通規則

REMOVE CLIBを実行する前に，HiRDBサーバに接続しておく必要があります。

エラーコードはSQLCODEに返されます。

ワイルドカードは使用できません。

REMOVE CLIBは，トランザクションの開始前に実行してください。

トランザクションの実行中は，Ｃライブラリファイルの削除を行わないでください。

(5)　使用例

外部Cライブラリファイル（sampleproc.dll）を埋込み変数で指定して削除します。

EXEC SQL BEGIN DECLARE SECTION ;
struct {
    short  len ;
    char   str[256] ;
} filename ;
EXEC SQL END DECLARE SECTION ;
EXEC SQL CONNECT ;
strcpy(filename.str,"sampleproc.dll") ;
filename.len = strlen(filename.str) ;
EXEC SQL REMOVE CLIB:filename ;

6.24　DECLARE AUDIT INFO SET（ユーザ任意接続情報の設定）

6.24.1　DECLARE AUDIT INFO SETの形式と規則

(1)　機能

HiRDBサーバにアクセスするアプリケーションのアカウント情報など，ユーザ任意の接続情報を設定します。設定したユーザ任意接続情報は解除するまで有効となり，SQL実行時にHiRDBサーバの監査証跡に出力されます。

(2)　形式

　DECLARE AUDIT INFO SET  POS=：埋込み変数，
　　　　　　　　　　　　　   INF=：埋込み変数〔：標識変数〕

(3)　オペランド

(a)　POS=：埋込み変数

情報を設定したいユーザ付加情報の番号をINTEGER型の埋込み変数で指定します。各ユーザ付加情報に該当する番号は次のとおりです。

1：ユーザ付加情報1

2：ユーザ付加情報2

3：ユーザ付加情報3

(b)　INF=：埋込み変数〔：標識変数〕

ユーザ任意接続情報をVARCHAR型（領域長100バイト以内）の埋込み変数で指定します。設定済みの情報を解除する場合は，ナル値を指定してください。ユーザ任意接続情報にはユーザ付加情報1〜3があり，それぞれ監査証跡に出力されます。

既定文字集合以外の文字集合は指定できません。

(4)　共通規則

使用する埋込み変数は，埋込み変数宣言節で宣言してください。

エラーコードはSQLCODEに返されます。

ユーザ任意接続情報が既に設定されている状態でDECLARE AUDIT INFO SET を再度実行した場合は，設定済みのユーザ任意接続情報が更新されます。

設定したユーザ任意接続情報は，DECLARE AUDIT INFO SETでナル値を指定して解除するまで有効です。DECLARE AUDIT INFO SETで設定したユーザ任意接続情報の有効範囲を，次の図に示します。

図6‒6　DECLARE AUDIT INFO SETで設定したユーザ任意接続の有効範囲

CONNECT実行前にDECLARE AUDIT INFO SETでユーザ任意接続情報を設定した場合は，CONNECT時にその情報が引き継がれます。

ユーザ任意接続情報が設定されている状態でDISCONNECTを実行しても，ユーザ任意接続情報は解除されません。解除する場合は，INFにナル値を指定してDECLARE AUDIT INFO SETを実行してください。

複数接続時は，接続ハンドル単位でユーザ任意接続情報を設定してください。

(5)　留意事項

CONNECT文の実行時には，ユーザ任意接続情報は監査証跡に出力されません。

(6)　使用例

（例１）ユーザ任意接続情報（ユーザ付加情報1〜3）を埋込み変数で指定して設定します。

EXEC SQL BEGIN DECLARE SECTION ;
SQL TYPE IS VARCHAR(100) udata ;
long pos ;
EXEC SQL END DECLARE SECTION ;

strcpy(udata.str,"userA") ;
udata.len = strlen(udata.str) ;
pos = 1;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata ;
strcpy(udata.str," user data B ") ;
udata.len = strlen(udata.str) ;
pos = 2;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata ;
strcpy(udata.str," user data C ") ;
udata.len = strlen(udata.str) ;
pos = 3;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata ;

（例２）ユーザ任意接続情報（ユーザ付加情報1〜3）の設定内容を解除します。

EXEC SQL BEGIN DECLARE SECTION ;
SQL TYPE IS VARCHAR(100) udata ;
long pos ;
short ind ;
EXEC SQL END DECLARE SECTION ;

ind = -1;
pos = 1;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata:ind ;
pos = 2;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata:ind ;
pos = 3;
EXEC SQL DECLARE AUDIT INFO SET POS=:pos, INF=:udata:ind ;

7　ルーチン制御SQL

この章では，ルーチン制御SQLの構文形式，及び文法について説明します。

7.1　全般規則

7.1.1　ルーチン制御SQLの全般規定

(1)　ルーチン制御SQLの種類と機能

ルーチン制御SQLは，ルーチン定義のSQL手続き文中に指定できるSQLです。

ルーチン制御SQLの種類と機能を次の表に示します。

表7‒1　ルーチン制御SQLの種類と機能

種　類

機　能

代入文　形式1（SQL変数，又はSQLパラメタへの値の代入）

SQL変数又はSQLパラメタに値を代入します。※

複合文（複数文実行）

複数のSQL文をまとめて一つのSQL文として実行します。

IF文（条件分岐による実行）

条件に合ったSQL文を実行します。

LEAVE文（文の途中終了）

複合文又はWHILE文の途中から抜けて，それらの文の実行を終了します。

RETURN文（関数の戻り値の返却）

関数の戻り値を返却します。

WHILE文（文の繰り返し）

SQL文の実行を繰り返します。

FOR文（各行に対する文の繰返し）

表の各行に対してSQL文の実行を繰り返します。

WRITE LINE文（ファイルへの文字列出力）

ファイルへ文字列を出力します。

SIGNAL文（エラーの通知）

エラーを通知します。

RESIGNAL文（エラーの再通知）

エラーを再通知します。

注※　SQL手続き文中の代入文については「代入文　形式1（SQL変数，又はSQLパラメタへの値の代入）」を参照してください。

表「ルーチン制御SQLの種類と機能」に示したルーチン制御SQL以外に，ルーチン中にSQL手続き文として指定できるSQL文を次に示します。ただし，関数本体中には指定できません。

CALL文（手続きの呼出し）

CLOSE文（カーソルクローズ）

DECLARE CURSOR（カーソル宣言）

DELETE文（行削除）

FETCH文（データの取り出し）

INSERT文（行挿入）

OPEN文（カーソルオープン）

PURGE TABLE文（全行削除）

1行SELECT文（1行検索）

UPDATE文（データ更新）

COMMIT文（トランザクションの正常終了）

LOCK文（表の排他制御）

ROLLBACK文（トランザクションの取り消し）

7.2　複合文（複数文実行）

7.2.1　複合文の形式と規則

(1)　機能

複数のSQL文をまとめて，一つのSQL文（複合文）として実行します。

(2)　形式

　〔開始ラベル：〕
　BEGIN
　〔｛SQL変数宣言;｜カーソル宣言;｜条件宣言;｜ハンドラ宣言;｝〕…
　〔SQL手続き文;〕…

　END 〔終了ラベル〕
　SQL変数宣言：：＝DECLARE SQL変数名〔，SQL変数名〕…データ型 〔DEFAULT句〕
　DEFAULT句：：＝DEFAULT 〔既定値〕
　条件宣言：：＝DECLARE 条件名 CONDITION 〔FOR SQLCODE値〕
　ハンドラ宣言：：＝DECLARE ハンドラ種別
　　　　　　　　　　　HANDLER FOR 条件値〔，条件値〕… ハンドラ動作
　ハンドラ種別：：＝｛CONTINUE｜EXIT｝
　条件値：：＝｛SQLERROR｜NOT FOUND｜条件名｜SQLCODE値｝
　ハンドラ動作：：＝SQL手続き文
　SQLCODE値：：＝SQLCODE 〔VALUE〕 整数定数

(3)　オペランド

(a)　〔開始ラベル〕

複合文の文ラベルを指定します。

(b)　BEGIN

複合文の開始を指定します。

(c)　SQL変数宣言：：＝DECLARE SQL変数名〔，SQL変数名〕…データ型 〔DEFAULT句〕

複合文中で使用するSQL変数を宣言します。SQL変数が割り当てられたとき，初期値としてSQL変数の既定値が設定されます。SQL変数の既定値はDEFAULT句で指定します。DEFAULT句を省略した場合，SQL変数の既定値はナル値になります。

SQL変数名

宣言するSQL変数の名称を指定します。

データ型

宣言するSQL変数のデータ型を指定します。

SQL変数宣言の規則

SQL変数宣言中で宣言するSQL変数の名称には，ルーチンのパラメタ名と同じ名称は指定できません。

同じ複合文中に直接含まれるSQL変数宣言中で宣言するSQL変数の名称は，重複して指定できません。

複合文中で宣言したSQL変数は，その複合文の最初に割り当てられ，最後に解放されます。

SQL変数の有効範囲は，そのSQL変数が宣言されている複合文の中，及び同じ複合文の中に宣言されているハンドラ宣言のハンドラ動作の中になります。また，その複合文の中のSQL手続き文に複合文を指定した場合は，内側の複合文の中でも有効です。

複合文の中のSQL手続き文に複合文を指定した場合，外側の複合文の中で宣言したSQL変数と，内側の複合文の中で宣言したSQL変数が同じ名称のときは，内側の複合文の中では内側で宣言したSQL変数が有効となります。内側の複合文が終了したら，外側で宣言したSQL変数が有効となります。

SQL変数宣言中で宣言するSQL変数のデータ型には，BOOLEANは指定できません。

DEFAULT句：：＝DEFAULT 〔既定値〕

DEFAULT句の規則については，「CREATE TABLE（表定義）」のDEFAULT句の規則を参照してください。

既定値としてCURRENT_TIMESTAMP〔（小数秒精度）〕 USING BES又はCURRENT TIMESTAMP〔（小数秒精度）〕 USING BESは指定できません。

(d)　カーソル宣言

複合文中で使用するカーソルを宣言します。

カーソル宣言の規則

同じ複合文中に直接含まれる，カーソル宣言中で宣言するカーソルの名称は，重複して指定できません。

複合文中で宣言したカーソルは，その複合文の最初に割り当てられ，最後に解放されます。ただし，WITH RETURN指定をして宣言したカーソルは，解放されません。

カーソルの有効範囲は，そのカーソルが宣言されている複合文の中，及び同じ複合文の中に宣言されているハンドラ宣言のハンドラ動作の中になります。また，その複合文の中のSQL手続き文に複合文を指定した場合は，内側の複合文の中でも有効です。

複合文の中のSQL手続き文に複合文を指定した場合，外側の複合文の中で宣言したカーソルと，内側の複合文の中で宣言したカーソルが同じ名称のときは，内側の複合文の中では内側で宣言したカーソルが有効となります。内側の複合文が終了したら，外側で宣言したカーソルが有効となります。

(e)　条件宣言：：＝DECLARE 条件名 CONDITION 〔FOR SQLCODE値〕

ハンドラ宣言，SIGNAL文，又はRESIGNAL文の中で使用する条件名と，それに対応するSQLCODEの値を宣言します。

条件名

宣言する条件の名称を指定します。

FOR SQLCODE値

宣言する条件に対応づけるSQLCODEの値を指定します。

条件宣言の規則

同じ複合文中に直接含まれるほかの条件宣言に，同じ条件名を重複して指定できません。

条件名の有効範囲は，その条件名が宣言されている複合文の中，及び同じ複合文の中に宣言されているハンドラ宣言のハンドラ動作の中になります。また，その複合文の中のSQL手続き文に複合文を指定した場合は，内側の複合文の中でも有効です。

複合文の中のSQL手続き文に複合文を指定した場合，外側の複合文の中で宣言した条件名と同じ条件名を使用した条件宣言は，内側の複合文の中で宣言できません。

同じ複合文中に直接含まれる条件宣言を複数指定する場合，同じSQLCODE値は指定できません。

SIGNAL文，又はRESIGNAL文の中で使用する条件名を宣言する場合は，"FOR SQLCODE値"を省略してください。指定した場合はエラーとなります。

(f)　ハンドラ宣言：：＝DECLARE ハンドラ種別 HANDLER FOR 条件値〔，条件値〕… ハンドラ動作

複合文中で例外処理をするためのハンドラを宣言します。

複合文中のSQL文を実行した結果のSQLCODE値，SIGNAL文，又はRESIGNAL文の条件名がハンドラ宣言で指定した条件値と一致すると，ハンドラが制御を受け取り，ハンドラ動作を実行します。

ハンドラ種別：：＝｛CONTINUE｜EXIT｝

CONTINUE

ハンドラ動作を実行した後に，例外を発生したSQL手続き文の次のSQL手続き文に制御を移します。ただし，例外を発生したSQL手続き文がルーチン制御SQLのIF文，又はWHILE文の場合，END IF，又はEND WHILE〔終了ラベル〕の次のSQL手続き文に制御を移します。

EXIT

ハンドラ動作を実行した後に，ハンドラ宣言を指定した複合文の最後に制御を移します。

条件値：：＝｛SQLERROR｜NOT FOUND｜条件名｜SQLCODE値｝

ハンドラが有効になる条件を指定します。

SQLERROR

SQLERRORが発生した場合に，ハンドラを呼び出すときに指定します。SQLERRORは，SQLCODE<0となる場合に対応しています。

NOT FOUND

NOT FOUNDが発生した場合に，ハンドラを呼び出すときに指定します。NOT FOUNDは，SQLCODE=100となる場合に対応しています。

条件名

ハンドラが呼び出される条件となる条件名を指定します。

条件名は，条件宣言であらかじめ定義されていて，かつこのハンドラ宣言を有効範囲として含んでいる必要があります。

条件宣言の中で条件名に対応するSQLCODE値が定義されている場合は，SQLCODEがその値と一致したときにハンドラが呼び出されます。条件宣言の中で条件名に対応するSQLCODE値が定義されていない場合は，その条件名を指定したSIGNAL文，又はRESIGNAL文を実行したときだけハンドラが呼び出されます。

SQLCODE値

ハンドラが呼び出される条件となるSQLCODEの値を指定します。

ハンドラ動作：：＝SQL手続き文

ハンドラが呼び出されたときに実行するSQL手続き文を指定します。

ハンドラ宣言の規則

ハンドラは，そのハンドラが宣言されている複合文の中のSQL手続き文を有効範囲とします。その複合文の中のSQL手続き文に複合文を指定した場合は，内側の複合文全体で有効となります。ただし，そのハンドラが宣言されている複合文の中の，ハンドラ宣言中のSQL手続き文は無効となります。例を次に示します。

ハンドラ宣言の中で，条件値にSQLERROR，又はNOT FOUNDのどちらかを指定した場合，同時にSQLCODE値，又は条件名を指定できません。

ハンドラ宣言の中で，同じ条件値は重複して指定できません。また，SQLCODE値と同じSQLCODEを表す条件名も指定できません。

同じ複合文の中に含まれるほかのハンドラ宣言に，同じ条件を表す条件値は指定できません。

条件値にSQLERROR，又はNOT FOUNDを指定したハンドラ宣言を一般ハンドラ宣言，それ以外は特定ハンドラ宣言とします。同じ複合文の中に，同じSQLの実行状態（異常終了，警告あり正常終了，又はデータなし）を示す条件値を指定した一般ハンドラ宣言と特定ハンドラ宣言が定義されている場合，特定ハンドラ宣言で指定したSQLCODE値に対しては，特定ハンドラ宣言だけが有効になります。

複合文の中のSQL手続き文に複合文を指定した場合に，外側の複合文で宣言したハンドラAと内側の複合文の中で宣言したハンドラBとで，同じSQLCODE，又は条件名を指定したときは，内側の複合文の中では内側のハンドラBが有効となります。内側の複合文が終了したら，再び外側のハンドラAが有効となります。例を次に示します。

ハンドラ動作が正常終了でない（SQLCODE=0以外）場合，条件を満たすほかのハンドラがあれば呼び出します。

ハンドラ動作開始直後は，SQLCODE=0となります。

(g)　SQL手続き文

複合文中で実行するSQL手続き文を指定します。

(h)　END〔終了ラベル〕

複合文の終了を指定します。終了ラベルには，文ラベルを指定します。

(i)　SQLCODE値：：＝SQLCODE 〔VALUE〕 整数定数

SQLCODEの値を整数定数で指定します。

SQLCODEの値として，正常終了を表す値である0は指定できません。SQLCODE値に指定する整数定数を次の表に示します。

表7‒2　SQLCODE値に指定する整数定数

SQL文の実行状態

SQLCODEの値

正常終了（警告あり）

＞0(≠100，110)

データがない

100

異常終了

＜0

HiRDBで発生する可能性がある，SQLCODEに対応するメッセージを次の表に示します。

表7‒3　HiRDBで発生する可能性がある，SQLCODEに対応するメッセージ

SQLCODE

対応するメッセージID

-yyy

KFPA11yyy

-1yyy

KFPA19yyy

-3yyy

KFPA18yyy

yyy

KFPA12yyy

+3yyy

KFPA13yyy

(4)　共通規則

最も外側のSQL手続き文に複合文を指定して，開始ラベルを省略した場合は，そのルーチンのルーチン識別子が文ラベルとして仮定されます。また，複合文の中のSQL手続き文に複合文を指定した場合，内側の複合文に対する開始ラベルを省略したときは，文ラベルなしとして扱われます。

終了ラベルを指定する場合は，開始ラベルと同じ名称の文ラベルを指定してください。

文ラベルの有効範囲は，文ラベルを指定した複合文の開始から終了までの間です。その複合文中に含まれる，ほかの文の文ラベル，及びループ変数名と同じ名称の文ラベルは指定できません。ただし，複合文中にハンドラ宣言がある場合，そのハンドラ宣言中は除きます。同一名称の文ラベルの指定可否の例を次に示します。

AAA: BEGIN  ...........................................1
  DECLARE CN1 CONDITION FOR SQLCODE VALUE -800;
  DECLARE EXIT HANDLER FOR CN1
  AAA: BEGIN  .........................................2
      :
  END AAA;
  AAA: BEGIN  .........................................3
    DECLARE CN2 CONDITION FOR SQLCODE VALUE -800;
    DECLARE EXIT HANDLER FOR CN2
      :
  END AAA;
    :
END AAA

〔説明〕

2は，1と同一名称ですが，ハンドラ宣言中のため指定できます。

3は，1と同一名称であり，ハンドラ宣言中でないため指定できません。

指定したSQL手続き文は，指定した順序で実行されます。

SQL手続きの実行中にエラーが発生した場合に，トランザクションが無効になるのは，そのエラーが暗黙的ロールバックありのときだけです。トリガ動作のSQL手続き文の実行中にエラーが発生した場合は，必ず暗黙的ロールバックとなります。

SQL手続き文の実行でエラーが発生した場合は，次の規則に従います。

暗黙的ロールバックなしのエラーが発生した場合

条件を満たすハンドラがあれば，そのハンドラの例外処理を実行します。条件を満たすハンドラがなければ，その時点でSQLルーチンの実行を終了し，エラーを返します。それ以降のSQL手続き文は実行されません。

暗黙的ロールバックありのエラーが発生した場合

条件を満たすハンドラがあっても，例外処理はしないで，その時点でSQLルーチン，又はトリガの実行を終了し，エラーを返します。それ以降のSQL手続き文は実行されません。

複合文，及びFOR文のネスト数は，最大255です。

SQL変数名，カーソル名，及び条件名に，次の名称を指定する場合は，引用符（"）で名称を囲んでください。

CONDITION

EXIT

HANDLER

(5)　留意事項

複合文は，SQLルーチン中，及びトリガ中に指定できます。

(6)　使用例

在庫表（ZAIKO）の数量が，1,000個以上の商品の単価を3割引きに，0の場合はその行を削除し，そのほかの場合は単価を1割引きにする手続き（PROC1）を定義します。

CREATE PROCEDURE PROC1(OUT OUTDATA INT)
BEGIN
  DECLARE CR1 CURSOR FOR SELECT SURYO FROM ZAIKO ;
  OPEN CR1 ;
  WHILE SQLCODE=0 DO
    FETCH CR1 INTO OUTDATA ;
    IF SQLCODE=0 THEN
      IF OUTDATA>=1000 THEN
        UPDATE ZAIKO SET TANKA = (1-0.3)*TANKA WHERE CURRENT OF CR1 ;
      ELSE IF OUTDATA=0 THEN
        DELETE FROM ZAIKO WHERE CURRENT OF CR1 ;
      ELSE
        UPDATE ZAIKO SET TANKA = (1-0.1)*TANKA WHERE CURRENT OF CR1 ;
      END IF ;
    END IF ;
  END;
END

在庫表（ZAIKO）に対し，指定した商品コードの数量を更新するSQL手続き（PROC2）を定義します。

指定した数量が0以下である場合（手続き内で定義する条件illegal_valueになる場合）

SIGNAL文でエラーを発生させ，例外処理で出力パラメタにメッセージを設定します。また，SQL手続きの実行は終了します。

指定した商品コードのデータがない場合（NOT FOUNDになる場合）

例外処理で出力パラメタにメッセージを設定します。また，SQL手続き文の実行は終了します。

非ナル値制約ありの列をNULL値で更新しようとした場合（SQLCODE=-210になる場合）

例外処理で出力パラメタにメッセージを設定します。また，SQL手続き文の実行は継続します。

CREATE PROCEDURE PROC2(IN USCODE CHAR(4), IN USURYO INT,
                       OUT MSG MVARCHAR(255))
BEGIN
  DECLARE PSURYO INT;
  DECLARE illegal_value CONDITION ;
  DECLARE EXIT HANDLER FOR illegal_value
    SET MSG=M'数量として無効な値です。';
  DECLARE EXIT HANDLER FOR NOT FOUND
    SET MSG=M'指定された商品コードは登録されていません。';
  DECLARE CONTINUE HANDLER FOR SQLCODE VALUE -210
    SET MSG=M'非ナル値制約ありの列をNULL値で更新しようとしましたが，
              無視します。';
  SET MSG ='';
  IF USURYO<0 THEN
    SIGNAL illegal_value;
  ELSE
    UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE;
    SET MSG=MSG||M'処理が完了しました。 '
    SELECT ZSURYO INTO PSURYO FROM ZAIKO WHERE ZSCODE=USCODE;
    SET MSG=MSG||M'現在の数量：'||NUMEDIT(PSURYO,'<999999');
  END IF;
END

在庫表（ZAIKO）に対し，新規の商品データを登録するSQL手続き（PROC3）を定義します。

なお，商品コード列（SCODE）は主キーであるものと仮定します。挿入するデータの商品コードが，既に登録されているデータの商品コードと重複する場合（SQLCODE=-803の場合），例外処理でロールバックをさせて，出力パラメタにメッセージを設定します。また，SQL手続き文の実行は終了します。

CREATE PROCEDURE PROC3(IN  USCODE CHAR(4) , IN  USNAME NCHAR(8),
                       IN  UCOL   NCHAR(1), IN  UTANKA INT,
                       OUT MSG    MVARCHAR(255))
BEGIN
  DECLARE EXIT HANDLER FOR SQLCODE VALUE -803
    BEGIN
      ROLLBACK;
      SET MSG=M'重複キー違反のため，ロールバックしました。';
    END;
  INSERT INTO ZAIKO VALUES(USCODE,USNAME,UCOL,UTANKA,0);
  SET MSG=M'登録が完了しました。';
END

7.3　IF文（条件分岐による実行）

7.3.1　IF文の形式と規則

(1)　機能

条件に合ったSQL文を実行します。

(2)　形式

　IF 探索条件 THEN SQL手続き文;〔SQL手続き文;〕…
　〔ELSEIF 探索条件 THEN SQL手続き文;〔SQL手続き文;〕…〕
　〔ELSE SQL手続き文;〔SQL手続き文;〕…〕
　END IF

(3)　オペランド

(a)　IF 探索条件 THEN SQL手続き文;〔SQL手続き文;〕…

探索条件

THEN句に指定するSQL手続き文を実行する条件を指定します。

SQL手続き文

IF句に指定した条件を満たす場合に実行するSQL文を指定します。

(b)　〔ELSEIF 探索条件 THEN SQL手続き文;〔SQL手続き文;〕…〕

探索条件

THEN句に指定するSQL手続き文を実行する条件を指定します。

SQL手続き文

IF句の条件を満たさないで，ELSEIF句に指定した条件を満たす場合に実行するSQL文を指定します。

(c)　〔ELSE SQL手続き文;〔SQL手続き文;〕…〕

SQL手続き文

IF句，及びELSEIF句の条件を満たさない場合に実行するSQL文を指定します。

(d)　END IF

IF文の終了を指定します。

(4)　共通規則

指定したSQL手続き文は，指定した順序で実行されます。SQL手続き文の実行でエラーが発生した場合，それ以降のSQL手続き文は実行されません。

探索条件中に副問合せを指定できません。

(5)　留意事項

IF文は，SQLルーチン中に指定できます。

7.4　LEAVE文（文の途中終了）

7.4.1　LEAVE文の形式と規則

(1)　機能

複合文，WHILE文，又はFOR文の途中から抜けて，それらの文の実行を終了します。

(2)　形式

　LEAVE 〔文ラベル〕

(3)　オペランド

(a)　文ラベル

途中で抜けて実行を終了させる複合文，WHILE文，又はFOR文の文ラベルを指定します。

文ラベルを省略した場合は，文ラベルを省略したLEAVE文を囲む最も内側の複合文，WHILE文，又はFOR文を途中終了します。

(4)　共通規則

文ラベルには，LEAVE文を含む文（複合文，WHILE文，又はFOR文）の開始ラベルを指定します。

ハンドラ動作を抜けるLEAVE文は，ハンドラ動作中に指定できません。

(5)　留意事項

LEAVE文は，SQLルーチン中に指定できます。

7.5　RETURN文（関数の戻り値の返却）

7.5.1　RETURN文の形式と規則

(1)　機能

関数の戻り値を返却します。

(2)　形式

　RETURN 戻り値
　戻り値：：＝｛値式｜NULL｝

(3)　オペランド

(a)　戻り値：：＝｛値式｜NULL｝

戻り値として，値式又はNULLを指定します。

(4)　共通規則

戻り値は，関数定義時のRETURNS句で指定されたデータ型にデータ変換されます。

RETURN文は，手続き中には指定できません。

戻り値に指定する値式中に，副問合せは指定できません。

(5)　留意事項

RETURN文は，SQL関数中に指定できます。

7.6　WHILE文（文の繰り返し）

7.6.1　WHILE文の形式と規則

(1)　機能

SQL文の実行を繰り返します。

(2)　形式

　〔開始ラベル：〕
　WHILE 探索条件 DO
　　SQL手続き文;〔SQL手続き文;〕…
　END 〔WHILE〕 〔終了ラベル〕

(3)　オペランド

(a)　〔開始ラベル〕

WHILE文の文ラベルを指定します。

(b)　探索条件

SQL手続き文の実行を繰り返す条件を指定します。

(c)　SQL手続き文

繰り返し実行するSQL手続き文を指定します。

(d)　END 〔WHILE〕 〔終了ラベル〕

WHILE文の終了を指定します。終了ラベルには，文ラベルを指定します。

WHILEは指定してもしなくても同じです。

(4)　共通規則

終了ラベルを指定する場合は，開始ラベルと同じ名称の文ラベルを指定してください。

文ラベルの有効範囲は，WHILE文の開始から終了までの間です。そのWHILE文中に含まれるほかの文の文ラベル，及びループ変数名と同じ名称の文ラベルは指定できません。ただし，SQL手続き文中にハンドラ宣言がある場合，そのハンドラ宣言中は除きます。同一名称の文ラベルの指定可否の例を次に示します。

AAA: WHILE X < 100 DO
  BEGIN  ...........................................1
    DECLARE CN1 CONDITION FOR SQLCODE VALUE -800;
    DECLARE EXIT HANDLER FOR CN1
    AAA: BEGIN  .........................................2
        :
    END AAA;
    AAA: BEGIN  .........................................3
      DECLARE CN2 CONDITION FOR SQLCODE VALUE -800;
      DECLARE EXIT HANDLER FOR CN2
        :
    END AAA;
    SET X=X+1;
  END
END WHILE AAA

〔説明〕

2は，1と同一名称ですが，ハンドラ宣言中のため指定できます。

3は，1と同一名称であり，ハンドラ宣言中でないため指定できません。

探索条件を評価し，結果が真の場合はSQL手続き文を実行します。探索条件が偽，又は不定になるまで，繰り返しSQL手続き文を実行します。

指定したSQL手続き文は，指定した順序で実行されます。SQL手続き文の実行でエラーが発生した場合，それ以降のSQL手続き文は実行されません。WHILE文の実行も終了します。

探索条件中に副問合せを指定できません。

(5)　留意事項

WHILE文は，SQLルーチン中に指定できます。

7.7　FOR文（各行に対する文の繰返し）

7.7.1　FOR文の形式と規則

(1)　機能

表の各行に対してSQL文の実行を繰り返します。

(2)　形式

　〔開始ラベル：〕
　FOR ループ変数名 AS
  〔カーソル名 CURSOR 〔WITH HOLD〕FOR〕
     カーソル指定　形式１
　　〈排他オプション〉
　　　〔〔｛WITH ｛SHARE｜EXCLUSIVE｝LOCK
　　　　　｜WITHOUT LOCK〔｛WAIT｜NOWAIT｝〕｝〕
　　　〔｛WITH ROLLBACK｜NO WAIT｝〕〕
　　　　　〔FOR｛UPDATE 〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝〕
　　　　　〔UNTIL DISCONNECT〕
  DO
　　SQL手続き文;〔SQL手続き文;〕…
　END FOR 〔終了ラベル〕

(3)　オペランド

(a)　〔開始ラベル〕

FOR文の文ラベルを指定します。

(b)　ループ変数名

暗黙的に宣言するSQL変数の修飾子を指定します。

FOR文実行時，カーソル指定の導出列名を変数名とするSQL変数が暗黙的に宣言されます。暗黙的に宣言されたSQL変数はループ変数名での修飾ができます。

ループ変数名はラベル名の規則に従います。したがって，ラベル名に関する制限はループ変数名に対しても適用されます。

(c)　カーソル名

カーソルの名称を指定します。

カーソル名を省略した場合は，HiRDBが固有のカーソル名を生成します。

カーソル名については，「名前の指定」を参照してください。

(d)　〔WITH HOLD〕

ホールダブルカーソルを使用する場合に指定します。

WITH HOLDは，UNTIL DISCONNECTを指定した場合の機能と同じなので，説明はUNTIL DISCONNECTを参照してください。また，この指定がUNTIL DISCONNECTと重複しているかどうかによる機能差はありません。

ホールダブルカーソルに関する制限事項については，「DECLARE CURSOR　形式1（カーソル宣言）」を参照してください。

(e)　カーソル指定　形式１

問合せの内容を表すカーソルを指定します。

カーソル指定については「カーソル指定　形式1」を参照してください。

FOR文で指定するカーソル指定の規則

導出列に名前のない列は指定できません。名前のない列を導出列として指定する場合は，AS句を指定し，導出列に対して別名を付与してください。

導出列名が重複する導出列を指定できません。

導出列に〔表指定.〕ROWを指定できません。

導出列に，FROM句に平坦化の指定がない添字なし繰返し列を指定できません。

カーソル指定の導出列が次に示す項目から導き出された列で，AS 列名を省略した場合，その列は名前のない列となります。導出列がスカラ副問合せの場合，導出列名はスカラ副問合せの選択式の導出列名に依存します。

スカラ演算（ウィンドウ関数を含む）

関数呼出し

集合関数

定数

USER値関数

CURRENT_DATE値関数

CURRENT_TIME値関数

CURRENT_TIMESTAMP値関数

コンポネント指定

GET_JAVA_STORED_ROUTINE_SOURCE指定

WRITE指定

SQL変数

SQLパラメタ

(f)　排他オプション

問合せをする場合の排他制御モードと，ほかのユーザが資源を占有していた場合の処置を指定します。

排他オプションについては，「排他オプション」を参照してください。

(g)　〔FOR｛UPDATE 〔OF列名〔，列名〕…〕〔NOWAIT〕｜READ ONLY｝〕

FOR UPDATE 〔OF列名〔，列名〕…〕をFOR UPDATE句といいます。

FOR UPDATE句，及びFOR READ ONLYについては，「DECLARE CURSOR　形式1（カーソル宣言）」を参照してください。

(h)　〔UNTIL DISCONNECT〕

ホールダブルカーソルを使用する場合に指定します。

この指定をしたときの機能は，WITH HOLDを指定した場合と全く同じです。また，この指定がWITH HOLDと重複しているかどうかによっての機能差はありません。

また，ホールダブルカーソルに関する制限事項については，「DECLARE CURSOR　形式1（カーソル宣言）」を参照してください。

(i)　SQL手続き文

繰り返し実行するSQL手続き文を指定します。

FOR文の中で指定するSQL手続き文の規則

FOR文のカーソルを指定したOPEN文，FETCH文，及びCLOSE文は指定できません。

ループ変数名を指定したLEAVE文は指定できません。

FOR文のカーソルがホールダブルカーソルではない場合，COMMIT文，ROLLBACK文，及びPURGE TABLE文は指定できません。また，CALL文でこれらを指定した手続きが呼び出された場合は実行時エラーとなります。

指定したSQL手続き文は指定した順序で実行されます。SQL手続き文の実行でエラーが発生した場合，それ以降のSQL手続き文は実行されません。FOR文の実行も終了します。

(j)　END FOR 〔終了ラベル〕

FOR文の終了を指定します。終了ラベルには，文ラベルを指定します。

(4)　共通規則

終了ラベルを指定する場合は，開始ラベルと同じ名称の文ラベルを指定してください。

文ラベル，及びループ変数名の有効範囲は，FOR文の開始から終了までの間です。そのFOR文中に含まれるほかの文の文ラベル，ループ変数名と同じ名称の文ラベル，及びループ変数名は指定できません。ただし，SQL手続き文中にハンドラ宣言がある場合，そのハンドラ宣言中は除きます。

FOR文中で暗黙的に宣言したSQL変数，及び明示的に宣言したカーソルは，そのFOR文の最初に割り当てられ，最後に解放されます。

FOR文で暗黙的に宣言したSQL変数，及び明示的に宣言したカーソルの有効範囲は，そのSQL変数及びカーソルが宣言されているFOR文の中になります。

FOR文の中のSQL手続き文に複合文を指定した場合，及び複合文の中のSQL手続き文にFOR文を指定した場合，FOR文で暗黙的に宣言したSQL変数と，複合文の中で宣言したSQL変数が同じ名称のときは，内側のルーチン制御SQLの中では内側のルーチン制御SQLで宣言したSQL変数が有効となります。内側のルーチン制御SQLが終了したら，外側のルーチン制御SQLで宣言したSQL変数が有効となります。例を次に示します。

FOR文の中のSQL手続き文にFOR文を指定した場合，外側のFOR文で暗黙的に宣言したSQL変数と内側のFOR文で暗黙的に宣言したSQL変数が同じ名称のときは，内側のFOR文の中では内側のFOR文で宣言したSQL変数が有効となります。内側のFOR文が終了したら，外側のFOR文で宣言したSQL変数が有効となります。

FOR文の中のSQL手続き文に複合文を指定した場合，及び複合文の中のSQL手続き文にFOR文を指定した場合，FOR文で宣言したカーソルと，複合文の中で宣言したカーソルが同じ名称のときは，内側のルーチン制御SQLの中では内側で宣言したカーソルが有効となります。内側のルーチン制御SQLが終了したら，外側で宣言したカーソルが有効となります。

FOR文の中のSQL手続き文にFOR文を指定した場合，外側のFOR文で宣言したカーソルと内側のFOR文で宣言したカーソルが同じ名称のときは，内側のFOR文の中では内側のFOR文で宣言したカーソルが有効となります。内側のFOR文が終了したら，外側のFOR文で宣言したカーソルが有効となります。

SQL手続きの実行中にエラーが発生した場合に，トランザクションが無効になるのは，そのエラーが暗黙的ロールバックありのときだけです。トリガ動作のSQL手続き文の実行中にエラーが発生した場合は，必ず暗黙的ロールバックとなります。

FOR文，及び複合文のネスト数は，最大255です。

(5)　留意事項

FOR文はSQL手続き中，及びトリガ中に指定できます。

(6)　使用例

表T1のデータのうち，列C1(INT型)の値が100以下のデータは表T2に代入し，それ以外は表T3に代入する手続き(PROC1)を定義します。

CREATE PROCEDURE PROC1 ()
FLBL :
FOR LVN AS SELECT C1,C2,C3 FROM T1 DO
 IF C1 <= 100 THEN
  INSERT INTO T2 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
 ELSE
  INSERT INTO T3 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
 END IF ;
END FOR FLBL

上記使用例で示したFOR文と等価なSQLは以下のSQLで実現できます。

CREATE PROCEDURE PROC1 ()
LVN :
BEGIN
  DECLARE C1,C2,C3 INT ;
  DECLARE FCN CURSOR FOR SELECT C1,C2,C3 FROM T1 ;
  DECLARE AT_END CHAR(1) DEFAULT 'N' ;
  OPEN FCN ;
  FLBL :
  WHILE AT_END != 'Y' DO
    FETCH FCN INTO C1,C2,C3 ;
    IF SQLCODE = 100 THEN
      SET AT_END = 'Y' ;
    ELSE
      IF C1 <= 100 THEN
        INSERT INTO T2 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
      ELSE
        INSERT INTO T3 VALUES(LVN.C1,LVN.C2,LVN.C3) ;
      END IF ;
    END IF ;
  END WHILE FLBL ;
　CLOSE FCN ;
END LVN

7.8　WRITE LINE文（ファイルへの文字列出力）

7.8.1　WRITE LINE文の形式と規則

(1)　機能

指定した値式の文字列をファイルに出力します。

(2)　形式

　WRITE LINE 値式

(3)　オペランド

(a)　値式

ファイルに出力する値式を指定します。

値式についての規則を次に示します。

値式に指定できるものを次に示します。

定数

USER値関数

SQL変数，又はSQLパラメタ

連結演算

スカラ関数

関数呼出し

CASE式

CAST指定

SQLERRM_OF_LAST_CONDITION

値式のデータ型は，文字データ型（CHAR及びVARCHAR），各国文字データ型（NCHAR及びNVARCHAR），又は混在文字データ型（MCHAR及びMVARCHAR）にしてください。

値式の結果のデータ型が文字データ型となる場合，ファイルに出力する文字の文字集合は値式で指定した文字集合となります。

値式の出力先は，クライアント環境定義PDWRTLNPATHで指定した出力先となります。また，値式を出力するファイルの最大サイズは，クライアント環境定義PDWRTLNFILSZで指定します。PDWRTLNPATH，及びPDWRTLNFILSZについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

値式の文字列の最後に，HiRDBサーバ側の環境の改行コードが付加されます。改行コードは，HiRDBサーバのOSによって異なります。また，値式の値がクライアント環境定義PDWRTLNCOMSZで指定したサイズを超えた場合，最後に付加するHiRDBサーバ側の改行コードは，PDWRTLNCOMSZで指定したサイズに収まるように，値式の文字列の後方を削除して，改行コードを付加します。PDWRTLNCOMSZについては，マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

付加されるHiRDBサーバ側の改行コードを次の表に示します。

表7‒4　付加されるHiRDBサーバ側の改行コード

HiRDBサーバのOS

付加される改行コード

HP-UX

NL(X'0a')

AIX

NL(X'0a')

Linux

NL(X'0a')

Windows

CR(X'0d')＋NL(X'0a')

値式の値がナル値の場合は，ファイルに出力しません。

値式中には，副問合せを指定できません。

(4)　共通規則

WRITE LINE文は，SQL手続き，及びトリガに指定できます。SQL関数中には指定できません。

クライアント環境定義PDWRTLNFILSZを指定しなかった場合，WRITE LINE文は実行できません。

(5)　使用例

日付データ型のSQLパラメタ「fromdate」を文字列に変換して，ファイルに出力します。

  CREATE PROCEDURE proc_1(IN fromdate DATE)
    BEGIN
      WRITE LINE 'fromdate='||char(fromdate);
    END;

7.9　SIGNAL文（エラーの通知）

7.9.1　SIGNAL文の形式と規則

(1)　機能

エラーを発生させて，通知します。このとき，この時点までに診断領域へ設定していた情報をクリアします。

(2)　形式

　SIGNAL 信号値

　信号値：：＝｛SQLSTATE値｜条件名｝
　SQLSTATE値：：＝SQLSTATE 〔VALUE〕 文字列定数

(3)　オペランド

(a)　信号値：：＝｛SQLSTATE値｜条件名｝

UAPに返す値を指定します。

(b)　SQLSTATE値：：＝SQLSTATE 〔VALUE〕 文字列定数

SQLSTATE値として有効な値（A〜Zの大文字，及び0〜9の数字の組み合わせ）を5文字で指定してください。ただし，次のHiRDBでのSQLSTATEの規則に従って値を指定してください。

SQLSTATEクラス（最初の2文字）に'00'，'01'，'02'，及び'R2'は指定できません。これらの値はエラーを表すクラスではありません。

最初の1文字が'0'〜'5'，'A'〜'I'，及び'R'で始まるSQLSTATEクラスは指定できません。これらの値はHiRDBで予約されています。

SQLSTATEクラスがこれらの規則に従っていない場合，定義時にエラーとなります。SQLSTATE値については，「SQLSTATE変数」を参照してください。

(c)　条件名

条件宣言で宣言した条件名を指定してください。

条件名を指定した場合，SQLSTATEにはエラーを示す'R0000'（異常終了で暗黙的ロールバックなし）が設定されます。

条件名に対応したSQLCODE値を定義している場合，エラーとなります。

(4)　共通規則

SIGNAL文を実行した場合は，SQLCODEに-1400が設定されます。

SIGNAL文を実行しても，暗黙的ロールバックにはなりません。ただし，トリガの中で実行した場合は，WITHOUT ROLLBACKを指定して定義した表を除いて，暗黙的ロールバックになります。WITHOUT ROLLBACKを指定して定義した表については，SIGNAL文をトリガの中で実行しても，行更新（追加，削除を含む）の処理完了後はロールバックしません。

SIGNAL文を実行すると，SIGNAL文を実行する前に設定されていた診断領域の条件情報項目の情報はクリアされます。

診断領域の文情報項目のNUMBERには1が，MOREには'N'が設定されます。

1番目（条件番号：1）の条件情報項目のERROR_SQLには，'SIGNAL'が設定されます。また，信号値に条件名を指定した場合は，CONDITION_IDENTIFIERに条件名が，SQLSTATE値を指定した場合はCONDITION_IDENTIFIERに'SQLSTATE:xxxxx'（xxxxxは，指定したSQLSTATE値）が設定されます。

(5)　留意事項

SIGNAL文は，SQL手続き，及びトリガ中に指定できます。

SIGNAL文を実行すると，実行前に設定されていた診断領域の診断情報はクリアされます。それ以前の診断情報の履歴をクリアしない場合は，RESIGNAL文を使用してください。

(6)　使用例

在庫表（ZAIKO）に対し，指定した商品コードの数量を更新するSQL手続き（ZAIKO_KOUSIN1）を定義します。入力パラメタに指定した数量が負の値の場合，SIGNAL文でエラーを発生させ，「数量として無効な値です。」というメッセージを出力パラメタに設定します。

CREATE PROCEDURE ZAIKO_KOUSIN1(IN USCODE INT, IN USURYO INT,
                               OUT MSG NVARCHAR(50))
BEGIN
  DECLARE illegal_value CONDITION ;
  DECLARE EXIT HANDLER FOR illegal_value
    SET MSG=N'数量として無効な値です。';
  DECLARE EXIT HANDLER FOR NOT FOUND
    SET MSG=N'指定された商品コードは登録されていません。';
  IF USURYO<0 THEN
    SIGNAL illegal_value;
  ELSE
    UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE;
    SET MSG=N'更新が完了しました。';
  END IF;
END

在庫表（ZAIKO）の行を削除する前に，SIGNAL文でエラーを発生させ，在庫表からの行の削除を抑止するトリガ（SIGNALTRIG）を定義します。

CREATE TRIGGER SIGNALTRIG
  BEFORE DELETE ON ZAIKO
  SIGNAL SQLSTATE '99001'

7.10　RESIGNAL文（エラーの再通知）

7.10.1　RESIGNAL文の形式と規則

(1)　機能

エラーを発生させ，通知します。このとき，診断領域に診断情報を追加します。

(2)　形式

　RESIGNAL 〔信号値〕

　信号値：：＝｛SQLSTATE値｜条件名｝
　SQLSTATE値：：＝SQLSTATE 〔VALUE〕 文字列定数

(3)　オペランド

(a)　信号値：：＝｛SQLSTATE値｜条件名｝

UAPに返す値を指定します。

(b)　SQLSTATE値：：＝SQLSTATE 〔VALUE〕 文字列定数

SQLSTATE値として有効な値（A〜Zの大文字，及び0〜9の数字の組み合わせ）を5文字で指定してください。ただし，次のHiRDBでのSQLSTATEの規則に従って値を指定してください。

SQLSTATEクラス（最初の2文字）に'00'，'01'，'02'，及び'R2'は指定できません。これらの値はエラーを表すクラスではありません。

最初の1文字が'0'〜'5'，'A'〜'I'，及び'R'で始まるSQLSTATEクラスは指定できません。これらの値はHiRDBで予約されています。

SQLSTATEクラスがこれらの規則に従っていない場合，定義時にエラーとなります。SQLSTATE値については，「SQLSTATE変数」を参照してください。

(c)　条件名

条件宣言で宣言した条件名を指定してください。

条件名を指定した場合，SQLSTATEにはエラーを示す'R0000'（異常終了で暗黙的ロールバックなし）が設定されます。

条件名に対応したSQLCODE値を定義している場合，エラーとなります。

(4)　共通規則

RESIGNAL文を実行するまでに，ハンドラを呼び出したSQL手続き文がない場合は，実行時にエラーとなります。

信号値を指定していない場合，SQLSTATEにはエラーを示す'R0000'（異常終了で暗黙的ロールバックなし）が設定されます。

RESIGNAL文を実行した場合は，SQLCODEに設定される値は次のようになります。

信号値を指定していない場合

変更されません。ハンドラを呼び出したSQL手続き文を実行したときに設定された値が保持されます。

信号値を指定した場合

-1400が設定されます。

RESIGNAL文を実行しても，暗黙的ロールバックにはなりません。ただし，トリガの中で実行した場合は，WITHOUT ROLLBACKを指定して定義した表を除いて，暗黙的ロールバックになります。WITHOUT ROLLBACKを指定して定義した表については，RESIGNAL文をトリガの中で実行しても，行更新（追加，削除を含む）の処理完了後はロールバックしません。

RESIGNAL文を実行した場合，診断領域に設定される情報は次のようになります。

信号値を指定していない場合

診断情報は更新されません。

信号値を指定した場合

診断領域の文情報項目のNUMBERにはi+1（RESIGNAL文実行前の値をiとする）が，MOREには'N'が設定されます。診断領域の条件情報項目のi番目（条件番号i）に設定されていた情報は，i+1番目（条件番号i+1）に配置されます。ここで，条件情報項目数の最大値を超えた場合は，文情報項目のMOREに'Y'が設定されます。1番目（条件番号:1）の条件情報項目のERROR_SQLには，'RESIGNAL'が設定されます。また，信号値に条件名を指定した場合，CONDITION_IDENTIFIERに条件名，又はSQLSTATE値を指定したときは，CONDITION_IDENTIFIERに'SQLSTATE:xxxxx'（xxxxxは指定したSQLSTATE値）が設定されます。

(5)　留意事項

RESIGNAL文は，SQL手続き，及びトリガ中に指定できます。

(6)　使用例

在庫表（ZAIKO）に対し，指定した商品コードの数量を更新するSQL手続き（ZAIKO_KOUSIN2）を定義します。指定した数量が0未満の値の場合，一致する商品がなかった場合，又は更新に失敗した場合に，RESIGNAL文でエラーを発生させ，それぞれのSQLSTATE値を設定します。

  CREATE PROCEDURE ZAIKO_KOUSIN2(IN USCODE INT,IN USURYO INT)
  BEGIN
    DECLARE illegal_value CONDITION ;
    DECLARE EXIT HANDLER FOR illegal_value
      RESIGNAL SQLSTATE VALUE '66001';
    DECLARE EXIT HANDLER FOR NOT FOUND
      SIGNAL SQLSTATE VALUE '66002';
    DECLARE EXIT HANDLER FOR SQLERROR
      RESIGNAL SQLSTATE VALUE '66003';
    IF USURYO<0 THEN
      SIGNAL illegal_value;
    ELSE
      UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE;
    END IF;
  END

付録

付録A　予約語一覧

付録A.1　SQLの予約語

SQLには，ISOで「ISO 9075−1992 Database Language SQL」として規格された予約語（以降SQL92と呼びます）と，JISで「JIS X 3005-1990データベース言語SQL」として規格された予約語があります。HiRDBで使用する予約語は，JIS規格を基本にしています。

予約語は，SQL文で使用するキーワードとして登録されています。したがって，予約語を表や列の名称として定義できません。なお，予約語をSQL文中に使用する必要がある場合，引用符（"）で囲んでください。予約語を引用符（"）で囲むと，一般の文字列と同じようにSQL文で使用できます。

SQLの予約語を次の表に示します。

SQLの予約語（A）

SQLの予約語（B）

SQLの予約語（C）

SQLの予約語（D）

SQLの予約語（E）

SQLの予約語（F）

SQLの予約語（G）

SQLの予約語（H）

SQLの予約語（I）

SQLの予約語（J）

SQLの予約語（K）

SQLの予約語（L）

SQLの予約語（M）

SQLの予約語（N）

SQLの予約語（O）

SQLの予約語（P）

SQLの予約語（R）

SQLの予約語（S）

SQLの予約語（T）

SQLの予約語（U）

SQLの予約語（V）

SQLの予約語（W）

SQLの予約語（X）

SQLの予約語（Y）

SQLの予約語（Z）

表中の凡例を次に示します。

○：予約語です。

−：予約語ではありません。

●：DatabaseMetaDataインタフェースのgetSQLKeywordsメソッドで返却されるキーワードです。

×：DatabaseMetaDataインタフェースのgetSQLKeywordsメソッドで返却されるキーワードではありません。

SQL92：ISO SQL 1992

SQL99：ISO SQL 1999

UNIFY：UNIFY2000

XDM/RD：XDM/RD E2

HiRDB（V6）：HiRDB Version6

HiRDB（V7）：HiRDB Version7

HiRDB（V8）：HiRDB Version8

HiRDB（V9）：HiRDB Version9

JDBC：Type4 JDBCドライバのDatabaseMetaDataインタフェースのgetSQLKeywordsメソッド

表A‒1　SQLの予約語（A）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

ABS

−

−

−

○

○

○

○

○

●

ABSOLUTE

○

○

−

−

○

○

○

○

×

ACCESS

−

−

○

−

○

○

○

○

●

ACTION

○

○

−

○

○

○

○

○

×

ADD

○

○

○

○

○

○

○

○

×

ADMIN

−

○

−

−

−

−

−

−

×

AFTER

−

○

−

−

○

○

○

○

●

AGGREGATE

−

○

−

−

−

−

−

−

×

ALIAS

−

○

−

−

○

○

○

○

●

ALL

○

○

○

○

○

○

○

○

×

ALLOCATE

○

○

○

○

○

○

○

○

×

ALTER

○

○

○

○

○

○

○

○

×

AMOUNT

−

−

○

−

○

○

○

○

●

AND

○

○

○

○

○

○

○

○

×

ANDNOT

−

−

−

○

○

○

○

○

●

ANSI

−

−

○

−

○

○

○

○

●

ANY

○

○

○

○

○

○

○

○

×

ARE

○

○

−

−

○

○

○

○

×

ARRAY

−

○

−

○

○

○

○

○

●

AS

○

○

○

○

○

○

○

○

×

ASC

○

○

○

○

○

○

○

○

×

ASSERTION

○

○

−

−

○

○

○

○

×

ASSIGN

−

−

−

○

○

○

○

○

●

ASYNC

−

−

−

−

○

○

○

○

●

AT

○

○

○

−

○

○

○

○

×

AUTHORIZATION

○

○

○

○

○

○

○

○

×

AUTO

−

−

○

−

○

○

○

○

●

AVG

○

−

○

○

○

○

○

○

×

表A‒2　SQLの予約語（B）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

BASE

−

−

○

−

○

○

○

○

●

BEFORE

−

○

−

−

○

○

○

○

●

BEGIN

○

○

○

○

○

○

○

○

×

BETWEEN

○

−

○

○

○

○

○

○

×

BINARY

−

○

○

○

○

○

○

○

●

BIT

○

○

−

−

○

○

○

○

×

BIT_AND_TEST

−

−

−

−

○

○

○

○

●

BIT_LENGTH

○

−

−

−

○

○

○

○

×

BLOB

−

○

−

○

○

○

○

○

●

BOOLEAN

−

○

−

○

○

○

○

○

●

BOTH

○

○

−

○

○

○

○

○

×

BREADTH

−

○

−

−

○

○

○

○

●

BTREE

−

−

○

−

○

○

○

○

●

BUFFER

−

−

○

−

○

○

○

○

●

BY

○

○

○

○

○

○

○

○

×

BYTE

−

−

○

−

○

○

○

○

●

表A‒3　SQLの予約語（C）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

CALL

−

○

−

○

○

○

○

○

●

CASCADE

○

○

−

−

○

○

○

○

×

CASCADED

○

○

−

−

−

−

−

−

×

CASE

○

○

−

○

○

○

○

○

×

CAST

○

○

−

○

○

○

○

○

×

CATALOG

○

○

−

−

○

○

○

○

×

CHANGE

−

−

−

○

○

○

○

○

●

CHAR

○

○

○

○

○

○

○

○

×

CHARACTER

○

○

○

○

○

○

○

○

×

CHAR_LENGTH

○

−

−

−

○

○

○

○

×

CHARACTER_LENGTH

○

−

−

−

○

○

○

○

×

CHECK

○

○

○

○

○

○

○

○

×

CLASS

−

○

−

−

−

−

−

−

×

CLOB

−

○

−

○

−

−

−

−

×

CLOSE

○

○

○

○

○

○

○

○

×

CLUSTER

−

−

−

○

○

○

○

○

●

COALESCE

○

−

−

○

○

○

○

○

×

COLLATE

○

○

−

−

○

○

○

○

×

COLLATION

○

○

−

−

○

○

○

○

×

COLUMN

○

○

○

○

○

○

○

○

×

COLUMNS

−

−

○

−

○

○

○

○

●

COMMENT

−

−

−

○

○

○

○

○

●

COMMIT

○

○

○

○

○

○

○

○

×

COMPLETION

−

○

−

−

○

○

○

○

●

COMPRESSED

−

−

−

○

−

−

−

○

×

CONDITION

−

○

−

−

−

○

○

○

●

CONFIGURATION

−

−

○

−

○

○

○

○

●

CONNECT

○

○

○

○

○

○

○

○

×

CONNECTION

○

○

−

−

○

○

○

○

×

CONST

−

−

○

−

○

○

○

○

●

CONSTRAINT

○

○

−

○

○

○

○

○

×

CONSTRAINTS

○

○

−

−

○

○

○

○

×

CONSTRUCTOR

−

○

−

−

○

○

○

○

●

CONTIGUOUS

−

−

○

−

○

○

○

○

●

CONTINUE

○

○

○

−

○

○

○

○

×

CONVERT

○

−

−

−

○

○

○

○

×

CORR

−

−

−

○

−

−

−

−

×

CORRESPONDING

○

○

−

−

○

○

○

○

×

COUNT

○

−

○

○

○

○

○

○

×

COUNT_FLOAT

−

−

−

−

−

○

○

○

●

COVAR_POP

−

−

−

○

−

−

−

−

×

COVAR_SAMP

−

−

−

○

−

−

−

−

×

CREATE

○

○

○

○

○

○

○

○

×

CROSS

○

○

−

○

○

○

○

○

×

CUBE

−

○

−

○

−

−

−

−

×

CUME_DIST

−

−

−

○

−

−

−

−

×

CURAID

−

−

○

−

○

○

○

○

●

CURRENT

○

○

○

○

○

○

○

○

×

CURRENT_DATE

○

○

−

○

○

○

○

○

×

CURRENT_DEFAULT_TRANSFORM_GROUP

−

○

−

−

−

−

−

−

×

CURRENT_PATH

−

○

−

−

−

−

−

−

×

CURRENT_ROLL

−

○

−

−

−

−

−

−

×

CURRENT_TIME

○

○

−

○

○

○

○

○

×

CURRENT_TIMESTAMP

○

○

−

○

○

○

○

○

×

CURRENT_TRANSFORM_GROUP_FOR_TYPE

−

○

−

−

−

−

−

−

×

CURRENT_USER

○

○

−

○

○

○

○

○

×

CURSOR

○

○

○

○

○

○

○

○

×

CYCLE

−

○

−

−

○

○

○

○

●

表A‒4　SQLの予約語（D）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

DATA

−

○

○

○

○

○

○

○

●

DATABASE

−

−

○

−

○

○

○

○

●

DATE

○

○

○

○

○

○

○

○

×

DAY

○

○

−

○

○

○

○

○

×

DAYS

−

−

−

○

○

○

○

○

●

DBA

−

−

○

○

○

○

○

○

●

DEALLOCATE

○

○

○

−

○

○

○

○

×

DEC

○

○

○

○

○

○

○

○

×

DECIMAL

○

○

○

○

○

○

○

○

×

DECLARE

○

○

○

○

○

○

○

○

×

DEFAULT

○

○

○

○

○

○

○

○

×

DEFER

−

−

○

−

○

○

○

○

●

DEFERRABLE

○

○

−

−

○

○

○

○

×

DEFERRED

○

○

○

−

○

○

○

○

×

DELETE

○

○

○

○

○

○

○

○

×

DEMOTING

−

−

○

−

○

○

○

○

●

DENSE_RANK

−

−

−

○

−

−

−

−

×

DEPTH

−

○

−

−

○

○

○

○

●

DEREF

−

○

−

−

−

−

−

−

×

DESC

○

○

○

○

○

○

○

○

×

DESCRIBE

○

○

○

○

○

○

○

○

×

DESCRIPTION

−

−

○

−

−

−

−

−

×

DESCRIPTOR

○

○

○

○

○

○

○

○

×

DESTROY

−

○

−

−

−

−

−

−

×

DESTRUCTOR

−

○

−

−

−

−

−

−

×

DETERMINISTIC

−

○

−

−

−

−

−

−

×

DEVICE

−

−

○

−

○

○

○

○

●

DIAGNOSTICS

○

○

−

○

○

○

○

○

×

DICTIONARY

−

○

−

−

○

○

○

○

●

DIGITS

−

−

−

○

○

○

○

○

●

DIRECT

−

−

○

−

○

○

○

○

●

DISCONNECT

○

○

○

○

○

○

○

○

×

DISPLAY

−

−

○

−

−

−

−

−

×

DISTINCT

○

○

○

○

○

○

○

○

×

DO

−

○

−

○

○

○

○

○

●

DOMAIN

○

○

−

−

−

−

−

−

×

DOUBLE

○

○

○

○

○

○

○

○

×

DOUBLE_PRECISION

−

−

○

−

○

○

○

○

●

DROP

○

○

○

○

○

○

○

○

×

DYNAMIC

−

○

−

−

−

−

−

−

×

表A‒5　SQLの予約語（E）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

EACH

−

○

−

○

○

○

○

○

●

EDIT

−

−

○

−

○

○

○

○

●

ELSE

○

○

−

○

○

○

○

○

×

ELSEIF

−

○

−

○

○

○

○

○

●

ENCRYPT

−

−

−

−

−

○

○

○

●

END

○

○

○

○

○

○

○

○

×

END-EXEC

○

○

−

−

−

−

−

−

×

EQUALS

−

○

−

−

○

○

○

○

●

ESCAPE

○

○

○

○

○

○

○

○

×

ESTIMATED

−

−

○

−

○

○

○

○

●

EVERY

−

○

−

○

−

−

−

−

×

EXCEPT

○

○

−

○

○

○

○

○

×

EXCEPTION

○

○

−

○

○

○

○

○

×

EXCLUSIVE

−

−

−

○

○

○

○

○

●

EXEC

○

○

○

−

○

○

○

○

×

EXECUTE

○

○

○

○

○

○

○

○

×

EXISTS

○

−

○

○

○

○

○

○

×

EXIT

−

○

−

−

−

○

○

○

●

EXTERN

−

−

○

−

○

○

○

○

●

EXTERNAL

○

○

−

−

○

○

○

○

×

EXTRACT

○

−

−

−

○

○

○

○

×

表A‒6　SQLの予約語（F）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

FALSE

○

○

−

○

○

○

○

○

×

FETCH

○

○

○

○

○

○

○

○

×

FILE

−

−

○

−

○

○

○

○

●

FILTER

−

−

−

○

−

−

−

−

×

FIRST

○

○

−

−

○

○

○

○

×

FIX

−

−

−

○

○

○

○

○

●

FIXED

−

−

○

−

○

○

○

○

●

FLAT

−

−

−

○

○

○

○

○

●

FLOAT

○

○

○

○

○

○

○

○

×

FOR

○

○

○

○

○

○

○

○

×

FORCE

−

−

○

○

○

○

○

○

●

FOREIGN

○

○

−

○

○

○

○

○

×

FOUND

○

○

○

−

○

○

○

○

×

FREE

−

○

−

−

−

○

○

○

●

FROM

○

○

○

○

○

○

○

○

×

FULL

○

○

−

○

○

○

○

○

×

FUNCTION

−

○

−

○

○

○

○

○

●

表A‒7　SQLの予約語（G）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

GENERAL

−

○

−

−

○

○

○

○

●

GET

○

○

○

○

○

○

○

○

×

GET_JAVA_STORED_ROUTINE_SOURCE

−

−

−

−

○

○

○

○

●

GLOBAL

○

○

−

−

○

○

○

○

×

GO

○

○

○

−

○

○

○

○

×

GOTO

○

○

○

−

○

○

○

○

×

GRANT

○

○

○

○

○

○

○

○

×

GROUP

○

○

○

○

○

○

○

○

×

GROUPING

−

○

−

○

−

−

−

−

×

表A‒8　SQLの予約語（H）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

HANDLER

−

○

−

−

−

○

○

○

●

HASH

−

−

○

−

○

○

○

○

●

HAVING

○

○

○

○

○

○

○

○

×

HELP

−

−

○

−

○

○

○

○

●

HEX

−

−

−

○

○

○

○

○

●

HOST

−

○

−

−

−

−

−

−

×

HOUR

○

○

−

○

○

○

○

○

×

HOURS

−

−

−

○

○

○

○

○

●

HUGE

−

−

○

−

○

○

○

○

●

表A‒9　SQLの予約語（I）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

IDENTIFIED

−

−

−

○

○

○

○

○

●

IDENTITY

○

○

−

−

○

○

○

○

×

IF

−

○

−

○

○

○

○

○

●

IGNORE

−

○

−

−

○

○

○

○

●

IMMEDIATE

○

○

○

○

○

○

○

○

×

IN

○

○

○

○

○

○

○

○

×

INDEX

−

−

○

○

○

○

○

○

●

INDICATOR

○

○

○

○

○

○

○

○

×

INITIALIZE

−

○

−

−

−

−

−

−

×

INITIALLY

○

○

−

−

○

○

○

○

×

INNER

○

○

−

○

○

○

○

○

×

INOUT

−

○

−

○

○

○

○

○

●

INPUT

○

○

○

−

○

○

○

○

×

INSENSITIVE

○

−

−

−

○

○

○

○

×

INSERT

○

○

○

○

○

○

○

○

×

INT

○

○

○

○

○

○

○

○

×

INTEGER

○

○

○

○

○

○

○

○

×

INTERSECT

○

○

−

○

○

○

○

○

×

INTERVAL

○

○

−

○

○

○

○

○

×

INTO

○

○

○

○

○

○

○

○

×

IS

○

○

○

○

○

○

○

○

×

ISOLATION

○

○

−

○

○

○

○

○

×

IS_USER_CONTAINED_IN_HDS_GROUP

−

−

−

−

○

○

○

○

●

ITERATE

−

○

−

○

−

−

−

−

×

表A‒10　SQLの予約語（J）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

JOIN

○

○

−

○

○

○

○

○

×

表A‒11　SQLの予約語（K）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

KEY

○

○

○

○

○

○

○

○

×

表A‒12　SQLの予約語（L）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

LABEL

−

−

−

○

−

−

−

−

×

LANGUAGE

○

○

○

○

○

○

○

○

×

LARGE

−

○

−

○

○

○

○

○

●

LAST

○

○

−

−

○

○

○

○

×

LATERAL

−

○

−

−

−

−

−

−

×

LEADING

○

○

○

○

○

○

○

○

×

LEAVE

−

○

−

○

○

○

○

○

●

LEFT

○

○

−

−

○

○

○

○

×

LENGTH

−

−

○

○

○

○

○

○

●

LESS

−

○

−

−

○

○

○

○

●

LEVEL

○

○

○

○

○

○

○

○

×

LIKE

○

○

○

○

○

○

○

○

×

LIMIT

−

○

−

−

○

○

○

○

●

LINES

−

−

○

−

○

○

○

○

●

LINK

−

−

○

−

○

○

○

○

●

LIST

−

−

−

○

○

○

○

○

●

LOCAL

○

○

−

−

○

○

○

○

×

LOCALTIME

−

○

−

−

−

−

−

−

×

LOCALTIMESTAMP

−

○

−

−

−

−

−

−

×

LOCATOR

−

○

−

−

−

○

○

○

●

LOCK

−

−

−

○

○

○

○

○

●

LOCKS

−

−

○

−

○

○

○

○

●

LOGID

−

−

○

−

○

○

○

○

●

LOGNAME

−

−

○

−

○

○

○

○

●

LONG

−

−

○

○

○

○

○

○

●

LOOP

−

○

−

○

○

○

○

○

●

LOWER

○

−

−

○

○

○

○

○

×

表A‒13　SQLの予約語（M）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

MAP

−

○

−

−

−

−

−

−

×

MATCH

○

○

−

−

○

○

○

○

×

MAX

○

−

○

○

○

○

○

○

×

MAXUSAGES

−

−

−

−

○

○

○

○

●

MCHAR

−

−

−

○

○

○

○

○

●

MICROSECOND

−

−

−

○

−

−

−

−

×

MICROSECONDS

−

−

−

○

−

−

−

−

×

MIN

○

−

○

○

○

○

○

○

×

MINUTE

○

○

−

○

○

○

○

○

×

MINUTES

−

−

−

○

○

○

○

○

●

MOD

−

−

−

○

○

○

○

○

●

MODE

−

−

○

○

○

○

○

○

●

MODIFIES

−

○

−

−

−

−

−

−

×

MODIFY

−

○

−

−

○

○

○

○

●

MODULE

○

○

○

○

○

○

○

○

×

MONTH

○

○

−

○

○

○

○

○

×

MONTHS

−

−

−

○

○

○

○

○

●

MOVE

−

−

○

−

○

○

○

○

●

MVARCHAR

−

−

−

○

○

○

○

○

●

表A‒14　SQLの予約語（N）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

NAMES

○

○

−

−

○

○

○

○

×

NATIONAL

○

○

−

○

○

○

○

○

×

NATURAL

○

○

−

−

○

○

○

○

×

NCHAR

○

○

−

○

○

○

○

○

×

NCLOB

−

○

−

−

−

−

−

−

×

NESTING

−

○

−

−

−

−

−

−

×

NEW

−

○

−

○

○

○

○

○

●

NEXT

○

○

−

−

○

○

○

○

×

NO

○

○

−

○

○

○

○

○

×

NONE

−

○

−

−

○

○

○

○

●

NONLOCAL

−

−

−

○

−

−

−

−

×

NOT

○

○

○

○

○

○

○

○

×

NOWAIT

−

−

−

○

○

○

○

○

●

NULL

○

○

○

○

○

○

○

○

×

NULLABLE

−

−

○

−

○

○

○

○

●

NULLIF

○

−

−

○

○

○

○

○

×

NUMERIC

○

○

○

○

○

○

○

○

×

NVARCHAR

−

−

−

○

○

○

○

○

●

表A‒15　SQLの予約語（O）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

OBJECT

−

○

−

−

○

○

○

○

●

OCTET_LENGTH

○

−

−

−

○

○

○

○

×

OF

○

○

○

○

○

○

○

○

×

OFF

−

○

−

−

○

○

○

○

●

OFFSET

−

−

○

−

○

○

○

○

●

OID

−

−

−

−

○

○

○

○

●

OLD

−

○

−

○

○

○

○

○

●

ON

○

○

○

○

○

○

○

○

×

ONLY

○

○

○

○

○

○

○

○

×

OPEN

○

○

○

○

○

○

○

○

×

OPERATION

−

○

−

−

○

○

○

○

●

OPERATORS

−

−

−

−

○

○

○

○

●

OPTION

○

○

○

○

○

○

○

○

×

OPTIMIZE

−

−

−

○

○

○

○

○

●

OR

○

○

○

○

○

○

○

○

×

ORDER

○

○

○

○

○

○

○

○

×

ORDINALITY

−

○

−

−

−

−

−

−

×

OTHERS

−

−

−

−

○

○

○

○

●

OUT

−

○

−

○

○

○

○

○

●

OUTER

○

○

−

○

○

○

○

○

×

OUTPUT

○

○

○

−

○

○

○

○

×

OVER

−

−（2001年以降○に変更）

−

○

−

○

○

○

●

OVERFLOW

−

−

○

−

○

○

○

○

●

OVERLAPS

○

−

−

−

−

−

−

−

×

OVERWRITE

−

−

○

−

−

−

−

−

×

OWN

−

−

−

○

○

○

○

○

●

OWNER

−

−

○

−

−

−

−

−

×

表A‒16　SQLの予約語（P）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

PAD

○

○

−

−

○

○

○

○

×

PAGE

−

−

−

−

○

○

○

○

●

PARAMETER

−

○

−

−

−

−

−

−

×

PARAMETERS

−

○

−

−

○

○

○

○

●

PARTIAL

○

○

−

−

○

○

○

○

×

PARTITION

−

−

−

○

−

−

−

−

×

PARTITIONED

−

−

−

−

○

○

○

○

●

PATH

−

○

○

−

−

−

−

−

×

PCTFREE

−

−

−

○

○

○

○

○

●

PENDANT

−

−

−

−

○

○

○

○

●

PERCENT_RANK

−

−

−

○

−

−

−

−

×

PERCENTILE_CONT

−

−

−

○

−

−

−

−

×

PERCENTILE_DISC

−

−

−

○

−

−

−

−

×

PIC

−

−

○

−

○

○

○

○

●

PICTURE

−

−

○

○

○

○

○

○

●

POSITION

○

−

−

−

○

○

○

○

×

POSTFIX

−

○

−

−

−

−

−

−

×

PREALLOCATED

−

−

○

−

○

○

○

○

●

PRECISION

○

○

○

○

○

○

○

○

×

PREFERRED

−

−

○

−

○

○

○

○

●

PREFIX

−

○

−

−

−

−

−

−

×

PREORDER

−

○

−

−

○

○

○

○

●

PREPARE

○

○

○

○

○

○

○

○

×

PRESERVE

○

○

−

−

○

○

○

○

×

PRIMARY

○

○

○

○

○

○

○

○

×

PRIMLEGES

−

−

○

−

−

−

−

−

×

PRIOR

○

○

−

−

○

○

○

○

×

PRIVATE

−

−

○

○

○

○

○

○

●

PRIVILEGES

○

○

−

○

○

○

○

○

×

PROCEDURE

○

○

○

○

○

○

○

○

×

PROGRAM

−

−

−

○

○

○

○

○

●

PROTECTED

−

−

−

○

○

○

○

○

●

PUBLIC

○

○

○

○

○

○

○

○

×

PURGE

−

−

−

○

○

○

○

○

●

表A‒17　SQLの予約語（R）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

RANDOM

−

−

−

−

○

○

○

○

●

RANGE

−

−

−

○

−

−

−

−

×

RANK

−

−

−

○

−

−

−

−

×

RD

−

−

−

−

○

○

○

○

●

RDAREA

−

−

−

○

○

○

○

○

●

RDNODE

−

−

−

○

−

−

−

−

×

READ

○

○

○

○

○

○

○

○

×

READS

−

○

−

−

−

−

−

−

×

REAL

○

○

○

○

○

○

○

○

×

RECOMPILE

−

−

−

−

○

○

○

○

●

RECOVERABLE

−

−

○

−

○

○

○

○

●

RECOVERY

−

−

−

−

○

○

○

○

●

RECURSIVE

−

○

−

○

○

○

○

○

●

REDO

−

○

−

−

−

−

−

−

×

REF

−

○

−

−

○

○

○

○

●

REFERENCES

○

○

○

○

○

○

○

○

×

REFERENCING

−

○

−

○

○

○

○

○

●

REGLIKE

−

−

○

−

○

○

○

○

●

REGR_AVGX

−

−

−

○

−

−

−

−

×

REGR_AVGY

−

−

−

○

−

−

−

−

×

REGR_COUNT

−

−

−

○

−

−

−

−

×

REGR_INTERCEPT

−

−

−

○

−

−

−

−

×

REGR_R2

−

−

−

○

−

−

−

−

×

REGR_SLOPE

−

−

−

○

−

−

−

−

×

REGR_SXX

−

−

−

○

−

−

−

−

×

REGR_SXY

−

−

−

○

−

−

−

−

×

REGR_SYY

−

−

−

○

−

−

−

−

×

RELATIVE

○

○

−

−

○

○

○

○

×

RELEASE

−

−

−

○

○

○

○

○

●

RELEASING

−

−

○

−

○

○

○

○

●

RENAME

−

−

○

−

○

○

○

○

●

REPEAT

−

○

−

○

−

−

−

−

×

RESIGNAL

−

○

−

−

○

○

○

○

●

RESTART

−

−

○

−

○

○

○

○

●

RESTRICT

○

○

−

−

○

○

○

○

×

RESULT

−

○

−

−

−

−

−

−

×

RETURN

−

○

−

○

○

○

○

○

●

RETURNS

−

○

−

○

○

○

○

○

●

REVOKE

○

○

○

○

○

○

○

○

×

RIGHT

○

○

−

−

○

○

○

○

×

ROLE

−

○

−

−

○

○

○

○

●

ROLLBACK

○

○

○

○

○

○

○

○

×

ROLLUP

−

○

−

○

−

−

−

−

×

ROOT

−

−

○

−

○

○

○

○

●

ROUTINE

−

○

−

○

○

○

○

○

●

ROW

−

○

−

○

○

○

○

○

●

ROW_NUMBER

−

−

−

○

−

−

−

−

×

ROWID

−

−

○

○

○

○

○

○

●

ROWS

○

○

−

○

○

○

○

○

×

表A‒18　SQLの予約語（S）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

SAVEPOINT

−

○

−

−

○

○

○

○

●

SCALE

−

−

○

−

○

○

○

○

●

SCAN

−

−

○

−

○

○

○

○

●

SCATTERED

−

−

○

−

−

−

−

−

×

SCHEMA

○

○

○

○

○

○

○

○

×

SCHEMAS

−

−

○

−

○

○

○

○

●

SCOPE

−

○

−

−

○

○

○

○

●

SCROLL

○

○

−

−

○

○

○

○

×

SD

−

−

−

−

○

○

○

○

●

SEARCH

−

○

−

−

○

○

○

○

●

SECOND

○

○

−

○

○

○

○

○

×

SECONDS

−

−

−

○

○

○

○

○

●

SECTION

○

○

○

−

○

○

○

○

×

SEGMENT

−

−

○

−

○

○

○

○

●

SELECT

○

○

○

○

○

○

○

○

×

SENSITIVE

−

−

−

−

○

○

○

○

●

SEPARATE

−

−

○

−

○

○

○

○

●

SEPARATOR

−

−

○

−

○

○

○

○

●

SEQUENCE

−

○

−

−

○

○

○

○

●

SESSION

○

○

−

−

○

○

○

○

×

SESSION_USER

○

○

−

−

○

○

○

○

×

SET

○

○

○

○

○

○

○

○

×

SETS

−

○

−

−

−

−

−

−

×

SFLIKE

−

−

−

−

○

○

○

○

●

SHARE

−

−

−

○

○

○

○

○

●

SHLIKE

−

−

○

−

−

−

−

−

×

SHORT

−

−

○

−

○

○

○

○

●

SIGN

−

−

○

−

−

−

−

−

×

SIGNAL

−

○

−

○

○

○

○

○

●

SIMILAR

−

−

−

−

○

○

○

○

●

SIZE

○

○

○

−

○

○

○

○

×

SLOCK

−

−

○

−

○

○

○

○

●

SMALLFLT

−

−

−

○

○

○

○

○

●

SMALLINT

○

○

○

○

○

○

○

○

×

SOME

○

○

○

○

○

○

○

○

×

SPACE

○

○

−

−

○

○

○

○

×

SPECIFIC

−

○

−

○

−

−

−

−

×

SPECIFICTYPE

−

○

−

−

−

−

−

−

×

SPLIT

−

−

○

−

○

○

○

○

●

SQL

○

○

○

−

○

○

○

○

×

SQL_STANDARD

−

−

○

−

○

○

○

○

●

SQLCODE

○

−

−

○

○

○

○

○

×

SQLCODE_OF_LAST_CONDITION

−

−

−

−

−

−

○

○

●

SQLCODE_TYPE

−

−

○

−

○

○

○

○

●

SQLCOUNT

−

−

−

○

○

○

○

○

●

SQLDA

−

−

−

○

○

○

○

○

●

SQLERRM

−

−

−

○

○

○

○

○

●

SQLERRM_OF_LAST_CONDITION

−

−

−

−

−

−

○

○

●

SQLERRMC

−

−

−

○

○

○

○

○

●

SQLERRML

−

−

−

○

○

○

○

○

●

SQLERROR

○

−

○

−

○

○

○

○

×

SQLEXCEPTION

−

○

−

−

○

○

○

○

●

SQLNAME

−

−

−

○

○

○

○

○

●

SQLSTATE

○

○

−

○

○

○

○

○

×

SQLWARN

−

−

−

○

○

○

○

○

●

SQLWARNING

−

○

○

−

○

○

○

○

●

START

−

○

○

−

○

○

○

○

●

STATE

−

○

−

−

−

−

−

−

×

STATEMENT

−

○

−

−

−

−

−

−

×

STATIC

−

○

○

−

○

○

○

○

●

STDDEV_POP

−

−

−

○

−

−

−

−

×

STOP

−

−

○

−

○

○

○

○

●

STOPPING

−

−

−

○

○

○

○

○

●

STRUCTURE

−

○

−

−

○

○

○

○

●

SUBSTR

−

−

−

○

○

○

○

○

●

SUBSTRING

○

−

−

−

○

○

○

○

×

SUM

○

−

○

○

○

○

○

○

×

SUPPRESS

−

−

−

−

○

○

○

○

●

SYNONYM

−

−

○

−

○

○

○

○

●

SYSTEM_USER

○

○

−

−

○

○

○

○

×

表A‒19　SQLの予約語（T）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

TABLE

○

○

○

○

○

○

○

○

×

TABLES

−

−

○

−

−

−

−

−

×

TEMPORARY

○

○

−

−

○

○

○

○

×

TERMINATE

−

○

−

−

−

−

−

−

×

TEST

−

−

−

−

○

○

○

○

●

TEXT

−

−

○

−

○

○

○

○

●

THAN

−

○

−

−

−

−

−

−

×

THEN

○

○

−

○

○

○

○

○

×

THERE

−

−

−

−

○

○

○

○

●

TIME

○

○

○

○

○

○

○

○

×

TIMESTAMP

○

○

−

○

○

○

○

○

×

TIMESTAMP_FORMAT

−

−

−

−

−

○

○

○

●

TIMEZONE_HOUR

○

○

−

−

○

○

○

○

×

TIMEZONE_MINUTE

○

○

−

−

○

○

○

○

×

TO

○

○

○

○

○

○

○

○

×

TRAILING

○

○

−

○

○

○

○

○

×

TRANSACTION

○

○

○

−

○

○

○

○

×

TRANSLATE

○

−

−

−

○

○

○

○

×

TRANSLATION

○

○

−

−

○

○

○

○

×

TREAT

−

○

−

−

○

○

○

○

●

TRIGGER

−

○

−

○

○

○

○

○

●

TRIM

○

−

−

○

○

○

○

○

×

TRUE

○

○

−

○

○

○

○

○

×

TRUNCATE※

−

−

−

−

−

−

−

○

×

TYPE

−

○

○

○

○

○

○

○

●

注※

ISO SQL 2008での予約語です。

表A‒20　SQLの予約語（U）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

UAMT

−

−

○

−

○

○

○

○

●

UBINBUF

−

−

○

−

○

○

○

○

●

UCHAR

−

−

○

−

○

○

○

○

●

UDATE

−

−

○

−

○

○

○

○

●

UHAMT

−

−

○

−

−

−

−

−

×

UHANT

−

−

−

−

○

○

○

○

●

UHDATE

−

−

○

−

○

○

○

○

●

UNBOUNDED

−

−

−

○

−

−

−

−

×

UNDER

−

○

−

○

○

○

○

○

●

UNDO

−

○

−

−

−

−

−

−

×

UNIFY_2000

−

−

○

−

○

○

○

○

●

UNION

○

○

○

○

○

○

○

○

×

UNIONALL

−

−

−

−

○

○

○

○

●

UNIQUE

○

○

○

○

○

○

○

○

×

UNKNOWN

○

○

−

○

○

○

○

○

×

UNLIMITED

−

−

○

−

○

○

○

○

●

UNLOCK

−

−

○

−

○

○

○

○

●

UNTIL

−

○

−

○

○

○

○

○

●

UNNEST

−

○

−

−

−

−

−

−

×

UPDATE

○

○

○

○

○

○

○

○

×

UPPER

○

−

−

○

○

○

○

○

×

USAGE

○

○

○

○

○

○

○

○

×

USE

−

−

○

−

○

○

○

○

●

USER

○

○

○

○

○

○

○

○

×

USER_GROUP

−

−

−

○

−

−

−

−

×

USER_LEVEL

−

−

−

○

−

−

−

−

×

USING

○

○

○

○

○

○

○

○

×

UTIME

−

−

○

−

○

○

○

○

●

UTXTBUF

−

−

○

−

○

○

○

○

●

表A‒21　SQLの予約語（V）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

VALUE

○

○

○

○

○

○

○

○

×

VALUES

○

○

○

○

○

○

○

○

×

VAR_POP

−

−

−

○

−

−

−

−

×

VAR_SAMP

−

−

−

○

−

−

−

−

×

VARCHAR

○

○

−

○

○

○

○

○

×

VARCHAR_FORMAT

−

−

−

−

−

○

○

○

●

VARIABLE

−

○

−

−

○

○

○

○

●

VARYING

○

○

−

○

○

○

○

○

×

VIEW

○

○

○

○

○

○

○

○

×

VIRTUAL

−

−

−

−

○

○

○

○

●

VISIBLE

−

−

−

−

○

○

○

○

●

VOLATILE

−

−

○

−

○

○

○

○

●

VOLUME

−

−

○

−

○

○

○

○

●

VOLUMES

−

−

○

−

○

○

○

○

●

表A‒22　SQLの予約語（W）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

WAIT

−

−

−

○

○

○

○

○

●

WHEN

○

○

−

○

○

○

○

○

×

WHENEVER

○

○

○

−

○

○

○

○

×

WHERE

○

○

○

○

○

○

○

○

×

WHILE

−

○

−

○

○

○

○

○

●

WINDOW

−

−

−

○

−

−

−

−

×

WITH

○

○

○

○

○

○

○

○

×

WITHIN

−

−

−

○

−

−

−

−

×

WITHOUT

−

○

−

○

○

○

○

○

●

WORK

○

○

○

○

○

○

○

○

×

WRITE

○

○

○

−

○

○

○

○

×

表A‒23　SQLの予約語（X）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

XLIKE

−

−

−

−

○

○

○

○

●

XLOCK

−

−

○

−

○

○

○

○

●

XML

−

−

−

−

−

−

○

○

●

XMLAGG

−

−

−

−

−

−

○

○

●

XMLEXISTS

−

−

−

−

−

−

○

○

●

XMLPARSE

−

−

−

−

−

−

○

○

●

XMLQUERY

−

−

−

−

−

−

○

○

●

XMLSERIALIZE

−

−

−

−

−

−

○

○

●

表A‒24　SQLの予約語（Y）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

YEAR

○

○

−

○

○

○

○

○

×

YEARS

−

−

−

○

○

○

○

○

●

表A‒25　SQLの予約語（Z）

予約語

SQL92

SQL99

UNIFY

XDM/RD

HiRDB

(V6)

HiRDB

(V7)

HiRDB

(V8)

HiRDB

(V9)

JDBC

ZONE

−

○

−

−

−

−

−

−

×

付録A.2　HiRDBの予約語

HiRDBが使用する予約語は，認可識別子や表識別子などの名前として定義できません。

HiRDBの予約語を次の表に示します。

表A‒26　HiRDBの予約語

予約語

定義できない名称

ALL

認可識別子，表識別子，RDエリア名

HiRDB※1

認可識別子

MASTER※1※2

認可識別子

PUBLIC

認可識別子

SQL及びsqlで始まる名称

埋込み変数，標準変数名，ホスト識別子

注※1

Type4 JDBC DatabaseMetaDataインタフェースのgetSQLKeywordsメソッドが返却するキーワードの対象です。

注※2

データディクショナリ表，及びプラグインが提供する次のリソースの認可識別子で使用します。

ユーザ定義型

インデクス型

関数

付録A.3　SQL予約語削除機能で削除できる予約語

SQL予約語削除機能で削除できる予約語，及び削除した場合に使用できなくなる機能を次の表に示します。

削除できる予約語（A）

削除できる予約語（B）

削除できる予約語（C）

削除できる予約語（D）

削除できる予約語（E）

削除できる予約語（F）

削除できる予約語（G）

削除できる予約語（H）

削除できる予約語（I）

削除できる予約語（L）

削除できる予約語（M）

削除できる予約語（N）

削除できる予約語（O）

削除できる予約語（P）

削除できる予約語（R）

削除できる予約語（S）

削除できる予約語（T）

削除できる予約語（U）

削除できる予約語（V）

削除できる予約語（W）

削除できる予約語（X）

削除できる予約語（Y）

表中の凡例を次に示します。

−：予約語を削除しても使用できなくなる機能はありません。

表A‒27　削除できる予約語（A）

予約語

使用できなくなる機能

ABS

・スカラ関数ABS

ALLOCATE

・抽象データ型のLOB属性

・プラグイン

AMOUNT

−

ANDNOT

・リスト間の差集合

ANSI

−

ARRAY

・繰返し列　

ASSERTION

−

ASYNC

−

AUTO

−

表A‒28　削除できる予約語（B）

予約語

使用できなくなる機能

BASE

−

BEGIN

・ルーチン制御SQLの複合文

・ユーザ定義関数

BINARY

・データ型 BINARY，BINARY LARGE OBJECT

BIT_AND_TEST

・スカラ関数 BIT_ADN_TEST

BLOB

・データ型 BLOB

BOOLEAN

・データ型 BOOLEAN

BOTH

−

BREADTH

−

BTREE

−

BUFFER

−

BYTE

−

表A‒29　削除できる予約語（C）

予約語

使用できなくなる機能

CALL

・ストアドプロシジャ

・コマンド又はユティリティの実行

CASE

・CASE式

CAST

・CAST指定

COALESCE

・CASE略式

COLUMNS

−

COMPLETION

−

CONDITION

・ルーチン制御SQL 複合文の条件宣言

CONFIGURATION

−

CONST

−

CONSTRAINT

・参照制約

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY，DROP CONNECTION SECURITY）のIPアドレスによる接続制限

CONTIGUOUS

−

CORRESPONDING

−

COUNT_FLOAT

・集合関数 COUNT_FLOAT

CROSS

−

CURAID

−

CURRENT_DATE

・CURRENT_DATE値関数

・DEFAULT句

CURRENT_TIME

・CURRENT_TIME値関数

・DEFAULT句

CURRENT_TIMESTAMP

・CURRENT_TIMESTAMP値関数

・DEFAULT句

CURRENT_USER

−

CYCLE

CREATE SEQUENCE文の順序数生成子循環オプション

表A‒30　削除できる予約語（D）

予約語

使用できなくなる機能

DATA

・抽象データ型の削除

DATABASE

−

DATE

・データ型 DATE

・スカラ関数 DATE

・CURRENT_DATE値関数

・DEFAULT句

DAY

・データ型 INTERVAL YEAR TO DAY

・スカラ関数 DAY

・DAYによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のDAYによる設定

DAYS

・スカラ関数 DAYS

・DAYSによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のDAYSによる設定

DEFER

−

DEMOTING

−

DEPTH

−

DEVICE

−

DIAGNOSTICS

・埋込み言語文法 GET DIAGNOSTICS

DICTIONARY

−

DIGITS

・スカラ関数 DIGITS

DIRECT

−

DO

・ルーチン制御SQL FOR文，WHILE文

DOUBLE_PRECISION

−

表A‒31　削除できる予約語（E）

予約語

使用できなくなる機能

EACH

・トリガ

EDIT

−

ELSE

・ルーチン制御SQL IF文

ELSEIF

・ルーチン制御SQL IF文

ENCRYPT

−

END

・CASE式

・ルーチン制御SQL複合文，FOR文，IF文，WHILE文

EQUALS

−

ESTIMATED

−

EXCEPTION

・埋込み言語文法 GET DIAGNOSTICS

EXIT

・ルーチン制御SQL 複合文のハンドラ宣言

EXTERN

−

EXTRACT

−

表A‒32　削除できる予約語（F）

予約語

使用できなくなる機能

FALSE

・論理述語 IS FALSE

FIXED

−

FORCE

−

FREE

・操作系SQL FREE LOCATOR文

FULL

−

FUNCTION

・ユーザ定義関数

・プラグイン

・オブジェクト名による監査証跡絞込み

表A‒33　削除できる予約語（G）

予約語

使用できなくなる機能

GENERAL

−

GET

・埋込み言語文法 GET DIAGNOSTICS

GET_JAVA_STORED_ROUTINE_SOURCE

・スカラ関数 GET_JAVA_STORED_ROUTINE_SOURCE

表A‒34　削除できる予約語（H）

予約語

使用できなくなる機能

HANDLER

・ルーチン制御SQLハンドラ宣言

HELP

−

HEX

・スカラ関数 HEX

HOUR

・データ型 INTERVAL HOUR TO SECOND

・スカラ関数 HOUR

・HOURによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のHOURによる設定

HOURS

・HOURSによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のHOURSによる設定

HUGE

−

表A‒35　削除できる予約語（I）

予約語

使用できなくなる機能

IF

・ルーチン制御SQL IF文

IGNORE

−

INNER

・結合表 INNER JOIN

INOUT

・ストアドプロシジャ

INTERSECT

−

INTERVAL

・データ型 INTERVAL HOUR TO SECOND，INTERVAL YEAR TO DAY

・順序数生成子定義（CREATE SEQUENCE文）のログ出力間隔オプション

ISOLATION

・SQLコンパイルオプション ISOLATION

IS_USER_CONTAINED_IN_HDS_GROUP

・スカラ関数 IS_USER_CONTAINED_IN_HDS_GROUP

表A‒36　削除できる予約語（L）

予約語

使用できなくなる機能

LARGE

・データ型 LARGE DECIMAL，BINARY LARGE OBJECT

LEADING

−

LEAVE

・ルーチン制御SQL LEAVE文

LENGTH

・スカラ関数 LENGTH

・SQLコンパイルオプション SUBSTR LENGTH

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）のパスワード文字制限強化でのパスワードの最小許容バイト数の設定

LESS

−

LEVEL

・SQLコンパイルオプション OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL

LIMIT

・LIMIT句

LINES

−

LINK

−

LOCATOR

−

LOCKS

−

LOGID

−

LOGNAME

−

LOOP

−

LOWER

・スカラ関数 LOWER

表A‒37　削除できる予約語（M）

予約語

使用できなくなる機能

MAXUSAGES

−

MINUTE

・スカラ関数 MINUTE

・MINUTEによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のMINUTEによる設定

MINUTES

・MINUTESによるラベル付き間隔の指定

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）の連続認証失敗回数制限での連続認証失敗アカウントロック状態継続期間のMINUTESによる設定

MOD

・スカラ関数 MOD

MONTH

・スカラ関数 MONTH

・MONTHによるラベル付き間隔の指定

MONTHS

・MONTHSによるラベル付き間隔の指定

MOVE

−

表A‒38　削除できる予約語（N）

予約語

使用できなくなる機能

NATURAL

−

NEW

・トリガ

NOWAIT

・排他オプション NO WAIT

NULLIF

・CASE略式

表A‒39　削除できる予約語（O）

予約語

使用できなくなる機能

OFF

−

OID

−

OLD

・トリガ

ONLY

・改竄防止表

・読み込み専用のビュー表

・FOR READ ONLY

OPERATION

−

OPERATORS

−

OPTIMIZE

・SQLコンパイルオプション OPTIMIZE LEVEL，ADD OPTIMIZE LEVEL

OTHERS

−

OUT

・ストアドプロシジャ

OUTER

・結合表 OUTER JOIN

OVER

・ウィンドウ関数

OVERFLOW

−

OWN

−

表A‒40　削除できる予約語（P）

予約語

使用できなくなる機能

PARAMETERS

−

PENDANT

−

PIC

−

PICTURE

−

PREALLOCATED

−

PREFERRED

−

PREORDER

−

PRIVATE

・抽象データ型

PROTECTED

・抽象データ型

PURGE

・表の分割条件変更（定義系SQL ALTER TABLE WITHOUT PURGE）

・キーワードPURGEを使用したPURGE TABLE文

表A‒41　削除できる予約語（R）

予約語

使用できなくなる機能

RANDOM

−

RD

−

READ

・読み込み専用のビュー表

・FOR READ ONLY

RECOMPILE

−

RECOVERABLE

−

RECURSIVE

−

REF

−

REFERENCING

・トリガ

REGLIKE

−

RELEASING

−

RESTART

−

RETURN

・ユーザ定義関数

RETURNS

・ユーザ定義関数

RIGHT

−

ROLE

−

ROOT

−

ROUTINE

・ルーチンのリコンパイル

ROW

・行単位の排他 LOCK ROW

・トリガ

・行単位（ROW指定）インタフェース

ROWS

−

表A‒42　削除できる予約語（S）

予約語

使用できなくなる機能

SAVEPOINT

−

SCALE

−

SCAN

−

SCHEMAS

−

SCOPE

−

SD

−

SEARCH

−

SECOND

・データ INTERVAL HOUR TO SECOND

・スカラ関数 SECOND

・SECONDによるラベル付き間隔の指定

SECONDS

・SECONDSによるラベル付き間隔の指定

SENSITIVE

−

SEPARATE

−

SEPARATOR

−

SEQUENCE

・CREATE SEQUENCE文

・DROP SEQUENCE文

SESSION_USER

−

SFLIKE

−

SHORT

−

SIGNAL

・ルーチン制御SQL文 SIGNAL文

SIMILAR

・SIMILAR述語

・CONNECT関連セキュリティ機能（CREATE CONNECTION SECURITY）のパスワード文字制限強化でのパスワードを構成する文字種に関する設定

SLOCK

−

SQL_STANDARD

−

SQLCODE_OF_LAST_CONDITION

・値指定　SQLCODE_OF_LAST_CONDITION

SQLCODE_TYPE

−

SQLDA

−

SQLERRM

−

SQLERRM_OF_LAST_CONDITION

・値指定　SQLERRM_OF_LAST_CONDITION

SQLERRMC

−

SQLERRML

−

SQLEXCEPTION

−

SQLWARN

−

STATIC

−

STOP

−

STOPPING

−

SUBSTR

・スカラ関数 SUBSTR

・SQLコンパイルオプション SUBSTR LENGTH

SYSTEM_USER

−

表A‒43　削除できる予約語（T）

予約語

使用できなくなる機能

TEST

−

TEXT

−

THEN

・CASE式

・ルーチン制御SQL IF文

THERE

−

TIME

・データ型 TIME

・スカラ関数 TIME

・CURRENT_TIME値関数

・DEFAULT句 規定値

TIMESTAMP

・データ型 TIMESTAMP

・スカラ関数 TIMESTAMP

・CURRENT_TIMESTAMP値関数

・DEFAULT句 規定値

TIMESTAMP_FORMAT

・スカラ関数 TIMESTAMP_FORMAT

TRAILING

−

TRANSACTION

−

TREAT

−

TRIGGER

・トリガ　

・オブジェクト名による監査証跡絞込み

TRIM

−

TRUE

・論理述語 IS TRUE

TRUNCATE

・キーワードTRUNCATEを使用したPURGE TABLE文

TYPE

・抽象データ型

・プラグイン

・オブジェクト名による監査証跡絞込み

表A‒44　削除できる予約語（U）

予約語

使用できなくなる機能

UAMT

−

UBINBUF

−

UCHAR

−

UDATE

−

UHANT

−

UHDATE

−

UNDER

・抽象データ型

UNIFY_2000

−

UNIONALL

−

UNKNOWN

・論理述語 IS UNKNOWN

UNLIMITED

−

UNLOCK

−

UNTIL

・UNTIL DISCONNECT

UPPER

・スカラ関数 UPPER

USAGE

・順序数生成子定義（CREATE SEQUENCE文）のFOR PUBLIC USAGE

USE

−

UTIME

−

UTXTBUF

−

表A‒45　削除できる予約語（V）

予約語

使用できなくなる機能

VALUE

・スカラ関数 VALUE

・NEXT VALUE式

VARCHAR_FORMAT

・スカラ関数 VARCHAR_FORMAT

VARIABLE

−

VARYING

・データ型 CHARACTER VARYING，NATIONAL CHARACTER VARYING

VIRTUAL

−

VISIBLE

−

VOLATILE

−

VOLUME

−

VOLUMES

−

表A‒46　削除できる予約語（W）

予約語

使用できなくなる機能

WHEN

・CASE式

・トリガ

WHILE

・改竄防止表

・ルーチン制御SQL WHILE文

表A‒47　削除できる予約語（X）

予約語

使用できなくなる機能

XLOCK

−

XML

・XML型

・XMLコンストラクタ関数

XMLAGG

・XMLAGG集合関数

XMLEXISTS

・XMLEXISTS述語

XMLPARSE

・XMLPARSE関数

XMLQUERY

・XMLQUERY関数

XMLSERIALIZE

・XMLSERIALIZE関数

表A‒48　削除できる予約語（Y）

予約語

使用できなくなる機能

YEAR

・データ型 INTERVAL YEAR TO DAY

・スカラ関数 YEAR

・YEARによるラベル付き間隔の指定

YEARS

・YEARSによるラベル付き間隔の指定

付録B　SQL一覧

各SQLの種類と使用できるSQLの一覧を次の表に示します。「OLTP下」とは，OLTP下のX/Openに従ったUAPで，該当するSQLが使用できるかどうかを表しています。

表B‒1　SQL一覧（定義系SQL）

種類

機能

使用できるSQL

C言語

COBOL言語

OLTP下

ALTER INDEX

（インデクス定義変更）

インデクスの名称を変更します。

○

○

×

ALTER PROCEDURE

（手続きのSQLオブジェクトの再作成）

手続きのSQLオブジェクトを再作成します。

○

○

×

ALTER ROUTINE

（関数，手続き，及びトリガのSQLオブジェクトの再作成）

関数，手続き，及びトリガのSQLオブジェクトを再作成します。

○

○

×

ALTER TABLE

（表定義変更）

実表に新しい列を追加します。

データ型を変更します。

可変長データ型の列の最大長を大きくします。

データの格納されていない実表の列を削除します。

データの格納されていない実表のクラスタキーの一意性制約を変更します。

表や列の名称を変更します。

○

○

×

ALTER TRIGGER

（トリガのSQLオブジェクトの再作成）

トリガのSQLオブジェクトを再作成します。

○

○

×

COMMENT

（注釈付加）

表，及び列に注釈を付けます。

○

○

×

CREATE AUDIT

（監査対象イベントの定義）

監査証跡として記録する監査イベント及びその対象を定義します。

○

○

×

CREATE CONNECTION SECURITY

（CONNECT関連セキュリティ機能の定義）

CONNECT関連セキュリティ機能に関するセキュリティ項目を定義します。

○

○

×

CREATE 〔PUBLIC〕FUNCTION

（関数定義，パブリック関数定義）

関数，パブリック関数を定義します。

○

○

×

CREATE INDEX

（インデクス定義）

実表の列にインデクス（昇順，降順）を定義します。

○

○

×

CREATE 〔PUBLIC〕PROCEDURE

（手続き定義，パブリック手続き定義）

手続き，パブリック手続きを定義します。

○

○

×

CREATE SCHEMA

（スキーマ定義）

スキーマを定義します。

○

○

×

CREATE SEQUENCE

（順序数生成子定義）

順序数生成子を定義します。

○

○

×

CREATE TABLE

（表定義）

実表を定義します。

○

○

×

CREATE TRIGGER

（トリガ定義）

トリガを定義します。

○

○

×

CREATE TYPE

（型定義）

抽象データ型を定義します。

○

○

×

CREATE 〔PUBLIC〕 VIEW

（ビュー定義，パブリックビュー定義）

ビュー表，パブリックビュー表を定義します。

○

○

×

DROP AUDIT

（監査対象イベントの削除）

CREATE AUDITで定義した監査対象イベントと内容が一致する定義を，監査対象から削除します。

○

○

×

DROP CONNECTION SECURITY

（CONNECT関連セキュリティ機能の削除）

CONNECT関連セキュリティ機能に関するセキュリティ項目を削除します。

○

○

×

DROP DATA TYPE

（ユーザ定義型削除）

ユーザ定義型を削除します。

○

○

×

DROP〔PUBLIC〕FUNCTION

（関数削除，パブリック関数削除）

関数，パブリック関数を削除します。

○

○

×

DROP INDEX

（インデクス削除）

インデクスを削除します。

○

○

×

DROP〔PUBLIC〕PROCEDURE

（手続き削除，パブリック手続き削除）

手続き，パブリック手続きを削除します。

○

○

×

DROP SCHEMA

（スキーマ削除）

スキーマを削除します。

○

○

×

DROP SEQUENCE

（順序数生成子削除）

順序数生成子を削除します。

○

○

×

DROP TABLE

（表削除）

実表を削除します。さらに，その実表に対するインデクス，注釈，アクセス権限，ビュー表，及びトリガも削除します。

○

○

×

DROP TRIGGER

（トリガ削除）

トリガを削除します。

○

○

×

DROP〔PUBLIC〕VIEW

（ビュー表，パブリックビュー表の削除）

ビュー表，パブリックビュー表を削除します。

○

○

×

GRANT AUDIT

（監査人のパスワード変更）

監査人のパスワードを変更します。

○

○

×

GRANT CONNECT

（CONNECT権限定義）

ユーザにCONNECT権限を与えます。

○

○

×

GRANT DBA

（DBA権限定義）

ユーザにDBA権限を与えます。

○

○

×

GRANT RDAREA

（RDエリア利用権限定義）

ユーザにRDエリアの利用権限を与えます。

○

○

×

GRANT SCHEMA

（スキーマ定義権限定義）

ユーザにスキーマ定義権限を与えます。

○

○

×

GRANT アクセス権限

（アクセス権限定義）

ユーザにアクセス権限を与えます。

○

○

×

REVOKE CONNECT

（CONNECT権限削除）

ユーザに与えたCONNECT権限を取り消します。

○

○

×

REVOKE DBA

（DBA権限削除）

ユーザに与えたDBA権限を取り消します。

○

○

×

REVOKE RDAREA

（RDエリア利用権限削除）

ユーザに与えたRDエリアの利用権限を取り消します。

○

○

×

REVOKE SCHEMA

（スキーマ定義権限削除）

ユーザに与えたスキーマ定義権限を取り消します。

○

○

×

REVOKE アクセス権限

（アクセス権限削除）

ユーザに与えたアクセス権限を取り消します。

○

○

×

（凡例）

○：使用できます。

×：使用できません。

表B‒2　SQL一覧（操作系SQL）

種類

機能

使用できるSQL

C言語

COBOL言語

OLTP下

ALLOCATE CURSOR文

（カーソル割当て）

PREPARE文で前処理したSELECT文，又は手続きから返却された結果集合の組に対してカーソルを割り当てます。

○

○

○

ASSIGN LIST文

（リスト作成）

実表からリストを作成します。

○

○

○

CALL文※

（手続きの呼び出し）

手続きを呼び出します。

○

○

○

CLOSE文

（カーソルクローズ）

カーソルを閉じます。

○

○

○

DEALLOCATE PREPARE文

（前処理解除）

PREPARE文で前処理されたSQL文の割り当てを解放します。

○

○

○

DECLARE CURSOR

（カーソル宣言）

SELECT文の検索結果をFETCH文で1行ずつ取り出すために，カーソルを宣言します。

○

○

○

DELETE文

（行削除）

指定した探索条件を満足する行，又はカーソルが指している行を削除します。

○

○

○

準備可能動的DELETE文：位置付け

（前処理可能なカーソルを使用した行削除）

指定したカーソルが指している行を削除します。動的に実行する場合に使用します。

○

○

○

DESCRIBE文

（検索情報，入出力情報の受け取り）

PREPARE文で前処理したSQLの検索情報，出力情報，又は入力情報をSQL記述領域に返します。

○

○

○

DESCRIBE CURSOR文

（カーソルの検索情報の受け取り）

手続きから返却された結果集合を参照するカーソルの検索情報を，SQL記述領域に返します。

○

○

○

DESCRIBE TYPE文

（ユーザ定義型の定義情報の受け取り）

PREPARE文で前処理したSQLの検索項目情報に直接又は間接的に含まれるユーザ定義型の定義情報（各属性のデータコード，データ長など）をSQL記述領域に受け取ります。

○

○

○

DROP LIST文

（リスト削除）

リストを削除します。

○

○

○

EXECUTE文

（SQLの実行）

PREPARE文で前処理したSQLを実行します。

○

○

○

EXECUTE IMMEDIATE文

（SQLの前処理と実行）

文字列で与えられたSQLを，前処理して実行します。

○

○

○

FETCH文

（データの取り出し）

取り出す行を示すカーソルの位置を次の行に進め，その行の列の値をINTO句で指定した埋込み変数に読み込みます。

○

○

○

FREE LOCATOR文

（位置付け子の無効化）

位置付け子を無効にします。

○

○

○

INSERT文

（行挿入）

表に行を挿入します。直接，値を指定して一つの行を挿入できます。また，SELECT文を使用して一つ，又は複数の行を挿入できます。

○

○

○

OPEN文

（カーソルオープン）

カーソルを開きます。DECLARE CURSORで宣言したカーソル，又はALLOCATE CURSOR文で割り当てたカーソルを，検索結果の先頭の行の直前に位置づけて，検索結果を取り出せる状態にします。

○

○

○

PREPARE文

（SQLの前処理）

文字列で与えられたSQLを実行するための前処理をして，そのSQLに名称（SQL文識別子，又は拡張文名）を付けます。

○

○

○

PURGE TABLE文

（全行削除）

実表中のすべての行を削除します。

○

○

×

1行SELECT文

（1行検索）

表のデータを検索します。表から1行だけデータを取り出す場合は，カーソルを使用しないでデータを取り出す1行SELECT文を指定します。

○

○

○

動的SELECT文

（動的検索）

表のデータを検索します。動的SELECT文は，PREPARE文で前処理します。検索するときは，DECLARE CURSORによってカーソルを宣言するか，ALLOCATE CURSOR文によってカーソルを割り当ててから，そのカーソルを使用して検索結果を1行ずつ取り出します。

○

○

○

UPDATE文

（データ更新）

表の指定した探索条件を満足する行，又はカーソルが指している行の指定した列の値を更新します。

○

○

○

準備可能動的UPDATE文：位置付け

（前処理可能なカーソルを使用したデータ更新）

指定したカーソルが指している行の指定した列の値を更新します。動的に実行する場合に使用します。

○

○

○

代入文

（値の代入）

値を代入します。

○

○

○

（凡例）

○：使用できます。

×：使用できません。

注※

OLTP下で手続きを呼び出す場合，その手続き中にPURGE TABLE文，COMMIT文，又はROLLBACK文があると，手続きは実行できません。

表B‒3　SQL一覧（制御系SQL）

種類

機能

使用できるSQL

C言語

COBOL言語

OLTP下

CALL COMMAND文

（コマンド又はユティリティの実行）

HiRDBのコマンド又はユティリティを実行します。

○

○

○

COMMIT文

（トランザクションの正常終了）

現在のトランザクションを正常終了させて，同期点を設定し1コミットメント単位を生成します。そのトランザクションが更新したデータベースの内容を有効にします。

○

○

×

CONNECT文

（HiRDBとの接続）

HiRDBに認可識別子及びパスワードを連絡して，UAPがHiRDBを使用できる状態にします。

○

○

×

DISCONNECT文

（HiRDBとの切り離し）

現在のトランザクションを正常終了させて，同期点を設定し1コミットメント単位を生成します。その後，UAPをHiRDBから切り離します。

○

○

×

LOCK文

（表の排他制御）

指定した表に排他制御をします。

○

○

○

ROLLBACK文

（トランザクションの取り消し）

現在のトランザクションを取り消して，そのトランザクション内でのデータベースの更新を無効にします。

○

○

×

SET SESSION AUTHORIZATION文

（実行ユーザの変更）

接続中のユーザを変更します。

○

○

○

（凡例）

○：使用できます。

×：使用できません。

表B‒4　SQL一覧（埋込み言語）

種類

機能

使用できるSQL

C言語

COBOL言語

OLTP下

BEGIN DECLARE SECTION

（埋込みSQL開始宣言）

埋込み変数宣節の始まりを示します。埋込み変数宣言節には，SQL中で使用する埋込み変数，及び標識変数を指定します。

○

○

○

END DECLARE SECTION

（埋込みSQL終了宣言）

埋込み変数宣言節の終わりを示します。

○

○

○

ALLOCATE CONNECTION HANDLE

（接続ハンドルの割り当て）

複数接続機能を使用した環境で，UAPが使用する接続ハンドルを割り当てます。

○

○

×

FREE CONNECTION HANDLE（接続ハンドルの解放）

ALLOCATE CONNECTION HANDLEで割り当てた接続ハンドルを解放します。

○

○

×

DECLARE CONNECTION HANDLE SET

（使用する接続ハンドルの宣言）

複数接続機能を使用した環境で，UAP中のSQLが使用する接続ハンドルを宣言します。

○

○

○※1

DECLARE CONNECTION HANDLE UNSET

（使用する接続ハンドルの全解除）

この文以前にDECLARE CONNECTION HANDLE SETで指定した接続ハンドルの，使用の宣言をすべて解除します。

○

×

○※2

GET CONNECTION HANDLE

（接続ハンドル取得）

X/Open XAインタフェース環境下で複数接続機能を使用する場合，UAPが使用する接続ハンドルを割り当てます。

○

○

○

COPY

（登録集原文の引き込み）

登録集原文をソースプログラム中に引き込みます。

○

○

○

GET DIAGNOSTICS

（診断情報取得）

直前に実行したSQL文がCREATE PROCEDURE，又はCALL文の場合に，そのエラー情報を診断領域から取得します。

○

○

○

COMMAND EXECUTE

（UAPからのコマンド実行）

UAP中から，HiRDBのコマンド，及びOSのコマンドを実行します。

○

×

×

SQL先頭子

SQLの始まりを示します。

○

○

○

SQL終了子

SQLの終わりを示します。

○

○

○

WHENEVER

（埋込み例外宣言）

SQLの実行後にHiRDBがSQL連絡領域に設定したリターンコードによって，UAPの処理を宣言します。

○

○

○

SQLCODE変数

SQLの実行後にHiRDBから返されるリターンコードを受け取ります。

○

○

○

SQLSTATE変数

SQLの実行後にHiRDBから返されるリターンコードを受け取ります。

○

○

○

PDCNCTHDL型変数の宣言

複数接続機能を使用した環境で，使用する接続ハンドル型の変数を宣言します。

○

○

○

INSTALL JAR

（JARファイルの登録）

HiRDBサーバにJARファイルをインストールします。

○

×

×

REPLACE JAR

（JARファイルの再登録）

HiRDBサーバにJARファイルを上書きインストールします。

○

×

×

REMOVE JAR

（JARファイルの削除）

HiRDBサーバからJARファイルをアンインストールします。

○

×

×

INSTALL CLIB

（外部Cライブラリファイルの登録）

HiRDBサーバに外部Cライブラリファイルをインストールします。

○

×

×

REPLACE CLIB

（外部Cライブラリファイルの再登録）

HiRDBサーバに外部Cライブラリファイルを上書きインストールします。

○

×

×

REMOVE CLIB

（外部Cライブラリファイルの削除）

HiRDBサーバから外部Cライブラリファイルをアンインストールします。

○

×

×

DECLARE AUDIT INFO SET

（ユーザ任意接続情報の設定）

HiRDBサーバにアクセスするアプリケーションのアカウント情報などのユーザ任意接続情報を設定します。

○

○

○

（凡例）

○：使用できます。

×：使用できません。

注※1

GET CONNECTION HANDLEで接続ハンドルを取得した場合に使用できます。

注※2

使用できるSQLはC言語だけです。

表B‒5　SQL一覧（ルーチン制御SQL）

種類

機能

使用できるSQL

C言語

COBOL言語

OLTP下

複合文

（複数文実行）

複数のSQL文をまとめて一つのSQL文として実行します。

△

△

×

代入文

（値の代入）

SQL変数，又はSQLパラメタに値を代入します。

△

△

×

IF文

（条件分岐）

条件によって，SQL文を実行します。

△

△

×

RETURN文

（関数の戻り値の返却）

関数の戻り値を返却します。

△※１

△※１

×

WHILE文

（繰り返し実行）

SQL文の実行を繰り返します。

△

△

×

FOR文

（各行に対する繰り返し実行）

表の各行に対してSQL文の実行を繰り返します。

△※3

△※3

×

LEAVE文

（実行の途中終了）

複合文，又はWHILE文から抜けて，その文の実行を終了します。

△

△

×

WRITE LINE文

（ファイルへの文字列出力）

指定した値式の文字列をファイルに出力します。

△

△

×

SIGNAL文

（エラーの通知）

エラーを発生させて通知します。

△※２

△※２

×

RESIGNAL文

（エラーの再通知）

エラーを発生させて再通知します。

△※２

△※２

×

（凡例）

△：直接UAPで使用することはできませんが，CREATE PROCEDURE，CREATE FUNCTION，及びCREATE TRIGGERの中で，SQL手続き，SQL関数，及びトリガの動作を定義するために使用できます。

×：使用できません。

注　

ルーチン制御SQL以外の，手続き定義中で指定できるSQL文は，CALL文，CLOSE文，DECLARE CURSOR，DELETE文，FETCH文，INSERT文，OPEN文，PURGE TABLE文，1行SELECT文，UPDATE文，COMMIT文，LOCK文，及びROLLBACK文です。関数の場合は，ルーチン制御SQL以外のSQLは使用できません。

注※1

CREATE PROCEDURE，及びCREATE TRIGGERの中で，SQL手続き，及びトリガの動作を定義する場合は使用できません。

注※2

CREATE FUNCTIONの中で，SQL関数を定義する場合は使用できません。

注※3

CREATE FUNCTIONの中では使用できません。

付録C　例題用データベース

マニュアル内の使用例として，使用している表の基本構成例を次の図に示します。

図C‒1　表の基本構成例

付録D　バージョン，リビジョンによるSQL構文の省略時解釈の変更点

付録D.1　変更点

バージョン09-50より前のバージョンからバージョンアップを行う場合は，省略時解釈変更によるメリット及びデメリットを確認してください。確認の結果，旧バージョンとの互換性を重視する場合は，旧バージョンと同等の省略値解釈になる互換モードを適用してください。

(1)　バージョンによって省略時解釈が異なるSQL構文

バージョンによって省略時解釈が異なるSQL構文を次の表に示します。

表D‒1　バージョンによって省略時解釈が異なるSQL構文

SQL

09-50以降の省略時解釈

0904互換モードを適用時の省略時解釈

09-50より前の省略値解釈

省略値変更によるメリット

省略値変更によるデメリット

CREATE 〔PUBLIC 〕PROCEDURE（手続き定義，パブリック手続き定義）

SQLコンパイルオプションの「ISOLATION データ保証レベル 〔FOR UPDATE { EXCLUSIVE | COMPATIBLE }〕」

FOR UPDATE { EXCLUSIVE | COMPATIBLE }を指定しない場合，FOR UPDATE EXCLUSIVEを仮定します。

→

FOR UPDATE　EXCLUSIVEを指定しない場合，FOR UPDATE　COMPATIBLEを仮定します。

更新を前提とした検索に対する排他モードのロックを自動設定

排他モード変更によるSQL文の見直し

CREATE TRIGGER（トリガ定義）

SQLコンパイルオプションの「ISOLATION データ保証レベル 〔FOR UPDATE { EXCLUSIVE | COMPATIBLE }〕」

FOR UPDATE { EXCLUSIVE | COMPATIBLE }を指定しない場合，FOR UPDATE EXCLUSIVEを仮定します。

→

FOR UPDATE　EXCLUSIVEを指定しない場合，FOR UPDATE　COMPATIBLEを仮定します。

更新を前提とした検索に対する排他モードのロックを自動設定

排他モード変更によるSQL文の見直し

ALTER PROCEDURE（手続きのSQLオブジェクトの再作成）

SQLコンパイルオプションの「ISOLATION データ保証レベル 〔FOR UPDATE { EXCLUSIVE | COMPATIBLE }〕」

FOR UPDATE { EXCLUSIVE | COMPATIBLE }を指定しない場合，FOR UPDATE EXCLUSIVEを仮定します。

→

FOR UPDATE　EXCLUSIVEを指定しない場合，FOR UPDATE　COMPATIBLEを仮定します。

更新を前提とした検索に対する排他モードのロックを自動設定

排他モード変更によるSQL文の見直し

ALTER TRIGGER（トリガのSQLオブジェクトの再作成）

SQLコンパイルオプションの「ISOLATION データ保証レベル 〔FOR UPDATE { EXCLUSIVE | COMPATIBLE }〕」

FOR UPDATE { EXCLUSIVE | COMPATIBLE }を指定しない場合，FOR UPDATE EXCLUSIVEを仮定します。

→

FOR UPDATE　EXCLUSIVEを指定しない場合，FOR UPDATE　COMPATIBLEを仮定します。

更新を前提とした検索に対する排他モードのロックを自動設定

排他モード変更によるSQL文の見直し

ALTER ROUTINE（関数，手続き，及びトリガのSQLオブジェクトの再作成）

SQLコンパイルオプションの「ISOLATION データ保証レベル 〔FOR UPDATE { EXCLUSIVE | COMPATIBLE }〕」

FOR UPDATE { EXCLUSIVE | COMPATIBLE }を指定しない場合，FOR UPDATE EXCLUSIVEを仮定します。

→

FOR UPDATE　EXCLUSIVEを指定しない場合，FOR UPDATE　COMPATIBLEを仮定します。

更新を前提とした検索に対する排他モードのロックを自動設定

排他モード変更によるSQL文の見直し

CREATE TABLE

（表定義）

表オプションの「PCTFREE」

「PCTFREE」を指定しない場合，PCTFREE=(30,10)を仮定します。ただし，クラスタキーのないFIX表の場合で，PCTFREEを省略したときは，PCTFREE＝（0，0）を仮定します。

「PCTFREE」を指定しない場合，PCTFREE=(30,10)を仮定します。ただし，クラスタキーのないFIX表の場合で，PCTFREEを省略したときは，PCTFREE＝（0，0）を仮定します。

「PCTFREE」を指定しない場合，PCTFREE=(30,10)を仮定します。

DBの格納効率向上

なし

表オプションの「SEGMENT REUSE」

「SEGMENT REUSE」の指定有無に関係なく，空き領域の再利用機能を適用します。ただし，リバランス表，一時表の場合は，空き領域の再利用機能を適用しません。

「SEGMENT REUSE」の指定有無に関係なく，空き領域の再利用機能を適用します。ただし，リバランス表，一時表の場合は，空き領域の再利用機能を適用しません。

「SEGMENT REUSE」を指定しない場合，空き領域の再利用機能を適用しません。

DBの空き領域のサーチ方法の変更によるSQL安定稼働

なし

表オプションの「SEGMENT REUSE」の「OPTION 再利用オプション値」

再利用オプション値として常に3を仮定し，再利用オプション機能を適用します。

再利用オプション値として常に3を仮定し，再利用オプション機能を適用します。

「OPTION 再利用オプション値」を指定しない場合，再利用オプション機能を適用しません。

DBの空き領域のサーチ方法の変更によるSQL安定稼働

なし

列定義の「NO SPLIT」

定義長が256バイト以上の可変長文字列（VARCHAR，NVARCHAR，MVARCHAR）を定義する場合，ノースプリットオプションを常に適用します。

定義長が256バイト以上の可変長文字列（VARCHAR，NVARCHAR，MVARCHAR）を定義する場合，ノースプリットオプションを常に適用します。

「NO SPLIT」を指定しない場合，ノースプリットオプションを適用しません。

DB容量削減

なし

ALTER TABLE

（表定義変更）

列追加定義の「NO SPLIT」

定義長が256バイト以上の可変長文字列（VARCHAR，NVARCHAR，MVARCHAR）を定義する場合，ノースプリットオプションを常に適用します。

定義長が256バイト以上の可変長文字列（VARCHAR，NVARCHAR，MVARCHAR）を定義する場合，ノースプリットオプションを常に適用します。

「NO SPLIT」を指定しない場合，ノースプリットオプションを適用しません。

DB容量削減

なし

（凡例）

→：バージョン09-04の省略時解釈と同じであることを示します。

(2)　指定不要になったSQL構文

省略時解釈以外の指定をする必要がないため指定不要になったSQL構文を，次の表に示します。

表D‒2　指定不要になったSQL構文

SQL

ALTER TABLE（表定義変更）

列追加定義の「NO SPLIT」

CREATE TABLE（表定義）

列定義の「NO SPLIT」

表オプションの「SEGMENT REUSE」の「OPTION 再利用オプション値」

索引

記号

＿（下線）[1]

?パラメタ[1]、[2]

?パラメタに対する値の指定[1]

｛LEFT｜RIGHT｝ 〔OUTER〕[1]

＊[1]

%（パーセント）[1]

数字

10進数定数[1]、[2]

16進文字列定数[1]

1行SELECT文[1]

1行検索[1]

2次元格納用RDエリア指定[1]、[2]、[3]、[4]、[5]

2次元格納用RDエリア指定〔ALTER TABLE〕[1]、[2]、[3]

A

ABS〔システム組込みスカラ関数〕[1]

ACOS〔システム定義スカラ関数〕[1]

ADD_INTERVAL〔システム定義スカラ関数〕[1]

ADD OPTIMIZE LEVEL[1]、[2]、[3]、[4]、[5]

AFTERトリガ[1]

ALL[1]、[2]、[3]

ALLOCATE CONNECTION HANDLE[1]

ALLOCATE CURSOR文 形式1[1]

ALLOCATE CURSOR文 形式2[1]

ALL集合関数[1]

ALL〔ALTER TABLE〕[1]

ALTER INDEX[1]

ALTER PROCEDURE[1]

ALTER ROUTINE[1]

ALTER TABLE[1]

ALTER TRIGGER[1]

ANY[1]

ARRAY〔ALTER TABLE〕[1]、[2]、[3]

ASC[1]、[2]、[3]、[4]、[5]

ASCII〔システム定義スカラ関数〕[1]

ASIN〔システム定義スカラ関数〕[1]

ASSIGN LIST文[1]、[2]

AS データ型〔XMLPARSE〕[1]

ATAN2〔システム定義スカラ関数〕[1]

ATAN〔システム定義スカラ関数〕[1]

AUTHORIZATION[1]、[2]

AVG[1]、[2]

B

BEFOREトリガ[1]

BEGIN[1]

BEGIN DECLARE SECTION[1]

BETWEEN述語[1]

BINARY[1]

BINARY LARGE OBJECT[1]

BINARY型使用上の注意事項[1]

BIT_AND_TEST〔システム組込みスカラ関数〕[1]

BLOB[1]、[2]

BOOLEAN[1]

C

CALL COMMAND文[1]

CALL文[1]

CASE式[1]、[2]

CASE略式[1]

CAST指定[1]

CEIL〔システム定義スカラ関数〕[1]

CENTURY〔システム定義スカラ関数〕[1]

CHAR〔ACTER〕[1]

CHAR〔ACTER〕VARYING[1]

CHARACTER〔システム組込みスカラ関数〕[1]

CHR〔システム定義スカラ関数〕[1]

CLOSE文[1]

CLUSTER KEY[1]

CLUSTER KEY UNIQUE[1]

COALESCE[1]

COMMAND EXECUTE[1]

COMMENT[1]

COMMIT文[1]

CONNECT関連セキュリティ機能の削除[1]

CONNECT関連セキュリティ機能の定義[1]

CONNECT権限削除[1]

CONNECT権限定義[1]

CONNECT文[1]

COPY[1]

COSH〔システム定義スカラ関数〕[1]

COS〔システム定義スカラ関数〕[1]

COUNT[1]、[2]

COUNT_FLOAT[1]、[2]

COUNT(*)[1]

CREATE AUDIT[1]

CREATE CONNECTION SECURITY[1]

CREATE FUNCTION[1]

CREATE INDEX[1]、[2]、[3]

CREATE PROCEDURE[1]

CREATE PUBLIC FUNCTION[1]

CREATE PUBLIC PROCEDURE[1]

CREATE PUBLIC VIEW[1]

CREATE SCHEMA[1]

CREATE SEQUENCE[1]、[2]

CREATE TABLE[1]

CREATE TRIGGER[1]

CREATE TYPE[1]

CREATE VIEW[1]

CREATE 〔PUBLIC〕FUNCTION[1]

CREATE 〔PUBLIC〕PROCEDURE[1]

CREATE 〔PUBLIC〕VIEW[1]

CURRENT_DATE[1]

CURRENT_DATE値関数[1]

CURRENT_TIME[1]

CURRENT_TIMESTAMP値関数[1]

CURRENT_TIME値関数[1]

CURRENT_USER[1]

CURRENT DATE[1]

CURRENT TIME[1]

D

DATE[1]

DATE_TIME〔システム定義スカラ関数〕[1]

DATE〔システム組込みスカラ関数〕[1]

DAYNAME〔システム定義スカラ関数〕[1]

DAYOFWEEK〔システム定義スカラ関数〕[1]

DAYOFYEAR〔システム定義スカラ関数〕[1]

DAY〔S〕[1]

DAYS〔システム組込みスカラ関数〕[1]

DAY〔システム組込みスカラ関数〕[1]

DBA権限削除[1]

DBA権限定義[1]

DEALLOCATE PREPARE文[1]

DEC〔IMAL〕[1]

DECIMAL型使用上の注意事項[1]

DECIMAL〔システム組込みスカラ関数〕[1]

DECLARE AUDIT INFO SET[1]

DECLARE CONNECTION HANDLE SET[1]

DECLARE CONNECTION HANDLE UNSET[1]

DECLARE CURSOR[1]、[2]

DEFAULT句[1]、[2]、[3]

DEGREES〔システム定義スカラ関数〕[1]

DELETE文[1]、[2]

DELETE文：位置付け[1]

DESC[1]、[2]、[3]、[4]、[5]

DESCRIBE CURSOR文[1]

DESCRIBE TYPE文[1]

DESCRIBE文[1]、[2]

DIGITS〔システム組込みスカラ関数〕[1]

DISCONNECT文[1]

DISTINCT[1]

DISTINCT集合関数[1]

DOCUMENT〔XMLPARSE〕[1]

DOUBLE PRECISION[1]

DROP AUDIT[1]

DROP CONNECTION SECURITY[1]

DROP DATA TYPE[1]

DROP DEFAULT[1]

DROP FUNCTION[1]

DROP INDEX[1]

DROP LIST文[1]

DROP PROCEDURE[1]

DROP PUBLIC FUNCTION[1]

DROP PUBLIC PROCEDURE[1]

DROP PUBLIC VIEW[1]

DROP SCHEMA[1]

DROP SEQUENCE[1]、[2]

DROP TABLE[1]

DROP TRIGGER[1]

DROP VIEW[1]

DROP 〔PUBLIC〕FUNCTION[1]

DROP 〔PUBLIC〕PROCEDURE[1]

DROP 〔PUBLIC〕VIEW[1]

E

EMPTY[1]、[2]、[3]

END DECLARE SECTION[1]

ESCAPE[1]、[2]、[3]

EXCEPT[1]

EXCEPT VALUES[1]

EXECUTE IMMEDIATE文[1]

EXECUTE文[1]、[2]

EXISTS述語[1]

EXP〔システム定義スカラ関数〕[1]

F

FETCH文[1]、[2]、[3]

FIX[1]

FIX指定の表内の行を行単位で複数回更新[1]

FIXハッシュ分割[1]

FLAT指定[1]

FLOAT[1]

FLOAT〔システム組込みスカラ関数〕[1]

FLOOR〔システム定義スカラ関数〕[1]

fn:abs関数〔XQuery関数〕[1]

fn:boolean関数〔XQuery関数〕[1]

fn:ceiling関数〔XQuery関数〕[1]

fn:compare関数〔XQuery関数〕[1]

fn:concat関数〔XQuery関数〕[1]

fn:contains関数〔XQuery関数〕[1]

fn:contains関数〔XQuery関数〕[1]

fn:count関数〔XQuery関数〕[1]

fn:data関数〔XQuery関数〕[1]

fn:day-from-dateTime関数〔XQuery関数〕[1]

fn:day-from-date関数〔XQuery関数〕[1]

fn:deep-equal関数〔XQuery関数〕[1]

fn:distinct-values関数〔XQuery関数〕[1]

fn:ends-with関数〔XQuery関数〕[1]

fn:false関数〔XQuery関数〕[1]

fn:floor関数〔XQuery関数〕[1]

fn:hours-from-dateTime〔XQuery関数〕[1]

fn:hours-from-time関数〔XQuery関数〕[1]

fn:index-of関数〔XQuery関数〕[1]

fn:insert-before関数〔XQuery関数〕[1]

fn:last関数〔XQuery関数〕[1]

fn:local-name関数〔XQuery関数〕[1]

fn:max関数〔XQuery関数〕[1]

fn:minutes-from-dateTime関数〔XQuery関数〕[1]

fn:minutes-from-time関数〔XQuery関数〕[1]

fn:min関数〔XQuery関数〕[1]

fn:month-from-dateTime関数〔XQuery関数〕[1]

fn:month-from-date関数〔XQuery関数〕[1]

fn:namespace-uri関数〔XQuery関数〕[1]

fn:name関数〔XQuery関数〕[1]

fn:normalize-space関数〔XQuery関数〕[1]

fn:not関数〔XQuery関数〕[1]

fn:number関数〔XQuery関数〕[1]

fn:position関数〔XQuery関数〕[1]

fn:remove関数〔XQuery関数〕[1]

fn:reverse関数〔XQuery関数〕[1]

fn:round関数〔XQuery関数〕[1]

fn:seconds-from-dateTime関数〔XQuery関数〕[1]

fn:seconds-from-time関数〔XQuery関数〕[1]

fn:starts-with関数〔XQuery関数〕[1]

fn:string関数〔XQuery関数〕[1]

fn:string-length関数〔XQuery関数〕[1]

fn:subsequence関数〔XQuery関数〕[1]

fn:substring関数〔XQuery関数〕[1]

fn:substring-after関数〔XQuery関数〕[1]

fn:substring-before関数〔XQuery関数〕[1]

fn:sum関数〔XQuery関数〕[1]

fn:translate関数〔XQuery関数〕[1]

fn:true関数〔XQuery関数〕[1]

fn:year-from-dateTime関数〔XQuery関数〕[1]

fn:year-from-date関数〔XQuery関数〕[1]

FOREIGN KEY[1]

FOR INDEX〔ALTER TABLE〕[1]

FOR PRIMARY KEY〔ALTER TABLE〕[1]、[2]

FOR文[1]

FOR 〔PRIMARY〕 CLUSTER KEY〔ALTER TABLE〕[1]

FREE CONNECTION HANDLE[1]

FREE LOCATOR文[1]

FROM句の導出表についての規則[1]

G

GET_JAVA_STORED_ROUTINE_SOURCE指定[1]

GET CONNECTION HANDLE[1]

GET DIAGNOSTICS[1]

GLOBAL TEMPORARY[1]

GRANT[1]、[2]

GRANT CONNECT[1]

GRANT DBA[1]

GRANT RDAREA[1]

GRANT SCHEMA[1]

GRANT アクセス権限[1]

GREATEST〔システム定義スカラ関数〕[1]

GROUP BY句[1]、[2]

GROUP BY句についての規則[1]

H

HALF〔システム定義スカラ関数〕[1]

HASH0[1]

HASH1[1]

HASH2[1]

HASH3[1]

HASH4[1]

HASH5[1]

HASH6[1]

HASHA[1]

HASHB[1]

HASHC[1]

HASHD[1]

HASHE[1]

HASHF[1]

HASHZ[1]

HASH〔ALTER TABLE〕[1]

HAVING句[1]

HAVING句についての規則[1]

HAVING 探索条件[1]、[2]

HEX〔システム組込みスカラ関数〕[1]

HiRDB Control Manager - Agent[1]

HiRDBが定義するXQueryデータ型〔XQuery〕[1]

HiRDBで定義された関数[1]

HiRDBとの切り離し[1]

HiRDBとの接続[1]

HOUR〔S〕[1]

HOUR〔システム組込みスカラ関数〕[1]

I

IF文[1]

INDEX USING[1]

INNER JOIN[1]

INSERT ONLY[1]

INSERT ONLY〔ALTER TABLE〕[1]

INSERTSTR_LONG〔システム定義スカラ関数〕[1]

INSERTSTR〔システム定義スカラ関数〕[1]

INSERT文[1]、[2]、[3]

INSTALL CLIB[1]

INSTALL JAR[1]

INT〔EGER〕[1]

INTEGER〔システム組込みスカラ関数〕[1]

INTERVAL_DATETIMES〔システム定義スカラ関数〕[1]

INTERVAL HOUR TO SECOND[1]

INTERVAL YEAR TO DAY[1]

INTO[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]

IN述語[1]

IS_DBLBYTES〔システム定義スカラ関数〕[1]

IS_SNGLBYTES〔システム定義スカラ関数〕[1]

ISDIGITS〔システム定義スカラ関数〕[1]

ISOLATION[1]、[2]、[3]、[4]、[5]

J

JARファイルの再登録[1]

JARファイルの削除[1]

JARファイルの登録[1]

L

LAST_DAY〔システム定義スカラ関数〕[1]

LEAST〔システム定義スカラ関数〕[1]

LEAVE文[1]

LEFTSTR〔システム定義スカラ関数〕[1]

LENGTH〔システム組込みスカラ関数〕[1]

LIKE述語[1]

LIMIT句[1]

LN〔システム定義スカラ関数〕[1]

LOB属性格納用RDエリア名[1]、[2]、[3]

LOB列格納用RDエリア[1]

LOB列格納用RDエリア指定[1]、[2]

LOB列格納用RDエリア変更指定〔ALTER TABLE〕[1]

LOB列格納用RDエリア変更リスト〔ALTER TABLE〕[1]

LOB列格納用RDエリア名[1]

LOB列格納用RDエリア名〔ALTER TABLE〕[1]

LOCK｛ROW｜PAGE｝〔ALTER TABLE〕[1]

LOCK PAGE[1]、[2]

LOCK ROW[1]、[2]

LOCK文[1]

LOG10〔システム定義スカラ関数〕[1]

LOWER〔システム組込みスカラ関数〕[1]

LTRIMSTR〔システム定義スカラ関数〕[1]

LTRIM〔システム定義スカラ関数〕[1]

M

MAX[1]、[2]

MAX〔ALTER TABLE〕[1]、[2]

MCHAR[1]

MIDNIGHTSECONDS〔システム定義スカラ関数〕[1]

MIN[1]、[2]

MINUTE〔S〕[1]

MINUTE〔システム組込みスカラ関数〕[1]

MOD〔システム組込みスカラ関数〕[1]

MONTHNAME〔システム定義スカラ関数〕[1]

MONTH〔S〕[1]

MONTHS_BETWEEN〔システム定義スカラ関数〕[1]

MONTH〔システム組込みスカラ関数〕[1]

MULTIDIM〔ALTER TABLE〕[1]

MVARCHAR[1]

N

NATIONAL CHAR〔ACTER〕[1]

NATIONAL CHAR〔ACTER〕VARYING[1]

NCHAR[1]

NCHAR VARYING[1]

NEXT_DAY〔システム定義スカラ関数〕[1]

NEXT VALUE式[1]

NO SPLIT[1]

NOT FOUND[1]

NOT NULL[1]、[2]

NO WAIT[1]、[2]

NO WAIT｜NOWAIT[1]

NO〔ALTER TABLE〕[1]、[2]

NULL[1]

NULLIF[1]

NULL述語[1]

NULL〔ALTER TABLE〕[1]

NUMEDIT〔システム定義スカラ関数〕[1]

NUMERIC[1]

NVARCHAR[1]

NVL〔システム定義スカラ関数〕[1]

O

ON 探索条件[1]

OPEN文[1]、[2]

OPTIMIZE LEVEL[1]、[2]、[3]、[4]、[5]

ORDER BY句[1]

OTHERS〔ALTER TABLE〕[1]、[2]、[3]、[4]

P

PARTIAL〔ALTER TABLE〕[1]

PARTITIONED CONDITION〔ALTER TABLE〕[1]

PARTITIONED〔ALTER TABLE〕[1]

PCTFREE[1]、[2]、[3]、[4]

PDCNCTHDL型変数[1]、[2]、[3]

PDCNCTHDL型変数の宣言[1]

PI〔システム定義スカラ関数〕[1]

POSITION[1]

POSITION〔システム組込みスカラ関数〕[1]

POSSTR〔システム定義スカラ関数〕[1]

POWER〔システム定義スカラ関数〕[1]

PREPARE文[1]

PRESERVE WHITESPACE〔XMLPARSE〕[1]

PRIMARY[1]、[2]

PRIMARY KEY〔ALTER TABLE〕[1]

PRIMARY〔ALTER TABLE〕[1]、[2]

PRIVATE[1]

PROTECTED[1]

PUBLIC[1]、[2]、[3]、[4]

PURGE TABLE文[1]

Q

QUARTER〔システム定義スカラ関数〕[1]

R

RADIANS〔システム定義スカラ関数〕[1]

RDエリア追加定義〔ALTER TABLE〕[1]

RDエリア名〔ALTER TABLE〕[1]、[2]

RDエリア利用権限削除[1]

RDエリア利用権限定義[1]

READ ONLY[1]、[2]、[3]

REAL[1]

RECOVERY[1]

RELEASE[1]、[2]

REMOVE CLIB[1]

REMOVE JAR[1]

REPLACE_LONG〔システム定義スカラ関数〕[1]

REPLACE CLIB[1]

REPLACE JAR[1]

REPLACE〔システム定義スカラ関数〕[1]

RESIGNAL文[1]

RETURN文[1]

REVERSESTR〔システム定義スカラ関数〕[1]

REVOKE[1]

REVOKE CONNECT[1]

REVOKE DBA[1]

REVOKE RDAREA[1]

REVOKE SCHEMA[1]

REVOKE アクセス権限[1]

RIGHTSTR〔システム定義スカラ関数〕[1]

ROLLBACK文[1]

ROUNDMONTH〔システム定義スカラ関数〕[1]

ROUND〔システム定義スカラ関数〕[1]

RTRIMSTR〔システム定義スカラ関数〕[1]

RTRIM〔システム定義スカラ関数〕[1]

S

SECOND〔S〕[1]

SECOND〔システム組込みスカラ関数〕[1]

SEGMENT REUSE[1]、[2]

SEGMENT REUSE OPTION 再利用オプション値〔ALTER TABLE〕[1]

SELECT[1]

SET[1]、[2]、[3]、[4]

SET DEFAULT句[1]

SET SESSION AUTHORIZATION文[1]

SET句[1]、[2]、[3]

SIGNAL文[1]

SIGN〔システム定義スカラ関数〕[1]

SIMILAR述語[1]

SINH〔システム定義スカラ関数〕[1]

SIN〔システム定義スカラ関数〕[1]

SMALLFLT[1]

SMALLINT[1]

SOME[1]

SPLIT[1]

SQLCODE[1]

SQLCODE_OF_LAST_CONDITION[1]

SQLCODE変数[1]

SQLCOUNT[1]

SQLERRM_OF_LAST_CONDITION[1]

SQLERROR[1]

SQLSTATE変数[1]

SQLWARNING[1]

SQL一覧（埋込み言語）[1]

SQL一覧（制御系SQL）[1]

SQL一覧（操作系SQL）[1]

SQL一覧（定義系SQL）[1]

SQL一覧（ルーチン制御SQL）[1]

SQL拡張最適化オプション[1]、[2]、[3]、[4]、[5]

SQLコンパイルオプション[1]、[2]、[3]、[4]、[5]

SQL最適化オプション[1]、[2]、[3]、[4]、[5]

SQL最適化指定[1]

SQL終了子[1]

SQL先頭子[1]

SQLで使用できる文字[1]

SQL手続き文[1]、[2]、[3]

SQLの記述形式[1]

SQLの最大長[1]

SQLの実行[1]

SQLの前処理[1]

SQLの前処理と実行[1]

SQLの前処理無効化[1]

SQLパラメタ[1]、[2]

SQLパラメタ名[1]、[2]

SQL文識別子[1]、[2]

SQL文識別子｜拡張文名[1]、[2]、[3]、[4]

SQL変数[1]、[2]

SQL変数，又はSQLパラメタへの値の代入[1]

SQL文字列の指定[1]

SQL予約語削除機能[1]

SQRT〔システム定義スカラ関数〕[1]

STRIP WHITESPACE〔XMLPARSE〕[1]

STRTONUM〔システム定義スカラ関数〕[1]

SUBSTR LENGTH[1]、[2]、[3]、[4]、[5]、[6]

SUBSTR〔システム組込みスカラ関数〕[1]

SUM[1]、[2]

SUPPRESS[1]、[2]

SYSTEM GENERATED[1]

T

TANH〔システム定義スカラ関数〕[1]

TAN〔システム定義スカラ関数〕[1]

TIME[1]

TIMESTAMP[1]

TIMESTAMP_FORMAT〔システム組込みスカラ関数〕[1]

TIMESTAMP〔システム組込みスカラ関数〕[1]

TIME〔システム組込みスカラ関数〕[1]

TRANSL_LONG〔システム定義スカラ関数〕[1]

TRANSL〔システム定義スカラ関数〕[1]

TRIM〔システム組込みスカラ関数〕[1]

TRUNCYEAR〔システム定義スカラ関数〕[1]

TRUNC〔システム定義スカラ関数〕[1]

U

UAPからのコマンド実行[1]

UNBALANCED SPLIT[1]、[2]、[3]

UNION[1]

UNIQUE[1]、[2]、[3]、[4]

UNTIL DISCONNECT[1]、[2]、[3]

UPDATE[1]

UPDATE ONLY FROM NULL〔ALTER TABLE〕[1]、[2]

UPDATE文[1]、[2]、[3]

UPDATE〔ALTER TABLE〕[1]、[2]

UPPER〔システム組込みスカラ関数〕[1]

USER[1]

USER値関数[1]

V

VALUE〔システム組込みスカラ関数〕[1]

VARCHAR[1]

VARCHAR_FORMAT〔システム組込みスカラ関数〕[1]

VIEW[1]、[2]

W

WEEKOFMONTH〔システム定義スカラ関数〕[1]

WEEK〔システム定義スカラ関数〕[1]

WHENEVER[1]

WHERE[1]、[2]、[3]、[4]、[5]、[6]、[7]

WHERE [1]、[2]

WHERE 探索条件[1]、[2]

WHILE文[1]

WHITESPACE指定〔XMLPARSE〕[1]

WITH DEFAULT[1]、[2]、[3]

WITH EXCLUSIVE LOCK[1]

WITH HOLD[1]

WITHOUT LOCK NOWAIT[1]

WITHOUT LOCK WAIT[1]

WITHOUT PURGE[1]

WITHOUT ROLLBACK[1]

WITH PROGRAM[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]、[11]、[12]

WITH ROLLBACK[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]、[10]、[11]、[12]、[13]、[14]、[15]、[16]

WITH SHARE LOCK[1]

WITH句中の導出問合せ式[1]

WRITE LINE文[1]

WRITE指定[1]

X

XLIKE述語[1]

XMLAGG[1]、[2]

XMLEXISTS述語[1]

XMLPARSE[1]

XML型[1]

XMLコンストラクタ関数[1]

XQuery[1]

XQuery関数[1]

XQueryコメント[1]

XQuery宣言部〔XQuery〕[1]

XQueryデータ型〔XQuery〕[1]

XQueryデータモデル[1]

XQueryで定義された関数[1]

XQuery問合せ本体〔XQuery〕[1]

XQueryの記述形式〔XQuery〕[1]

XQueryの指定〔XQuery〕[1]

Y

YEAR〔S〕[1]

YEARS_BETWEEN〔システム定義スカラ関数〕[1]

YEAR〔システム組込みスカラ関数〕[1]

あ

アクセス権限削除[1]

アクセス権限定義[1]

値式[1]

値式〔XMLPARSE〕[1]

値指定[1]

圧縮指定[1]

圧縮分割サイズに指定できる値の範囲[1]

い

一次子[1]

位置付け子（locator）[1]

位置付け子の無効化[1]

インデクスオプション[1]、[2]、[3]、[4]

インデクスオプション〔ALTER TABLE〕[1]

インデクス格納用RDエリア指定[1]

インデクス格納用RDエリア指定〔ALTER TABLE〕[1]

インデクス格納用RDエリア変更指定〔ALTER TABLE〕[1]

インデクス格納用RDエリア名[1]、[2]、[3]、[4]

インデクス格納用RDエリア名〔ALTER TABLE〕[1]

インデクス型識別子[1]

インデクス型名[1]

インデクス削除[1]

インデクス識別子[1]

インデクス識別子〔ALTER INDEX〕[1]、[2]

インデクス定義[1]、[2]、[3]

インデクス定義変更[1]

インデクス名[1]

インデクス名変更定義〔ALTER INDEX〕[1]

インデクス名〔ALTER TABLE〕[1]

インナレプリカ機能使用時の制限[1]

隠蔽レベル[1]

う

ウィンドウ関数[1]、[2]

ウィンドウ指定[1]

内結合[1]

内表[1]

埋込みSQL開始宣言[1]

埋込みSQL終了宣言[1]

埋込みSQL宣言節[1]、[2]

埋込み言語[1]

埋込み変数[1]、[2]、[3]

埋込み変数，又は？パラメタへの値の代入[1]

埋込み変数とSQLのデータ型の関係[1]

埋込み変数に設定されるナル値の既定値[1]

埋込み変数の変更[1]

埋込み変数配列[1]、[2]、[3]、[4]

埋込み例外宣言[1]

え

エスケープ文字[1]、[2]、[3]、[4]

エラーの再通知[1]

エラーの通知[1]

お

オーバフローエラー抑止[1]

オフセット行数[1]

オペランドの指定順序[1]

か

カーソル[1]、[2]、[3]、[4]

カーソルオープン[1]、[2]

カーソルクローズ[1]

カーソル指定[1]

カーソル宣言[1]、[2]

カーソルの検索情報の受け取り[1]

カーソル名[1]

外部C関数[1]

外部Cストアドルーチン[1]、[2]

外部Cストアドルーチン名[1]

外部C手続き[1]

外部Cライブラリファイルの再登録[1]

外部Cライブラリファイルの削除[1]

外部Cライブラリファイルの新規登録[1]

外部Java関数[1]

外部Java手続き[1]

外部Javaルーチン[1]、[2]

外部Javaルーチン名[1]

外部ルーチン[1]、[2]

外部ルーチン指定[1]、[2]

各行に対する文の繰返し[1]

拡張カーソル名[1]

格納条件[1]、[2]

格納条件〔ALTER TABLE〕[1]

格納代入[1]

型定義[1]

型マッピング[1]

各国文字データ[1]、[2]、[3]、[4]

各国文字列定数[1]、[2]

環境変数グループ名変数[1]

監査対象イベントの削除[1]

監査対象イベントの定義[1]

監査人のパスワード変更[1]

関数[1]、[2]、[3]、[4]、[5]

関数，手続き，及びトリガのSQLオブジェクトの再作成[1]

関数削除[1]

関数削除，パブリック関数削除[1]

関数定義[1]

関数定義，パブリック関数定義[1]

関数の戻り値の返却[1]

関数本体[1]、[2]、[3]

関数呼出し[1]

き

キーワードの指定[1]

既定義型[1]

既定値〔DEFAULT句〕[1]

既定値〔WITH DEFAULT〕[1]

基本項目〔XQuery〕[1]

旧値相関名[1]

境界値[1]

境界値リスト[1]、[2]

境界値〔ALTER TABLE〕[1]、[2]、[3]

行更新値[1]、[2]、[3]

行削除[1]、[2]

行挿入[1]、[2]

行挿入値[1]

行単位（ROW指定）インタフェース[1]、[2]、[3]

行単位で更新[1]

行単位で更新（前処理可能）[1]

行値構成子[1]

共通規則[1]

行の重複排除[1]

共用モード[1]、[2]

く

区切り文字の挿入[1]

区切り文字を挿入してはいけない位置[1]

区切り文字を挿入してもよい位置[1]

区切り文字を挿入する位置[1]

クラスタキー[1]、[2]

クラスタキー格納用RDエリア変更〔ALTER TABLE〕[1]

グループ化列[1]、[2]

グループ分け[1]、[2]、[3]

け

結果集合カーソル割当て[1]

結果集合返却機能[1]

結果集合を参照する[1]

結合[1]

結合条件[1]

結合についての規則[1]

結合表[1]

結合表についての規則[1]

結合方式のSQL最適化指定[1]

結合列[1]

権限削除[1]

権限定義[1]

検索結果の列の値の受け取り[1]

検索項目情報[1]

検索情報[1]、[2]

限定述語[1]

こ

交差結合[1]

更新可能列属性[1]

更新可能列属性〔ALTER TABLE〕[1]

更新値[1]、[2]、[3]

更新値でオーバフローが発生した場合の例[1]

更新できるビュー表[1]

構造化繰返し述語[1]

項目指定[1]

コマンド又はユティリティの実行[1]

混在文字データ[1]、[2]、[3]、[4]

混在文字列定数[1]、[2]

コンストラクタ関数〔XQuery〕[1]

コンポネント指定[1]

さ

サーバ間の横分割[1]

サーバ内の横分割[1]

最小の排他資源単位[1]

最小排他資源単位[1]

サブタイプ句[1]

参照指定[1]

し

時間隔データ[1]、[2]、[3]

時間隔データの10進数表現[1]

時刻印データ[1]、[2]、[3]

時刻印データの既定の文字列表現[1]

時刻演算[1]

時刻データ[1]、[2]、[3]

時刻データの既定の文字列表現[1]

システム組込みスカラ関数[1]

システム定義関数[1]

システム定義スカラ関数[1]

四則演算[1]

実行ユーザの変更[1]

集合演算の結果のデータ型，及びデータ長[1]

集合関数[1]

修飾指定[1]

修飾名〔XQuery〕[1]

主キー[1]、[2]

主キー格納用RDエリア変更指定〔ALTER TABLE〕[1]

述語[1]

述語の結果[1]

順序数生成子削除[1]

順序数生成子識別子[1]

順序数生成子識別子〔DROP SEQUENCE〕[1]

順序数生成子定義[1]

順序数生成子名[1]

準備可能動的UPDATE文[1]、[2]

使用インデクスのSQL最適化指定[1]

条件情報項目名[1]

条件分岐による実行[1]

使用する接続ハンドルの全解除[1]

使用する接続ハンドルの宣言[1]

焦点〔XQuery〕[1]

除外値指定[1]

新旧値別名[1]

新旧値別名リスト[1]

診断情報取得[1]

新値相関名[1]

す

数値データ[1]

数値の指定[1]

数定数[1]

数定数以外の数値[1]

数定数の使用上の制限[1]

数データ[1]、[2]

スカラ演算[1]

スカラ関数[1]

スカラ関数の一覧[1]

スキーマ削除[1]

スキーマ定義[1]

スキーマ定義権限削除[1]

スキーマ定義権限定義[1]

スキーマパス[1]

せ

正規表現の各指定の意味[1]

制御系SQL[1]

整数定数[1]、[2]

制約名定義[1]

セグメント数の指定なし〔ALTER TABLE〕[1]

セグメント数〔ALTER TABLE〕[1]

セグメント内の空きページ比率[1]

接続PDHOST変数[1]

接続PDNAMEPORT変数[1]

接続ハンドル[1]、[2]、[3]、[4]

接続ハンドル取得[1]

接続ハンドルの解放[1]

接続ハンドルの割り当て[1]

全角文字[1]

全行削除[1]

選択式[1]

そ

相関名[1]、[2]

相関名，表名，又は問合せ名の有効範囲[1]、[2]

操作系SQL[1]

挿入値[1]、[2]

添字[1]

ソート項目指定番号[1]

属性定義[1]

属性名[1]

外結合[1]

外表[1]

外への参照[1]

た

第1次元境界値リスト[1]

第1次元列名[1]

第2次元境界値リスト[1]

第2次元列名[1]

代入規則[1]

代入先が可変長データの場合の代入規則[1]

代入先が固定長データの場合の代入規則[1]

代入の種類[1]

代入文[1]、[2]

単一列検査制約定義[1]

単一列参照制約定義[1]

探索CASE式[1]

探索条件[1]、[2]、[3]、[4]

探索条件でオーバフローが発生した場合の例[1]

単純CASE式[1]

ち

注釈[1]

注釈付加[1]

抽象データ[1]

抽象データ型[1]、[2]、[3]

抽象データ型使用上の注意事項[1]

抽象データ型定義内LOB格納用RDエリア指定[1]、[2]、[3]

長大データ[1]、[2]、[3]

長大データ使用上の注意事項[1]

て

定義系SQL[1]

定数[1]

定数値の変更[1]

データ型[1]

データ型識別子[1]

データ型の変換可否[1]

データ型〔ALTER TABLE〕[1]

データ更新[1]、[2]

データの取り出し[1]、[2]、[3]

データ保証レベル 〔FOR UPDATE ｛EXCLUSIVE｜COMPATIBLE｝〕[1]、[2]、[3]、[4]、[5]

手続き[1]

手続き削除[1]

手続き削除，パブリック手続き削除[1]

手続き定義[1]

手続き定義，パブリック手続き定義[1]

手続きのSQLオブジェクトの再作成[1]

手続きの呼び出し[1]

手続き本体[1]

デフォルトコンストラクタオプション[1]

と

問合せ式[1]

問合せ式本体[1]、[2]

問合せ式本体についての規則[1]

問合せ指定[1]

問合せ名[1]、[2]

導出表[1]

動的SELECT文[1]、[2]

動的検索[1]、[2]

登録集原文の引き込み[1]

特定名[1]

トランザクションの正常終了[1]

トランザクションの取り消し[1]

トリガSQL文[1]

トリガ契機[1]

トリガ削除[1]

トリガ識別子[1]

トリガ定義[1]

トリガ動作[1]

トリガ動作時期[1]

トリガのSQLオブジェクトの再作成[1]

トリガ名[1]

取り出し代入[1]

な

内部導出表[1]

名前の指定[1]

名前の修飾[1]

ナル値[1]

ナル値の既定値設定機能[1]

に

日間隔データ[1]、[2]、[3]

日間隔データの10進数表現[1]

日間隔データ〔ALTER TABLE〕[1]

日時間隔データの10進数表現[1]

日時書式[1]

日時書式の指定[1]

日時書式の要素[1]

入出力情報の受け取り[1]、[2]

認可識別子[1]

認可識別子，及びパスワードの指定[1]

認可識別子〔ALTER INDEX〕[1]

の

ノードの詳細[1]

は

排他オプション[1]、[2]、[3]、[4]、[5]、[6]

排他制御[1]、[2]

排他モード[1]、[2]

バイナリデータ[1]、[2]、[3]

配列を使用したSQLの実行[1]

配列を使用した行更新[1]

配列を使用した行削除[1]

配列を使用した行挿入[1]

パターン文字列[1]、[2]、[3]

パターン文字列中での特殊文字の意味（LIKE述語）[1]

パターン文字列中での特殊文字の意味（XLIKE述語）[1]

パターン文字列中の特殊文字[1]

ハッシュ関数[1]、[2]、[3]

パブリック関数削除[1]

パブリック関数定義[1]

パブリック手続き削除[1]

パブリック手続き定義[1]

パブリックビュー定義[1]

パブリックビューの削除[1]

半角文字[1]

ひ

比較演算子[1]

比較述語[1]、[2]

日付演算[1]

日付データ[1]、[2]、[3]

日付データの既定の文字列表現[1]

非ナル値制約[1]

非ナル値制約[1]

非ナル値制約指定[1]

非分割キーインデクス[1]

ビュー定義[1]

ビュー定義，パブリックビュー定義[1]

ビュー表の削除[1]

ビュー表の削除，パブリックビュー表の削除[1]

表一次子[1]

表オプション[1]

表格納用RDエリア名[1]、[2]

表格納用RDエリア名〔ALTER TABLE〕[1]

表格納用RDエリア名〔ALTER TABLE〕[1]、[2]

表削除[1]

表参照[1]、[2]、[3]

表参照 CROSS JOIN 表一次子[1]

表式[1]、[2]、[3]

表識別子[1]、[2]

表識別子〔ALTER TABLE〕[1]、[2]

標識変数[1]、[2]、[3]

標識変数配列[1]、[2]

表指定[1]

表制約定義[1]

表制約定義削除〔ALTER TABLE〕[1]

表制約定義追加〔ALTER TABLE〕[1]

表定義[1]

表定義変更[1]

表の排他制御[1]

表名[1]、[2]

表名変更定義〔ALTER TABLE〕[1]

表要素[1]

ふ

ファイルへの文字列出力[1]

複合文[1]

複数接続機能[1]、[2]

複数文実行[1]

複数列一意性制約定義[1]

複数列検査制約定義[1]

複数列参照制約定義[1]

副問合せ[1]

副問合せ実行方式のSQL最適化指定[1]

浮動小数点数定数[1]、[2]

プラグインオプション[1]、[2]、[3]

プラグイン指定[1]、[2]

プラグイン定義スカラ関数[1]

フレキシブルハッシュ分割[1]

文カーソル割当て[1]

分割格納条件変更定義〔ALTER TABLE〕[1]

分割キーインデクス[1]

文情報項目名[1]

文の繰り返し[1]

文の途中終了[1]

文脈位置〔XQuery〕[1]

文脈項目〔XQuery〕[1]

文脈サイズ〔XQuery〕[1]

へ

変換（代入，比較）できるデータ型[1]

変換可能なXQueryデータ型〔XQuery〕[1]

変更後インデクス格納用RDエリア名リスト〔ALTER TABLE〕[1]、[2]、[3]

変更後格納条件分割指定〔ALTER TABLE〕[1]

変更後境界値分割指定〔ALTER TABLE〕[1]

変更後境界値リスト〔ALTER TABLE〕[1]、[2]

変更前RDエリア情報リスト〔ALTER TABLE〕[1]

変更前境界値リスト〔ALTER TABLE〕[1]

変更前列名，変更後列名〔ALTER TABLE〕[1]

ほ

ホールダブルカーソル[1]、[2]、[3]

ホスト識別子[1]

ま

マトリクス分割LOB属性格納用RDエリア[1]

マトリクス分割LOB属性格納用RDエリア指定[1]

マトリクス分割LOB列格納用RDエリア指定[1]、[2]

マトリクス分割LOB列格納用RDエリア変更指定〔ALTER TABLE〕[1]

マトリクス分割インデクス格納用RDエリア指定[1]、[2]、[3]、[4]

マトリクス分割表[1]

マトリクス分割表格納用RDエリア指定[1]

マトリクス分割表格納用RDエリア変更指定〔ALTER TABLE〕[1]

マトリクス分割表変更指定〔ALTER TABLE〕[1]

マトリクス分割用RDエリアリスト[1]、[2]、[3]、[4]、[5]

マトリクス分割用RDエリアリスト〔ALTER TABLE〕[1]、[2]、[3]、[4]

み

未使用領域の比率[1]、[2]、[3]、[4]

も

文字コード[1]

文字集合[1]

文字データ[1]、[2]、[3]、[4]

文字の最大長[1]、[2]、[3]、[4]、[5]、[6]

文字列定数[1]、[2]

ゆ

ユーザ定義型[1]

ユーザ定義型削除[1]

ユーザ定義型の定義情報の受け取り[1]

ユーザ定義型名[1]

ユーザ定義関数[1]

ユーザ任意接続情報の設定[1]

よ

横分割表変更指定〔ALTER TABLE〕[1]

呼び出す関数の決定規則[1]

予備列定義[1]、[2]

予備列名[1]

読み込み専用のビュー表[1]

ら

ラベル付き間隔[1]、[2]

ラベル付き間隔〔ALTER TABLE〕[1]

り

リスト削除[1]

リスト作成[1]、[2]

リターンコード受け取り変数[1]、[2]

リミット行数[1]

る

ルーチン[1]

ルーチン識別子[1]

ルーチン制御SQL[1]

ルーチン名[1]

れ

列回復制約[1]

列回復制約1[1]

列回復制約2[1]

列削除定義〔ALTER TABLE〕[1]

列指定[1]、[2]

列制約[1]

列属性変更定義〔ALTER TABLE〕[1]

列単位で表内の行をカーソルを使用して更新（前処理可能）[1]

列単位で表内の行を更新[1]

列単位で表内の行を複数回更新[1]

列追加定義〔ALTER TABLE〕[1]

列定義[1]

列データ抑制指定[1]

列名変更定義〔ALTER TABLE〕[1]

列名〔ALTER TABLE〕[1]、[2]、[3]、[4]、[5]、[6]

連結演算[1]

ろ

論理演算[1]

論理述語[1]

論理データ[1]

論理データ使用上の注意事項[1]