caché sql リファレンス - intersystems...caché拡張のsql関数の最初の文字です。$...
TRANSCRIPT
Caché SQL リファレンス
Version 5.12006-03-14
InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com
Caché SQL リファレンス
Caché Version 5.1 2006-03-14
Copyright © 2006 InterSystems Corporation.
All rights reserved.
このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム
(www.w3c.org)のツールと情報を使用して、Adobe Portable Document Format (PDF)で作成およびフォーマットされました。
主要ドキュメント開発ツールは、InterSystemsが構築したCaché と Javaを使用した特別目的のXML処理アプリケーションで
す。
Caché 製品とロゴは InterSystems Corporation の登録商標です。
Ensemble 製品とロゴは InterSystems Corporation の登録商標です。
InterSystems という名前とロゴは InterSystems Corporation の登録商標です
このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有す
る企業秘密および秘密情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。こ
の発行物のいかなる部分も他の目的のために使用してはならない。また、インターシステムズ社の書面による事前の同意
がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは一部を、再発行、複製、開示、送付、検索可能
なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。
かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている
範囲を除き、ここに記載された本ドキュメントとソフトウェアプルグラムの複製、使用、廃棄は禁じられている。インターシス
テムズ社は、ソフトウェアライセンス契約に記載されている事項以外にかかるソフトウェアプログラムに関する説明と保証を
するものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフトウェアの使用から起こるいかなる損失、損害
に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。
前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する
一般的な概略である。完全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によっ
て入手することができる。
インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量
にて事前通知なしに、本ドキュメントに記載された製品および実行に対する代替と変更を行う権利を有する。
Caché および InterSystems Caché、Caché SQL、 Caché ObjectScript および Caché Object は、インターシステムズ社の
商標です。
ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。
インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください:
InterSystems ワールドワイド カスタマサポート
+1 617 621-0700Tel:
+1 617 374-9391Fax:
目次
記号 .......................................................................................................................... 1
Caché SQL で使用する記号 .................................................................................... 1
SQL コマンドおよび SQL 関数 ....................................................................................... 5
ABS ..................................................................................................................... 5
ACOS .................................................................................................................. 6
ALL ..................................................................................................................... 7
%ALPHAUP .......................................................................................................... 8
ALTER TABLE .................................................................................................... 10
ALTER USER ...................................................................................................... 15
ALTER VIEW ...................................................................................................... 17
ANY .................................................................................................................. 18
ASCII ................................................................................................................. 19
ASIN .................................................................................................................. 20
ATAN ................................................................................................................ 21
AVG .................................................................................................................. 22
CALL ................................................................................................................. 23
CASE ................................................................................................................. 26
CAST ................................................................................................................. 28
CEILING ............................................................................................................ 33
CHAR ................................................................................................................ 34
CHARACTER_LENGTH ........................................................................................ 35
CHAR_LENGTH .................................................................................................. 36
%CHECKPRIV ..................................................................................................... 38
CLOSE ............................................................................................................... 40
COALESCE ........................................................................................................ 41
COMMIT ............................................................................................................ 42
CONCAT ........................................................................................................... 43
CONVERT .......................................................................................................... 44
COS .................................................................................................................. 48
COT .................................................................................................................. 49
COUNT .............................................................................................................. 50
CREATE FUNCTION ........................................................................................... 52
CREATE INDEX .................................................................................................. 56
CREATE METHOD .............................................................................................. 60
CREATE PROCEDURE ........................................................................................ 64
CREATE QUERY ................................................................................................. 71
Caché SQL リファレンス iii
CREATE ROLE ................................................................................................... 75
CREATE TABLE ................................................................................................. 77
CREATE TRIGGER .............................................................................................. 90
CREATE USER .................................................................................................... 97
CREATE VIEW .................................................................................................... 99
CURDATE ........................................................................................................ 105
CURRENT_DATE ............................................................................................... 106
CURRENT_TIME ................................................................................................ 107
CURRENT_TIMESTAMP ...................................................................................... 109
CURTIME ......................................................................................................... 111
DATABASE ....................................................................................................... 113
DATEADD ........................................................................................................ 113
DATEDIFF ........................................................................................................ 118
DATENAME ...................................................................................................... 121
DATEPART ....................................................................................................... 125
DAYNAME ........................................................................................................ 129
DAYOFMONTH ................................................................................................. 130
DAYOFWEEK ................................................................................................... 132
DAYOFYEAR .................................................................................................... 134
DECLARE ......................................................................................................... 136
DECODE .......................................................................................................... 138
DELETE ........................................................................................................... 140
DROP FUNCTION ............................................................................................. 143
DROP INDEX .................................................................................................... 144
DROP METHOD ................................................................................................ 146
DROP PROCEDURE ........................................................................................... 147
DROP QUERY ................................................................................................... 148
DROP ROLE ..................................................................................................... 148
DROP TABLE ................................................................................................... 150
DROP TRIGGER ................................................................................................ 152
DROP USER ...................................................................................................... 154
DROP VIEW ...................................................................................................... 155
%EXACT ........................................................................................................... 156
EXISTS ............................................................................................................. 157
EXP ................................................................................................................. 158
%EXTERNAL ..................................................................................................... 160
$EXTRACT ....................................................................................................... 161
FETCH ............................................................................................................. 165
$FIND .............................................................................................................. 167
FLOOR ............................................................................................................ 170
iv Caché SQL リファレンス
FROM .............................................................................................................. 171
GETDATE ........................................................................................................ 173
GRANT ............................................................................................................. 176
GROUP BY ....................................................................................................... 181
HAVING ........................................................................................................... 182
HOUR .............................................................................................................. 187
IFNULL ............................................................................................................ 188
INSERT ............................................................................................................ 191
%INTERNAL ...................................................................................................... 196
INTO ................................................................................................................ 197
ISNULL ............................................................................................................ 199
JOIN ................................................................................................................ 201
LCASE ............................................................................................................. 208
LEFT ............................................................................................................... 209
LENGTH .......................................................................................................... 210
$LENGTH ......................................................................................................... 212
LIST ................................................................................................................. 214
$LIST ............................................................................................................... 217
$LISTDATA ...................................................................................................... 222
$LISTFIND ........................................................................................................ 225
$LISTGET ......................................................................................................... 228
$LISTLENGTH .................................................................................................. 231
LOG ................................................................................................................. 233
LOG10 ............................................................................................................. 234
LOWER ............................................................................................................ 235
LTRIM .............................................................................................................. 236
MAX ................................................................................................................ 237
MIN .................................................................................................................. 239
MINUTE ........................................................................................................... 241
MOD ................................................................................................................ 242
MONTH ............................................................................................................ 243
MONTHNAME ................................................................................................... 245
- (負の数) ......................................................................................................... 246
NOW ................................................................................................................ 247
NULLIF ............................................................................................................ 249
NVL ................................................................................................................. 250
%ODBCIN ......................................................................................................... 252
%ODBCOUT ...................................................................................................... 253
OPEN ............................................................................................................... 253
ORDER BY ....................................................................................................... 254
Caché SQL リファレンス v
PI .................................................................................................................... 256
$PIECE ............................................................................................................. 257
POSITION ......................................................................................................... 262
+ (正の数) ......................................................................................................... 263
POWER ............................................................................................................ 263
QUARTER ........................................................................................................ 264
REPEAT ........................................................................................................... 266
REVOKE .......................................................................................................... 267
RIGHT .............................................................................................................. 269
ROLLBACK ...................................................................................................... 270
ROUND ............................................................................................................ 271
RTRIM .............................................................................................................. 273
SAVEPOINT ...................................................................................................... 274
SECOND .......................................................................................................... 276
SELECT ........................................................................................................... 278
SET OPTION ..................................................................................................... 290
SET TRANSACTION .......................................................................................... 295
SIGN ................................................................................................................ 297
SIN .................................................................................................................. 298
SOME ............................................................................................................... 299
SPACE ............................................................................................................. 299
%SQLSTRING .................................................................................................... 300
%SQLUPPER ...................................................................................................... 302
SQRT ............................................................................................................... 304
START TRANSACTION ...................................................................................... 305
STRING ............................................................................................................ 307
%STRING .......................................................................................................... 309
SUBSTR ............................................................................................................ 311
SUBSTRING ...................................................................................................... 313
SUM ................................................................................................................. 315
TAN ................................................................................................................. 316
TIMESTAMPADD ............................................................................................... 317
TIMESTAMPDIFF .............................................................................................. 320
TO_CHAR ......................................................................................................... 322
TO_DATE ......................................................................................................... 330
TO_NUMBER ..................................................................................................... 336
TRIM ................................................................................................................ 337
TRUNCATE ...................................................................................................... 338
UCASE ............................................................................................................. 340
UNION ............................................................................................................. 341
vi Caché SQL リファレンス
UPDATE ........................................................................................................... 343
UPPER ............................................................................................................. 346
%UPPER ............................................................................................................ 347
USER ............................................................................................................... 348
VALUES ........................................................................................................... 349
WEEK .............................................................................................................. 352
WHERE ............................................................................................................ 355
WHERE CURRENT OF ....................................................................................... 359
XMLAGG .......................................................................................................... 360
XMLCONCAT ................................................................................................... 362
XMLELEMENT .................................................................................................. 364
XMLFOREST .................................................................................................... 367
YEAR ............................................................................................................... 370
SQL の概念 ............................................................................................................ 373
集約関数 .......................................................................................................... 373
算術式 ............................................................................................................. 374
関数の呼び出し ................................................................................................. 374
列 .................................................................................................................... 375
コメント .............................................................................................................. 376
条件式 ............................................................................................................. 377
規則 ................................................................................................................. 378
カーソル ........................................................................................................... 379
データ型 ........................................................................................................... 380
日付/時刻文 ..................................................................................................... 387
DDL ................................................................................................................. 388
既定の仕様 ....................................................................................................... 388
既定のユーザ名とパスワード ................................................................................ 389
エラー・コード ..................................................................................................... 389
フィールド制約 ................................................................................................... 400
ホスト変数 ......................................................................................................... 401
識別子 ............................................................................................................. 404
リテラル ............................................................................................................. 408
NULL ............................................................................................................... 409
クエリ ................................................................................................................ 412
予約語 ............................................................................................................. 414
スカラ式 ............................................................................................................ 416
ストアド・プロシージャ .......................................................................................... 417
テーブル参照 .................................................................................................... 420
トランザクション ................................................................................................... 421
トリガ動作 .......................................................................................................... 424
Caché SQL リファレンス vii
ユーザ .............................................................................................................. 424
変数 ................................................................................................................. 425
ビュー ............................................................................................................... 426
viii Caché SQL リファレンス
テーブル一覧
SQL 比較述語 ......................................................................................................... 183
LIKE ワイルドカード文字 ........................................................................................... 184
SQL 比較述語 ......................................................................................................... 356
LIKE ワイルドカード文字 ........................................................................................... 357
SQL エラー・コードおよびエラー・メッセージ・テキスト ...................................................... 391
Caché SQL リファレンス ix
記号
Caché SQL で使用する記号
Caché SQL で演算子として使用される文字のテーブル。
記号のテーブル以下は、Caché SQL で使用されるリテラル記号です (このリストには、言語の一部ではない形式規
約を示す記号は含まれていません)。別途、Caché ObjectScript で使用される記号のテーブルも用
意されています。
各記号の名前の後には、ASCII 10 進数コード値が続きます。
名前と使用法記号
空白 (タブ (9)、または空白 (32)) : キーワード、識別子、および変数の間の 1
つ以上の空白文字。
[空白]、ま
たは [タブ]
感嘆符 (33) : 二項 OR 論理演算子。!
引用符 (34) : 区切り文字付き識別子名を囲みます。"
二重引用符 : リテラルが区切り文字付き識別子内の文字を囲みます。""
シャープ記号 (35) : 有効な識別子名の文字 (最初の文字ではない)。
前後にスペースを持つモジュロスカラ演算子です。
#
ドル記号 (36) : 有効な識別子名の文字 (最初の文字ではない)。
Caché 拡張の SQL 関数の最初の文字です。
$
二重ドル記号 : Caché ObjectScript 外部関数の呼び出し。$$
パーセント記号 (37) : 有効な識別子名の最初の文字 (最初の文字のみ)。
ロール名の接頭語。(例) %All。
データ型の最大長インジケータ。(例) CHAR(%24)
LIKE 節の複数文字ワイルドカード。
%
二重パーセント記号 : 擬似フィールド参照変数キーワードの接頭語。Caché
ObjectScript 計算フィールド・コードおよびトリガ・コードで使用されます。(例)
%%CLASSNAME、%%CLASSNAMEQ、%%ID、%%TABLENAME
%%
Caché SQL リファレンス 1
名前と使用法記号
アンド記号 (38) : 二項 And 論理演算子。
$BITLOGIC ビット文字列 And 演算子。
埋め込み SQL シェル呼び出し接頭語。(例) &sql(SQL commands)
&
一重引用符 (39) : 区切り文字つきのリテラル値を囲みます。'
二重の一重引用符:区切り文字付きリテラル値内のリテラル一重引用符。(例)
'can''t'
''
括弧 (40,41) : コンマで区切られたリストを囲みます。SQL 関数の引数を囲み
ます。プロシージャ、メソッド、またはクエリでのパラメータ・リストを囲みます。多
くの場合、引数またはパラメータが提供されない場合でも、括弧を指定する必
要があります。
SELECT文で、FROM節内のサブクエリを囲みます。UNIONで使用される事前
定義のクエリの名前を囲みます。
変数配列添え字を囲みます。例えば INTO :var(1),:var(2) です。
embedded SQL コードを囲みます。(例) &sql( code )
算術演算で優先順位を指定するために使われます。(例) 3+(3*5)=18
( )
アスタリスク (42) : 以下の場合で "すべて" を示すワイルドカード。SELECT で
すべての列を検索します。(例) SELECT * FROM テーブル。COUNT で、すべ
ての行 (NULL と重複を含む) をカウントします。GRANT で、現在定義されてい
るすべてのユーザに指定された特権を与えます。
マルチパートの列名内で使用されます。
乗算スカラ演算子です。
*
アスタリスク、等号 : WHERE 節では、右外部結合。*=
プラス記号 (43) : 加算スカラ演算子。+
コンマ (44) : リストの区切り記号。例えば、複数のフィールド名を区切る場合に
使用します。
データ・サイズ定義内にあります。(例) NUMERIC (precision,scale)
,
ハイフン (マイナス記号) (45) : 減算スカラ演算子。
SQLCODE エラー・コード接頭語です。(例) –304
日付区切り文字です。
–
2 Caché SQL リファレンス
記号
名前と使用法記号
二重ハイフン : 単一の行のコメント文字。– –
ハイフン、より大きい (矢印) : 暗黙結合文字。– >
ピリオド (46) : 修飾されているテーブル名の schema.tablename、または列名
の tablename.fieldname など、マルチパート名の一部を区切るために使用され
ます。
数値リテラル内の小数点です。
日付区切り文字です。
.
スラッシュ (47) : 除算スカラ演算子。
日付区切り文字です。
/
コロン (58) : ホスト変数の指示接頭語。(例) :var
時間区切り文字です。
トリガ・コードでは、Caché ObjectScript ラベル行を示す接頭語です。
:
二重コロン:トリガ・コードでは、この二重接頭語は、その行の最初にある識別
子 (::name) がラベル行ではなくホスト変数であることを示します。
::
セミコロン (59) : プロシージャ、メソッド、クエリ、およびトリガ・コード内で SQL
文の最後を示します。
;
より小さい (60) : 比較条件より小さい。<
以下 : 比較条件以下。<=
より小さい/より大きい : 比較条件に等しくない。<>
等記号 (61) : 比較条件に等しい。
WHERE 節では、内部結合です。
=
等号、アスタリスク : WHERE 節では、左外部結合。=*
より大きい (62) : 比較条件より大きい。>
以上 : 比較条件以上。>=
疑問符 (63) :ダイナミック SQL 内で Execute メソッドによって提供される入力
パラメータ。
?
アット記号 (64) : 有効な識別子名の文字 (最初の文字ではない)。@
文字 "E" (69, 101) : 指数文字。E, e
Caché SQL リファレンス 3
Caché SQL で使用する記号
名前と使用法記号
角括弧 (開始) (91) : 二項包含関係演算子。[
バックスラッシュ (92) : 整数除算スカラ演算子。\
角括弧 (終了) (93) : 二項後続関係演算子。]
アンダースコア (95) :有効な識別子名の最初 (またはそれ以降)の文字。特定
のユーザ名 (パスワードではなく) の有効な最初の文字です。
マルチパートの列名内で使用され、埋め込まれたシリアル・クラス・データを表
します。(例) SELECT Staff_UserID
LIKE 節の単一文字ワイルドカードです。
_
中括弧 (123,125) : ODBC スカラ関数を囲みます。(例) {fn name(...)}。時
刻/日付文の関数を囲みます。(例) {d 'string'}、{t 'string'}、{ts
'string'}
プロシージャ、メソッド、クエリ、およびトリガ・コード内で Caché ObjectScript
コードを囲みます。
{ }
二重の垂直バー (124) : 連結スカラ演算子。||
4 Caché SQL リファレンス
記号
SQL コマンドおよび SQL 関数
ABS
数値式の絶対値を返す汎用スカラ数値関数です。
ABS(numeric-expression){fn ABS(numeric-expression)}
引数
絶対値を求める数。numeric-expression
概要ABS は絶対値を返します。絶対値は、必ず 0 または正の数になります。ABS が返す値のデータ型
は、numeric-expression のデータ型と同じです。numeric-expression が数値でない場合 (例えば文
字列 'abc' や空文字列 '')、ABS は 0 を返します。NULL 値を渡すと ABS は <NULL> を返します。
ABS は、{ } 括弧構文による ODBC スカラ関数、または SQL 汎用関数として使用できる点に注意し
てください。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.ABS(numeric-expression)
例以下の例は、ABS の 2 つのフォームを示しています。
SELECT DISTINCT ABS(-99) AS AbsoluteValueFROM Sample.Person
SELECT DISTINCT {fn ABS(-99)} AS AbsoluteValueFROM Sample.Person
いずれも 99 を返します。
以下の例は、いくつかの数値が ABS でどのように扱われるかを示しています。先頭および末尾の
ゼロは切り捨てられ、指数が評価されます。
SELECT DISTINCT ABS(007) AS AbsoluteValueFROM Sample.Person
Caché SQL リファレンス 5
これは、7 を返します。
SELECT DISTINCT ABS(-0.000) AS AbsoluteValueFROM Sample.Person
これは、0 を返します。
SELECT DISTINCT ABS(-99E4) AS AbsoluteValueFROM Sample.Person
これは、990000 を返します。
SELECT DISTINCT ABS(-99E-4) AS AbsoluteValueFROM Sample.Person
これは、.0099 を返します。
関連項目
• SQL 関数 : CONVERT TO_NUMBER
• Caché ObjectScript 関数 : $ZABS
ACOS
指定されたコサインのアークコサインを、ラジアン表示で返すスカラ数値関数です。
{fn ACOS(float-expression)}
引数
FLOAT や REAL 型の式で、値は -1 から 1 の間です。この値は
角度のコサインです。
float-expression
概要ACOS は数値を取り、そのコサインの逆関数値を浮動小数点数値で返します。float-expression に
は、–1 以上 1 以下の符号付き 10 進数値を指定します。この範囲外の数値を指定すると、実行時
エラーが発生して、SQLCODE=-400 (致命的なエラーが発生しました) が返されます。NULL 値を
渡すと、ACOS は NULL を返します。ACOS は、空文字列 ('') のように数値でない文字列を数値
0 (ゼロ) として扱います。
ACOS は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、2 つのコサイン値に対する ACOS の実行結果です。
6 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT DISTINCT {fn ACOS(0.52)} AS ArcCosineFROM Sample.Person
これは、1.023945... を返します。
SELECT DISTINCT {fn ACOS(-1)} AS ArcCosineFROM Sample.Person
これは、円周率 (3.14159...) を返します。
関連項目
• SQL 関数 : ASIN ATAN COS COT SIN TAN
• Caché ObjectScript 関数 : $ZARCCOS
ALL
クエリ内のすべての値を比較します。
scalar-expression comparison-operator ALL query
引数
値の比較対象となるスカラ式。scalar-expression
有効な比較演算子。< (より小さい)、<= (以下)、> (より大き
い)、>= (以上)、<> (等しくない)、= (等しい) など。
comparison-operator
比較対象のクエリから取得するデータ。query
概要ALL演算子は、比較演算子と併用し、クエリで取得したすべての行がスカラ式を満たす場合に真と
なる、専用の条件式 (限定比較条件) を作成します。
例以下に例を示します。
SELECT DISTINCT(Customer.Customer),Customer.Name FROM Orders,Customer WHERE Orders.Customer=Customer.ID AND 1000 >= ALL (SELECT OrderTotal FROM Orders WHERE Orders.Customer=Customer.ID)
このコマンドは、$1000 以上のものを 1 度も注文したことがない顧客のリストを返します。
Caché SQL リファレンス 7
ALL
関連項目ANY SOME
%ALPHAUP
非推奨。アルファベット文字を、ALPHAUP 照合形式に変換するケース変換関数です。
%ALPHAUP(expression)
%ALPHAUP expression
引数
列名、文字リテラル、または他の関数の結果を指定できる文字列式。基本
となるデータ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とする
ことができます。
expression
概要この照合関数はお勧めしません。新しく開発された、"%SQLUPPER"を参照してください。%SQLUPPER
は、アルファベット以外の文字の処理に優れています。
%ALPHAUP はすべてのアルファベット文字を大文字 (つまり、ALPHAUP 形式) に変換し、空白を
すべて削除し、コンマと疑問符以外の句読点文字をすべて削除します。
%SQLUPPER および %STRING と異なり、%ALPHAUP では、数値が文字列として解釈されることは
ありません。数値は削除されませんが、先頭と末尾のゼロ、空白、小数点文字、プラス記号とマイナ
ス記号、およびその他の句読点は削除されます。したがって、アルファベット以外の文字を含む文
字列の処理に、%ALPHAUP はお勧めできません。
%ALPHAUP は、Caché SQL の拡張機能であり、SQL 検索クエリ用として使用するものです。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.ALPHAUP(expression)
例以下のクエリでは、%ALPHAUP を使用して Name フィールドを大文字に変換しています。これによ
り、包含関係演算子 ([) を使用して、文字 "Y" が存在するかどうかをテストできます。このクエリは、
Sample.Person に文字 "Y" を含む名前をすべて返します。Y が大文字であるか小文字であるかは
関係ありません。
SELECT Name FROM Sample.PersonWHERE %ALPHAUP(Name) [ 'Y'
8 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
他の例として、以下の検索クエリがあります。
SELECT Employees,Name,City,State FROM Employees WHERE (%ALPHAUP(Name) %STARTSWITH %ALPHAUP(:Name)) AND (City %STARTSWITH :City) ORDER BY Name
このクエリは、検索情報変数 ":Name" に対する "Name" フィールド、および検索情報変数 ":City"
に対する "City" フィールドの複合マッチを行うことで、"Employees"テーブルから行を取得します。
どちらの場合も、部分的マッチング論理 %STARTSWITH を使用します。"Name" フィールドに対し
ては、ALPHAUP 文字変換を行います。キャプチャされたすべての行に対して、クエリは
"Name"、"City"、"State" フィールドを表示します。また、"Employees"RowID フィールドも検索しま
す。このフィールドは表示項目からは除外されますが、データベースから行を選択するために内部
的に使用されます。
以下のギリシャ語の例にあるように、%ALPHAUPは Unicode のアルファベット文字とともに使用でき
ます。
SELECT %ALPHAUP({fn CHAR(952)})||%ALPHAUP({fn CHAR(945)})||%ALPHAUP({fn CHAR(955)})||%ALPHAUP({fn CHAR(945)})||%ALPHAUP({fn CHAR(963)})||%ALPHAUP({fn CHAR(963)})||%ALPHAUP({fn CHAR(945)}) FROM Sample.Person
以下の注意すべき例は、実際にはまったく異なる文字が、%ALPHAUP では同一の文字列として扱
われる可能性があることを示しています。
SELECT %ALPHAUP('Max Wells'),%ALPHAUP('Maxwell S.'), %ALPHAUP('Release 3.2'),%ALPHAUP('Re: Lease 32'), %ALPHAUP('12/2/04'),%ALPHAUP('1/22/04'), %ALPHAUP('-36.5 degrees'),%ALPHAUP('365 Degrees')FROM Sample.Person
関連項目%SQLUPPER
Caché SQL リファレンス 9
%ALPHAUP
ALTER TABLE
テーブルを変更します。
ALTER TABLE table alter-table-action
where alter-table-action is one of the following:ADD add-actionDROP drop-actionDELETE drop-actionALTER [COLUMN] identifier alter-column-actionMODIFY modification-spec
add-action ::=[CONSTRAINT table][(] FOREIGN KEY identifier (identifier-commalist)REFERENCES table (identifier-commalist)[triggered-action] [)]|[(] UNIQUE (identifier-commalist)|[(] PRIMARY KEY identifier (identifier-commalist) [)]|DEFAULT [(] default-spec [)] FOR identifier|[COLUMN] [(] identifier datatype{%ALPHAUP | %EXACT | %SQLSTRING [(literal)] |%SQLUPPER [(literal)] | %UPPER | %STRING [(literal)] |%DESCRIPTION literal | DEFAULT [(] default-spec [)] |field-constraint} [)]
drop-action ::=FOREIGN KEY identifier |PRIMARY KEY |CONSTRAINT identifier |[COLUMN] identifier [RESTRICT | CASCADE]
alter-column-action ::=SET DEFAULT [(]default-spec[)] |DEFAULT [(]default-spec[)] |DROP DEFAULT |NULL |NOT NULL |datatype
modification-spec ::=identifier [datatype][DEFAULT [(]default-spec[)]][CONSTRAINT identifier] [NULL] [NOT NULL]
引数
10 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
変更するテーブルの名前。table
変更する列の名前。有効な識別子の詳細は、"SQL の概念" のページを
参照してください。
identifier
Caché SQLの有効なデータ型。有効なデータ型の詳細は、"SQLの概念"
のページを参照してください。
datatype
このフィールドがユーザ指定のデータ値でオーバーライドされない場合に、
このフィールドに自動的に入力される既定のデータ値。一重引用符で囲ん
だ文字列、数値、キーワード・オプション (NULL、CURRENT_USER、
CURRENT_TIMESTAMP など)、OBJECTSCRIPT リテラルなどを指定でき
ます。詳細は、"CREATE TABLE" を参照してください。
default-spec
概要ALTER TABLE 文は、要素の追加や削除または既存の要素の修正を行い、テーブルを変更しま
す。1 つの ALTER TABLE 文で実行できる処理は、1 つのみです。ALTER TABLE DROP 文と
ALTER TABLE DELETE 文は同義語です。
ALTER TABLE コマンドは特権を必要とする操作です。ALTER TABLE を使用する前
に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER オブジェクト特権
があることを確認する必要があります。特権がない場合は、SQLCODE –99エラー (特権違反)が返
されます。適切な特権を持っている場合は、GRANT コマンドを使用して %ALTER_TABLE 特権ま
たは%ALTER特権を割り当てることができます。埋め込みSQLでは、以下のように$SYSTEM.Secu-
rity.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
ALTER TABLE 文は table に対してテーブル・レベルのロックを取得します。これにより、他のプロ
セスはこのテーブルのデータを変更できなくなります。このロックは ALTER TABLE 操作が終了す
ると自動的に解除されます。
ADD COLUMN の制限
ALTER TABLE tablename ADD COLUMN 文を使用してテーブルにフィールドを追加することを考
えます。
• その名前の列がすでに存在している場合、この文は失敗し SQLCODE -306 エラーが発生し
ます。
• この文で、列に NOT NULL 制約を設定し、さらに既定値を設定しない場合、そのテーブルに
すでにデータがあると、この文はエラーになります。これは、DDL 文が完了した後では NOT
NULL 制約は既存の行すべてを満たさないためです。その結果、エラー・コード SQLCODE -
304が生成されますが、これはデータが存在するテーブルに、既定値のないNOTNULLフィー
ルドを追加しようとするためです。
Caché SQL リファレンス 11
ALTER TABLE
• この文で、列に NOT NULL 制約を設定し、さらに既定値を設定した場合、テーブルにある既
存の行は更新され、追加したフィールドの列には設定した既定値が割り当てられます。
• この文で、列に NOT NULL 制約を設定せず、既定値を設定した場合は、既存のどの行の列
でもデータは更新されません。これらの行に対する列の値は NULL です。
• テーブルにデータがない場合は、指定した列の定義がそのテーブルに追加されます。
ALTER COLUMN の制限
データが含まれている列のデータ型を変更することでストリーム・データが非ストリーム・データにな
る場合、または非ストリーム・データがストリーム・データになる場合、そのデータ型変更は実行でき
ません。この変更を実行しようとすると、SQLCODE エラー・コード -374 が発生します。列に既存の
データがない場合は、この変更が可能です。
ADD PRIMARY KEY の制限
一意でないデータを含むフィールド、または NULL 値の入力が認められているフィールドには、主
キー制約を追加できません。
既存のフィールドに主キー制約を追加する場合、フィールドが自動的に IDKey インデックスとして
定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの
方法で設定されているかどうかによります。
• SQL SET OPTION PKEY_IS_IDKEY 文
• ObjectScript $SYSTEM.SQL.SetDDLPKeyNotIDKey() 関数を呼び出します。現在の設定を確
認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Are Primary Keys Created through DDL not ID Keys]の現在の設定を表示しま
す。 “真” (true) を設定すると、主キー制約が DDL で指定されたときに、自動的にクラス定義
の IDKey インデックスになりません。 “偽” (false) の場合は、IDKey インデックスになります。こ
の値を “偽” (false) に設定すると、通常パフォーマンスが向上します。しかし主キーのフィール
ドを更新できなくなります。規定は “真 (true)” (1) です。
このオプションが “偽” (false) (0) に設定されていて、このフィールドにデータがない場合、主キー・
インデックスは IDKey インデックスとして定義されます。このオプションが “偽” (false) に設定され
ていて、このフィールドにデータがある場合、IDKey インデックスは定義されません。
主キーがすでに存在する場合に主キーを作成する
主キーがすでに定義されているテーブルに他の主キーを作成しようとすると、設定によって結果が
異なります。既定で、主キーがすでに存在する場合、Caché は主キーの定義を拒否し、SQLCODE
-307 エラーを返します。この振る舞いは、以下のように設定します。
12 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• ObjectScript $SYSTEM.SQL.SetDDLNo307() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-307
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow Create Primary Key Through DDL When Key Exists] の現在の設定を表
示します。
既定は “偽 (false)” (0) です。ここでは、この設定を推奨します。
このオプションが "真" (true) に設定されていると、ALTER TABLE ADD PRIMARY KEY により、
Cachéは主キー・インデックスをクラス定義から削除し、指定の主キー・フィールドを使用したインデッ
クスを再生成します。
ただし、既存の主キーが存在する状態で主キーを作成できるようにこのオプションを設定していて
も、テーブルにデータがある場合は、IDKey インデックスを兼ねる主キー・インデックスは再作成で
きません。これを実行しようとすると、SQLCODE -307 エラーが返されます。
ADD FOREIGN KEY の制限
既定では、同じ名前の2つの外部キーを持つことはできません。これを実行しようとすると、SQLCODE
= -311 エラーが返されます。このオプションは設定可能です。
• ObjectScript $SYSTEM.SQL.SetDDLNo311() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-311
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow DDL ADD Foreign Key Contraint When Foreign Key Exists] の現在の設
定を表示します。
既定は “偽 (false)” (0) です。この設定を推奨します。真 (true) の場合、同じ名前が存在しても、
DDL を使用して外部キーを追加できます。偽 (false) の場合は、上記の操作を実行すると、-311 エ
ラー・コードが返されます。
DROP CONSTRAINT の制限
外部キー制約によって参照されている一意キー制約または主キー制約は削除できません。削除し
ようとすると、SQLCODE -317 エラーが返されます。
主キー制約の削除による影響は、上記のように [Are Primary Keys ... also ID Keys] 設定の内容に
よって異なります。
• PrimaryKey インデックスが IDKey インデックスを兼ねていない場合、主キー制約を削除すると
PrimaryKey インデックスの定義が削除されます。
• PrimaryKey インデックスが IDKey インデックスを兼ねていて、テーブルにデータがない場合、
主キー制約を削除するとインデックスの定義全体が削除されます。
Caché SQL リファレンス 13
ALTER TABLE
• PrimaryKey インデックスが IDKey インデックスを兼ねていて、テーブルにデータがある場合、
主キー制約を削除すると、IDKey インデックスの定義から PRIMARYKEY 修飾子のみが削除さ
れます。
存在しない制約の削除
制約を持たないフィールドのフィールド制約を削除しようとした場合、構成設定によって結果が異な
ります。
• ObjectScript $SYSTEM.SQL.SetDDLNo315() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-315
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow DDL DROP of Non-constraint] の現在の設定を表示します。
既定は “偽 (false)” (0) です。既定で、制約が存在しない場合、Caché は制約の削除を拒否し、
SQLCODE -315 エラーを返します。しかし、"はい" に設定されていると、ALTER TABLE DROP
CONSTRAINT により、Caché は処理を実行せず、エラー・メッセージを発行しません。
例以下の例では 2 つの埋め込み SQL プログラムを使用して、テーブルを作成し、2 行を生成してか
らテーブルの定義を変更します。ALTER TABLE コマンドは FavoriteColors 列を作成し、その列で
既存の 2 つの行に対応するフィールドに値 'Blue' を入力します。
この動作をはっきり示すために、2 つの埋め込み SQL プログラムは示されている順序で実行してく
ださい (埋め込み SQL では参照されるテーブルがすでに存在していなければ INSERT 文をコンパ
イルすることができないため、ここでは2つの埋め込みSQLプログラムを使用する必要があります)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(DROP TABLE Sample.PTest) WRITE !,"Deleted table, SQLCODE=",SQLCODE &sql(CREATE TABLE Sample.PTest ( Id INT NOT NULL, Name VARCHAR(35), DOB DATE, CONSTRAINT PTestPK PRIMARY KEY (Id) ) ) WRITE !,"Created table, SQLCODE=",SQLCODE
14 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(INSERT INTO Sample.PTest (Id, Name, DOB) VALUES (1, 'David Vanderbilt', 46639)) WRITE !,"Insert data in table, SQLCODE=",SQLCODE &sql(INSERT INTO Sample.PTest (Id, Name, DOB) VALUES (2, 'Mary Smith', 49759)) WRITE !,"Insert data in table, SQLCODE=",SQLCODE &sql(ALTER TABLE Sample.PTest ADD COLUMN FavoriteColor %String NOT NULL DEFAULT 'Blue') IF SQLCODE=0 { WRITE !,"Altered table, SQLCODE=",SQLCODE } ELSEIF SQLCODE=-306 { WRITE !,"Column already exists, SQLCODE=",SQLCODE } ELSE { WRITE "SQLCODE error=",SQLCODE }
データを表示するには、システム管理ポータルで SAMPLES ネームスペースの [グローバル] オプ
ションを選択します。"Sample.PTestD" までスクロールし、[データ] オプションをクリックします。
関連項目
• テーブル CREATE TABLE DROP TABLE
• JOIN
• SELECT
• INSERT UPDATE DELETE
ALTER USER
ユーザ・パスワードを変更します。
ALTER USER user-name IDENTIFY BY password
引数
変更するパスワードを持っているユーザの名前。区切り文字付き識別子がサ
ポートされていて、ユーザ名がアンダースコア (_) で始まる場合、そのユーザ
名は引用符で囲む必要があります。
user-name
ユーザの新しいパスワード。password
概要ALTER USER コマンドを使用すると、ユーザのパスワードを変更できます。自分以外のユーザのパ
スワードを変更するには、適切なシステム特権が必要です。自分のパスワードはいつでも変更でき
ます。
Caché SQL リファレンス 15
ALTER USER
使用できるパスワードは、文字 (大文字/小文字) あるいは % (パーセント記号) から始まるパスワー
ドです。その後ろに、任意の文字、任意の数字、_ (アンダースコア)、& (アンパサンド)、$ (ドル記号)、
@ (アットマーク) を自由に組み合わせて使用できます。パスワードは大文字と小文字が区別されま
す。ユーザ名は、大文字と小文字が区別されません。
ALTER USER は、新しいパスワードが既存のものと同一でもエラー・コードを発行しません。この場
合、SQLCODE = 0 (正常終了) として設定されます。
Caché 5.1 セキュリティ
ALTER USER コマンドは特権を必要とする操作です。埋め込み SQL 内で ALTER USER を使用
する前に、適切な特権を持つユーザとしてログインする必要があります。この設定を行わないと、
SQLCODE -99 (特権違反)になります。$SYSTEM.Security.Login メソッドを使用して、以下のように
ユーザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の埋め込み SQL の例は、Bill というユーザのパスワードを "temp_pw" から "pw4AUser" に変
更します。
Main DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER Bill IDENTIFY BY temp_pw) WRITE !,"CREATE USER error code: ",SQLCODE &sql(ALTER USER BILL IDENTIFY BY pw4AUser) WRITE !,"ALTER USER error code: ",SQLCODECleanup SET toggle=$RANDOM(2) IF toggle=0 { &sql(DROP USER Bill) WRITE !,"DROP USER error code: ",SQLCODE } ELSE { WRITE !,"No drop this time" QUIT }
上述のように、区切り文字付き識別子へのサポートがあり、ユーザ名がアンダースコア (_) で始まる
場合、以下のようにユーザ名を引用符で囲む必要があります。以下はその例です。
ALTER USER "_ADMIN" IDENTIFY BY myPW4now
関連項目
• SQL : ユーザ CREATE USER DROP USER GRANT REVOKE
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
16 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
ALTER VIEW
ビューを変更します。
ALTER VIEW view-name [(column-commalist)] AS query [WITH READ ONLY]
ALTER VIEW view-name [(column-commalist)] AS query [WITH [level] CHECKOPTION]
引数
変更するビュー名。テーブル名と同じ命名規則で変更します。view-name
オプション—ビューを構成する列名。ここで指定しない場合、列
名は下に示すように query で指定されたものになります。
column-commalist
ビューの基準となるクエリの結果セット。query
オプション — このビューの基になっているテーブルに対して、こ
のビューからは挿入、更新、削除の各操作を実行できないよう
にすることを指定します。既定では、以下に示す制限の下で、
ビューからこれらの操作ができるようになっています。
WITH READ ONLY
オプション—このビューの基になっているテーブルに対して、挿
入、更新、削除の各操作を、このビューからどのように実行でき
るかを指定します。level には、キーワード LOCAL または
CASCADED を指定できます。level を指定しない場合、WITH
CHECK OPTION は既定で CASCADED になります。詳細
は、"CREATE VIEW" を参照してください。
WITH level CHECK
OPTION
概要ALTER VIEW コマンドを使用すると、ビューを変更できます。ビューは、1 つの SELECT 文で構成
されたクエリ、または 2 つ以上の SELECT 文の UNION で構成されたクエリの結果セットに基づい
ています。UNION の使用方法の詳細は、"CREATE VIEW" を参照してください。
ビューに列名リストを指定することによって、クエリにそれら列名を含めないこともできます。以下はそ
の例です。
ALTER VIEW MyView (MyViewCol1,MyViewCol2,MyViewCol3) AS SELECT TableCol1, TableCol2, TableCol3 FROM MyTable
上記の例は、以下と同じです。
ALTER VIEW MyView AS SELECT TableCol1 AS ViewCol1, TableCol2 AS ViewCol2, TableCol3 AS ViewCol3 FROM MyTable
Caché SQL リファレンス 17
ALTER VIEW
ALTERVIEWコマンドは特権を必要とする操作です。ALTERVIEWを使用する前に、%ALTER_VIEW
管理者特権または指定されたビューに対する%ALTERオブジェクト特権があることを確認する必要
があります。これを設定しないと、SQLCODE –99 エラー (特権違反) が返されます。適切な特権を
持っている場合は、GRANTコマンドを使用して%ALTER_VIEW特権または%ALTER特権を割り当
てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用し
て適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の埋め込み SQL の例では、クエリの WITH CHECK OPTION を使用してビューを変更しま
す。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(ALTER VIEW Sample.MyTestView AS SELECT FIRSTWORD FROM Sample.MyTest WITH CHECK OPTION) WRITE !,"SQL alter view code is: ",SQLCODE
関連項目ビュー CREATE VIEW DROP VIEW GRANT
ANY
クエリ内の値を比較します。
scalar-expression comparison-operator ANY query
引数
値が比較されるスカラ式。scalar-expression
有効な比較演算子。< (より小さい)、<= (以下)、> (より大き
い)、>= (以上)、<> (等しくない)、= (等しい) など。
comparison-operator
比較対象のクエリから取得するデータ。query
概要ANY 演算子は、比較演算子と併用し、クエリで取得した行のいずれか、またはいくつかがスカラ式
を満たす場合に真となる、専用の条件式 (限定比較条件) を作成します。
比較条件は、SELECT 文の WHERE 節または HAVING 節で使用されます。
18 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例以下に例を示します。
SELECT DISTINCT(Customer.Customer),Customer.CustName FROM Orders,Customer WHERE Orders.Customer=Customer.ID AND 1000 <= ANY (SELECT OrderTotal FROM Orders WHERE Orders.Customer=Customer.ID)
これは、1 度でも $1000 以上の注文をしたことがある顧客のリストを返します。
関連項目ALL SOME
ASCII
文字列式の最初の文字 (左端にある文字) を整数ASCII コード値として返す、スカラ文字列関数で
す。
{fn ASCII(string-expression)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文字
タイプ (CHARやVARCHARなど)とすることができます。CHAR
タイプや VARCHAR タイプの文字列式です。
string-expression
概要NULL または空文字列値を渡すと、ASCII は NULL を返します。NULL を空文字列に返すことは
SQL サーバとの整合性が取れています。
ASCII は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下のクエリはどちらも、文字 Z の ASCII 値である 90 を返します。
SELECT DISTINCT {fn ASCII('Z')} AS AsciiCodeFROM Sample.Person
SELECT DISTINCT {fn ASCII('ZEBRA')} AS AsciiCodeFROM Sample.Person
Caché SQL リファレンス 19
ASCII
Caché SQL では、ASCII 変換の前に、数値が解析されます。以下の例は、数値 7 の ASCII 値であ
る 55 を返します。
SELECT DISTINCT {fn ASCII(+007)} AS AsciiCodeFROM Sample.Person
数値を文字列として指定すると、この数値の解析は実行されません。以下の例は、プラス (+) 文字
の ASCII 値である 43 を返します。
SELECT DISTINCT {fn ASCII('+007')} AS AsciiCodeFROM Sample.Person
関連項目
• SQL 関数 : CHAR
• Caché ObjectScript 関数 : $ASCII $ZLASCII $ZWASCII
ASIN
与えられた角度の正弦のアークサインを、ラジアン表示で返すスカラ数値関数です。
{fn ASIN(float-expression)}
引数
FLOAT 型の式で、値は -1 から 1 の間です。この値は角度の
サインです。
float-expression
概要ASIN は、角度のサインの逆関数値を浮動小数点値で返します。float-expression には、–1 以上 1
以下の符号付き10進数値を指定します。この範囲外の数値を指定すると、実行時エラーが発生し
て、SQLCODE=-400 (致命的なエラーが発生しました) が返されます。NULL 値を渡すと、ASIN は
NULL を返します。ASIN は、空文字列 ('') のように数値でない文字列を数値 0 (ゼロ) として扱いま
す。
ASIN は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、2 つのサイン値に対する ASIN の実行結果です。
SELECT DISTINCT {fn ASIN(0.52)} AS ArcSineFROM Sample.Person
20 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
これは、0.5468509506... を返します。
SELECT DISTINCT {fn ASIN(-1.00)} AS ArcSineFROM Sample.Person
これは、-1.5707963267... を返します。
関連項目
• SQL 関数 : ACOS ATAN COS COT SIN TAN
• Caché ObjectScript 関数 : $ZARCSIN
ATAN
与えられた角度の三角関数のアーク・タンジェントを、ラジアン表示で返すスカラ数値関数です。
{fn ATAN(float-expression)}
引数
FLOAT 型の式。角度のタンジェントです。float-expression
概要ATANは任意の数値を取り、角度のタンジェントの逆関数値を浮動小数点値で返します。NULL値
を渡すと、ATANは NULL を返します。ATANは、空文字列 ('') のように数値でない文字列を数値
0 (ゼロ) として扱います。
ATAN は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、ATAN の実行結果です。
SELECT DISTINCT {fn ATAN(0.52)} AS ArcTangentFROM Sample.Person
これは、0.47951929199... を返します。
関連項目
• SQL 関数 : ACOS ASIN COS COT SIN TAN
• Caché ObjectScript 関数 : $ZARCTAN
Caché SQL リファレンス 21
ATAN
AVG
指定した列の値の平均値を返す集約関数です。
AVG([ALL | DISTINCT] expression)
引数
オプション— AVGで、expressionにある値すべての平均値を返すことを指
定します。キーワードが指定されていない場合は、これが既定になります。
ALL
オプション — AVG で、値の一意なインスタンスのみの平均値を計算する
ことを指定します。指定されていない場合、既定は ALL です。
DISTINCT
任意の有効な式。普通は、平均値算出の対象となるデータ値を含む列の
名前を指定します。
expression
概要AVG 集約関数は、expression の値の平均値を返します。一般的に expression は、クエリで返され
る複数行の中のフィールド名 (または、フィールド名を 1 つ以上含む式) です。
AVG は、テーブルまたはビューを参照する SELECT クエリまたは SELECT サブクエリで使用でき
ます。AVG は、一般のフィールド値とともに、SELECT リストや HAVING 節で使用できます。
AVG は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON 節
では、AVG を使用できません。
AVGで DISTINCT キーワードを使用すると、個別 (一意) の値を持つフィールドのみについて集約
演算が実行されます。ALLキーワードはオプションです。既定では、すべての値の平均値が計算さ
れます。
データ値AVG は倍精度浮動小数点数を返します。既定では、集約関数は Display 値ではなく、Logical (内
部) データ値を使用します。
通常、AVGは数値を含むフィールドまたは式に適用されます。型チェックは実行されないため、(ほ
とんど意味はありませんが) 非数値フィールドに対して実行できます。AVG では、空文字列 ('') の
ように数値でない値はゼロ (0) として扱われます。
データ・フィールドの NULL 値は、AVG 集約関数の値を取得する場合は無視されます。クエリから
行が返されない場合や、すべての行のデータ・フィールド値が NULL の場合、AVG は NULL を返
します。
22 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
現在のトランザクションで発生する変更すべての集約関数と同様に、AVG も必ず、現在のトランザクションの分離レベルに関係なく、コミッ
トされていない変更も含めてデータの現在の状態を返します。詳細は、"SET TRANSACTION" と
"START TRANSACTION" を参照してください。
例以下のクエリは、Sample.Employee データベースに記録されている全従業員の平均給与額をリスト
にします。クエリから返されたすべての行には同じ平均値が入っているので、このクエリは、平均給
与額から成る 1行のみを返します。結果の見やすさを考慮し、|| 演算子を使用して数値にドル記号
を付加し、AS 節を使用して列にラベルを表示しています。
SELECT '$' || AVG(Salary) AS AverageSalary FROM Sample.Employee
以下のクエリは、平均給与額よりも給与額が多い従業員の名前、給与額、全従業員の平均給与額
をリストにします。行は給与額の昇順でリストされます。平均給与額のフィールド値は、クエリで返さ
れるすべての行で同じ値になります。
SELECT Name,Salary,AVG(Salary) AS AverageSalaryFROM Sample.EmployeeHAVING Salary>AVG(Salary)ORDER BY Salary
関連項目COUNT SUM
CALL
ストアド・プロシージャを実行します。
CALL procname(:arg1,:arg2,...)
引数
ストアド・プロシージャの名前。procname
オプション — コンマ区切りリストで指定した、ストアド・プロ
シージャの 1 つまたは複数の引数。普通は、コロン (:) を接
頭語として持つホスト変数として指定します。
arg1
概要CALL 文は、ストアド・プロシージャを実行します。
Caché SQL リファレンス 23
CALL
Caché ObjectScript の埋め込み SQL では、CALL 文の発行、または DO コマンドによる基本ルー
チンや基本メソッドの呼び出しが可能です。
Caché は、ODBC 2.x 標準および JDBC 1.0 標準で定義されている CALL 構文を全面的にサポー
トしています。JDBC では、CallableStatement クラス・メソッドから CALL を実行できます。ODBC で
は、API を利用します。CALL の構文と意味は、JDBC と ODBC でまったく同じです。さらに、処理
方法も同様です。どちらのドライバも文のテキストを解析し、CALL 文の場合は SQL エンジンを経
由せずにサーバ側の専用メソッドを直接呼び出します。
ODBC、JDBC クライアントPERSON クラスに SP1 と呼ばれるストアド・プロシージャが存在する場合、ODBC や JDBC クライア
ント (Microsoft Query など) からこのプロシージャを以下のように呼び出すことができます。
retcode = SQLExecDirect(hstmt, "{?=call PERSON_SP1(?,?)}", SQL_NTS);
Cachéでは、ストアド・プロシージャを呼び出す文の構造は、ODBC標準に準拠しています。この標
準の情報に関しては、関連するドキュメントを参照してください。
ODBC で使用する場合にのみ、Caché では呼び出しに柔軟な構文を適用できるので、CALL の前
後の{ }括弧やパラメータの前後の括弧は必要ありません(これは、適切なプログラミング形式です。
上記の例はこれらを使用しています)。
同様に、ODBCで使用する場合にのみ、Cachéでは、既定のパラメータを使用するために変更され
た構文を適用できます。したがって、CALL SP は CALL SP() とは異なる機能を持ちます。2番目の
フォームは、既定のパラメータを使用しないことを意味します—これは CALL SP (,,)や SP(,?,)、
または他の構文などと同様です。つまり、CALLでは、括弧を使用したフォームと括弧を使用しない
フォームは異なります。
埋め込み SQL からの呼び出し以下のように、埋め込み SQL 文を作成することで、ストアド・プロシージャを呼び出すことができま
す。
&sql(CALL MyProc(:a,:b,:c))
Caché ObjectScript埋め込みSQLから直接ストアド・プロシージャを呼び出すのではなく、ストアド・プロシージャを持つ
クラス・メソッドを Caché ObjectScript から呼び出すことによって、そのストアド・プロシージャを実行
することもできます。この場合、パラメータの管理が必要になります。また、クエリに基づいたストアド・
プロシージャでは、個別のメソッドを呼び出し、フェッチ・ループを管理する必要もあります。
例えば、パラメータを持たないUpdateAllAvgScores と呼ばれるストアド・プロシージャを含むメソッド
を呼び出すためのコードは、以下のようになります。
24 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
NEW phnd SET phnd=##class(%SQLProcContext).%New() DO ##class(students).UpdateAllAvgScores(phnd) IF phnd.SQLCode QUIT phnd.SQLCode USE 0 WRITE !,phnd.RowCount," Rows Affected"
CALL 文でプロシージャの引数を指定する際、そのプロシージャで %Library.SQLProcContext パ
ラメータが明示的に定義されている場合は、%Library.SQLProcContextパラメータを指定しないでく
ださい。このパラメータは自動的に処理されます。
クエリとして実装されているストアド・プロシージャを呼び出すためには、以下の 3 つのメソッドすべ
てを呼び出す必要があります。
NEW qhnd DO ##class(students).GetAvgScoreExecute(.qhnd,x1) NEW avgrow,AtEnd SET avgrow=$lb("") SET AtEnd=0 DO ##class(students).GetAvgScoreFetch(.qhnd,.avgrow,.AtEnd) SET x5=$lg(avgrow,1) DO ##class(students).GetAvgScoreClose(qhnd)
クエリ・ベースのストアド・プロシージャを多くのストアド・プロシージャ内に入れ子にする場合、ラッパ・
メソッドを記述してすべて非表示にすると便利です。
関連項目
• SQL : ストアド・プロシージャ CREATE PROCEDURE CREATE QUERY CREATE METHOD
• Caché ObjectScript : DO コマンド
Caché SQL リファレンス 25
CALL
CASE
条件に従って、特定の値の組み合わせを返します。
CASEWHEN search_condition THEN value_expression[ WHEN search_condition THEN value_expression ... ][ ELSE value_expression ]END
CASE value_expressionWHEN value_expression THEN value_expression[ WHEN value_expression THEN value_expression ... ][ ELSE value_expression ]END
引数
SQL ブーリアン式。search_condition
SQL 式 (リテラル値やフィールド名など)。value_expression
概要CASE式を使用すると、一連の値に対する比較テストを実行し、最初に値が一致したときに返り値を
得ることができます。
CASE 式には単純と検索の 2 つの形式があります。
単純 CASE 式は、(WHEN 節で指定した) 一連の値式をテストし、与えられた値式と等しいかどうか
を調べます。
SELECTCASE Field1 WHEN 1 THEN 'ONE' WHEN 2 THEN 'TWO' ELSE NULLENDFROM MyTable
最初に一致する式に対応する値が CASE 式の値として返されます。
検索 CASE 式は、(WHEN 節で指定した) 一連の検索条件をテストし、評価が真になる最初の条件
を検索し、対応する値を返します。
SELECTCASE WHEN Field1 = 1 THEN 'ONE' WHEN Field1 = 2 THEN 'TWO' ELSE NULLENDFROM MyTable
26 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
どちらの CASE 式の形式でも、WHEN 節の条件が真でない場合に返す値を ELSE 節で指定でき
ます。
CASE 式の最後には END トークンを記述します。
例以下のクエリは単純 CASE 式の例で、ここでは指定したフィールドの値を指定した値に置き換えま
す。
SELECTCASE Age WHEN 65 THEN 'Retire this year' WHEN 64 THEN 'Retire next year' ELSE AgeEND, NameFROM Sample.PersonORDER BY Name
以下のクエリは、別の単純 CASE 式の例です。このクエリでは、特定の Home_State 値を持つ行に
"Northern NE" または "Southern NE" のラベルを付け、この列のその他のHome_State 値を NULL
に設定します。さらに、As 節を使用してこの列に "NewEnglanders" のラベルを付け、Name と元の
Home_State 値を表示します。この結果得られる行は、まず NewEnglanders 列の値の降順で並べら
れ、その中で Home_State、Name の順でアルファベット順に並べられます。
SELECT Name,CASE Home_State WHEN 'VT' THEN 'Northern NE' WHEN 'NH' THEN 'Northern NE' WHEN 'ME' THEN 'Northern NE' WHEN 'MA' THEN 'Southern NE' WHEN 'CT' THEN 'Southern NE' WHEN 'RI' THEN 'Southern NE' ELSE NULLEND As NewEnglanders, Home_StateFROM Sample.PersonORDER BY NewEnglanders DESC,Home_State,Name
以下のクエリは、検索 CASE 式の例です。ここでは、論理演算子 (不等号 >、論理積 &、論理和 !)
を使用して、WHEN節ごとにブーリアン文を指定します。真をテストする最初のWHEN節によって、
THEN キーワードに続く値式が設定されます。この例では、Age フィールドと Home_State フィール
ドの値を使用して、Yankees の値を、Old Yankees、Yankees (New England の 6 州の住民)、および
野球チーム New York Yankees のファンと思われる人のいずれかに特定します。
Caché SQL リファレンス 27
CASE
SELECT Name,CASEWHEN Age > 55 & Home_State = 'VT' ! Home_State='ME' ! Home_State='NH' ! Home_State='MA' ! Home_State='CT' ! Home_State='RI'THEN 'Old Yankee'WHEN Home_State = 'VT' ! Home_State='ME' ! Home_State='NH' ! Home_State='MA' ! Home_State='CT' ! Home_State='RI'THEN 'Yankee'WHEN Home_State='NY' THEN 'Yankees Fan' ELSE Home_StateEND As YankeesFROM Sample.Person
関連項目
• SQL 関数 : DECODE NULLIF COALESCE
• Caché ObjectScript 関数 : $CASE
CAST
与えられた式を、特定のデータ型に変換する汎用 SQL 関数です。
CAST(expr AS CHAR | CHARACTER)CAST(expr AS CHAR(n) | CHARACTER(n) | VARCHAR(n))CAST(expr AS CHAR VARYING | CHARACTER VARYING)CAST(expr AS INT | INTEGER | SMALLINT | TINYINT)CAST(expr AS DEC | DECIMAL | NUMERIC | FLOAT)CAST(expr AS DATE)CAST(expr AS TIME)CAST(expr AS TIMESTAMP)
引数
SQL 式expr
最大文字数を示す整数。n
概要SQL の CAST 関数は、式のデータ型を別のデータ型に変換します。
以下のタイプのいずれにでも式のキャストが可能です。
• CHAR または CHARACTER : 数値または文字列を、その先頭文字で表します。
• CHAR(n)、CHARACTER(n)、または VARCHAR(n) : 数値または文字列を、n で指定された文
字数で表します。
28 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• CHAR VARYING または CHARACTER VARYING : 数値または文字列を、元の値の文字数
で表します。
• INT、INTEGER、SMALLINT、およびTINYINT :数値を、その整数部で表します。小数部は切
り捨てられます。
• DEC、DECIMAL、NUMERIC、および FLOAT : 数値を、元の値の桁数で表します。
• DATE :日付を表します。日付は、コンテキストに応じて、ユーザのロケールでの日付表示形式
(mm/dd/yyyy など)、ODBC 日付形式 (yyyy-mm-dd)、整数で日付を保存する $HOROLOG
形式 (nnnnn) のいずれかで表すことができます。
• TIME :時刻を表します。時刻は、コンテキストに応じて、ユーザのロケールでの時刻表示形式
(hh:mm:ss など)、ODBC 日付形式 (hh:mm:ss)、整数で時刻を保存する $HOROLOG 形式
(nnnnn) のいずれかで表すことができます。
• TIMESTAMP :日付と時刻のスタンプを、yyyy-mm-dd hh:mm:ss形式で表します。これは、
Caché ObjectScript の $ZTIMESTAMP 特殊変数に対応します。
Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照してください。他
のデータ型変換については、"CONVERT" 関数を参照してください。
数値のキャスト
数値は、数値データ型または文字列データ型にキャストできます。
少ない桁数の値に数値をキャストすると、その数値は四捨五入ではなく、切り捨てられます。例えば、
98.765を INTにキャストすると 98が返され、CHARにキャストすると 9が返されます。また、CHAR(4)
にキャストすると 98.7 が返されます。負数を CHAR にキャストすると負符号のみが返され、小数を
CHAR にキャストすると小数点のみが返される点に注意してください。
数値は、0~ 9の数字の桁、小数点、先頭にある 1つまたは複数の記号 (+ または –)、および指数
記号 (文字 E または e) とそれに続く 1 つ以下の + 記号または – 記号で構成できます。数値に桁
区切り文字 (コンマ) を入れることはできません。詳細は "リテラル" を参照してください。
数値は、キャストされる前にCaché SQLによって以下のようにその数値のキャノニック形式に変換さ
れます。指数演算が実行されます。Cachéによって、先頭と末尾にあるゼロ、先頭にある+記号、お
よび末尾にある小数点が取り除かれます。数値がキャストされる前に、複数の記号が変換されます。
ただし、SQL では 2 つ続いたマイナス記号はコメントを示す記号として扱われます。したがって、数
値の中にマイナス記号を 2 つ続けて記述すると、Caché ではそのコード行のそれ以降の部分はコ
メントとして扱われます。
数値を日付データ型または時刻データ型にキャストすると、SQLではNULL値として表示されます。
ただし、日付または時刻にキャストした数値を埋め込み SQLから Caché ObjectScript に渡すと、対
応する $HOROLOG 値として表示されます。
Caché SQL リファレンス 29
CAST
文字列のキャスト
文字列は他の文字データ型にキャストできます。得られる返り値は、1文字、先頭のn文字、または
文字列全体です。
キャストの前に、Caché SQL によって埋め込み引用符文字 ('can''t'=can't) および文字列連結
('can'||'not'=cannot) が変換されます。先頭の空白や末尾の空白は削除されます。
文字列を数値型にキャストすると、必ず 1 桁のゼロ (0) が返されます。
文字列は、DATE、TIME、TIMESTAMP のいずれかのデータ型にキャストできます。以下の演算で
は、有効な数値が得られます。
• 'nnnn-nn-nn' 形式の文字列は DATE にキャストできます (これは、ODBC 日付形式に対応し
た文字列形式です)。値とその範囲の確認が行われます。入力されたデータ値は、1841~9999
年の範囲の有効な日付であることが必要です。SQL では、キャストされたこの値はロケールの
日付表示形式で表示されます。例えば、'2004–11–23' が '11/23/2004' と表示されます。埋め
込み SQL では、このキャストにより、対応する $HOROLOG 日付整数が返されます。
• 'nn:nn:nn' 形式または 'nn:nn:nn.nn' 形式の文字列は、TIME データ型にキャストできます (nn
は、有効な時間値の範囲にある 1 桁または 2 桁の整数)。これは、ODBC 時刻形式に対応し
た文字列形式です。SQLでは、キャストされたこの値はロケールの時刻表示形式で表示されま
す(先頭のゼロが追加され、秒の小数部は切り捨てられます)。例えば、'2:33:25.99'は '02:33:25'
と表示されます。埋め込み SQL では、このキャストにより、対応する $HOROLOG 時刻整数が
返されます。秒の小数部は切り捨てられません。
• 通常、DATE データ型または TIME データ型は TIMESTAMP データ型にキャストされます。
TIMESTAMP にキャストした文字列は、指定どおりに表示されます。値とその範囲の確認は行
われません。また、先頭のゼロは追加されず、秒の小数部も切り捨てられません。
• 'nnnnn' 形式の文字列は DATE にキャストできます (これは、$HOROLOG 日付形式に対応し
た整数文字列です)。SQL では、キャストされたこの値は NULL 文字列として表示されます。埋
め込み SQL では、このキャストにより、対応する $HOROLOG 日付整数が返されます。
• 'nnnnn' 形式の文字列は TIME にキャストできます (これは、$HOROLOG 時刻形式に対応し
た整数文字列です)。SQL では、キャストされたこの値は NULL 文字列として表示されます。埋
め込み SQL では、このキャストにより、対応する $HOROLOG 時刻整数が返されます。
上記の説明にない値を入力すると、NULL 値が返されます。
NULL のキャスト
NULL はあらゆるデータ型にキャストできますが、返り値は NULL です。
日付のキャスト
日付は、TIMESTAMP データ型、数値データ型、または文字列データ型にキャストできます。
30 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
日付をTIMESTAMPデータ型にキャストすると、yyyy-mm-dd hh:mm:ss形式のタイムスタンプが
返されます。日付には時刻の部分がないので、得られるタイムスタンプの時刻の部分は必ず00:00:00
になります。
日付を数値データ型にキャストすると、その日付の $HOROLOG値が返されます。これは、1840 年
12 月 31 日を 0 とし、そこから起算した日数を表す整数値です。
日付を文字列データ型にキャストすると、日付全体、またはキャスト先のデータ型で決まる長さの日
付が返されます。ただし、表示形式はキャスト先の文字列データ型で異なります。CHARVARYING
および CHARACTER VARYING の両データ型では、日付全体が返されます。例えば、日付が
mm/dd/yyyy形式で表示される場合は、その日付が同じ形式の文字列として返されます。他のデー
タ型では、日付 (またはその一部) が ODBC日付形式の文字列として返されます。例えば、日付が
mm/dd/yyyy形式で表示される場合は、その日付が yyyy-mm-dd という形式の文字列として返さ
れます。したがって、日付 04/24/2004 に対して、CHAR データ型では暦年の先頭文字である '2'
が返され、CHAR(8) データ型では '2004–04–' が返されます。
例以下の例では、CAST関数を使用して、平均値を浮動小数点ではなく整数として表示します。CAST
によって数値が四捨五入ではなく、切り捨てられる点に注意してください。
SELECT DISTINCT AVG(Age) AS AvgAge, CAST(AVG(Age) AS INTEGER) AS IntAvgAge FROM Sample.Person
以下の例では、CAST関数を使用して、円周率 (浮動小数点値) をさまざまな数値データ型に変換
します。
SELECT DISTINCT CAST({fn PI()} As INTEGER) As IntegerPi, CAST({fn PI()} As SMALLINT) As SmallIntPi, CAST({fn PI()} As DECIMAL) As DecimalPi, CAST({fn PI()} As NUMERIC) As NumericPi, CAST({fn PI()} As FLOAT) As FloatPi FROM Sample.Person
以下の例では、CAST関数を使用して、円周率 (浮動小数点値) をさまざまな文字列データ型に変
換します。
SELECT DISTINCT CAST({fn PI()} As CHAR) As CharPi, CAST({fn PI()} As CHAR(4)) As CharNPi, CAST({fn PI()} As CHAR VARYING) As CharVaryingPi, CAST({fn PI()} As VARCHAR(4)) As VarCharNPi FROM Sample.Person
以下の例では、CAST関数を使用して、Name (文字列)をさまざまな文字列データ型に変換します。
SELECT DISTINCT CAST(Name As CHAR) As CharName, CAST(Name As CHAR(4)) As CharNName, CAST(Name As CHAR VARYING) As CharVaryingName, CAST(Name As VARCHAR(4)) As VarCharNName FROM Sample.Person
Caché SQL リファレンス 31
CAST
以下の例では、CAST 関数を使用して Name (文字列) をさまざまな数値データ型に変換した結果
を示します。どの場合でも、返り値は 0 (ゼロ) です。
SELECT DISTINCT CAST(Name As INT) As IntName, CAST(Name As SMALLINT) As SmallIntName, CAST(Name As DEC) As DecName, CAST(Name As NUMERIC) As NumericName, CAST(Name As FLOAT) As FloatName FROM Sample.Person
以下の例では、日付フィールド (DOB) を数値データ型、およびいくつかの文字列データ型にキャ
ストします。日付を数値データ型にキャストすると、その日付に相当する $HOROLOG 整数値が返
されます。日付を文字列データ型にキャストすると、CHARVARYINGデータ型またはCHARACTER
VARYINGデータ型の場合は、入力した形式のままでその日付が返されます。それ以外のデータ型
では、日付全体またはその一部が ODBC 日付文字列形式で返されます。
SELECT DISTINCT DOB, CAST(DOB As INT) AS IntDate, CAST(DOB As CHAR) AS CharDate, CAST(DOB As CHAR(6)) AS CharNDate, CAST(DOB As CHAR VARYING) AS CharVaryDate, CAST(DOB As VARCHAR(10)) AS VarCharNDate FROM Sample.Person
以下の例では、文字列を DATE データ型および TIME データ型にキャストします。
SELECT DISTINCT CAST('1936-11-26' As DATE) AS StringToDate, CAST('14:33:45.78' AS TIME) AS StringToTime FROM Sample.Person
日付に変換できるのは、yyyy-mm-dd 形式の文字列のみです。文字列を TIME データ型に変換
すると、秒の小数部は四捨五入ではなく、切り捨てられる点に注意してください。
以下の例では、日付を TIMESTAMP データ型にキャストします。
SELECT DISTINCT DOB, CAST(DOB As TIMESTAMP) AS DateToTstamp FROM Sample.Person
ここで得られるタイムスタンプは、yyyy-mm-dd hh:mm:ss 形式で表されます。
以下の例では、文字列を TIMEデータ型にキャストし、その結果を TIMESTAMPデータ型にキャス
トします。
SELECT DISTINCT CAST(CAST('14:33:45.78' AS TIME) As TIMESTAMP) AS TimeToTstamp FROM Sample.Person
ここで得られるタイムスタンプは、yyyy-mm-dd hh:mm:ss形式で表されます。時刻の部分は入れ
子になっている CAST で指定されています。また、日付の部分は現在のシステム日付です。
32 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目
• データ型 CONVERT
• TO_CHAR TO_DATE TO_NUMBER
CEILING
指定された数値式に等しいか、より大きい最小整数値を返すスカラ数値関数です。
{fn CEILING(numeric-expression)}
引数
上限値を計算する数。numeric-expression
概要CEILINGは、numeric-expression と同じデータ型を返します。numeric-expression に NULL値、空
文字列 ('')、または数値でない文字列を指定すると、CEILING は NULL を返します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.CEILING(numeric-expression)
例以下の例は、CEILING の実行結果です。
SELECT DISTINCT {fn CEILING(167.45)} AS CeilingNumFROM Sample.Person
これは、168 を返します。
SELECT DISTINCT {fn CEILING(167.00)} AS CeilingNumFROM Sample.Person
これは、167 を返します。
SELECT DISTINCT {fn CEILING(-167.45)} AS CeilingNumFROM Sample.Person
これは、-167 を返します。
SELECT DISTINCT {fn CEILING(-167.00)} AS CeilingNumFROM Sample.Person
Caché SQL リファレンス 33
CEILING
これは、-167 を返します。
関連項目FLOOR
CHAR
文字列式で指定された ASCII コード値を持つ文字を返す、スカラ文字列関数です。
{fn CHAR(code-value)}
引数
文字に対応する整数コード。code-value
概要CHAR は指定した整数コード値に対応する文字を返します。Unicode システムでは、0 から 65535
までのあらゆる Unicode 文字の整数コードを指定できます。code-value に許容範囲外の整数を指
定すると、CHAR は NULL を返します。
code-value に数値でない文字列を指定すると、CHAR は空文字列 ('') を返します。NULL 値を渡
すと、CHAR は NULL を返します。
CHAR は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は文字 Z を返します。
SELECT DISTINCT {fn CHAR(90)} AS CharCodeFROM Sample.Person
以下の例はギリシャ文字ラムダを返します。
SELECT DISTINCT {fn CHAR(955)} AS CharCodeFROM Sample.Person
関連項目
• SQL 関数 : ASCII CHAR_LENGTH CHARACTER_LENGTH
• Caché ObjectScript 関数 : $CHAR $ZLCHAR $ZWCHAR
34 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CHARACTER_LENGTH
文字列式の文字数を返す汎用 SQL 関数です。
CHARACTER_LENGTH(string-expression)
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文字
タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
概要CHARACTER_LENGTH は、与えられた文字列式について、そのバイト数ではなく、文字数を示す
整数を返します。この数値には、先頭と末尾の空白や文字列の終了文字の数も含まれます。
CHARACTER_LENGTH は、NULL 値を渡すと NULL を返し、空文字列 ('') の値を渡すと 0 を返
します。
数値は、文字数がカウントされる前に解析されます。引用符に囲まれた数値文字列は解析されませ
ん。以下の例では、最初の CHARACTER_LENGTH は 1 を返し (数値の解析によって先頭と末尾
の空白が削除されるため)、2 番目の CHARACTER_LENGTH は 7 を返します。
SELECT DISTINCT CHARACTER_LENGTH(007.000) AS NumLen, CHARACTER_LENGTH('007.000') AS NumStringLen FROM Sample.Employee
CHARACTER_LENGTH 関数と CHAR_LENGTH 関数は同一です。
例以下の例は、Sample.Employee テーブルの、州の省略形フィールド (Home_State) にある文字の数
を返します (米国のすべての州には 2 文字の郵便用省略形が付けられています)。
SELECT DISTINCT CHARACTER_LENGTH(Home_State) AS StateLength FROM Sample.Employee
以下の例は、各従業員の名前とその名前の文字数を、文字数の昇順で返します。
SELECT Name, CHARACTER_LENGTH(Name) AS NameLength FROM Sample.Employee ORDER BY NameLength
以下の埋め込み SQL の例は、CHARACTER_LENGTH で Unicode 文字がどのように処理される
かを示しています。CHARACTER_LENGTH では、文字のバイト長に関係なく、文字数がカウントさ
れます。
Caché SQL リファレンス 35
CHARACTER_LENGTH
SET a=$CHAR(960)_"FACE" WRITE !,a &sql(SELECT CHARACTER_LENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The CHARACTER length is ",b }
これは、5 を返します。
関連項目
• SQL 関数 : CHAR CHAR_LENGTH
• Caché ObjectScript 関数 : $LENGTH
CHAR_LENGTH
文字列式の文字数を返す汎用 SQL 関数です。
CHAR_LENGTH(string-expression)
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文字
タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
概要CHAR_LENGTH は、与えられた文字列式について、そのバイト数ではなく、文字数を示す整数を
返します。この数値には、先頭と末尾の空白や文字列の終了文字の数も含まれます。CHAR_LENGTH
は、NULL 値を渡すと NULL を返し、空文字列 ('') の値を渡すと 0 を返します。
数値は、文字数がカウントされる前に解析されます。引用符に囲まれた数値文字列は解析されませ
ん。以下の例では、最初の CHAR_LENGTH は 1 を返し (数値の解析によって先頭と末尾の空白
が削除されるため)、2 番目の CHAR_LENGTH は 7 を返します。
SELECT DISTINCT CHAR_LENGTH(007.000) AS NumLen, CHAR_LENGTH('007.000') AS NumStringLen FROM Sample.Employee
CHAR_LENGTH 関数と CHARACTER_LENGTH 関数は同一です。
36 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例以下の例は、Sample.Employee テーブルの、州の省略形フィールド (Home_State) にある文字の数
を返します (米国のすべての州には 2 文字の郵便用省略形が付けられています)。
SELECT DISTINCT CHAR_LENGTH(Home_State) AS StateLength FROM Sample.Employee
以下の例は、各従業員の名前とその名前の文字数を、文字数の昇順で返します。
SELECT Name, CHAR_LENGTH(Name) AS NameLength FROM Sample.Employee ORDER BY NameLength
以下の埋め込み SQL の例は、CHAR_LENGTH で Unicode 文字がどのように処理されるかを示し
ています。CHAR_LENGTH では、文字のバイト長に関係なく、文字数がカウントされます。
SET a=$CHAR(960)_"FACE" WRITE !,a &sql(SELECT CHAR_LENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The CHAR length is ",b }
これは、5 を返します。
関連項目
• SQL 関数 : CHAR CHARACTER_LENGTH
• Caché ObjectScript 関数 : $LENGTH
Caché SQL リファレンス 37
CHAR_LENGTH
%CHECKPRIV
指定の特権がユーザにあるかどうかを確認します。
%CHECKPRIV [GRANT OPTION FOR | ADMIN OPTION FOR] syspriv [,syspriv]
%CHECKPRIV [GRANT OPTION FOR] objpriv ON object
引数
オプション —このキーワードは、現在のユーザが指定の特権
について WITH GRANT OPTION 特権を持っているかどうか
確認することを指定します。このオプションを設定した
%CHECKPRIVでは、ユーザが指定の特権を持っているかどう
かが確認されません。
GRANT OPTION FOR
オプション — このキーワードは、現在のユーザが、指定の特
権を他のユーザやロールに付与できるかどうか確認すること
を指定します。このオプションを設定した%CHECKPRIVでは、
ユーザが指定の特権を持っているかどうかが確認されませ
ん。
ADMIN OPTION FOR
1つのシステム特権です。または、複数のシステム特権をコン
マで区切って列挙した一覧です。利用できる syspriv オプショ
ンに
は、%CREATE_FUNCTION、%DROP_FUNCTION、%CREATE_METHOD、%DROP_METHOD、%CREATE_PROCEDURE、%DROP_PROCEDURE、%CREATE_QUERY、%DROP_QUERY、%CREATE_TABLE、%ALTER_TABLE、%DROP_TABLE、%CREATE_VIEW、%ALTER_VIEW、%DROP_VIEW、%CREATE_TRIGGER、
および %DROP_TRIGGER の 16 個のオブジェクト定義特権が
あります。%DB_OBJECT_DEFINITION を指定すれば、この 16
個のオブジェクト定義特権すべてについて確認できます。
syspriv
指定の object に関係するオブジェクト特権です。指定できる
オプションは、%ALTER、DELETE、SELECT、INSERT、
UPDATE、EXECUTE、および REFERENCES です。
objpriv
objpriv の確認対象とするオブジェクトの名前です。object
概要%CHECKPRIV には以下の 2 つの使用方法があります。
• ユーザに、指定のタイプのシステム特権があるかどうか確認する。
• ユーザに、指定のオブジェクトに対する指定のタイプのユーザ特権があるかどうか確認する。
ユーザに指定の特権がある場合、%CHECKPRIV は SQLCODE 0 を返し、その特権がない場合は
SQLCODE 100 を返します。
38 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
埋め込みSQLについては、特権が自動的には確認されません。この場合の特権は、ODBC/JDBC、
および Dynamic SQL (例えば、システム管理ポータルの [SQL 文の実行] など) を使用して確認し
ます。したがって、埋め込み SQL では、更新作業のように特権を必要とする操作を実行する前
に、%CHECKPRIV を呼び出しておく必要があります。
SET name="fred",age=99 SET SQLCODE="" &sql(%CHECKPRIV UPDATE ON Sample.Person) IF SQLCODE=100 { WRITE !,"No UPDATE privilege" QUIT } ELSEIF SQLCODE > 0 { WRITE !,"Unexpected SQL error: ",SQLCODE QUIT } ELSE { WRITE !,"Proceeding with UPDATE" } &sql(UPDATE Sample.Person SET Name=:name,Age=:age)
%CHECKPRIVはすぐに作成および実行され、通常一度しか実行されないため、Cachéでは、ODBC、
JDBC、またはダイナミック SQL での %CHECKPRIV にはクエリ・キャッシュは作成されません。
例以下の例では、特定のテーブルに対する特定のオブジェクト特権が現在のユーザにあるかどうかを
確認します。
%CHECKPRIV UPDATE ON Sample.Person
以下の例では、すべてのテーブルで3種類のテーブル操作を実行するシステム特権が現在のユー
ザにあるかどうかを確認します。
%CHECKPRIV %CREATE_TABLE,%ALTER_TABLE,%DROP_TABLE
以下の例では、16 個のオブジェクトすべての定義特権が現在のユーザにあるかどうかを確認しま
す。返る SQLCODE値は、16個のオブジェクトすべてに対する特権があれば0、1つでも特権のな
いオブジェクトがあれば 100 です。
%CHECKPRIV %DB_OBJECT_DEFINITION
以下の例では、現在のユーザが、他のユーザやロールに %CREATE_TABLE 特権を付与できるか
どうかを確認します。
%CHECKPRIV ADMIN OPTION FOR %CREATE_TABLE
関連項目
• SQL : ユーザ GRANT REVOKE
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
Caché SQL リファレンス 39
%CHECKPRIV
CLOSE
カーソルをクローズします。
CLOSE cursor-name
引数
クローズするカーソルの名前。これは識別子です。cursor-name
概要CLOSE文は、オープンしているカーソルをクローズします。これは現在の結果セットをリリースし、現
在カーソルがある行によって設定されたカーソル・ロックを解放します。CLOSEは、再度オープンす
るときのためにデータ構造をアクセス可能なままにしますが、カーソルを再度オープンするまで、
フェッチや位置付け更新はできません。CLOSE はオープンしているカーソルに対して発行する必
要があります。宣言されたばかりのカーソルや、クローズされたカーソルに対しては発行できません。
SQL 文では、埋め込み SQL のみでサポートされることに注意してください。同様の操作は、ODBC
でも ODBC API を使用してサポートされます。
例以下は、EmpCursor という名前のカーソルをオープンしてクローズする埋め込み SQL の例です。
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
カーソルをクローズした後も、変数には最後にフェッチしたデータ値が設定されたままになっている
点に注意してください。
関連項目カーソル DECLARE FETCH OPEN
40 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
COALESCE
NULL でない最初の式の値を返す汎用 SQL 関数です。
COALESCE(expression,expression)
引数
評価される式。複数の式はコンマで区切ったリストで指定します。式リスト
では、140個までの式を指定できます。すべての式が同じ型である必要が
あります。
expression
概要COALESCE 関数は、式リストを左から右に検索し、NULL 値でない式が初めて見つかると、その値
を返します。すべての式が NULL と評価されると、NULL が返されます。
DISPLAYモードまたはODBCモードで返されるデータ型は、最初の expression のデータ型によっ
て決まります。
文字列は、先頭と末尾の空白が維持され、そのまま返されます。数値は、先頭と末尾のゼロが削除
され、キャノニック形式で返されます。
NULL の扱いの詳細は、"SQL の概念" のページで "NULL" を参照してください。
例以下の埋め込み SQL の例は、一連のホスト変数値を取り、NULL 以外の値を持つ最初の値 (d) を
返します。Caché ObjectScript の空文字列 ("") が、Caché SQL では NULL として扱われる点に注
意してください。
SET (a,b,c,e)="" SET d="firstdata" SET f="nextdata" &sql(SELECT COALESCE(:a,:b,:c,:d,:e,:f) INTO :x FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The first non-null value is: ",x }
以下の例では、COALESCE を使用して、FavoriteColors フィールドに NULL 値を持つレコードを
特定します。その結果、列を 1 つ返します。FavoriteColors が NULL でない場合は、その好みの
色を返します。FavoriteColors が NULL の場合は、好みの色を持たない人の名前を返します。
SELECT COALESCE(FavoriteColors,Name) AS WhoNullColors FROM Sample.Person
Caché SQL リファレンス 41
COALESCE
関連項目IFNULL ISNULL
COMMIT
トランザクションの終了を表します。
COMMIT [WORK]
概要COMMIT 文は、トランザクション中に完了した処理をコミットし、設定されていたすべてのロックを解
放します。コミットされた処理はロールバックできません。
COMMIT 文と COMMIT WORK 文は同等です。両者には互換性があります。
• トランザクションにセーブポイントが含まれていない場合は、COMMIT によって現在のトランザ
クション中に完了したすべての作業がコミットされ、すべてのロックが解放されて、トランザクショ
ンが正常に終了します。
• トランザクション中にセーブポイントがあると、COMMIT は最新のセーブポイント以降の処理を
コミットして、トランザクション・レベルのカウンタをディクリメントします。すべてのセーブポイント
がコミットされ、トランザクション・レベル・カウンタがゼロにリセットされると、トランザクションは完
了します。したがって、セーブポイントを含むトランザクションの場合、複数の COMMIT 文が必
要になります。
START TRANSACTION 文は新しいトランザクションを明示的に開始するものです。しかし、これは
オプションです。トランザクション処理がアクティブなとき、最初のデータベース操作に続いてCOMMIT
が実行されると、新しいトランザクションが暗黙的に開始されます。トランザクション処理が反映され
ない場合や、自動コミットによって反映される場合、COMMIT 文は意味を持ちません。クエリでの
COMMITの結果は現在の分離レベルによって異なります。これらのトランザクション・パラメータは、
SET TRANSACTION または START TRANSACTION コマンドのどちらでも設定できます。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
Caché ObjectScript と SQL トランザクションTSTART と TCOMMIT を使用した Caché ObjectScript トランザクション処理は、SQL 文 START
TRANSACTION と COMMIT を使用した SQL トランザクション処理とは異なり、互換性はありませ
ん。Caché ObjectScript および Caché SQLはいずれも入れ子のトランザクションを限定的にサポー
トしますが、これらのサブ・トランザクション・メソッドは本質的に異なります。また、Caché ObjectScript
トランザクションは、SQL ロック制御変数と相互にやり取りしません。アプリケーションは、これら 2 種
類のトランザクション処理を混同しないよう注意する必要があります。
42 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
トランザクションに SQL 更新文が含まれる場合、SQL の START TRANSACTION 文でトランザク
ションが開始され、COMMIT 文でコミットされます。TSTART/TCOMMIT を入れ子にして使用する
メソッドは、トランザクションを開始するものでなければ、トランザクションに組み込むことができます。
メソッドとストアド・プロシージャは、通常、設計でトランザクションの主要なコントローラにならない限
り、SQL トランザクション制御文を使用しません。ストアド・プロシージャは、独自のトランザクション制
御モデルの ODBC/JDBC から呼び出されるため、通常 SQL トランザクション制御文を使用しませ
ん。
関連項目
• SQL コマンド : ROLLBACK SAVEPOINT SET TRANSACTION START TRANSACTION トラ
ンザクション
• Caché ObjectScript コマンド : TCOMMIT
CONCAT
2 つの文字列式を連結した結果として、文字列を返すスカラ文字列関数です。
{fn CONCAT(string-expression1,string-expression2)}
引数
連結する文字列式。式は列の名前や文字リテラル、または
他のスカラ関数の結果です。基本となるデータ型は、任意
の文字タイプ (CHAR や VARCHAR など) とすることができ
ます。
string-expression1,
string-expression2
概要CONCAT は、2 つの文字列を連結して、連結後の文字列を返します。連結演算子 (||) を使用して
も、同じ動作を実行できます。すべての数値、または日付パラメータも、連結前に自動的に文字列
に変換されます。数値の指数が展開され、先頭のゼロと末尾のゼロは連結前に削除されます。先頭
または末尾の空白は文字列に連結できます。
NULL 値を文字列に連結すると NULL になりますが、これは業界全体の SQL 標準です。
STRING 関数でも、2 つ以上の式を連結して 1 つの文字列にすることができます。
例以下の例では、Home_State列とHome_City列を連結して、ロケーション値を生成します。CONCAT
関数と連結演算子を使用した、2 つの連結が示されています。
Caché SQL リファレンス 43
CONCAT
SELECT {fn CONCAT(Home_State,Home_City)} AS LocationFunc,Home_State||Home_City AS LocationOpFROM Sample.Person
以下の例は、文字列と NULL を連結しようとした場合にどのようになるかを示しています。
SELECT {fn CONCAT(Home_State,NULL)} AS StrNullFROM Sample.Person
以下では、連結前に数値がキャノニック形式に変換される例を示しています。このような状況を避け
るには、以下のように数値を文字列として指定します。
SELECT {fn CONCAT(Home_State,0012.00E2)} AS StrNum,{fn CONCAT(Home_State,'0012.00E2')} AS StrStrNumFROM Sample.Person
以下は、末尾の空白の保持の例を示しています。
SELECT CHAR_LENGTH({fn CONCAT(Home_State,' ')}) AS StrSpaceFROM Sample.Person
関連項目ASCII CHAR STRING SUBSTRING
CONVERT
与えられた式を、特定のデータ型に変換する汎用スカラ・システム関数です。
{fn CONVERT(expression,datatype)}
CONVERT(datatype,expression,format-code)
引数
変換する式。expression
式の変換後のデータ型。datatype
オプション — 日付および時刻の形式を指定する整数コード。
date/time/datastampデータ型と文字データ型の変換に使用し
ます。この引数は、2 番目の構文形式でのみ使用します。
format-code
概要ここでは、CONVERT 関数の 2 種類の実装について説明します。いずれも特定のデータ型の式を
別のデータ型の対応値に変換します。両方とも、主に日付と時刻の変換に使用されます。
44 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
注釈: これら 2 種類の CONVERT の実装では、引数の表示順序が異なります。1 つ目は、引数
2 つの Caché ODBC スカラ関数です。2 つ目は、MS SQL Server との互換性がある汎用
関数で、引数は 3 つです。これ以降は、これら 2 種類の形式の CONVERT のそれぞれ
について説明します。
{fn CONVERT(expression,datatype)}これは、ODBC スカラ関数です。以下の ODBC の明示的データ型変換をサポートします。この形
式の CONVERT では、データ型を指定する "SQL_" キーワードを使用する必要があります。
変換先変換元
SQL_TIME, SQL_DATE, SQL_VARCHAR,
SQL_TIMESTAMP
SQL_TIMESTAMP (%TimeStamp)
SQL_TIME, SQL_DATESQL_VARCHAR (%String)
SQL_VARCHAR, SQL_INTEGER,
SQL_TIMESTAMP, SQL_TIME
SQL_TIME (%Time)
SQL_VARCHAR, SQL_INTEGER,
SQL_TIMESTAMP, SQL_DATE
SQL_DATE (%Date)
SQL_INTEGER任意の非 BLOB データ型
SQL_DOUBLE任意の非 BLOB データ型
SQL_VARCHAR任意の数値データ型
SQL_VARCHAR は標準的な ODBC 表現です。SQL_VARCHAR に変換する場合、日時は適切な
ODBC表現に変換されます。つまり、数値のデータタイプは文字列に変換されます。SQL_VARCHAR
から変換する場合、値は有効な ODBC Time、Timestamp、Date 表現である必要があります。
SQL_INTEGER または SQL_DOUBLE に変換する場合は、日付および時刻も含めてデータ値が数
値表記に変換されます。SQL_DATEは1841年1月1日以降の日数を、SQL_TIMEは午前0時からの
秒数を示します。非数値文字が検出されると、入力文字列が切り捨てられます。SQL_INTEGER で
は、小数桁数も切り捨てられます。
NULL はどのデータ型に変換されても NULL のままです。
空文字列 ('')、あるいは非数値文字列値は以下のように変換されます。
• SQL_VARCHAR と SQL_TIMESTAMP は、入力された値を返します。
• SQL_INTEGER は、0 (ゼロ) に変換されます。
• SQL_DATE と SQL_TIME は NULL に変換されます。
これ以外のデータ型変換は、"CAST" 関数を参照してください。
Caché SQL リファレンス 45
CONVERT
CONVERT(datatype,expression,format-code)これは、MS SQL Server 互換関数です。有効な Caché SQL データ型のいずれかをデータ型として
取得します。Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照し
てください。
オプションの format-code 引数は、date、datetime、time のいずれかの形式を指定します。この形
式は、date/time/timestampデータ型から文字列への変換時の出力の定義、あるいは、文字列から
date/time/timestamp データ型への変換時の入力の定義に使用できます。format-code が指定さ
れない場合、既定は format-code 100 と同じになります。以下のコード値がサポートされています。
形式4 桁の年コード2桁の年コー
ド
Mon dd yyyy hh:mmAM (または PM)0 または 100
mm/dd/yy1011
yy.mm.dd1022
dd/mm/yy1033
dd.mm.yy1044
dd-mm-yy1055
dd Mon yy1066
Mon dd, yy1077
hh:mm:ss1088
Mon dd yyyy hh:mm:ss.nnnAM (または PM)9 または 109
mm-dd-yy11010
yy/mm/dd11111
yymmdd11212
dd Mon yyyy hh:mm:ss:nnn (24 時間制)13 または 113
hh:mm:ss:nnn (24 時間制)11414
yyyy-mm-dd hh:mm:ss (24 時間制)20 または 120
yyyy-mm-dd hh:mm:ss.nnn (24 時間制)21 または 121
yyyy-mm-ddThh:mm:ss.nnn (24 時間制)126
dd Mon yyyy hh:mm:ss:mmmAM (または PM)130
dd/mm/yy hh:mm:ss:mmmAM (または PM)131
46 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
Caché SQL でサポートされているデータ型の一覧については、"データ型" を参照してください。こ
れ以外のデータ型変換は、"CAST" 関数を参照してください。
例以下の例は、"DOB" (誕生日) 列の日付を、SQL_TIMESTAMP データ型に変換します。
SELECT DOB,{fn CONVERT(DOB,SQL_TIMESTAMP)} AS DOBtoTstamp FROM Sample.Person
ここで得られるタイムスタンプは、yyyy-mm-dd hh:mm:ss 形式で表されます。
以下の例は、"DOB" (誕生日) 列の日付を、SQL_INTEGER データ型に変換します。
SELECT DOB,{fn CONVERT(DOB,SQL_INTEGER)} AS DOBtoInt FROM Sample.Person
生成される整数は 1840 年 12 月 31 日からの、$HOROLOG カウントになります。
以下の例は、DOB (誕生日) 列の日付を、SQL_VARCHAR データ型に変換します。
SELECT DOB,{fn CONVERT(DOB,SQL_VARCHAR)} AS DOBtoVChar FROM Sample.Person
ここで得られる文字列は yyyy-mm-dd 形式で表されます。
以下の例は、CONVERT の 2 番目の構文形式を使用します。誕生日フィールド (DOB) から形式
化された文字列への複数の変換を示しています。
SELECT DOB,CONVERT(VARCHAR(20),DOB) AS DOBDefault,CONVERT(VARCHAR(20),DOB,100) AS DOB100,CONVERT(VARCHAR(20),DOB,107) AS DOB107,CONVERT(VARCHAR(20),DOB,114) AS DOB114,CONVERT(VARCHAR(20),DOB,126) AS DOB126 FROM Sample.Person
既定の形式とコード100の形式は同じです。DOBフィールドには時刻値が格納されていないため、
時刻を表示する形式 (ここでは、既定値、100、114、126) では、12:00AM (真夜中) を示すゼロ値が
指定されます。コード 126 の形式は、日付と時刻の文字列を空白なしで表示します。
関連項目データ型 CAST
Caché SQL リファレンス 47
CONVERT
COS
与えられた角度の三角関数のコサインを、ラジアン表示で返すスカラ数値関数です。
{fn COS(float-expression)}
引数
FLOAT 型の式。ラジアンで表示される角度です。float-expression
概要COS は、任意の数値を取り、浮動小数点数でコサインを返します。返り値は –1 から 1 までの範囲
の値です。NULL 値を渡すと、COS は NULL を返します。COS は、非数値文字列を数値 0 (ゼロ)
として扱います。
COS は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、2 つのサイン値に対する COS の実行結果です。
SELECT DISTINCT {fn COS(0.52)} AS CosineFROM Sample.Person
これは、0.86781 を返します。
SELECT DISTINCT {fn COS(-.31)} AS CosineFROM Sample.Person
これは、0.95233 を返します。
関連項目
• SQL 関数 : ACOS ASIN ATAN COT SIN TAN
• Caché ObjectScript 関数 : $ZCOS
48 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
COT
与えられた角度の三角関数のコタンジェントを、ラジアン表示で返すスカラ数値関数です。
{fn COT(float-expression)}
引数
FLOAT 型の式。ラジアンで表示される角度です。float-expression
概要COT は、ゼロ以外の数値を取り、そのコタンジェントを浮動小数点数で返します。NULL 値を渡す
と、COT は NULL を返します。数値 0 (ゼロ) では実行時エラーが発生して、SQLCODE=-400 (致
命的なエラーが発生しました) が返されます。COT は、非数値文字列を数値 0 として扱います。
COT は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、COT の実行結果です。
SELECT DISTINCT {fn COT(0.52)} AS CotangentFROM Sample.Person
これは、1.74653 を返します。
SELECT DISTINCT {fn COT(124.1332)} AS CotangentFROM Sample.Person
これは、-0.040312 を返します。
関連項目
• SQL 関数 : ACOS ASIN ATAN COS SIN TAN
• Caché ObjectScript 関数 : $ZCOT
Caché SQL リファレンス 49
COT
COUNT
テーブルや特定の列から、行の数を返す集約関数です。
COUNT(*)
COUNT([ALL | DISTINCT] expression)
引数
指定のテーブル内の行の合計を返すために、すべての行をカウントする
ことを指定。COUNT(*)はパラメータを取らず、ALLキーワードやDISTINCT
キーワードとは併用できません。COUNT(*)は、expressionパラメータを取
らず、特定の列に関する情報はまったく使用しません。COUNT(*) は、重
複を除外せずに指定されたテーブルやビューの行数を返します。それぞ
れの行は、NULL 値を持つ行も含めて、個別にカウントされます。
*
オプション — expression にあるすべての値の個数を返すように指定しま
す。キーワードが指定されていない場合は、これが既定になります。
ALL
オプション — expression にある個別 (一意) の値の個数を返すように指定
します。指定されていない場合、既定は ALL です。
DISTINCT
任意の有効な式。普通は、カウント算出の対象となるデータ値を含む列の
名前を指定します。
expression
概要COUNT 集約関数は、expression の値のカウントを返します。一般的に expression は、クエリで返
される複数行の中のフィールド名 (または、フィールド名を 1 つ以上含む式) です。COUNT では
NULL 値をカウントしません。
COUNT は、テーブルやビューを参照する SELECT クエリまたは SELECT サブクエリで使用できま
す。COUNT は、一般のフィールド値とともに SELECT リストや HAVING 節で使用できます。
COUNTは、WHERE節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON
節では、COUNT を使用できません。
COUNTは、DISTINCTキーワード、またはALLキーワードを取得できます。COUNTでDISTINCT
キーワードを使用すると、個別 (一意) の値を持つフィールドのみについて集約演算が実行されま
す。ALL キーワードは、非 NULL 値のすべてをカウントします。これが既定の動作です。
データ値COUNT は整数を返します。既定では、集約関数は Display 値ではなく、Logical (内部) データ値
を使用します。
50 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
COUNT(*) は、NULL 値が格納された行を含む、テーブル内の行の数を返します。
COUNT(expression) は、NULL 値が格納されたフィールドをカウントしません。
現在のトランザクション中の変更すべての集約関数と同様、COUNT は常にデータの現在の状態を返します。現在のトランザクショ
ンの分離レベルを問わず、コミット前の変更も現在の状態として扱われます。詳細は、"SET
TRANSACTION" および "START TRANSACTION" を参照してください。
例以下のクエリは、Sample.Person データベースの行の合計数を返します。
SELECT COUNT(*) AS TotalPersons FROM Sample.Person
以下のクエリは、Sample.PersonデータベースのHome_Stateの個別の値が格納された各行の合計
数を返します。
SELECT Home_State, COUNT(*) AS TotalPersons FROM Sample.Person GROUP BY Home_State ORDER BY Home_State
以下のクエリは、行の合計数、FavoriteColors フィールドの非 NULL 値の合計数、FavoriteColors
フィールドの個別の非 NULL 値の合計数の 3 つの値を返します。
SELECT COUNT(*) As TotalPersons, COUNT(FavoriteColors) AS WithColorPref, COUNT(DISTINCT FavoriteColors) AS ColorPrefs FROM Sample.Person
以下のクエリは、連結式のある COUNT を示しています。FavoriteColor フィールドの非 NULL 値
の合計数、連結演算子 (||) で他の 2 つのフィールドと連結された FavoriteColors の 非 NULL 値
の合計数を返します。
SELECT COUNT(FavoriteColors) AS Color, COUNT(FavoriteColors||Home_State) AS ColorState, COUNT(FavoriteColors||Spouse) AS ColorSpouse FROM Sample.Person
2 つのフィールドが連結されると、COUNTは、いずれのフィールドにも NULL値がない行のみをカ
ウントします。Sample.Person のすべての行に非 NULL の Home_State 値があるため、
FavoriteColors||Home_State の連結では FavoriteColors と同じカウントが返されます。
Sample.Person の行の中にはSpouse が NULL値のものがあるため、FavoriteColors||Spouse
の連結では、FavoriteColors と Spouse の両方ともが NULL 値でない行のカウントが返されます。
関連項目AVG SUM
Caché SQL リファレンス 51
COUNT
CREATE FUNCTION
クラス内でメソッドとして関数を生成します。
CREATE FUNCTION name(parameter_list) characteristics code_body
引数
作成する関数の名前。識別子です。この関数名に
は、修飾されていない場合 (StoreName) と修飾され
ている場合 (Patient.StoreName) があります。
name
オプション — 値を関数に渡すために使用するパラ
メータのリスト。パラメータのリストは括弧で囲み、パ
ラメータはコンマで区切ります。
parameter_list
オプション—関数の特性を指定する1つ以上のキー
ワード。使用可能なキーワードは、FOR、FINAL、
PRIVATE、PROCEDURE、RETURNS、SELECTMODE
です。複数の特性は、空白で区切り、任意の順序で
指定できます。
characteristics
オプション— code_body で使用するプログラミング言
語。LANGUAGE OBJECTSCRIPT (Caché
ObjectScript の場合) または LANGUAGE SQL を指
定します。LANGUAGE節が省略される場合は、SQL
が既定です。
LANGUAGE OBJECTSCRIPT
LANGUAGE SQL
メソッドのプログラム・コード。メソッドは関数として指
定するため、値を返すようにコードを記述する必要が
あります。
code_body
概要CREATE FUNCTION文は、クラスのメソッドとして関数を生成します。このクラス・メソッドは、SQLス
トアド・プロシージャとして投影されます。CREATE PROCEDURE 文は、SQL ストアド・プロシージャ
として投影されるメソッドの生成にも使用できます。メソッドで値を返すときにはCREATE FUNCTION
を使用する必要がありますが、値を返さないメソッドの生成にも使用できます。
関数の生成には、GRANTコマンドで指定された%CREATE_FUNCTION管理者特権が必要です。
SQL文内からの SQL関数の呼び出しの詳細は、このドキュメントの "SQLの概念"のページの "関
数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しに
ついては、"CALL" 文を参照してください。
52 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
引数
name
関数として生成するメソッドの名前です。この関数名には、修飾されない場合 (StoreName) と、クラ
ス名の指定で修飾される場合 (Patient.StoreName) があります。
parameter-list
値を関数に渡すために使用するパラメータのリストです。パラメータのリストは括弧で囲み、リストの
パラメータ宣言はコンマで区切ります。リストのパラメータ宣言は、先頭から順に、パラメータ・モード
を指定するキーワード (IN : 入力値、OUT : 出力値、INOUT : 入力、変更、出力)、パラメータ名、
パラメータのデータ型、さらにオプションのキーワードDEFAULTから成ります。キーワードDEFAULT
の後には、パラメータの既定値を一重引用符で囲んだ文字列で記述します。例えば以下のようにな
ります。
IN Salary FLOAT DEFAULT '0'
このメソッドは、プロシージャ・コンテキスト・ハンドラを使用して、プロシージャとその呼び出し元
(ODBC サーバなど) 間でプロシージャ・コンテキストの受け渡しを行います。このプロシージャ・コン
テキスト・ハンドラは、Caché によって (%qHandle:%SQLProcContext として) %sqlcontext オブジェク
トを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとし
て明示的に宣言できます。
INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数
SQLCODE と %ROWCOUNT に設定されます。
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
characteristics
利用できるキーワードは以下のとおりです。
Caché SQL リファレンス 53
CREATE FUNCTION
メソッドを生成するクラス名を指定します。そのクラスが存在しない
場合は新規作成します。関数名を認証することによりクラス名を指
定することもできます。FOR 節で指定されたクラス名の方が、関数
名の認証により指定されたクラス名よりも優先されます。
FOR classname
サブクラスがメソッドをオーバーライドできないように指定します。既
定では、メソッドは最終ではありません。FINAL キーワードはサブク
ラスによって継承されます。
FINAL
メソッドがそれ自身のクラス、またはサブクラスの他のメソッドによっ
てのみ起動できることを指定します。既定ではメソッドはパブリック
で、制限なしに起動できます。この制限はサブクラスによって継承さ
れます。
PRIVATE
メソッドが SQL ストアド・プロシージャとして投影されることを指定し
ます。ストアド・プロシージャはサブクラスに継承されます。CREATE
FUNCTION は常に SQL ストアド・プロシージャに投影するため、こ
のキーワードはオプションです。このキーワードは、PROC と略すこ
とができます。
PROCEDURE
メソッドの呼び出しで返される値のデータ型を指定します。RETURNS
が省略されると、メソッドは値を返すことができません。この仕様は
サブクラスによって継承されます。
RETURNS datatype
メソッドのコンパイルに使用するモードを指定します。使用可能な値
は、LOGICAL、ODBC、RUNTIME、DISPLAYです。既定はLOGICAL
です。
SELECTMODE mode
SELECTMODEはデータを返すモードを指定します。mode 値が LOGICALの場合は、論理 (内部
保存) 値が返されます。例えば、日付は $HOROLOG 形式で返されます。mode 値が ODBC の場
合、論理と ODBC 間の変換が適用され、ODBC 形式値が返されます。mode 値が DISPLAY の場
合、論理と表示間の変換が適用され、表示形式値が返されます。mode 値が RUNTIME の場合、
ローカル変数 %Runtime を設定して、実行時にモードを LOGICAL、ODBC、DISPLAY のいずれか
に設定できます。これは、%Library.ResultSet RuntimeMode プロパティを使用して設定できます。
RUNTIME モードの既定は LOGICAL です。
SELECTMODE に指定した値は、#SQLCOMPILE SELECT=mode のように Caché ObjectScript ク
ラス・メソッド・コードの最初に追加されます。
LANGUAGE
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節が省
略される場合は、SQL が既定です。
54 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
code_body
生成されるメソッドのプログラム・コード。このコードは SQL または Caché ObjectScript で指定しま
す。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché ObjectScript の
コードには埋め込み SQL を記述できます。
Caché は、メソッドの実際のコードを生成するために提供されたコードを使用します。指定するコー
ドが SQL の場合、メソッドの生成時にコード行が追加されます。追加のコードでは、SQL が Caché
ObjectScript "ラッパ" に埋め込まれ、(必要に応じて) プロシージャ・コンテキスト・ハンドラが作成さ
れ、返り値が処理されます。以下は この Caché から生成されたラッパ・コードの例です。
NEW SQLCODE,%ROWID,%ROWCOUNT,title &sql( SELECT col FROM tbl ) QUIT $GET(title)
指定したコードが OBJECTSCRIPT の場合、(NEW 変数で、QUIT を使用して終了し、(オプション
で) 完了時に値を返す) "ラッパ" を明示的に定義する必要があります。
例以下の例は、Caché ObjectScript コードを呼び出す関数を作成します。ObjectScript コードは埋め
込み SQL を含んでいます。
CREATE FUNCTION Sample_Employee.GetTitle ( INOUT pHandle %SQLProcContext, SSN VARCHAR(11), INOUT Title VARCHAR(50) ) PROCEDURE RETURNS VARCHAR(30) FOR Sample.Employee LANGUAGE OBJECTSCRIPT { NEW SQLCODE,%ROWCOUNT &sql(SELECT Title INTO :Title FROM Sample.Employee WHERE SSN = :SSN) IF $GET(pHandle)'=$$$NULLOREF { SET pHandle.SQLCode=SQLCODE SET pHandle.RowCount=%ROWCOUNT } QUIT }
関連項目DROP FUNCTION
Caché SQL リファレンス 55
CREATE FUNCTION
CREATE INDEX
テーブルにインデックスを定義します。
CREATE [UNIQUE | BITMAP] INDEX index-nameON [TABLE] table-name (column-name [ASC | DESC], ...)
引数
オプション—インデックス内のすべての列で、テーブル内に同じ値を持つ
行が存在しないようにする制約。
UNIQUE
オプション — ビットマップ・インデックスの生成の指定。BITMAP
定義するインデックス。識別子の名前です。index-name
インデックスを定義する既存のテーブル名。table-name
インデックスの基準となる、1 つまたは複数の列の名前。column-name
オプション—このキーワードは何も実行しません。解析時に、他のベンダ
に対する互換性維持のためのみにサポートされています。
ASC
オプション—このキーワードは何も実行しません。解析時に、他のベンダ
に対する互換性維持のためのみにサポートされています。
DESC
概要CREATE INDEX 節は、指定したテーブルの指定した列でソートされたインデックスを作成します。
CREATE INDEX コマンドは特権を必要とする操作です。CREATE INDEX を使用する前
に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER 特権があることを
確認する必要があります。特権がない場合は、SQLCODE –99 エラー (特権違反) が返されます。
適切な特権を持っている場合は、GRANTコマンドを使用してこのような特権を割り当てることができ
ます。
CREATE INDEX 文は table-name に対してテーブル・レベルのロックを取得します。これにより、他
のプロセスはこのテーブルのデータを変更できなくなります。このロックは、CREATE INDEX操作が
終了すると自動的に解除されます。
インデックス名
インデックス名は、指定されたテーブル内では一意の必要があります。インデックス名は、識別子規
約に従い、以下の制限を受けます。既定のインデックス名は、簡単な識別子です。インデックス名
は、128 文字を超えることはできません。
Caché は、("SqlName" と呼ばれる) 入力された名前を使用して、クラスおよびグローバル内で対応
するインデックス名を生成します。このインデックス名には英数字(文字と数字)のみを使用でき、最
56 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
大長は 31 文字です。Caché は、まず入力された SqlName から句読点を削除し、31 文字 (以内) の
一意の識別子を生成して、一意にするために必要であれば 31 番目の文字を大文字に置き換え
て、インデックス名を生成します。
• インデックス名は、フィールド、テーブル、ビューと同じ名前にすることができますが、このような
名前の重複はお勧めできません。
• インデックス名には、最低でも 1 字は英字が必要です。インデックス名の先頭の字または最初
の句読点の後ろの字は、文字にする必要があります。有効な文字は、$ZNAMEテストに合格す
る文字です。
• 生成されたインデックス名には句読点が含まれないため、句読点のみが異なるインデックス名
の作成は可能ですがお勧めできません。
• インデックス名は 31文字よりも大幅に長くすることができますが、最初の31文字の英数字と異
なるインデックス名にすると作業が簡単になります。
既存インデックスと同じ名前のインデックスを作成する場合に何が起こるかは、以下に説明していま
す。
既存インデックス
既定で Caché は、テーブルに既存インデックスと同じ名前のインデックスを作成することを拒否し、
SQLCODE -324 エラーを返します。この振る舞いは以下のように構成可能です。
• ObjectScript $SYSTEM.SQL.SetDDLNo324() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-324
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow DDL CREATE INDEX for Existing Index] の現在の設定を表示します。
既定は “偽 (false)” (0) です。既定で Caché は、テーブルに既存インデックスと同じ名前のイン
デックスを作成することを拒否し、SQLCODE -324 エラーを返します。ここでは、この設定を推奨し
ます。
このオプションを “真 (true)” (1) に設定した場合、Caché はクラス定義から既存インデックスを削
除して、CREATE INDEX を実行して再作成します。CREATE INDEX で指定されたテーブルから、
指定されたインデックスを削除します。このオプションにより、UNIQUE 制約インデックスの削除/再
作成が可能になります (DROP INDEX コマンドでは実行できません)。主キー・インデックスの削除/
再作成は、"ALTER TABLE" コマンドを参照してください。
ただし、このオプションが既存インデックスの再作成を許可するように設定されていても、テーブルに
データが格納されている場合は、IDKEYインデックスの再作成はできません。これを実行しようとす
ると、SQLCODE -324 エラーが返されます。
Caché SQL リファレンス 57
CREATE INDEX
UNIQUE キーワード
UNIQUE キーワードを使用して、インデックス内の各レコードが一意の値を持つよう指定できます。
具体的には、インデックス内に (つまり、インデックスがあるテープル内に)同じ照合された値を持つ
レコードは存在しないよう指定できます。既定では、大半のインデックスは、(大文字小文字に関係
なく検索するように) 大文字の照合を使用します。この場合、 “Smith” と “SMITH” は等しい値で
あり、それぞれ一意的ではありません。
インデックス照合および SQL クエリで大文字と小文字を区別するようにするには、以下の Caché
ObjectScript コマンドを使用します。
WRITE $$SetEnvironment^%apiOBJ("collation","%String","SQLSTRING")
システム管理ポータルで [クラス] オプションを選択します。次にストアド・クエリのネームスペースを
選択し、[コンパイル] オプションを使用して対応するクラスをリコンパイルします。その後すべてのイ
ンデックスを再構築します。これで大文字と小文字が区別されるようになります。
BITMAP キーワード
BITMAP キーワードを使用する場合、このインデックスは、ビットマップ・インデックスであることを指
定できます。ビットマップ・インデックスは、ビットマップ (圧縮 2進数)でインデックスされた値に対応
し、行の IDリストを維持します。SQLクエリ・プロセッサは、セット演算を使用して制限を実行するビッ
トマップ・インデックスを利用できます。このため、AND と OR 論理演算子を使用して、(WHERE 節
の) テーブル制限を実行できます。これは、INSERT、UPDATE、DELETE 演算子をビットマップで
実行するか通常のインデックスで実行するかでは大差ありません。ビットマップ・インデックスは、既
定構造 (%CacheStorage) を使用するテーブルに対してのみ定義でき、システムが割り当てた数値
列 ID (例えば、IDKEY 機能を使用しないなど) を持ちます。テーブルの作成に (クラス定義の使用
と反対に)DDLを使用する場合、これらの要件に合致し、ビットマップ・インデックスを有効に利用で
きます。
インデックスの再構築
CREATE INDEX 文を使用してインデックスの生成を行うと自動的にインデックスが構築されます。
しかし、インデックスを明示的に再構築することが必要になる場合もあります。
テーブルのインデックスを再構築するには、以下の Caché ObjectScript コマンドを実行します。
DO ##class(myclass).%PurgeIndices() DO ##class(myclass).%BuildIndices()
また以下の例のように、特定のインデックスを削除または再構築することもできます。
DO ##class(myclass).%PurgeIndices($ListBuild("NameIDX","AgeIDX")) DO ##class(myclass).%BuildIndices($ListBuild("NameIDX","AgeIDX"))
壊れたインデックスの削除または再構築、ビットマップ・インデックスの再圧縮、あるいはインデックス
の大文字・小文字の区別の設定変更を行うこともできます。
58 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
システム管理ポータルを使用して、特定のクラス(テーブル)のインデックスをすべて再構築すること
もできます。
詳細は、"Caché SQL の使用法" の "インデックス" の章を参照してください。
例以下の埋め込み SQL の例では、Fred という名前のテーブルを作成してから、Fred テーブルの
Lastword列と Firstword列に対して (入力された名前 "Fred_Index" から句読点を削除して)
"FredIndex" というインデックスを作成します。
&sql(CREATE TABLE Fred ( TESTNUM INT NOT NULL, FIRSTWORD CHAR (30) NOT NULL, LASTWORD CHAR (30) NOT NULL, CONSTRAINT FredPK PRIMARY KEY (TESTNUM)) ) IF SQLCODE=0 { WRITE !,"Table created" } ELSEIF SQLCODE=-201 { WRITE !,"Table already exists" } ELSE { WRITE !,"SQL table create error code is: ",SQLCODE QUIT } &sql(CREATE INDEX Fred_Index ON TABLE Fred (LASTWORD,FIRSTWORD)) IF SQLCODE=-324 { WRITE !,"Index already exists" QUIT } ELSEIF SQLCODE=0 { WRITE !,"Index created" } ELSE { WRITE !,"SQL index create error code is: ",SQLCODE QUIT }
以下の例は、Staff テーブルの City 列に対して、"CityIndex" という名前のインデックスを作成しま
す。
CREATE INDEX CityIndex ON Staff (City)
以下の例は、Staff テーブルの EmpName 列に対して、"EmpIndex" という名前のインデックスを作
成します。列内に同一の値を持つ行を避けるために、UNIQUE 制約を使用します。
CREATE UNIQUE INDEX EmpIndex ON TABLE Staff (EmpName)
以下の例は、Purchase テーブルの SKU 列に対して、"SKUIndex" という名前のビットマップ・イン
デックスを作成します。BITMAPキーワードは、コードがビットマップ・インデックスであることを示しま
す。
CREATE BITMAP INDEX SKUIndex ON TABLE Purchases (SKU)
関連項目
• DROP INDEX
• "Caché SQL の使用法" の "インデックス"
Caché SQL リファレンス 59
CREATE INDEX
CREATE METHOD
クラスにメソッドを生成します。
CREATE METHOD name(parameter_list) characteristics code_bodyCREATE STATIC METHOD name(parameter_list) characteristics code_body
引数
生成するメソッドの名前。識別子です。このメソッド名
は、修飾されていない場合 (StoreName)または修飾
されている場合 (Patient.StoreName) があります。
name
オプション — メソッドに渡すパラメータのリスト。パラ
メータのリストは括弧で囲み、パラメータはコンマで
区切ります。
parameter_list
オプション — メソッドの性質を指定する 1 つ以上の
キーワード。使用可能なキーワードは、RETURNS、
FOR、FINAL、PRIVATE、PROCEDURE、
SELECTMODEです。複数の特性は、空白で区切り、
任意の順序で指定できます。
characteristics
オプション— code_bodyで使用するプログラミング言
語。LANGUAGE OBJECTSCRIPT (Caché
ObjectScript の場合) または LANGUAGE SQL を指
定します。LANGUAGE節が省略される場合は、SQL
が既定です。
LANGUAGE OBJECTSCRIPT
LANGUAGE SQL
メソッドのプログラム・コード。code_body
概要CREATE METHOD 文は、クラスにメソッドを生成します。オプションの STATIC キーワードはスタ
ティック・メソッドを生成します。スタティック・メソッドはクラス・メソッドとも呼ばれます。
CREATEMETHOD文によって生成されるクラス・メソッドは、ストアド・プロシージャである場合とそう
でない場合があります。メソッドをSQLストアド・プロシージャとして公開されているクラスに生成する
には、PROCEDURE キーワードを指定する必要があります。既定では、CREATE METHOD はスト
アド・プロシージャでもあるメソッドを生成しませんが、CREATE PROCEDURE 文はそのようなメソッ
ドを常に生成します。
メソッドの生成には、GRANTコマンドで指定された%CREATE_METHOD管理者特権が必要です。
SQL文内からの SQL関数の呼び出しの詳細は、このドキュメントの "SQLの概念"のページの "関
数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しに
ついては、"CALL" 文を参照してください。
60 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
引数
name
生成するメソッドの名前。この関数名には、修飾されない場合 (StoreName) と、クラス名の指定で修
飾される場合 (Patient.StoreName) があります。
parameter-list
値をメソッドに渡すために使用されるパラメータのリストです。パラメータのリストは括弧で囲み、リスト
のパラメータ宣言はコンマで区切ります。リストのパラメータ宣言は、先頭から順に、パラメータ・モー
ドを指定するキーワード (IN : 入力値、OUT : 出力値、INOUT : 入力、変更、出力)、パラメータ
名、パラメータのデータ型、さらにオプションのキーワード DEFAULT から成ります。キーワード
DEFAULT の後には、パラメータの既定値を一重引用符で囲んだ文字列で記述します。例えば以
下のようになります。
IN Salary FLOAT DEFAULT '0'
メソッドをストアド・プロシージャとして公開すると (PROCEDURE キーワードを指定)、プロシージャ・
コンテキスト・ハンドラを使用して、プロシージャとその呼び出し元(ODBCサーバなど)間でプロシー
ジャ・コンテキストの相互受け渡しが行われます。このプロシージャ・コンテキスト・ハンドラは、Caché
によって (%qHandle:%SQLProcContext として) %sqlcontextオブジェクトを使用して自動生成されま
す。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとし
て明示的に宣言できます。
INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数
SQLCODE と %ROWCOUNT に設定されます。
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
characteristics
利用できるキーワードは以下のとおりです。
Caché SQL リファレンス 61
CREATE METHOD
メソッドを生成するクラス名を指定します。そのクラスが存在しない場合
は新規作成します。メソッド名を認証することによりクラス名を指定する
こともできます。FOR節で指定されたクラス名の方が、メソッド名の認証
により指定されたクラス名よりも優先されます。
FOR classname
サブクラスによってメソッドがオーバーライドされないように指定します。
既定では、メソッドは最終ではありません。FINAL キーワードはサブク
ラスによって継承されます。
FINAL
メソッドがそれ自身のクラス、またはサブクラスの他のメソッドによって
のみ起動できることを指定します。既定ではメソッドはパブリックで、制
限なしに起動できます。この制限はサブクラスによって継承されます。
PRIVATE
メソッドがSQLストアド・プロシージャであることを指定します。ストアド・
プロシージャはサブクラスに継承されます (このキーワードは、PROC
と略すことができます)。
PROCEDURE
メソッドの呼び出しで返される値のデータ型を指定します。RETURNS
が省略されると、メソッドは値を返すことができません。この仕様はサブ
クラスによって継承されます。
RETURNS datatype
メソッドのコンパイルに使用するモードを指定します。使用可能な値は、
LOGICAL、ODBC、RUNTIME、DISPLAYです。既定はLOGICALです。
SELECTMODE
mode
SELECTMODEはデータを返すモードを指定します。mode 値が LOGICALの場合は、論理 (内部
保存) 値が返されます。例えば、日付は $HOROLOG 形式で返されます。mode 値が ODBC の場
合、論理と ODBC 間の変換が適用され、ODBC 形式値が返されます。mode 値が DISPLAY の場
合、論理と表示間の変換が適用され、表示形式値が返されます。mode 値が RUNTIME の場合、
ローカル変数 %Runtime を設定して、実行時にモードを LOGICAL、ODBC、DISPLAY のいずれか
に設定できます。これは、%Library.ResultSet RuntimeMode プロパティを使用して設定できます。
RUNTIME モードの既定は LOGICAL です。
SELECTMODE に指定した値は、#SQLCOMPILE SELECT=mode のように Caché ObjectScript ク
ラス・メソッド・コードの最初に追加されます。
LANGUAGE
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節が省
略される場合は、SQL が既定です。
code_body
生成されるメソッドのプログラム・コード。このコードは SQL または Caché ObjectScript で指定しま
す。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché ObjectScript の
コードには埋め込み SQL を記述できます。
62 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
Caché は、メソッドの実際のコードを生成するために提供されたコードを使用します。指定するコー
ドが SQL の場合、メソッドの生成時にコード行が追加されます。追加のコードでは、SQL が Caché
ObjectScript "ラッパ" に埋め込まれ、(必要に応じて) プロシージャ・コンテキスト・ハンドラが作成さ
れ、返り値が処理されます。以下は この Caché から生成されたラッパ・コードの例です。
NEW SQLCODE,%ROWID,%ROWCOUNT,title &sql( SELECT col FROM tbl ) QUIT $GET(title)
指定したコードが OBJECTSCRIPT の場合、(変数で NEW を実行し、QUIT で終了し、(オプション
として) 終了後に値を返す) "ラッパ" を明示的に定義する必要があります。
以下の例は、CREATE METHOD を使用して、Sample.Employee クラスに UpdateSalary メソッドを
生成しています。
CREATE METHOD UpdateSalary ( IN SSN VARCHAR(11), IN Salary FLOAT ) FOR Sample.Employee BEGIN UPDATE Sample.Employee SET Salary = :Salary WHERE SSN = :SSN; END
以下の例は、Caché ObjectScript コードで CREATE METHOD を使用して、Sample.Employee クラ
スに GetTitle メソッドを生成し、Title 値を返します。
CREATE METHOD Sample_Employee.GetTitle( INOUT pHandle %SQLProcContext, IN SSN VARCHAR(11), INOUT Title VARCHAR(50) ) RETURNS VARCHAR(30) FOR Sample.Employee LANGUAGE OBJECTSCRIPT { NEW SQLCODE,%ROWCOUNT &sql(SELECT Title INTO :Title FROM Sample.Employee WHERE SSN = :SSN) IF $GET(pHandle)'=$$$NULLOREF { SET pHandle.SQLCode=SQLCODE SET pHandle.RowCount=%ROWCOUNT } QUIT }
関連項目
• ストアド・プロシージャ
• CALL
• CREATE PROCEDURE
• DROP METHOD
Caché SQL リファレンス 63
CREATE METHOD
CREATE PROCEDURE
SQL ストアド・プロシージャとして公開されるメソッドまたはクエリを生成します。
CREATE PROCEDURE procname(parameter_list) characteristics languagecode_body
CREATE PROC procname(parameter_list) characteristics languagecode_body
引数
生成するストアド・プロシージャの名前。識別子です。
このプロシージャ名には、修飾なし (StoreName) と
修飾付き (Patient.StoreName) のどちらでも使用で
きます。パラメータを指定しない場合でも、procname
の後には括弧を続ける必要があります。
procname
オプション—プロシージャに渡すパラメータのリスト。
パラメータのリストは括弧で囲み、パラメータはコン
マで区切ります。パラメータを指定しない場合でも、
括弧は必須です。各パラメータは、(先頭から順に)
オプションの IN、OUT、または INOUT キーワード、
変数名、データ型で構成します。
parameter_list
オプション — プロシージャの特性を指定する 1 つま
たは複数のキーワード。メソッドを生成する際に許可
されるキーワードは FINAL、FOR、PRIVATE、
RETURNS、SELECTMODE です。クエリを生成する
際に許可されるキーワードは CONTAINID、FINAL、
FOR、RESULTS、SELECTMODEです。複数の特性
は、空白で区切り、任意の順序で指定できます。
characteristics
オプション — code_body に使用するプログラミング
言語を指定するキーワード節。LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) また
はLANGUAGE SQLを指定します。language節を省
略する場合は、SQL が既定です。
language
64 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
プロシージャのプログラム・コード
SQLプログラム・コードの開始にはBEGINキーワー
ドを使用し、終了にはENDキーワードを使用します。
code_body内の完結した各SQL文は、セミコロン (;)
で終わります。
Caché ObjectScript プログラム・コードは中括弧で
囲みます。
code_body
概要CREATE PROCEDURE文は SQL ストアド・プロシージャとして自動的に公開されるメソッドまたはク
エリを生成します。ストアド・プロシージャはサブクラスに継承されます。
• LANGUAGE SQL の場合、code_body に SELECT 文を含める必要があります。
• LANGUAGE OBJECTSCRIPT の場合、code_body で EXECUTE メソッドと FETCH メソッドを
呼び出す必要があります。GETINFO、FETCHODBC、FETCHROWS および CLOSE メソッド
を呼び出すことも可能です。
ストアド・プロシージャとして公開されないメソッドを生成するには、CREATE METHOD または
CREATE FUNCTION を使用します。ストアド・プロシージャとして公開されないクエリを生成するに
は、CREATE QUERY を使用します。これらの文は、PROCEDURE 特性キーワードを指定すること
で、ストアド・プロシージャとして公開されるメソッドまたはクエリの生成にも使用できます。
プロシージャの生成には、GRANT コマンドで指定された %CREATE_PROCEDURE 管理者特権が
必要です。
SQL文内からの SQL関数の呼び出しの詳細は、このドキュメントの "SQLの概念"のページの "関
数の呼び出し" を参照してください。さまざまな状況での SQL ストアド・プロシージャの呼び出しに
ついては、"CALL" 文を参照してください。
引数
procname
ストアド・プロシージャとして生成するメソッドまたはクエリの名前です。この名前には、修飾なし
(StoreName) と、クラス名を指定する修飾付き (Patient.StoreName) のどちらでも指定できます。プロ
シージャの名前の後には括弧が必要です。
parameter_list
値をメソッドまたはクエリに渡すために使用するパラメータのリストです。パラメータのリストは括弧で
囲み、リストのパラメータ宣言はコンマで区切ります。パラメータを指定しない場合も括弧は必須で
す。
リスト内の各パラメータ宣言は、(先頭から順番に) 以下の要素で構成されます。
Caché SQL リファレンス 65
CREATE PROCEDURE
• パラメータ・モードが IN (入力値)、OUT (出力値)、または INOUT (変更値) のいずれかを指定
するキーワード。
• パラメータ名。
• パラメータのデータ型。
• オプション : キーワード DEFAULT とそれに続くパラメータの既定値 (既定値は、一重引用符
で囲んだ文字列として指定)。
以下は、3 つのパラメータを持つプロシージャの例です。
CREATE PROCEDURE UpdatePay (IN Salary FLOAT DEFAULT '0', IN Name VARCHAR(50), INOUT PayBracket VARCHAR(50) DEFAULT 'NULL')BEGIN UPDATE Sample.Person SET Salary = :Salary WHERE Name=:Name ;END
メソッドまたはクエリがストアド・プロシージャとして公開されるため、プロシージャ・コンテキスト・ハン
ドラによって、プロシージャとその呼び出し元 (ODBC サーバなど) 間でプロシージャ・コンテキスト
の相互受け渡しが行われます。このプロシージャ・コンテキスト・ハンドラは、Caché によって
(%qHandle:%SQLProcContext として) %sqlcontext オブジェクトを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとし
て明示的に宣言できます。
INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数
SQLCODE と %ROWCOUNT に設定されます。
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
SQLCODE と %ROWCOUNT の値は、SQL 文の実行によって自動的に設定されます。
characteristics
メソッドの生成にはクエリの生成とは異なる characteristics を使用します。
有効なメソッド characteristics キーワードは、以下のとおりです。
意味メソッド・キーワード
メソッドを生成するクラス名を指定します。そのクラスが存在しな
い場合は、新規作成します。メソッド名を修飾することにより、ク
ラス名を指定することもできます。FOR節で指定されたクラス名
の方が、メソッド名の修飾により指定されたクラス名よりも優先
されます。
FOR classname
66 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
意味メソッド・キーワード
サブクラスによってメソッドがオーバーライドされないように指定
します。既定では、メソッドは最終ではありません。FINAL キー
ワードは、サブクラスによって継承されます。
FINAL
メソッドがそれ自身のクラス、またはサブクラスの他のメソッドに
よってのみ起動できることを指定します。既定ではメソッドはパ
ブリックで、制限なしに起動できます。この制限はサブクラスに
よって継承されます。
PRIVATE
メソッドに対する呼び出しによって返される値のデータ型を指定
します。RETURNSが省略されると、メソッドは値を返すことがで
きません。この仕様はサブクラスによって継承されます。
RETURNS datatype
メソッドのコンパイルに使用されるモードを指定します。使用可
能な値は、LOGICAL、ODBC、RUNTIME、DISPLAY です。既定
は LOGICAL です。
SELECTMODE mode
有効なクエリ characteristics キーワードは、以下のとおりです。
概要クエリ・キーワード
フィールドが存在する場合は、どのフィールドが ID を返すか
を指定します。CONTAINID を ID を返す列の番号に設定す
るか、または ID を返す列が存在しない場合は 0 を設定しま
す。Caché では、指定されたフィールドが実際に ID を含んで
いるかどうかの検証が行われないため、ユーザの入力の誤
りによってデータの不一致が起こる可能性があります。
CONTAINID integer
メソッドを生成するクラス名を指定します。そのクラスが存在
しない場合は、新規作成します。メソッド名を修飾することに
より、クラス名を指定することもできます。FOR 節で指定され
たクラス名の方が、メソッド名の修飾により指定されたクラス
名よりも優先されます。
FOR classname
サブクラスがメソッドをオーバーライドできないように指定しま
す。既定では、メソッドは最終ではありません。FINAL キー
ワードは、サブクラスによって継承されます。
FINAL
Caché SQL リファレンス 67
CREATE PROCEDURE
概要クエリ・キーワード
データ・フィールドをクエリで返された順序で指定します。各
フィールドには、列名、データ型 (既定で属性に割り当てられ
た型と異なる場合)、そしてオプションで見出しを指定します。
これらフィールドの特性はコロンで区切ります。結果セット内
の異なるフィールドはコンマで区切ります。
LANGUAGE SQL の場合、クエリが SELECT * でない限り
RESULTS キーワードを省略することができます。RESULTS
キーワードを省略する場合、ROWSPECがクラス・コンパイル
中に自動生成されます。
RESULTS result_set
クエリをコンパイルするために使用するモードを指定します。
使用可能な値は、LOGICAL、ODBC、RUNTIME、DISPLAYで
す。既定は RUNTIME です。
SELECTMODE mode
SELECTMODEはデータを返すモードを指定します。mode 値が LOGICALの場合は、論理 (内部
保存) 値が返されます。例えば、日付は $HOROLOG 形式で返されます。mode 値が ODBC の場
合、論理から ODBC への変換が適用され、ODBC 形式値が返されます。mode 値が DISPLAY の
場合、論理から表示への変換が適用され、表示形式値が返されます。mode 値が RUNTIME の場
合、ローカル変数 %Runtime を設定して、実行時にモードを LOGICAL、ODBC、DISPLAY のいず
れかに設定できます。これは、%Library.ResultSet RuntimeMode プロパティを使用して設定できま
す。RUNTIMEモードの既定はLOGICALです。SELECTMODEに指定した値は、#SQLCOMPILE
SELECT=mode のように Caché ObjectScript クラス・メソッド・コードの最初に追加されます。
RESULTS 節は、クエリの結果を指定します。RESULTS 節の SQL データ型パラメータが、クエリの
ROWSPECの対応するCachéデータ型パラメータに変換されます。例えば、RESULTS節のRESULTS
( Code VARCHAR(15) ) では、ROWSPEC = "Code:%Library.String(MAXLEN=15)" という ROWSPEC
仕様が生成されます。
language
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節を省
略する場合は、SQL が既定です。
code_body
生成されるメソッドまたはクエリのプログラム・コード。このコードは SQL または Caché ObjectScript
で指定します。使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché
ObjectScript のコードには埋め込み SQLを記述できます。Caché は、メソッドまたはクエリの実際の
コードを生成するために提供されたコードを使用します。
SQL プログラム・コードの開始には BEGIN キーワードを使用し、その後に SQL コード自体を続け
ます。完結した各 SQL文の末尾では、セミコロン (;) を指定します。1つのクエリに含めることができ
68 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
るのは、1 つの SQL 文、つまり 1 つの SELECT 文のみです。SQL プログラム・コードの終了には、
END キーワードを使用します。
Caché ObjectScript プログラム・コードは、{ code } のように中括弧で囲みます。
SQL を Caché ObjectScript "ラッパ" に埋め込んだプロシージャを生成するとき、Caché によって、
プロシージャ・コンテキスト・ハンドラを提供し、返り値を処理するコード行が追加されます。以下は
この Caché から生成されたラッパ・コードの例です。
NEW SQLCODE,%ROWID,%ROWCOUNT,title &sql( code_body ) QUIT $GET(title)
指定したコードがOBJECTSCRIPT の場合、(変数で NEWを実行し、QUIT で終了し、終了後に値
を返す) "ラッパ" を明示的に定義する必要があります。
クエリを生成するとき、指定したコードが SQL の場合は、1 つの SELECT 文で構成する必要があり
ます。指定したコードが OBJECTSCRIPT の場合、Caché が提供する EXECUTE メソッドと FETCH
メソッドの呼び出しを含む必要があります。また、CLOSE、FetchRows、FetchODBC、GetInfo メソッ
ド呼び出しを含めることも可能です。
例以下の例は、ストアド・プロシージャとして公開される、PersonStateSP という名前のシンプルなクエリ
を作成します。このクエリでは、パラメータは宣言されず、characteristics および language に既定値
が使用されます。
WRITE !,"Creating a procedure" &sql(CREATE PROCEDURE PersonStateSP() BEGIN SELECT Name,Home_State FROM Sample.Person ; END) IF SQLCODE=0 { WRITE !,"Created a procedure" } ELSEIF SQLCODE=-361 { WRITE !,"Procedure already exists" } ELSE { WRITE !,"SQL error: ",SQLCODE }
システム管理ポータルで、[クラス]オプションを選択し、SAMPLESネームスペースを選択します。上
の例で作成したストアド・プロシージャの User.procPersonStateSP.clsを見つけます。上のプログラ
ム例を再実行する前に、ここでこのプロシージャを削除できます。もちろん、DROP PROCEDUREを
使用してプロシージャを削除できます。
WRITE !,"Deleting a procedure" &sql(DROP PROCEDURE SAMPLES.PersonStateSP) IF SQLCODE=0 { WRITE !,"Deleted a procedure" } ELSEIF SQLCODE=-362 { WRITE !,"Procedure did not exist" } ELSE { WRITE !,"SQL error: ",SQLCODE }
以下の例は、CREATE PROCEDURE を使用して、Sample.Employee クラスに UpdateSalary メソッド
を生成します。
Caché SQL リファレンス 69
CREATE PROCEDURE
CREATE PROCEDURE UpdateSalary ( IN SSN VARCHAR(11), IN Salary FLOAT ) FOR Sample.Employee BEGIN UPDATE Sample.Employee SET Salary = :Salary WHERE SSN = :SSN; END
以下の例は、Caché ObjectScript コードで CREATE PROCEDURE を使用して、Sample.Employee
クラスに GetTitle メソッドを生成し、Title 値を返します。
CREATE PROCEDURE Sample_Employee.GetTitle( INOUT pHandle %SQLProcContext, IN SSN VARCHAR(11), INOUT Title VARCHAR(50) ) RETURNS VARCHAR(30) FOR Sample.Employee LANGUAGE OBJECTSCRIPT { NEW SQLCODE,%ROWCOUNT &sql(SELECT Title INTO :Title FROM Sample.Employee WHERE SSN = :SSN) IF $GET(pHandle)'=$$$NULLOREF { SET pHandle.SQLCode=SQLCODE SET pHandle.RowCount=%ROWCOUNT } QUIT }
プロシジャ・ハンドラpHandleを使用します。対応するSQL変数を使用して、このハンドラのSQLCode
属性と RowCount 属性を設定します。プロシージャの LANGUAGE OBJECTSCRIPT キーワードに
続く Caché ObjectScript を中括弧で囲むことに注意してください。Caché ObjectScript コードには、
&sql でマークされ、角括弧で囲まれた埋め込み SQL コードがあります。
関連項目
• クエリ
• SELECT
• ストアド・プロシージャ
• CALL
• DROP PROCEDURE
• CREATE METHOD CREATE FUNCTION
• GRANT
70 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CREATE QUERY
クエリを作成します。
CREATE QUERY queryname(parameter_list) characteristics languagecode_body
引数
作成するクエリの名前。識別子です。このクエリ名
には、修飾なし (StoreName) と修飾付き
(Patient.StoreName)のどちらでも使用できます。パ
ラメータが指定されない場合でも、queryname の後
には括弧を続ける必要があります。
queryname
オプション — クエリに渡すパラメータのリスト。パラ
メータのリストは括弧で囲み、パラメータはコンマで
区切ります。パラメータを指定しない場合でも、括弧
は必須です。
parameter_list
オプション — クエリの特性を指定する 1 つ以上の
キーワード。使用可能なキーワードは、RESULTS、
CONTAINID、FOR、FINAL、ROCEDURE、
SELECTMODE です。複数の特性は、空白で区切
り、任意の順序で指定できます。
characteristics
オプション — code_body に使用するプログラミング
言語を指定するキーワード節。LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) ま
たは LANGUAGE SQL を指定します。language 節
を省略する場合は、SQL が既定です。
language
クエリのプログラム・コード
SQLプログラム・コードの開始にはBEGINキーワー
ドを使用し、終了には END キーワードを使用しま
す。クエリの code_bodyは、1つの完結したSQL文
(1 つの SELECT 文) のみで構成します。SELECT
文は、セミコロン (;) で終わります。
Caché ObjectScript プログラム・コードは中括弧で
囲みます。
code_body
Caché SQL リファレンス 71
CREATE QUERY
概要CREATE QUERY 文は、クラスにクエリを生成します。既定では、MySelect と命名したクエリが、
User.queryMySelect または SQLUser.queryMySelect として保存されます。
CREATE QUERY で作成されるクエリは、ストアド・プロシージャとして公開される場合とそうでない
場合があります。ストアド・プロシージャとして公開するクエリを生成するには、characteristics の 1
つとして PROCEDUREキーワードを指定する必要があります。CREATE PROCEDURE文を使用し
て、ストアド・プロシージャとして公開されるクエリを生成することも可能です。
クエリの生成には、GRANT コマンドで指定された %CREATE_QUERY 管理者特権が必要です。
引数
name
生成するクエリの名前です。この名前には、修飾なし (StoreName) と、クラス名を指定する修飾付き
(Patient.StoreName) のどちらでも指定できます。クエリの名前の後には括弧が必要です。
parameter-list
値をクエリに渡すために使用するパラメータのパラメータ宣言リストです。パラメータのリストは括弧で
囲み、リストのパラメータ宣言はコンマで区切ります。パラメータを指定しない場合も括弧は必須で
す。
リスト内の各パラメータ宣言は、(先頭から順番に) 以下の要素で構成します。
• パラメータ・モードが IN (入力値)、OUT (出力値)、または INOUT (変更値) のいずれかを指定
するキーワード。
• パラメータ名。
• パラメータのデータ型。
• オプション : キーワード DEFAULT とそれに続くパラメータの既定値 (既定値は、一重引用符
で囲んだ文字列として指定)。
クエリをストアド・プロシージャとして公開すると (characteristics に PROCEDURE キーワードを指
定)、プロシージャ・コンテキスト・ハンドラを使用によって、プロシージャとその呼び出し元 (ODBC
サーバなど) 間でプロシージャ・コンテキストの相互受け渡しが行われます。このプロシージャ・コン
テキスト・ハンドラは、Caché によって (%qHandle:%SQLProcContext として) %sqlcontext オブジェク
トを使用して自動生成されます。
以下のようにプロシージャ・コンテキスト・ハンドラは、%SQLProcContext 型で最初のパラメータとし
て明示的に宣言できます。
INOUT pHandle %SQLProcContext
%SQLProcContext の属性は SQLCode と RowCount です。これらは通常、以下のように SQL 変数
SQLCODE と %ROWCOUNT に設定されます。
72 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET pHandle.SQLCode=SQLCODE,pHandle.RowCount=%ROWCOUNT
characteristics
有効な characteristics キーワードは、以下のとおりです。
概要characteristics キーワード
フィールドが存在する場合は、どのフィールドが IDを返すか
を指定します。CONTAINID を ID を返す列の番号に設定す
るか、または ID を返す列が存在しない場合は 0 を設定しま
す。Cachéでは、指定されたフィールドが実際にIDを含んで
いるかどうかの検証が行われないため、ユーザの入力の誤
りによってデータの不一致が起こる可能性があります。
CONTAINID integer
メソッドを生成するクラス名を指定します。そのクラスが存在
しない場合は新規作成します。メソッド名を認証することによ
りクラス名を指定することもできます。FOR節で指定されたク
ラス名の方が、メソッド名の修飾により指定されたクラス名よ
りも優先されます。
FOR classname
サブクラスがメソッドをオーバーライドできないように指定しま
す。既定では、メソッドは最終ではありません。FINAL キー
ワードはサブクラスによって継承されます。
FINAL
クエリがSQLストアド・プロシージャであることを指定します。
ストアド・プロシージャはサブクラスに継承されます(このキー
ワードは、PROC と略すことができます)。
PROCEDURE
データ・フィールドをクエリで返された順序で指定します。各
フィールドには、列名、データ型(既定で属性に割り当てられ
た型と異なる場合)、そしてオプションで見出しを指定します。
これらフィールドの特性はコロンで区切ります。result_set 内
の異なるフィールドは、コンマで区切ります。
LANGUAGE SQL の場合、クエリが SELECT * でない限り
RESULTS キーワードを省略できます。RESULTS キーワー
ドを省略する場合、ROWSPEC がクラス・コンパイル中に自
動生成されます。
RESULTS result_set
クエリをコンパイルするために使用するモードを指定します。
可能な値は、LOGICAL、ODBC、RUNTIME、DISPLAYです。
既定は RUNTIME です。
SELECTMODE mode
SELECTMODE 節は、データを返すモードを指定します。mode 値が LOGICAL の場合は、論理
(内部保存) 値が返されます。例えば、日付は $HOROLOG 形式で返されます。mode 値が ODBC
の場合、論理からODBCへの変換が適用され、ODBC形式値が返されます。mode値がDISPLAY
Caché SQL リファレンス 73
CREATE QUERY
の場合、論理から表示への変換が適用され、表示形式値が返されます。mode 値が RUNTIME の
場合、ローカル変数 %Runtime を設定して、実行時にモードを LOGICAL、ODBC、DISPLAY のい
ずれかに設定できます。これは、%Library.ResultSet RuntimeMode プロパティを使用して設定でき
ます。RUNTIME モードの既定は LOGICAL です。
RESULTS 節は、クエリの結果を指定します。RESULTS 節の SQL データ型パラメータが、クエリの
ROWSPECの対応するCachéデータ型パラメータに変換されます。例えば、RESULTS節のRESULTS
( Code VARCHAR(15) ) では、ROWSPEC = "Code:%Library.String(MAXLEN=15)" という ROWSPEC
仕様が生成されます。
language
code_body に使用している言語を指定するキーワード節。使用可能な節は、LANGUAGE
OBJECTSCRIPT (Caché ObjectScript の場合) か、LANGUAGE SQL です。LANGUAGE 節を省
略する場合は、SQL が既定です。
LANGUAGEが SQLの場合、%Library.SQLQuery型のクラス・クエリが生成されます。LANGUAGE
が OBJECTSCRIPT の場合、%Library.Query 型のクラス・クエリが生成されます。
code_body
生成されるクエリのプログラム・コード。このコードはSQLまたはCaché ObjectScript で指定します。
使用する言語は LANGUAGE 節と一致させる必要があります。ただし、Caché ObjectScript のコー
ドには埋め込み SQL を記述できます。
指定したコードが SQL の場合、1 つの SELECT 文で構成する必要があります。SQL クエリのプロ
グラム・コードは BEGIN キーワードで開始し、その後に実際のプログラム・コード (1 つの SELECT
文)を続ける必要があります。プログラム・コードの末尾にはセミコロン (;) を付け、ENDキーワードで
終了します。
指定したコードが OBJECTSCRIPT の場合、Caché が提供する EXECUTE メソッドと FETCH メソッ
ドの呼び出しを含む必要があります。また、CLOSE、FetchRows、FetchODBC、GetInfo メソッド呼び
出しを含めることも可能です。Caché ObjectScript コードは、中括弧で囲みます。
Caché は、クエリの実際のコードを生成するために提供されたコードを使用します。
例以下の埋め込み SQL の例は、PersonState という名前のクエリを作成します。このクエリでは、パラ
メータは宣言されず、characteristics および language に既定値が使用されます。
WRITE !,"Creating a query" &sql(CREATE QUERY PersonState() BEGIN SELECT Name,Home_State FROM Sample.Person ; END) IF SQLCODE=0 { WRITE !,"Created a query" } ELSEIF SQLCODE=-361 { WRITE !,"Query already exists" } ELSE { WRITE !,"SQL error: ",SQLCODE }
74 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
システム管理ポータルで、[クラス]オプションを選択し、SAMPLESネームスペースを選択します。上
の例で作成したクエリの User.queryPersonState.cls を見つけます。上のプログラム例を再実行す
る前に、ここでこのクエリを削除できます。もちろん、DROP QUERYを使用してクエリを削除すること
も可能です。
関連項目
• クエリ
• SELECT
• ストアド・プロシージャ
• CALL
• DROP QUERY
• CREATE PROCEDURE
CREATE ROLE
ロールを生成します。
CREATE ROLE role-name
引数
生成するロールの名前。識別子です。role-name
概要CREATE ROLE コマンドはロールを生成します。ロールは複数のユーザに割り当てることができる
名前付きの特権セットです。1 つのロールを複数のユーザに割り当てることも、また複数のロールを
1 人のユーザに割り当てることもできます。ロールはシステム全体で利用できるもので、特定のネー
ムスペースに限定されません。
role-name は最大 30 文字までの有効な識別子です。ロール名が、区切られた識別子で、引用符
で囲まれていれば、SQL予約語も使用できます。ロール名は、大文字と小文字が区別されません。
最初に作成されたときは、ロールは名前が付いているだけで特権はありません。ロールに特権を付
与するには、GRANTコマンドを使用します。GRANTコマンドを使用すると、1つのロールに1つ以
上のロールを割り当てることもできます。この方法によってロールの階層を作成することができます。
CREATE ROLEを実行してすでに存在するロールを作成しようとすると、SQLは SQLCODE = –104
エラーを返します。ロールの削除には、DROP ROLE コマンドを使用します。
Caché SQL リファレンス 75
CREATE ROLE
Caché 5.1 セキュリティ
CREATE ROLE コマンドの実行には特権が必要です。埋め込み SQL で CREATE ROLE を使用
する前に、%Admin_Secure (USE特権)を持つユーザとしてログインする必要があります。この設定を
行わないと、SQLCODE -99 (特権違反)になります。$SYSTEM.Security.Login メソッドを使用して、
以下のようにユーザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の例は、BkUser という名前のロールを作成します。最初の例のユーザ "FRED"にはロール作
成特権がありません。次の例のユーザ "_SYSTEM" にはロール作成特権があります。
DO $SYSTEM.Security.Login("FRED","FredsPassword") &sql(CREATE ROLE BkUser) IF SQLCODE=-99 { WRITE !,"You don't have CREATE ROLE privileges" } ELSEIF SQLCODE=-104 { WRITE !,"The role already exists" } ELSE { WRITE !,"Created a role. Error code is: ",SQLCODE }
DO $SYSTEM.Security.Login("_SYSTEM","SYS")Main &sql(CREATE ROLE BkUser) IF SQLCODE=-99 { WRITE !,"You don't have CREATE ROLE privileges" } ELSEIF SQLCODE=-104 { WRITE !,"The role already exists" } ELSE { WRITE !,"Created a role. Error code is: ",SQLCODE }Cleanup SET toggle=$RANDOM(2) IF toggle=0 { &sql(DROP ROLE BkUser) WRITE !,"DROP USER error code: ",SQLCODE } ELSE { WRITE !,"No drop this time" QUIT }
($RANDOM トグルが記述されているので、このプログラム例を繰り返し実行できます。)
関連項目
• SQL : DROP ROLE ユーザ CREATE USER DROP USER GRANT REVOKE %CHECKPRIV
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
76 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CREATE TABLE
テーブルを作成します。
CREATE TABLE table (table-element-commalist)
table-element ::=[%DESCRIPTION string] |[%FILE string] |[%NUMROWS integer] |[%ROUTINE string]
{ fieldname datatype[IDENTITY] |{UNIQUE | NULL | NOT NULL |DEFAULT [(]default-spec[)] |[COLLATE] sqlcollation |%DESCRIPTION literal} , }
[CONSTRAINT identifier]UNIQUE (identifier-commalist) |[CONSTRAINT identifier]PRIMARY KEY (identifier-commalist) |[CONSTRAINT identifier]FOREIGN KEY (identifier-commalist) REFERENCES table(identifier-commalist) [triggered action]
sqlcollation::=%ALPHAUP |%EXACT |%MINUS |%PLUS |%SPACE |%SQLSTRING [(maxlen)] |%SQLUPPER [(maxlen)] |%STRING [(maxlen)] |%UPPER
このコマンド概要には、互換性目的でのみ解析されオペレーションを伴わないキーワードは記載さ
れていません。サポートされる空命令キーワードの一覧は、後述の別セクションで示します。
Caché SQL リファレンス 77
CREATE TABLE
引数
作成するテーブルの名前。有効な識別子を指定し
ます。テーブル名は修飾 (schema.table)、未修飾
(table)のどちらでもかまいません。テーブル名が未
修飾の場合は、システム既定のスキーマ名が使用
されます。
table
1 つまたは複数のフィールド定義またはキーワード
句のコンマ区切りリスト。
各フィールド定義の最も簡単な構成は、フィールド
名 (有効な識別子として指定) と、それに続くデータ
型です。
各キーワード句は、キーワードとそれに続くリテラル
で構成します。
table-element
概要CREATE TABLE コマンドは、指定された構成のテーブルを作成します。
CREATE TABLE コマンドの実行には特権が必要です。CREATE TABLE を使用する前
に、%CREATE_TABLE特権を得る必要があります。この操作をしないと、SQLCODE –99エラー (特
権違反) が返されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、%CRE-
ATE_TABLE特権を割り当てることができます。埋め込みSQLでは、以下のように $SYSTEM.Secu-
rity.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
以下の埋め込み SQL の例は、Employee テーブルを作成します。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE Employee ( EMPNUM INT NOT NULL, NAMELAST CHAR(30) NOT NULL, NAMEFIRST CHAR(30) NOT NULL, STARTDATE TIMESTAMP, SALARY MONEY, ACCRUEDVACATION INT, ACCRUEDSICKLEAVE INT, CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)) ) WRITE !,"SQL code is: ",SQLCODE
Employee という名前のこのテーブルには、いくつかの定義済みフィールドがあります。(会社の従業
員の ID 番号を含む) EMPNUM フィールドは、NULL ではない整数です。また、テーブルの主キー
として宣言されています。従業員の姓と名にはそれぞれフィールドが定義され、どちらも最大 30 文
字までの非NULL文字列で指定されます。また、従業員の入社日や有給休暇、病欠日のフィール
ド (TIMESTAMP と INT データ型を使用) もあります。
78 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SQL セキュリティ有効/無効%CREATE_TABLE 特権は GRANT コマンドで割り当てます。このときユーザまたはロールにこの特
権を割り当てる必要があります。この要件は設定可能です。
• ObjectScript $SYSTEM.SQL.SetSQLSecurity() 関数を呼び出します。現在の設定を確認する
には、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQL ON:]の
設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[SQL Security Enabled] の現在の設定を表示します。
既定は “真 (true)” (1) です。 “真” (true) の場合、ユーザは特権が付与されているテーブルや
ビューのみでアクションを実行できます。この設定を推奨します。
このオプションが “偽 (false)” (0) に設定されている場合、SQL セキュリティは無効になります。つ
まり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指
定しなくてもテーブルの作成が可能になります。この場合、ダイナミックSQLはユーザとして"_SYS-
TEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくても
テーブルやビューに対してアクションを実行することができます。
テーブル名テーブル名は、識別子の規則に従い、以下のような制約を受けます。既定では、テープル名は
(フィールド名と同様に) 単純な識別子です。同じスキーマ内では、テーブルとビューに同じ名前を
使用することはできません。テーブル名は 128 文字を超えることはできません。
テーブル名は修飾、未修飾のどちらでもかまいません。テーブル名を修飾する場合は、以下の構
文を使用します。
schema.tablename
未修飾のテーブル名には、既定として SQLUserスキーマが使用されます (以下に示すように、この
スキーマ名の使用については設定可能です)。例えば、上記の例では、未修飾のテーブル名
Employee からクラス User.Employee が生成されます。スキーマ名はクラス・パッケージ名となり、既
定のクラス・パッケージ名は User です。スキーマ名と既定値の詳細は、"テーブル参照" を参照し
てください。
Cachéはテーブル名を使用して、対応するクラス名を生成します。クラス名には英数字(文字および
数字)のみが使用され、その長さは最大25文字です。このクラス名を生成するために、Cachéは最
初にテーブル名から句読点を削除し、次に25文字 (未満)の一意の識別子を生成します。その際、
クラス名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。Cachéは有
効なテーブル名から一意のクラス名を生成しますが、テーブルの命名時には、この名前の生成に伴
う以下の制約について考慮する必要があります。
• テーブル名には、最低でも 1 文字を含める必要があります。テーブル名の先頭の文字または
最初の句読点に続く文字は、数字以外の文字にする必要があります。
Caché SQL リファレンス 79
CREATE TABLE
• 生成されたクラス名には句読点が含まれないため、句読点のみが異なるテーブル名の作成は
可能ですが、お勧めできません。
• テーブル名は 25 文字よりも大幅に長くすることができますが、最初の 25 の英数文字が異なる
ようにテーブル名を作成すると処理がはるかに容易になります。
Caché は Unicode システムで、16 ビット (ワイド) 文字列のテーブルやフィールドの名前付けをサ
ポートします。$ZNAME テストに合格した文字は、有効な文字です。以下の埋め込み SQL の例に
示すように、テーブル名にはアクセント記号付き文字を使用でき、生成されるクラス名にもアクセント
記号が含まれます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE ñáàéèíìóòúù ( TESTNUM INT NOT NULL, FIRSTWORD CHAR (30) NOT NULL, LASTWORD CHAR (30) NOT NULL, CONSTRAINT ñáàéèíìóòúùPK PRIMARY KEY (TESTNUM)) ) WRITE !,"SQL code is: ",SQLCODE
既定スキーマ名
未修飾のテーブル名には、既定として SQLUserスキーマが使用されます。この既定は設定可能で
す。現在のプロセスの既定スキーマ名を返すには、$SYSTEM.SQL.DefaultSchema() 関数を使用し
ます。
WRITE $SYSTEM.SQL.DefaultSchema()
既定スキーマ名を設定するには以下の方法があります。
• ObjectScript $SYSTEM.SQL.SetDefaultSchema() 関数を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Default SQL Schema Name] の現在の設定が表示されます。
既定のスキーマ名が使用されるのは、未修飾のテーブル名がSQL文で出現し、#import文が指定
されていない場合です。この構成は、SQL スキーマ名とクラス・パッケージ名間のマッピングとは関
係ありません。既定のスキーマ名を指定するだけです。既定スキーマ名に _CURRENT_USER を指
定すると、この既定スキーマ名が現在ログインしているプロセスでのユーザ名になります。ログインし
ていなければSQLUserが既定スキーマ名となります。既定スキーマ名に _CURRENT_USERまたは
myname (ユーザが指定した文字列)を指定すると、これが現在ログインしているプロセスでのユーザ
名になります。ログインしていなければ、myname が既定スキーマ名として使用されます。例えば、
_CURRENT_USER または HMO は、プロセスがログインしていないときは既定のスキーマ名として
HMO を使用します。
80 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
既存のテーブル
既存のテーブルと同じ名前のテーブルを作成しようとしたときの反応は、構成設定により異なります。
既定では、Caché は既存のテーブルと同じ名前のテーブルを作成することを拒否し、SQLCODE -
201 エラーを返します。これは以下のように設定可能です。
• ObjectScript $SYSTEM.SQL.SetDDLNo201() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-201
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow DDL CREATE TABLE for Existing Table] の現在の設定を表示します。
既定は “偽 (false)” (0) です。この設定を推奨します。このオプションを “真 (true)” (1) に設定す
ると、Caché はこのテーブルに対応するクラス定義を削除し、クラスを再作成します。つまり、DROP
TABLE を実行して既存のテーブルを削除し、CREATE TABLE を実行する動作と同じ結果を生じ
ます。この場合、SQL構成オプションの [Does DDL DROP TABLE Delete the Table's Data]を “真”
(ture) に設定 (既定) することを強くお勧めします。
%DESCRIPTION、%FILE、%NUMROWS、%ROUTINEこれらのオプション・キーワード句は、テーブル要素のコンマ区切りリスト内の任意の場所で指定で
きます。
Caché SQL で提供されている %DESCRIPTION キーワードは、テーブルまたはフィールドの説明を
挿入するために使用します。%DESCRIPTION の後には、一重引用符で囲んだテキスト文字列を続
けます。このテキストの長さに制限はなく、空白スペースを含むすべての文字を使用できます(説明
文字列内の一重引用符は、二重引用符で代用します。例えば、'Joe''s Table' のようになりま
す)。1 つのテーブルには 1つの %DESCRIPTION を使用できます。テーブルの各フィールドには、
データ型の後にそれぞれ独自の %DESCRIPTION を指定できます。1 つのテーブルに対してテー
ブル全体の %DESCRIPTION を複数指定すると、SQLCODE –82 が返されます。1 つのフィールド
に対して %DESCRIPTIONを複数指定すると、最後に指定された %DESCRIPTIONのみが保持され
ます。Caché スタジオでは、説明は、対応するテーブル (クラス) またはフィールド (プロパティ) の 1
つ前の行に、3 つのスラッシュが付けられて表示されます。以下はその例です。
/// Joe's Table
Caché SQL が提供する %FILE キーワードは、テーブルの説明を記録するファイル名を指定する目
的で使用します。1 つのテーブルに使用できるのは 1 つの %FILE のみです。複数の %FILE を指
定すると、SQLCODE –83 が返されます。
Caché SQL が提供する %NUMROWS キーワードは、このテーブルの予想される行数を示す整数を
格納するのに使用されます。既知のデータ行数でテーブルが作成される場合、特に行数の初期値
が以降に変更される可能性が低い場合 (都道府県のテーブルなど)、%NUMROWS を設定するとス
ペースを節約して、パフォーマンスを向上させることができます。1 つのテーブルに使用できるのは
1 つの %NUMROWS キーワードのみです。複数の %NUMROWS を指定すると、SQLCODE –84 が
返されます。
Caché SQL リファレンス 81
CREATE TABLE
Caché SQL が提供する %ROUTINE キーワードは、このベース・テーブルに対して生成されるルー
チン名の接頭語を指定するのに使用できます。例えば、%ROUTINE "myname" では、myname1、
myname2 というように以降も順次続く一連の名前のルーチンにコードが生成されます。外部関数
は、%ROUTINE から呼び出せません。1 つのテーブルに使用できるのは 1 つの %ROUTINE のみ
です。複数の %ROUTINE を指定すると、SQLCODE –85 が返されます。Caché スタジオでは、ルー
チン名の接頭語は SqlRoutinePrefix 値として表示されます。
互換性のみにサポートされるオプションCaché SQL は、構文解析の目的にのみ以下の CREATE TABLE オプションをサポートし、既存の
SQL コードから Caché SQL への変換を支援します。これらのオプションは、実際には機能しませ
ん。
{ON | IN} dbspace-name
LOCK MODE [ROW | PAGE]
[CLUSTERED | NONCLUSTERED]
WITH FILLFACTOR = literal
MATCH [FULL | PARTIAL]
CHARACTER SET identifier
COLLATE identifier /* But note use of COLLATE keyword, described below*/
TEMPORARY テーブル・オプションSQL の実装とは異なり、Caché は TEMPORARY テーブルをサポートしません。CREATE TABLE
によって作成されたすべてのテーブルは、永続的なテーブルです。詳細は、"CREATE VIEW" を
参照してください。
フィールド定義テーブル名の後に、括弧に囲まれたテーブルの全フィールド (列) 定義があります。フィールドの定
義は、コンマで区切ります。規則によって、各フィールドの定義は通常、別の行にインデントされて
表示されます。これは必須ではありませんがお勧めします。最後のフィールドを定義した後は、フィー
ルド定義の閉じ括弧を必ず記述してください。
フィールド定義部分は空白で区切ります。フィールド名は最初に記述し、その後にそのデータ特性
を続けます。フィールドのデータ特性は、データ型、データ・サイズ (オプション)、データ制約 (オプ
ション) の順序に表示されます。
注釈: Caché では、400 列を超えるテーブルの作成はお勧めできません。400 列を超える場合
は、データベースを設計し直します。これには、列を行に置き換える方法、列を複数の関
連テーブルに分割する方法、データを文字ストリームまたはビット・ストリームとして保存し、
列を減らす方法などがあります。
82 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
フィールド名
フィールド名は、識別子の規約に従い、テーブル名と同様の制約を受けます。フィールド名は 128
文字を超えることはできません。既定のフィールド名は、簡単な識別子です。
Caché はフィールド名を使用して、対応するプロパティ名を生成します。プロパティ名には英数字
(文字および数字) のみを使用し、その長さは最大 31 文字です。Caché は、このプロパティ名を生
成するために、最初にフィールド名から句読点を削除し、次に 31 文字 (未満) の一意の識別子を
生成します。その際、プロパティ名の一意性を維持するために、必要に応じて最後の文字を数字に
置き換えます。
データ型
Caché SQL は、多くの標準 SQL データ型をサポートしています。サポートされているデータ型の完
全なリストは、"データ型" セクションを参照してください。
Cachéは SQL.SystemDataTypes マッピング・テーブルおよびSQL.UserDataTypes マッピング・テー
ブルによって、これらの標準 SQL データ型を Caché データ型にマップします。ユーザは、追加の
ユーザ定義のデータ型を含めるために SQL.UserDataTypes を追加できます。
現在のデータ型マッピングを表示および変更するには、[システム管理ポータル] で [システム構
成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL] を選択します。[SystemDataTypes]
または [UserDataTypes] の現在の値を表示するには、[内容] を選択します。
Caché に対応するデータ型がない SQL のデータ型を指定する場合、その SQL データ型の名前
が、対応するクラス・プロパティのデータ型として使用されます。DDL の実行 (SQLExecute) 前に、
このユーザ定義の Caché データ型を作成する必要があります。
また、データ型のマッピングは、1つのパラメータ値を上書きできます。例えば、VARCHAR(100)を、
与えられた %String(MAXLEN=100) 標準マッピングにマップしたくないとします。この場合、テーブ
ルに 'VARCHAR(100)' の DDL データ型を追加して、これを上書きし、対応する Caché のタイプを
指定します。以下はその例です。
VARCHAR(100) maps to MyString100(MAXLEN=100)
データ・サイズ
データ型の後に続けて、(precision,scale) のように括弧内で使用可能なデータ・サイズを表示できま
す。precision は、許可された最大文字数や桁数を表示します。scale は、小数桁数を指定します。
例えば以下のようになります。
ProductName VARCHAR (64)UnitPrice NUMERIC (6,2)
この例では、UnitPrice の最大許可サイズは 6 桁で、そのうち 2 桁は小数点以下の桁です。した
がって、使用できる最高金額は $9999.99 になります。
Caché SQL リファレンス 83
CREATE TABLE
IDENTITY フィールドCaché SQL は各テーブルについて自動的に RowID を作成します。これはシステムが作成する整
数値で、一意のレコード識別子となります (以下のセクションを参照)。この IDENTITY キーワード・
オプションを使用すると、同じプロパティを持つ名前付きのフィールドをRowIDレコード識別子フィー
ルドとして定義できます。IDENTITY フィールドとして定義できるのは、1 テーブルに 1 つのフィー
ルドです。複数の IDENTITY フィールドを定義しようとすると、SQLCODE -308 エラーが発生しま
す。IDENTITY フィールドには以下のような特質があります。
• データ型は自動的に INTEGERとなります。データ型を定義する必要はありません。IDENTITY
フィールドにデータ型を設定しても無視されます。NOT NULL や UNIQUE のようなフィールド
制約も、無視されます。
• IDENTITY フィールド "myfieldname" のクラス定義は、SqlRowIdPrivate ではなく SqlRowId-
Name=myfieldname になります。
• データ値はシステムが生成します。値は一意で、0以外の正の整数です。ユーザは IDENTITY
フィールドのデータ値を指定・変更することはできません。
• INSERT文は IDENTITYフィールドの値を指定しません。指定しようとしてもできません。これを
実行しようとすると、SQLCODE -111 エラーが返されます。UPDATE 文では IDENTITY フィー
ルドの値を指定できません。これを実行しようとすると、SQLCODE -107 エラーが返されます。
• Caché が自動的に、IDENTITY フィールド上の主キーを ODBC および JDBC に投影します。
CREATE TABLE文またはALTER TABLE文によって、IDENTITYフィールドまたは IDENTITY
フィールドを含む列セット上に主キー制約または一意の制約を定義すると、その制約定義は無
視されます。
• SELECT * 文はテーブルの IDENTITY フィールドを返します。
以下は IDENTITY フィールドの例です。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE Employee ( EmpNum INT NOT NULL, MyID IDENTITY NOT NULL, Name CHAR(30) NOT NULL, CONSTRAINT EMPLOYEEPK PRIMARY KEY (EmpNum)) ) IF SQLCODE'=0 { WRITE !,"CREATE TABLE error is: ",SQLCODE QUIT } ELSE { &sql(INSERT INTO Employee (EmpNum,Name) SELECT ID,Name FROM Sample.Person WHERE Age >= '25') WRITE !,"INSERT error code is: ",SQLCODE }
この場合、主キー(EmpNum)は別のテーブルのIDフィールドから取得されます。したがってEmpNum
の値は一意の整数になりますが、WHERE節のため、数字が連続しない場合もあります。IDENTITY
フィールドの MyID は、ユーザから可視の一意の連続した整数を、各レコードに割り当てます。
84 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
フィールドのデータ制約データ制約によって、フィールドに許可される値、フィールドの既定値、およびデータ値に使用され
る照合タイプが規定されます。これらのデータ制約は、すべてオプションです。データ制約は、どの
ような順序でも指定できます。詳細は、"フィールド制約" を参照してください。
NULL と NOT NULL
NOT NULL データ制約キーワードは、そのフィールドが NULL 値を受け入れないように指定しま
す。つまり、すべてのレコードがこのフィールドに対して指定された値を持つ必要があります。NULL
と空文字列 ('') は、Caché では異なる値です。フィールドが NOT NULL 制約で定義されているとし
ても、文字列を受け入れるフィールドに空文字列を挿入することができます。数値フィールドに空文
字列を挿入することはできません。詳細は、このドキュメントの "SQL の概念" の "NULL" のページ
を参照してください。
NULL データ制約キーワードは、このフィールドが NULL 値を受け入れることを明示的に指定しま
す。これは、フィールドの既定の定義です。
UNIQUE
UNIQUEデータ制約は、このフィールドが一意の値のみ受け入れることを指定します。したがって、
このフィールドには同じ値を持つレコードは存在しないことになります。空文字列 ('') はデータ値と
みなされるため、UNIQUEデータ制約が適用されている場合は、このフィールドの複数のレコードを
空文字列値にすることはできません。NULL はデータ値とみなされないため、UNIQUE データ制約
は複数のNULLに対して適用されません。フィールドに対してNULLを制限するには、NOTNULL
キーワード制約を使用します。
DEFAULT
レコードにユーザ指定のデータ値が上書きされていなければ、DEFAULT データ制約によって、こ
のフィールドに自動的に与えられている既定データ値が指定されます。既定値として指定する文字
列は定数で、一重引用符で囲みます。数値既定値には一重引用符は必要ありません。例えば以下
のようになります。
Member_status CHAR(13) DEFAULT 'M',Membership_term INT DEFAULT 2
DEFAULT が指定されていなければ、暗黙の既定は NULL になります。フィールドに NOT NULL
データ制約があれば、このフィールドには明示的に、またはDEFAULTで値を指定する必要があり
ます。NOT NULLフィールドも含めてどのフィールドも、DEFAULTで空文字列を既定にすることが
できます。この場合、このフィールドには既定として常に$CHAR(0)の空文字列値が格納されます。
NULL および空文字列の詳細は、このドキュメントの "SQL の概念" の "NULL" を参照してくださ
い。
DEFAULT データ制約には、その値を定義するキーワード・オプションを指定できます。サポートさ
れているオプションは、NULL、USER、CURRENT_USER、SESSION_USER、SYSTEM_USER、CUR-
RENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP です。
Caché SQL リファレンス 85
CREATE TABLE
また、DEFAULT データ制約には OBJECTSCRIPT literal を指定することもできます。このオプショ
ンでは、以下の例に示すように、Caché ObjectScript コードを含む引用符付き文字列を指定するこ
とで既定値を生成できます。
CREATE TABLE mytest(ID NUMBER(12,0) NOT NULL,CREATE_DATE DATE DEFAULT OBJECTSCRIPT '+$HOROLOG' NOT NULL,LOGNUM NUMBER(12,0) DEFAULT OBJECTSCRIPT '$INCREMENT(^LogNumber)')
詳細は、"Caché ObjectScript リファレンス" を参照してください。
照合パラメータ
オプションの照合パラメータは、フィールドの値のソート時に使用する照合タイプを指定します。Caché
SQLは、9タイプの照合をサポートします。プログラミングを明確にする目的で、照合パラメータの前
にオプション・キーワードのCOLLATEを指定することを推奨します。ただし、このキーワードは必須
ではありません。照合を指定しない場合、既定は %EXACT 照合です。
%ALPHAUP、%SQLUPPER、%STRING、および %UPPER 照合は、照合目的ですべての文字を大文
字に変換します。大文字と小文字を区別しない照合の詳細は、"%SQLUPPER"関数を参照してくだ
さい。
%SQLSTRING、%SQLUPPER、および %STRING 照合では、オプションの maxlen パラメータを使うこ
とができます。これは切り捨てを命令する整数で、照合の実行時に対象とする最大文字数を指定し
ます。このパラメータは、サイズの大きなデータ値を持つフィールドにインデックスを作成するときに
便利です。
Caché SQL には、これらの照合タイプのほとんどに対応する関数があります。詳細
は、"%ALPHAUP"、"%SQLSTRING"、"%SQLUPPER"、"%STRING"、"%UPPER" の各関数を参照し
てください。
%DESCRIPTION
フィールドには、説明用のテキストを追加できます。このオプションに適用される規則は、テーブル
の説明テキストと同じです。それらの規則は、その他のテーブル要素とともに前述されています。
レコード識別子SQL では、すべてのレコードは RowID という一意の値によって識別される必要があります。Caché
SQL では、RowID フィールドを指定する必要はありません。テーブルを作成して希望のデータ・
フィールドを指定するとき、追加の RowID フィールドが自動的に作成されます。この RowID は内部
的に使用されますが、クラス・プロパティにマップはされません。これはクラスが SQL に投影される
場合にのみ、表示されます。この投影されたSQLでは、追加のRowIDフィールドが表示されます。
ユーザが上書きしない限り、このフィールドは常に "ID" という名前です。
例えば、CREATE TABLE 文は Name、Age、Address の 3 つのフィールドを指定します。これに対
応するクラスは、Name、Age、Address の 3 つのクラス・プロパティを持ちます。ただし、このクラスか
ら投影される SQL は ID、Name、Age、Address の 4 つのフィールドを持ちます。
86 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
RowID に対して生成された値は、以下の制約を持っています。各値は一意です。NULL 値は許可
されていません。照合は EXACT です。値は変更できません。
主キーPRIMARY KEY 節を使用して、フィールドを主レコード識別子として明示的に定義することができま
す。主キーは一意の値のみを受け取り、NULL値は受け取りません。主キーの照合タイプは、フィー
ルドそのものの定義で指定されます。
定義されたフィールドを以下のように主キーとして指定します。
CREATE TABLE A1 (Field1 INT, Field2 INT, PRIMARY KEY (Field1))
定義済みの主キーを持つクラスが SQLに投影される場合、追加の "ID" という RowID フィールドが
表示されます。その値は IDKEY フィールドの値と同じになります。
IDKey の主キー
CDL では、レコード識別子を IDKEY に指定することができます。多くの場合、SQL 主キーは CDL
IDKEY に対応します。
既存のフィールドに主キー制約を追加する場合、フィールドが自動的に IDKey インデックスとして
定義されることもあります。これはデータが存在するかどうか、および構成設定が以下のいずれかの
方法で設定されているかどうかによります。
• SQL SET OPTION PKEY_IS_IDKEY 文
• ObjectScript $SYSTEM.SQL.SetDDLPKeyNotIDKey() 関数を呼び出します。現在の設定を確
認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Are Primary Keys Created through DDL not ID Keys]の現在の設定を表示しま
す。 “真” (true) を設定すると、主キー制約が DDL で指定されたときに、自動的にクラス定義
の IDKey インデックスになりません。 “偽” (false) の場合は、IDKey インデックスになります。こ
の値を “偽” (false) に設定すると、通常パフォーマンスが向上します。しかし主キーのフィール
ドを更新できなくなります。既定は “真 (true)” (1) です。
このオプションが “偽 (false)” (0) に設定されている場合、主キーは IDKEY に対応します。IDKEY
である主キーを使用したレコードへのアクセスはより効率的ですが、一度設定されたキー値は二度
と変更することはできません。
複数の主キー
主キーには、1 フィールドしか定義できません。テーブルに複数の主キーを指定しようとすると、設
定によって結果が異なります。既定では、主キーがすでに存在する場合、Cachéは主キーの定義を
拒否し、SQLCODE -307 エラーを返します。この振る舞いは、以下のように設定します。
Caché SQL リファレンス 87
CREATE TABLE
• ObjectScript $SYSTEM.SQL.SetDDLNo307() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-307
] の設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Allow Create Primary Key Through DDL When Key Exists] の現在の設定を表
示します。
既定は “偽 (false)” (0) です。このオプションの設定が “偽 (false)” の場合、テーブルにすでに
主キー制約が存在するのに DDL で主キー制約を追加しようとすると、Caché は SQLCODE -307
エラーを返します。主キーの第 2 定義が最初の定義と同じ場合もエラーを返します。
例えば、以下に CREATE TABLE 文があります。
CREATE TABLE MyTable (f1 VARCHAR(16), CONSTRAINT MyTablePK PRIMARY KEY (f1))
この文は、主キーを作成します (存在しない場合)。次に、ALTER TABLE 文があります。
ALTER TABLE MyTable ADD CONSTRAINT MyTablePK PRIMARY KEY (f1)
上記の例は、SQLCODE -307 エラーを返します。
[キーが存在する時に DDL を通して主キーを作成することを許可する] が “真 (true)” に設定され
ている場合、Caché は既存の主キー制約を排除し、最後に指定された主キーをテーブルの主キー
として設定します。
外部キー外部キーは他のテーブルを参照するフィールドです。外部キー・フィールドに保存された値は、他
のテーブル内のレコードに対する主キー値です。指定された外部キーは必ず存在し、一意である
必要があります (主キーは重複値を持てないため)。外部キーが存在しないテーブルを参照する場
合は、SQLCODE=–310が返されます。外部キーが一意でないフィールドを参照する場合は、SQL-
CODE=–314 が返されます。
テーブルに外部キーが含まれる場合は、1つのテーブルでの変更が他のテーブルにも影響します。
外部キーを定義するときにデータの整合性を維持するには、外部キーの元となっているレコードを
変更したときに外部キー値に与える影響も定義します。
88 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
外部キー定義は、以下の 2 つの参照動作節を含みます。
ON DELETE ref-action
あるいは以下のコードを入力します。
ON UPDATE ref-action
ON DELETE 節は、参照されるテーブルに対する DELETE ルールを定義します。参照されるテー
ブルから行が削除されるとき、ON DELETE 節は参照しているテーブルの行に対してどのような操
作を行うかを定義します。
ON UPDATE 節は、参照されるテーブルに対する UPDATE ルールを定義します。参照されるテー
ブルから行の主キー値を変更 (更新) しようとする場合、参照しているテーブルの行に対してどのよ
うに作用するかは ON UPDATE 節に定義します。
Caché SQL は以下の外部キー参照動作をサポートします。
• NO ACTION
• SET DEFAULT
• SET NULL
• CASCADE
NO ACTION — 参照されるテーブル内の行が削除されたり、キー値が更新されるとき、参照される
すべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。参照
している行がある場合は、削除や更新は失敗します。NO ACTION は既定です。
SET NULL — 参照されるテーブル内の行が削除されたり、そのキー値が更新されるとき、参照され
るすべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。参
照している行がある場合は、削除や更新されている行を参照する外部キー・フィールドが NULL に
設定されます。外部キー・フィールドは、NULL 値を許可します。
SET DEFAULT — 参照されるテーブル内の行が削除されたり、そのキー値が更新されるとき、参照
されるすべてのテーブルは、削除や更新される行を参照している行があるかどうかをチェックします。
参照している行がある場合は、削除や更新されている行を参照する外部キー・フィールドにその
フィールドの既定値が設定されます。外部キー・フィールドが既定値を持たない場合は、NULL に
設定されます。行は参照されるテーブル内に存在しなければならないことに注意してください。また、
参照されるテーブルには、既定値に対するエントリが含まれます。
CASCADE — 参照されるテーブル内の行が削除される場合、参照するすべてのテーブルでは、削
除されている行を参照している行があるかどうかがチェックされます。参照している行がある場合は、
削除によって、削除される行を参照している外部キー・フィールドの行も削除されます。
参照されるテーブル内のキー値が更新されるとき、参照するすべてのテーブルでは、更新される行
を参照している行があるかどうかがチェックされます。参照している行がある場合は、更新によって、
更新される行を参照する外部キー・フィールドの参照しているすべての行も続けて更新されます。
Caché SQL リファレンス 89
CREATE TABLE
以下は、CREATE TABLE文を発行する埋め込みSQLの例です。このコマンドは両方の参照動作
節を使用します。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE MyPatients ( PatNum VARCHAR(16), Name VARCHAR(30), DOB DATE, Primary_Physician VARCHAR(16) DEFAULT 'A10001982321', CONSTRAINT Patient_PK PRIMARY KEY (PatNum), CONSTRAINT Patient_Physician_FK FOREIGN KEY Primary_Physician REFERENCES Physician (PatNum) ON UPDATE CASCADE ON DELETE SET NULL) ) WRITE !,"SQL code: ",SQLCODE
関連項目
• テーブル参照 列 ALTER TABLE DROP TABLE
• SELECT JOIN
• INSERT UPDATE
CREATE TRIGGER
トリガを作成します。
CREATE TRIGGER name BEFORE event ORDER integer ON table REFERENCINGalias action
CREATE TRIGGER name AFTER event ORDER integer ON table REFERENCINGalias action
引数
作成するトリガの名前。識別子です。トリガ名は
修飾、未修飾のどちらでもかまいません。修飾
する場合は、そのスキーマ名はテーブルのス
キーマ名と同じである必要があります。
name
トリガ・イベントのタイミング (BEFORE または
AFTER) とタイプ。指定できる event オプション
は、INSERT、DELETE、UPDATE、および
UPDATE OF です。UPDATE OF 節の後には、
列名またはコンマで区切られた列名のリストが
続きます。UPDATE OF 節は、LANGUAGE が
SQL の場合にのみ指定できます。
BEFORE event
AFTER event
90 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
オプション — テーブルに、同じタイミングおよび
イベントに対して複数のトリガが存在する場合に
トリガを引き出す順番。順番の指定を省略したト
リガには、順番 0 が割り当てられます。
ORDER integer
トリガが作成されるテーブル。テーブル名は修
飾、未修飾のどちらでもかまいません。修飾す
る場合は、トリガがテーブルと同じスキーマにあ
る必要があります。
ON table
オプション — REFERENCING OLD ROW を指定
すると、UPDATE または DELETE トリガの実行
中に、列の元の値を参照できます。
REFERENCING NEW ROW を指定すると、
INSERT または UPDATE トリガの実行中に、列
の新しい値を参照できます。REFERENCING 節
は、LANGUAGE が SQL の場合にのみ使用で
きます。
REFERENCING OLD ROW AS alias
REFERENCING NEW ROW AS alias
トリガのプログラム・コード。LANGUAGE SQLま
たは LANGUAGE OBJECTSCRIPT (Caché
ObjectScript) キーワード節を使用して、action
の先頭にプログラム言語を指定します。
LANGUAGE節を省略する場合は、SQLが既定
です。
action
概要CREATE TRIGGER コマンドはトリガを作成します。トリガは、指定されたテーブルに新しい行が挿
入されるなどのトリガ・イベントが発生したときに引き出されます(実行されます)。トリガの起動で、ユー
ザ指定のトリガ・コードが、INSERT、DELETE、またはUPDATEコマンドと連動して実行されます。ト
リガ・コードの実行は、起動アクションの実行の前後どちらにも指定できます。トリガは指定したテー
ブルおよび指定した INSERT、DELETE、または UPDATE の動作により異なります。
CREATE TRIGGER コマンドの実行には特権が必要です。CREATE TRIGGER を使用する前
に、%CREATE_TRIGGER 特権を得る必要があります。この設定を行わないと、SQLCODE -99 (特
権違反)になります。適切な付与特権を持っていれば、GRANTコマンドを使用して、%CREATE_TRIG-
GER特権を割り当てることができます。埋め込みSQLでは、以下のように $SYSTEM.Security.Login
メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
CREATE TRIGGER 文は table に対してテーブル・レベルのロックを取得します。これにより、他の
プロセスはこのテーブルのデータを変更できなくなります。このロックはCREATE TRIGGER処理が
終了すると自動的に解除されます。
Caché SQL リファレンス 91
CREATE TRIGGER
引数
name
トリガ名にはテーブル名と同様の識別子要件があります。しかし一意性の要件は異なります。トリガ
名はスキーマ内のテーブルに対して一意である必要があります。したがって、スキーマ内の異なる
テーブルを参照しているトリガの名前が同じ場合もあります。トリガとそのトリガが関連するテーブル
は同じスキーマ内に存在している必要があります。同じスキーマ内では、トリガとテーブルに同じ名
前を使用できません。トリガの名前付け規約に違反すると、CREATE TRIGGER の実行時に SQL-
CODE -400 エラーが発生します。
トリガ名は、修飾、未修飾のどちらでもかまいません。修飾されたトリガ名は次のようになります。
schema_name.trigger_name
トリガ名が未修飾の場合、トリガ・スキーマ名は既定でtableのスキーマと同じになります。どちらも未
修飾であれば、システムの既定スキーマが使用されます。トリガ名を修飾する場合は、トリガ・スキー
マ名をテーブル・スキーマ名と同じにする必要があります。テーブル・スキーマ名が指定されていな
い場合は、トリガ・スキーマ名が使用されます。スキーマ名が一致しないと SQLCODE -366 エラー
になります。これはトリガ名とテーブル名の両方が修飾されていて、異なるスキーマ名を指定してい
るときにのみ起こります。
トリガ名は、識別子の規則に従い、以下のような制約を受けます。既定のトリガ名は、簡単な識別子
です。トリガ名は 128 文字を超えることはできません。トリガ名は、大文字と小文字が区別されませ
ん。
Caché はトリガ名 (SQLNAME) を使用して、対応する Caché 識別子を生成します。Caché 識別子
には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。この Caché 識別
子名を生成するために、Cachéは最初にトリガ名から句読点を削除し、次に 25文字 (未満)の一意
の識別子を生成します。その際、トリガ名の一意性を維持するために、必要に応じて最後の文字を
数字に置き換えます。トリガの名前を付ける際には、この名前生成に伴う以下の制約について考慮
する必要があります。
• トリガ名には、最低でも1文字を含める必要があります。トリガ名の先頭の文字または最初の句
読点に続く文字は、数字以外の文字にする必要があります。
• Caché は Unicode システムで、16 ビット (ワイド) 文字のトリガ名をサポートします。$ZNAME テ
ストに合格した文字は、有効な文字です。
• 生成された Caché の名前には句読点が含まれないため、句読点のみが異なるトリガ名の作成
は可能ですが、お勧めできません。
• トリガ名は 25 文字よりも大幅に長くすることができますが、最初の 25 の英数文字が異なるよう
にトリガ名を作成すると処理がはるかに容易になります。
92 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
event
INSERTとして指定されたトリガは、指定されたテーブルに行が挿入されたときに引き出されます(実
行されます)。DELETEとして指定されたトリガは、指定されたテーブルから行が削除されたときに引
き出されます。UPDATE として指定されたトリガは、指定されたテーブルの行が更新されたときに引
き出されます。
UPDATE OF として指定されたトリガは、指定されたテーブルの行で 1つ以上の指定された列が更
新されたときにのみ、引き出されます。列名はコンマ区切りのリストで指定します。列名は任意の順
序で指定できますが、重複して使用することはできません。重複していると、コンパイル時にSQLCODE
-58 エラーが発生します。UPDATE OF 節はトリガ・コード LANGUAGE が SQL (既定) の場合のみ
有効です。
BEFORE トリガが引き出される (実行される) のは、指定した event の実行前ですが、event の検証
よりも後です。例えば、DELETE 文が指定の行に対して有効で、DELETE の実行 (外部キー参照
の整合性チェックも含む)に必要な特権がプロセスに与えられている場合にのみ、BEFOREDELETE
トリガが引き出されます。プロセスが指定のeventを実行できない場合、eventに対してエラー・コー
ドが発行され、BEFORE トリガは引き出されません。
ORDER
ORDER 節は、1 つのテーブルに同じタイミングとイベントを持つトリガが複数あるときに、トリガが引
き出される順番を決定します。例えば、2 つの AFTER DELETE トリガのような場合です。ORDER
の整数値が最小のトリガが最初に実行され、その後は、次に高い整数値を持つトリガが順次実行さ
れます。ORDER 節が指定されない場合は、ORDER 値に 0 (ゼロ) が割り当てられてトリガが生成さ
れます。したがって、ORDER 節を持たないトリガは、必ず ORDER 節を持つトリガの前に実行され
ます。
複数のトリガに同じ ORDER 値を割り当てることができます。また、ORDER が 0 (明示的または暗黙
的)のトリガを複数作成することもできます。タイミング、イベント、および順序が同じ複数のトリガは、
任意の順序でまとめて実行されます。
以下の例は、ORDER 値がどのように機能するかを示します。以下のすべての CREATE TRIGGER
文は、同じイベントによって引き出されるトリガを作成します。
CREATE TRIGGER TrigA BEFORE DELETE ON doctable INSERT INTO TLog VALUES ('doc deleted'); -- Assigned ORDER=0
CREATE TRIGGER TrigB BEFORE DELETE ORDER 4 ON doctable INSERT INTO TReport VALUES ('doc deleted') -- Specified as ORDER=4
CREATE TRIGGER TrigC BEFORE DELETE ORDER 2 ON doctable INSERT INTO Ttemps VALUES ('doc deleted') -- Specified as ORDER=2
CREATE TRIGGER TrigD BEFORE DELETE ON doctable INSERT INTO Tflags VALUES ('doc deleted') -- Also assigned ORDER=0
Caché SQL リファレンス 93
CREATE TRIGGER
これらのトリガは、(TrigA または TrigD)、TrigC、TrigB の順に実行されます。TrigA と TrigD は同じ
ORDER 値となるので、任意の順序で実行されます。
REFERENCING
REFERENCING 節では、行の元の値、新しい値、またはその両方に対してエイリアスを指定できま
す。元の値とは、UPDATEまたはDELETE トリガのトリガ動作が実行される前の行の値のことです。
新しい値とは、UPDATE または INSERT トリガのトリガ動作が実行された後の行の値のことです。
UPDATE トリガの場合は、以下のようにして、元の行値と新しい値の両方にエイリアスを指定できま
す。
REFERENCING OLD ROW AS oldalias NEW ROW AS newalias
キーワードの ROW と AS は省略可能です。したがって、同じ節を以下のように指定することもでき
ます。
REFERENCING OLD oldalias NEW newalias
INSERT前の元の値やDELETE後の新しい値を参照することには、意味がありません。それらを参
照すると、コンパイル時に SQLCODE -48 が返されます。
REFERENCING節は action プログラム・コードが SQLの場合にのみ、使用できます。LANGUAGE
OBJECTSCRIPT 節とともに REFERENCING 節を指定すると、SQLCODE -49 エラーになります。
action
トリガ動作は、以下の要素から構成されます。
• オプションの FOR EACH ROW 節。
• オプションのWHEN節。WHEN節は、WHENキーワードとその後の括弧で囲まれた検索条件
(単純または複雑な)から成ります。検索条件が真に評価されると、トリガが実行されます。WHEN
節は、LANGUAGE が SQL の場合にのみ使用できます。
• オプションの LANGUAGE 節。LANGUAGE SQL または LANGUAGE OBJECTSCRIPT を指
定できます。既定は LANGUAGE SQL です。
• トリガが引かれたときに実行されるユーザ記述のコードです。
SQL トリガ・コードLANGUAGE SQL の場合、既定でトリガ文は SQL プロシージャ・ブロックです。SQL プロシージャ・
ブロックは、1 つの SQL プロシージャ文とその後のセミコロン、またはキーワード BEGIN で始まり
キーワード END で終わる 1 つ以上の SQL プロシージャ文と各文の後のセミコロンから成ります。
トリガ動作はアトミックで、完全に適用されるかまったく適用されないかのどちらかです。これに
COMMIT 文または ROLLBACK 文を含めることはできません。キーワード BEGIN ATOMIC は、
キーワード BEGIN と同義です。
94 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
LANGUAGE SQL の場合、CREATE TRIGGER文はオプションで REFERENCING節、WHEN節、
および/または UPDATE OF 節を含むことができます。UPDATE OF 節は、トリガに指定された 1
つ以上の列でUPDATEが実行されるときにのみ、トリガを実行することを指定します。LANGUAGE
OBJECTSCRIPT の CREATE TRIGGER 文では、これらの節を含むことができません。
SQL トリガ・コードは埋め込みSQLとして実行されます。Cachéは自動的に、トリガ・コード内で使用
されているすべての変数をリセット (NEW) します。各 SQL 文の実行後に、Caché は SQLCODE を
チェックします。エラーが発生すると、Caché は %ok変数に 0をセットし、トリガ・コードの処理および
関連する INSERT、UPDATE、または DELETE を中止してロールバックします。
ObjectScript トリガ・コードLANGUAGE OBJECTSCRIPT の場合、CREATE TRIGGER 文は REFERENCING 節、WHEN 節、
または UPDATE OF 節を含むことができません。これらの SQL 限定である節を LANGUAGE
OBJECTSCRIPT とともに指定すると、それぞれコンパイル時に SQLCODE エラーの -49、-57、ま
たは -50 が発生します。
LANGUAGEOBJECTSCRIPTの場合、トリガ文は、中括弧で囲まれた1つ以上のCachéObjectScript
文からなるブロックです。こうしたトリガ・コードでラベルを指定するには、ラベル行の先頭にコロンを
付けて、その行が最初の列で始まることを示します。Caché はコロンを削除して、残りの行をラベル
として処理します。
注釈: ラベル用のコロン接頭語の使用は、ホスト変数参照用のコロン接頭語の使用よりも優先さ
れます。この競合を回避するために、埋め込みSQLトリガ・コード行の先頭にホスト変数参
照を記述しないことをお勧めします。トリガ・コード行の先頭にホスト変数参照を記述する必
要がある場合は、二重のコロン接頭語を使用することで、それがホスト変数でありラベルで
ないことを明示してください。
Caché ObjectScript で記述するトリガ・コードには、{fieldname} で指定するフィールド参照を含める
ことができます。ここで、fieldname は現在のテーブルの既存フィールドを指定します。中括弧内に
空白スペースは許可されません。現在のフィールドは、{*} のようにアスタリスクを使用して指定でき
ます。UPDATE トリガ・コードでは、fieldnameの後に*N、*O、または*Cを続けることで、変更フィー
ルドのデータ値の処理方法を指定できます。{fieldname*N} は、指定された変更が実行された後の
新しいフィールド値を返します。これが既定です。{fieldname*O} は、指定された変更が実行される
前の元のフィールド値を返します。{fieldname*C}は、フィールド値が変更されたかどうかを示すブー
リアン値 (変更の場合は 1、未変更の場合は 0) を返します。
また、Caché ObjectScript で記述するトリガ・コードには、擬似フィールド参照変数の {%%CLASS-
NAME}、{%%CLASSNAMEQ}、{%%TABLENAME}、および {%%ID} を含めることもできます。擬似フィー
ルドは、クラスのコンパイル時に特定の値に変換されます。{%%CLASSNAME} と {%%CLASSNAMEQ}
は、ともに SQL テーブル定義を投影するクラスの名前に変換されます。{%%CLASSNAME} は引用
符なし文字列を返し、{%%CLASSNAMEQ} は引用符付き文字列を返します。{%%TABLENAME} は
テーブルの完全修飾名に変換され、引用符付き文字列を返します。{%%ID}は RowID名に変換され
ます。この参照は、RowIDフィールドの名前がわからないときに有用です。これらの擬似フィールド・
キーワードは、すべて大文字と小文字が区別されません。
Caché SQL リファレンス 95
CREATE TRIGGER
%ok 変数を 0 に設定することで、トリガ・コードからエラーを発行できます。この設定によって、実行
時エラーを生成し、トリガの実行が中止されます。また、トリガ・コードでは %msg 変数に実行時エ
ラーの起きた節を記述する文字列を設定することもできます。
トリガの実行時エラートリガおよびそのトリガが起動するイベントは、単一行ベースでアトミック処理として実行されます。つ
まり、以下のように処理されます。
• 失敗した BEFORE トリガはロールバックされ、関連する INSERT、UPDATE、または DELETE
操作は実行されません。さらに行のすべてのロックは解放されます。
• 失敗した AFTER トリガはロールバックされ、関連する INSERT、UPDATE、または DELETE 操
作がロールバックされます。さらに行のすべてのロックは解放されます。
• 失敗した INSERT、UPDATE、または DELETE 操作はロールバックされ、関連する BEFORE ト
リガがロールバックされます。さらに行のすべてのロックは解放されます。
• 失敗した INSERT、UPDATE、または DELETE 操作はロールバックされ、関連する AFTER トリ
ガは実行されません。さらに行のすべてのロックは解放されます。
整合性が維持されるのは、現在の行の操作のみであることに注意してください。アプリケーション・プ
ログラムは、トランザクション処理文を使用して、複数行での操作も含めてデータの整合性の問題に
対処する必要があります。
トリガはアトミック処理であるため、コミットやロールバックのようなトランザクション文は、トリガ・コード
内ではコーディングできません。
INSERT、UPDATE、または DELETE 操作が複数のトリガを実行する場合、1 つのトリガが失敗する
と残りすべてのトリガは実行されないままになります。
致命的なランタイム・エラーによってデータベース操作が失敗すると、Cachéは SQLCODE -415 エ
ラーを発行します。トリガ処理が失敗すると、Caché は失敗したトリガのタイプにより SQLCODE エ
ラー・コードの -130 から -135 のうちの 1 つを発行します。トリガ・コード内で %ok変数を 0 に設定
することで、トリガを失敗させることができます。また、%msg 変数にトリガの失敗時に返すメッセージ
を含む文字列を設定することもできます。
例以下の埋め込み SQL の例は、SQL 挿入トリガを作成します。
96 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE TestDummy ( TESTNUM INT NOT NULL, FIRSTWORD CHAR (30) NOT NULL, LASTWORD CHAR (30) NOT NULL, CONSTRAINT TestDummyPK PRIMARY KEY (TESTNUM)) ) WRITE !,"SQL table code is: ",SQLCODE &sql(CREATE TRIGGER TrigTestDummy AFTER INSERT ON TestDummy BEGIN INSERT INTO LogFile VALUES ('INSERT into TestDummy'); END) WRITE !,"SQL trigger code is: ",SQLCODE
以下の例は AFTER INSERT トリガを作成します。
CREATE TRIGGER Trigger_1 AFTER INSERT ON Table_1 REFERENCING NEW ROW AS new_row BEGIN INSERT INTO Log_Table VALUES ('INSERT into Table_1'); INSERT INTO New_Log_Table VALUES ('INSERT into Table_1', new_row.ID); END
CREATE TRIGGER Trigger_2 AFTER INSERT ON Table_1 REFERENCING NEW ROW AS new_row BEGIN INSERT INTO Log_Table VALUES (new_row.Category); END
関連項目トリガ動作 DROP TRIGGER GRANT
CREATE USER
ユーザ・アカウントを作成します。
CREATE USER user-name IDENTIFY BY password
引数
作成するユーザ名。名前は、最大 30 文字の識別子です。識別子の区切り
文字のサポートが有効で、ユーザ名がアンダースコア (_) で始まる場合、
ユーザ名を引用符で囲む必要があります。
user-name
作成するユーザのパスワード。password
概要CREATE USER コマンドは、指定したパスワードを持つユーザ・アカウントを作成します。
Caché SQL リファレンス 97
CREATE USER
user-name は最大 30 文字までの有効な識別子です。ユーザ名が、区切られた識別子で、引用符
で囲まれていれば、SQL予約語も使用できます。ユーザ名は、大文字と小文字が区別されません。
password は、文字 (大文字/小文字) あるいは % (パーセント記号) で始める必要があります。その
後ろに、任意の文字、任意の数字、% (パーセント)、_ (アンダースコア)、& (アンパサンド)、$ (ドル記
号)、@ (アットマーク) を自由に組み合わせて使用できます。パスワードは大文字と小文字が区別さ
れます。
ユーザを作成しても、ロールの作成やユーザへのロールの付与は行われません。ただし、ユーザは
データベースにログインする許可が与えられ、ネームスペースでの SQL 特権を 1 つでも持ってい
れば、%SQL/ServiceサービスのUSE許可が与えられます。ユーザに特権やロールを割り当てるに
は、GRANT コマンドを使用します。ロールの作成には、CREATE ROLE コマンドを使用します。
CREATE USERを実行してすでに存在するユーザを作成しようとすると、SQLは SQLCODE = –118
エラーを返します。
Caché 5.1 セキュリティ
CREATE USER コマンドの実行には特権が必要です。埋め込み SQLで CREATE USER を使用す
る前に、適切な特権を持つユーザとしてログインする必要があります。この操作をしないと、SQLCODE
–99 エラー (特権違反) が返されます。$SYSTEM.Security.Login メソッドを使用して、以下のように
ユーザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の埋め込み SQLの例は、"Carl4SHK"いうパスワードを持つ "Bill" という新しいユーザを作成
します ($RANDOM トグルが記述されているので、このプログラム例を繰り返し実行できます。)
Main DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER Bill IDENTIFY BY Carl4SHK) WRITE !,"CREATE USER error code: ",SQLCODECleanup SET toggle=$RANDOM(2) IF toggle=0 { &sql(DROP USER Bill) WRITE !,"DROP USER error code: ",SQLCODE } ELSE { WRITE !,"No drop this time" QUIT }
上述のように、区切り文字付き識別子へのサポートがあり、ユーザ名がアンダースコア (_) で始まる
場合、以下のようにユーザ名を引用符で囲む必要があります。
CREATE USER "_ADMIN" IDENTIFY BY PW9suPer
98 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目
• SQL : ユーザ ALTER USER DROP USER GRANT REVOKE CREATE ROLE
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
CREATE VIEW
ビューを作成します。
CREATE VIEW view-name (column-commalist) AS select-statement WITH READONLY
CREATE VIEW view-name (column-commalist) AS select-statement WITH[level] CHECK OPTION
引数
作成するビュー名。名前付け規約はテーブル名と
同じです。ビュー名は修飾 (schema.viewname)、未
修飾のどちらでもかまいません。同じスキーマ内で
は、テーブルとビューに同じ名前を使用することは
できません。
view-name
オプション — ビューを構成する列名。指定する場
合、このリストは括弧で囲み、リスト内の項目はコン
マで区切ります。
column-commalist
ビューを定義する SELECT 文。AS select-statement
オプション — このビューの基になっているテーブル
に対して、このビューからは挿入、更新、削除の各
操作を実行できないように指定します。既定では、
後述の制限を条件として、ビュー経由でこれらの操
作が許可されます。
WITH READ ONLY
オプション — このビューの基になっているテーブル
に対して、挿入、更新、削除の各操作をこのビュー
からどのように実行するかを指定します。level に
は、キーワード LOCAL またはCASCADED を指定
できます。level を指定しない場合、WITH CHECK
OPTION は既定で CASCADED になります。
WITH level CHECK OPTION
Caché SQL リファレンス 99
CREATE VIEW
概要CREATE VIEW コマンドは、ビューの内容を定義します。ビューを定義する SELECT 文は、複数の
テーブルや他のビューを参照できます。作成するビューのSELECT節内から参照するオブジェクト
を選択するには、適切な特権が必要です。
• それには、ビューから参照するすべてのテーブル (またはビュー) に対して、SELECT 特権を
持っている必要があります。指定したテーブル (またはビュー) に対する SELECT 特権を持っ
ていない場合は、CREATE VIEW コマンドを実行できません。
• ビューに対する SELECT 特権のWITH GRANT OPTION を取得するには、ビューが参照する
すべてのテーブル (またはビュー) について WITH GRANT OPTION を持っていなければなり
ません。
• ビューについて INSERT、UPDATE、DELETE または REFERENCES 特権を取得するには、
ビューが参照するすべてのテーブル (またはビュー) に対して同じ特権を持っている必要があ
ります。これらの特権の WITH GRANT OPTION を取得するには、基になるテーブルに対して
WITH GRANT OPTION 特権を持っている必要があります。
• ビューが WITH READ ONLY に指定されていると、基本テーブルに対する特権を持っていて
もそのビューに対しての INSERT、UPDATE、または DELETE 特権は認められません。後で
ビューが読み取り/書き込み可能に再定義されると、ビューに投影されているクラスが再コンパ
イルされるときにこれらの特権が追加されます。
ビューがコンパイルされると、ビューの作成者(所有者)に%ALTER特権のWITHGRANTOPTION
が与えられます。
CREATE VIEW コマンドの実行には特権が必要です。CREATE VIEW を使用する前に、%CRE-
ATE_VIEW 特権を得る必要があります。この設定を行わないと、SQLCODE -99 (特権違反) になり
ます。適切な付与特権を持っていれば、GRANT コマンドを使用して、%CREATE_VIEW特権を割り
当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用
して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
%CREATE_VIEW特権はGRANTコマンドで割り当てます。このときユーザまたはロールにこの特権
を割り当てる必要があります。この要件は設定可能です。
• ObjectScript $SYSTEM.SQL.SetSQLSecurity() 関数を呼び出します。現在の設定を確認する
には、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQL ON:]の
設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[SQL Security Enabled] の現在の設定を表示します。
既定は “真 (true)” (1) です。 “真” の場合、ユーザは特権が付与されているテーブルやビュー
のみでアクションを実行できます。この設定を推奨します。
100 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
このオプションが “偽 (false)” (0) に設定されている場合、SQL セキュリティは無効になります。つ
まり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指
定しなくてもテーブルの作成が可能になります。この場合、ダイナミックSQLはユーザとして"_SYS-
TEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくても
テーブルやビューに対してアクションを実行することができます。
ビューの名前付け規約
ビュー名の名前付け規約は、テーブル名の名前付け規約と同じです。同じスキーマ内では、テーブ
ルとビューに同じ名前を使用できません。同じ名前にすると、SQLCODE –201 が返されます。
ビュー名は、識別子の規則に従い、以下のような制約を受けます。既定のビュー名は、簡単な識別
子です。ビュー名は 128 文字を超えることはできません。
Cachéはビュー名を使用して、対応するクラス名を生成します。クラス名には英数字(文字および数
字)のみが使用され、その長さは最大25文字です。このクラス名を生成するために、Cachéは最初
にビュー名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、クラ
ス名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。Caché は有効
なビュー名から一意のクラス名を生成しますが、ビューの名前を付ける際には、この名前の生成に
伴う以下の制約について考慮する必要があります。
• ビュー名には、最低でも1文字を含める必要があります。ビュー名の先頭の文字または最初の
句読点に続く文字は、数字以外の文字にする必要があります。
• Caché は Unicode システムで、16 ビット (ワイド) 文字のビュー名をサポートします。$ZNAME
テストに合格した文字は、有効な文字です。
• 生成されたクラス名には句読点が含まれないため、句読点のみが異なるビュー名およびテーブ
ル名の作成は可能ですが、お勧めできません。
• ビュー名は25文字よりも大幅に長くすることができますが、最初の25の英数字が異なるように
ビュー名を作成すると処理がはるかに容易になります。
ビュー名は修飾、未修飾のどちらでもかまいません。修飾付きのビュー名には、以下の構文を使用
します。
schema.viewname
未修飾のビュー名には、既定として SQLUser スキーマ (または事前構成されたシステム既定のス
キーマ名) が使用されます。Caché はスキーマ名を使用して、対応するクラス・パッケージ名を生成
します。SQLUserからは、パッケージ名Userが生成されます。スキーマ名と既定値の詳細は、"テー
ブル参照" を参照してください。
複雑な SELECT 節
ビューは、特定のテーブルの行や列の単純なサブセットである必要はありません。ビューは、任意の
複雑度を持つ SELECT 節で、複数のテーブルや他のビューを使用して作成できます。ただし、
Caché SQL リファレンス 101
CREATE VIEW
ビュー定義に使用する SELECT 節には、いくつかの制約があります。CREATE VIEW 文には、以
下の内容が適用されます。
• ORDER BY 節を含まない
• INTO キーワードを含まない
• 臨時のテーブルを参照しない
• GROUP BY 節を持つことが可能
• 関数を使用可能
ビュー内の列名を指定する column-commalist には、SELECT クエリで指定したのと同じ列数が含
まれている必要があります。ビューとクエリとで列数が一致していない場合は、コンパイル時にSQL-
CODE -142 が発生します。以下の例は、ビューとクエリで列が一致するときの CREATE VIEW を
示しています。
CREATE VIEW MyView (ViewCol1, ViewCol2, ViewCol3) AS SELECT TableCol1, TableCol2, TableCol3 FROM MyTable
また、クエリでASキーワードを使ってビュー列をクエリ列 (またはビュー列のペア) として関連付ける
こともできます。以下はその例です。
CREATE VIEW MyView AS SELECT TableCol1 AS ViewCol1, TableCol2 AS ViewCol2, TableCol3 AS ViewCol3 FROM MyTable
CREATE VIEW には、2 つのテーブルの UNION 結合から列を選択する UNION 文を含めることが
できます。以下の埋め込み SQL の例のように、UNION を指定することができます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE VIEW MyView (vname,vstate) AS SELECT t1.name,t1.home_state FROM Sample.Person AS t1 UNION SELECT t2.name,t2.office_state FROM Sample.Employee AS t2) WRITE !,"SQL error code is: ",SQLCODE
上記の例のように、ビュー名が未修飾の場合は、ビューによって参照されるテーブルが Sample ス
キーマに属していたとしても、システム全体の既定 SQL スキーマ名 (この場合は User.MyView) が
既定のスキーマになることに注意してください。ビューを関連するテーブルとともに確実に格納する
ために、ビュー名は常に修飾付きにすることをお勧めします。
ビュー経由の更新ビューを使用して、ビューの基であるテーブルの更新が可能です。ビュー経由で、新しい行のINSERT
による挿入、行データの UPDATE による更新、および、行の DELETE による削除が可能です。
CREATE VIEW 文にこの機能を指定していれば、INSERT 文、UPDATE 文、DELETE 文をビュー
102 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
に発行できます。ビュー経由の更新を許可するには、WITH CHECK OPTION (既定) を指定しま
す。
ビュー経由の更新を禁止するには、WITH READ ONLY を指定します。WITH READ ONLY で生
成されているビューで INSERT、UPDATE、またはDELETEを実行すると、SQLCODE = -35エラー
が返されます。
ビュー経由の更新を実行するには、GRANT コマンドによって、テーブルやビューの更新に対応す
る特権を指定することが必要です。
ビュー経由で更新するには、以下の制限に従います。
• ビューは、ビューとして投影されたクラス・クエリではありません。
• ビューのクラスはクラス・パラメータ READONLY=1 を含むことはできません。
• ビューの SELECT文はGROUP BY、HAVING、SELECT DISTINCT、UNION、または SELECT
TOP 節を含むことはできません。
• ビューの SELECT 文はサブクエリを含むことはできません。
• ビューの SELECT 文は、列参照である値式だけをリストします。
• ビューの SELECT 文が持つことができるテーブル参照は 1 つだけで、更新可能なテーブルま
たはビューのいずれかを指定する必要があります。
WITH CHECK OPTION 節を指定すると、挿入または更新操作の際に、その結果行がビュー定義
のWHERE節に対して検証されます。これで、挿入または変更した行が、確実に導出されたビュー・
テーブルの一部になります。利用可能なチェック・オプションは以下に示す 2 つです。
WITH LOCAL CHECKOPTIONでは、INSERTまたはUPDATE文で指定されたビューのWHERE
節のみがチェックされます。
WITH CASCADED CHECK OPTION では、INSERT または UPDATE 文で指定されたビューおよ
びすべての基本ビューで指定された WHERE 節がチェックされます。これは、この基本ビューのあ
らゆる WITH LOCAL CHECK OPTION 節よりも優先されます。CASCADED は、既定であり、更新
可能なすべてのビューについて使用することをお勧めします。
INSERT オペレーションでWITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、SQL-
CODE=–136 エラーが返されます。
UPDATE オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、
SQLCODE=–137 エラーが返されます。
例以下の例は、PhoneBook テーブルから "CityPhoneBook" という名前のビューを作成します。
CREATE VIEW CityPhoneBook AS SELECT Name FROM PhoneBook WHERE City='Boston'
Caché SQL リファレンス 103
CREATE VIEW
以下の例は、Guides テーブルから "GuideHistory" という名前のビューを作成します。すべてのタイ
トル (Title 列から) と、その人が退職したか否かをリストにします。
CREATE VIEW GuideHistory AS SELECT Guides, Title, Retired, Date_Retired FROM Guides
以下の埋め込み SQL 例は、テーブル MyTest を作成し、次に MyTest から 1 つのフィールドを選
択するビュー MyTestView を作成します。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE TABLE Sample.MyTest ( TESTNUM INT NOT NULL, FIRSTWORD CHAR (30) NOT NULL, LASTWORD CHAR (30) NOT NULL, CONSTRAINT MyTestPK PRIMARY KEY (TESTNUM)) ) WRITE !,"SQL create table code is: ",SQLCODE &sql(CREATE VIEW Sample.MyTestView AS SELECT FIRSTWORD FROM Sample.MyTest WITH CASCADED CHECK OPTION) WRITE !,"SQL create view code is: ",SQLCODE
以下の例は、3 つのテーブル (Proj、Staff、Works) から "StaffWorksDesign" という名前のビューを
作成します。Name 列、Cost 列、Project 列はデータを提供します。
CREATE VIEW StaffWorksDesign (Name,Cost,Project) AS SELECT EmpName,Hours*2*Grade,PName FROM Proj,Staff,Works WHERE Staff.EmpNum=Works.EmpNum AND Works.PNum=Proj.PNum AND PType='Design'
以下の例は、UNION を使用して b.table2 と a.table1 から選択することにより "v_3" という名前の
ビューを作成します。
CREATE VIEW v_3(fvarchar) AS SELECT DISTINCT * FROM (SELECT fVARCHAR2 FROM b.table2 UNION ALL SELECT fVARCHAR1 FROM a.table1)
関連項目テーブル参照 ALTER VIEW DROP VIEW CREATE TABLE GRANT
104 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CURDATE
現在の日付を返す、スカラ日付/時間関数です。
{fn CURDATE()}{fn CURDATE}
概要CURDATE は引数を持たず、DATE 型として日付を返します。引数の括弧はオプションです。
既定では、CURDATE は以下の形式で日付を返します。
mm/dd/yyyy
異なる日付形式を指定するには、TO_DATE関数を使用します。既定の日付形式を変更するには、
DATE_FORMAT、YEAR_OPTION、または DATE_SEPARATOR オプションで SET OPTION コマン
ドを使用します。
現在の日付のみを返すには、CURDATEまたはCURRENT_DATEを使用します。これらの関数は、
その値をDATEデータ型で返します。現在の日付と時間をTIMESTAMPデータ型で返す場合は、
CURRENT_TIMESTAMP 関数、GETDATE 関数、および NOW 関数を使用できます。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。DATE データ型は
$HOROLOG形式の整数として値を格納し、SQLで表示されるときは日付表示形式に変換され、埋
め込み SQL から返されるときは整数として返されます。TIMESTAMPデータ型は、同じ形式で値を
格納および表示します。日付および時刻のデータ型は、CONVERT関数を使用して変更できます。
例以下の例は、ともに現在の日付を返します。
SELECT DISTINCT {fn CURDATE()} AS TodayFROM Sample.Person
SELECT DISTINCT {fn CURDATE} AS TodayFROM Sample.Person
以下の埋め込み SQL の例は、現在の日付を返します。この日付は $HOROLOG 形式で格納され
るため、整数として返されます。
&sql(SELECT {fn CURDATE()} INTO :a FROM Sample.Person) WRITE !,"Current date is: ",a
以下の例は、現在の日付以降の出荷日を示すすべてのレコードを返すために、CURDATE が
SELECT 文でどのように使用されるかを示します。
Caché SQL リファレンス 105
CURDATE
SELECT * FROM Orders WHERE ShipDate >= {fn CURDATE()}
関連項目
• SQL 関数 : CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURTIME NOW
• Caché ObjectScript 関数 : $ZDATE
CURRENT_DATE
現在の日付を返す、汎用 SQL 日付/時刻関数です。
CURRENT_DATE
概要CURRENT_DATEは引数を持たず、DATE型として日付を返します。引数の括弧は使用しません。
CURRENT_DATE は、既定の仕様として使用されます。
既定では、CURRENT_DATE は以下の形式で日付を返します。
mm/dd/yyyy
異なる日付形式を指定するには、TO_DATE関数を使用します。既定の日付形式を変更するには、
DATE_FORMAT、YEAR_OPTION、または DATE_SEPARATOR オプションで SET OPTION コマン
ドを使用します。
現在の日付のみを返すには、CURRENT_DATEまたはCURDATEを使用します。これらの関数は、
その値をDATEデータ型で返します。現在の日付と時間をTIMESTAMPデータ型で返す場合は、
CURRENT_TIMESTAMP 関数、GETDATE 関数、および NOW 関数を使用できます。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。DATE データ型は
$HOROLOG形式の整数として値を格納し、SQLで表示されるときは日付表示形式に変換され、埋
め込み SQL から返されるときは整数として返されます。TIMESTAMPデータ型は、同じ形式で値を
格納および表示します。日付および時刻のデータ型は、CONVERT関数を使用して変更できます。
例以下の例は、現在の日付を返します。
SELECT DISTINCT CURRENT_DATE AS TodayFROM sample.person
以下の埋め込み SQL の例は、現在の日付を返します。この日付は $HOROLOG 形式で格納され
るため、整数として返されます。
106 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
&sql(SELECT CURRENT_DATE INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Current date is: ",a }
以下の例は、今日が誕生日である従業員のすべてのレコードを返すために、CURRENT_DATE を
SELECT 文内でどのように使用するかを示します。
SELECT * FROM Employees WHERE dob = CURRENT_DATE
関連項目CURDATE CURRENT_TIME CURRENT_TIMESTAMP CURTIME NOW
CURRENT_TIME
現在のローカル時刻を返す、汎用日付/時刻関数です。
CURRENT_TIME
概要CURRENT_TIME は引数を持たず、TIME データ型として時刻を返します。引数の括弧は使用しま
せん。CURRENT_TIME は、既定の仕様として使用されます。
既定では、CURRENT_TIME は以下の形式で時刻を返します。
hh:mm:ss
既定の時刻形式を変更するには、TIME_FORMAT および TIME_PRECISION オプションで SET
OPTION コマンドを使用します。秒の小数部の精度は以下のように設定できます。
現在の時刻のみを返すには、CURRENT_TIME またはCURTIME を使用します。これらの関数は、
その値を TIMEデータ型で返します。現在の日付と時間を TIMESTAMPデータ型で返す場合は、
CURRENT_TIMESTAMP 関数、GETDATE 関数、および NOW 関数を使用できます。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。TIME データ型は
$HOROLOG 形式の整数 (午前 0 時 00 分からの秒数) として値を格納し、SQL で表示されるとき
は時刻表示形式に変換され、埋め込みSQLから返されるときは整数として返されます。TIMESTAMP
データ型は、同じ形式で値を格納および表示します。日付および時刻のデータ型は、CASTまたは
CONVERT 関数を使用して変更できます。
Caché SQL リファレンス 107
CURRENT_TIME
秒の小数部の精度
CURRENT_TIME は秒の小数部の精度について小数点以下 9 桁までの値を返すことができます。
精度桁数の既定は以下の方法で構成できます。
• SET OPTION で TIME_PRECISION オプションを使用します。
• ObjectScript $SYSTEM.SQL.SetDefaultTimePrecision() 関数を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Default time precision for GETDATE(), CURRENT_TIME, and CURRENT_TIMES-
TAMP] の現在の設定を表示および編集します。
返される小数点以下の桁数の既定値を含めて 0 ~ 9 の整数を指定します。初期の既定値は 0 で
す。実際に返される精度はプラットフォームに依存し、システムで使用可能な精度を超えた精度の
桁はゼロとして返されます。
例以下の例は、現在のシステム時刻を返します。
SELECT DISTINCT CURRENT_TIMEFROM Sample.Person
以下の埋め込み SQL の例は、現在の時刻を返します。この時刻は $HOROLOG 形式で格納され
るため、整数として返されます。
&sql(SELECT CURRENT_TIME INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Current time is: ",a }
以下の例は、Contacts テーブルの指定された行の LastCall フィールドに、現在のシステム時刻を
設定します。
UPDATE Contacts SET LastCall = CURRENT_TIME WHERE Contacts.ItemNumber=:item
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL 時刻関数 : CAST CONVERT CURTIME HOUR MINUTE SECOND
• SQL タイムスタンプ関数 : CURRENT_TIMESTAMP GETDATE NOW TIMESTAMPADD
TIMESTAMPDIFF
• Caché ObjectScript : $ZTIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
108 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CURRENT_TIMESTAMP
現在の日付と時刻を返す、汎用日付/時刻関数です。
CURRENT_TIMESTAMP[(precision)]
引数
オプション—時刻の精度を秒の小数部の桁数として指定します。有効値は
整数の 0 ~ 9 で、既定値は 0 (秒の小数部はなし) です。この既定値は構
成可能です。
precision
概要CURRENT_TIMESTAMP は引数なしで使用するか、または 1 つの精度引数とともに使用し、
TIMESTAMP データ型として現在の日付と時刻を返します。空引数の括弧は使用しません。
CURRENT_TIMESTAMP は、既定の仕様として使用されます。
日付と時刻を表す文字列は、以下の形式で返されます。
yyyy-mm-dd hh:mm:ss.ffff
"f" は、秒単位の小数精度を表します。
既定の日付/時刻形式を変更するには、各種日付/時刻オプションでSETOPTIONコマンドを使用
します。
現在の日付と時刻を TIMESTAMP データ型で返す場合は、GETDATE および NOW 関数を使用
できます。GETDATE は精度をサポートし、NOW は精度をサポートしません。
現在の日付のみを返すには、CURDATE または CURRENT_DATE を使用します。現在の時刻の
みを返すには、CURRENT_TIMEまたはCURTIMEを使用します。これらの関数は、その値をDATE
または TIME データ型で返します。これらの関数は、いずれも精度をサポートしません。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。TIMESTAMP データ型
は、同じ形式で値を格納および表示します。TIME および DATE データ型は $HOROLOG形式の
整数として値を格納し、SQL で表示されるときは日付または時刻表示形式に変換され、埋め込み
SQL から返されるときは整数として返されます。日付および時刻のデータ型は、CAST または
CONVERT 関数を使用して変更できます。
すべての Caché SQL タイムスタンプ関数は、ローカル・タイム・ゾーン設定に依存します。ユニバー
サルな (タイム・ゾーンに依存しない)現在のタイムスタンプを取得するには、Caché ObjectScript の
$ZTIMESTAMP 特殊変数を使用します。
Caché SQL リファレンス 109
CURRENT_TIMESTAMP
秒の小数部の精度
CURRENT_TIMESTAMP は、小数点以下 9 桁までの精度の値を返すことができます。返される精
度の桁数は precision 引数を使用して設定します。precision 引数の既定値は、以下の方法で構成
できます。
• SET OPTION で TIME_PRECISION オプションを使用します。
• ObjectScript $SYSTEM.SQL.SetDefaultTimePrecision() 関数を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Default time precision for GETDATE(), CURRENT_TIME, and CURRENT_TIMES-
TAMP] の現在の設定を表示および編集します。
返される小数点以下の桁数の既定値を含めて 0 ~ 9 の整数を指定します。初期の既定値は 0 で
す。返される実際の精度はプラットフォームに依存し、システムでサポートされる精度を超えるprecision
桁はゼロとして返されます。
例以下の例は、現在の日付と時刻を返します。
SELECT DISTINCT CURRENT_TIMESTAMP AS DateTimeFROM Sample.Person
以下の例は、2 桁の精度で現在の日付と時刻を返します。
SELECT DISTINCT CURRENT_TIMESTAMP(2) AS DateTimeFROM Sample.Person
以下の埋め込み SQL の例は、ローカル・タイムスタンプ (タイム・ゾーン依存) とユニバーサル・タイ
ムスタンプ (タイム・ゾーン非依存) を比較します。
SET b=$ZDATETIME($ZTIMESTAMP,3) &sql(SELECT CURRENT_TIMESTAMP INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Timestamp is: ",a WRITE !,"ZTimestamp is: ",b }
以下の例は、Orders テーブルの指定された行の LastUpdate フィールドに、現在のシステム日付と
時刻を設定します。
UPDATE Orders SET LastUpdate = CURRENT_TIMESTAMP WHERE Orders.OrderNumber=:ord
以下に例を示します。
110 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CREATE TABLE Employees ( EmpId INT NOT NULL, LastName CHAR(40) NOT NULL, FirstName CHAR(20) NOT NULL, StartDate TIMESTAMP DEFAULT (CURRENT_TIMESTAMP), PRIMARY KEY (EmpId))
Employees という名前のテーブルを作成します。このテーブルには、各レコードに対する列の数が
あります。EmpId 列 (従業員の ID 番号を含む) は、NULL ではない整数値です。従業員の姓と名
にはそれぞれ列があり、どちらもNULLではない文字列です。StartDate列は従業員の開始日付を
含み、TIMESTAMP データ型を使用し、CURRENT_TIMESTAMP で現在のシステム日付と時刻を
既定値として挿入します。
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL タイムスタンプ関数 : CAST CONVERT GETDATE NOW TIMESTAMPADD
TIMESTAMPDIFF
• SQL 現在の日付/時刻関数 : CURDATE CURRENT_DATE CURRENT_TIME CURTIME
• Caché ObjectScript : $ZDATETIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
CURTIME
現在のローカル時刻を返す、スカラ日付/時刻関数です。
{fn CURTIME()}{fn CURTIME}
概要CURTIMEは引数を持たず、TIMEデータ型として時刻を返します。引数の括弧はオプションです。
既定では、CURTIME は以下の形式で時刻を返します。
hh:mm:ss
時間は 24 時間形式で表示されます。
既定の時刻形式を変更するには、TIME_FORMAT および TIME_PRECISION オプションで SET
OPTION コマンドを使用します。
現在の時刻のみを返すには、CURTIME またはCURRENT_TIME を使用します。これらの関数は、
その値を TIMEデータ型で返します。現在の日付と時間を TIMESTAMPデータ型で返す場合は、
CURRENT_TIMESTAMP 関数、GETDATE 関数、および NOW 関数を使用できます。
Caché SQL リファレンス 111
CURTIME
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。TIME データ型は
$HOROLOG 形式の整数 (午前 0 時 00 分からの秒数) として値を格納し、SQL で表示されるとき
は時刻表示形式に変換され、埋め込みSQLから返されるときは整数として返されます。TIMESTAMP
データ型は、同じ形式で値を格納および表示します。日付および時刻のデータ型は、CASTまたは
CONVERT 関数を使用して変更できます。
例以下の例は、ともに現在のシステム時刻を返します。
SELECT DISTINCT {fn CURTIME()} AS TimeNowFROM Sample.Person
SELECT DISTINCT {fn CURTIME} AS TimeNowFROM Sample.Person
以下の埋め込み SQL の例は、現在の時刻を返します。この時刻は $HOROLOG 形式で格納され
るため、整数として返されます。
&sql(SELECT {fn CURTIME} INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Current time is: ",a }
以下の例は、Contacts テーブルの指定された行の LastCall フィールドに、現在のシステム時刻を
設定します。
UPDATE Contacts Set LastCall = {fn CURTIME()} WHERE Contacts.ItemNumber=:item
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL 時刻関数 : CAST CONVERT CURRENT_TIME HOUR MINUTE SECOND
• SQL タイムスタンプ関数 : CURRENT_TIMESTAMP GETDATE NOW TIMESTAMPADD
TIMESTAMPDIFF
• Caché ObjectScript : $ZTIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
112 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DATABASE
データベース名の修飾子を返すスカラ文字列関数です。
{fn DATABASE()}
概要DATABASE は、接続ハンドルに対応するデータベース名の現在の修飾子を返します。Caché で
は、DATABASE は常に空文字列 ('') を返します。
DATEADD
日付部分 (時刻や日など) の数値を、指定されたタイムスタンプに加算することによって計算された
日付を返す、汎用日付/時刻関数です。
DATEADD(datepart,integer-exp,date-exp)
引数
日付または時刻部分の名前(または省略形)。引用符付き文字列として
指定されます。
datepart
すべての数値タイプの数値式。値は、整数 (正または負) に切り捨てら
れます。この値は datepart の数を表し、date-exp に加算または減算さ
れます。
integer-exp
変更される日付/時刻式。これには日付文字列、タイムスタンプ文字列、
または CURRENT_DATE などの関数を指定できます。返される値は常
にタイムスタンプです。
date-exp
概要DATEADD 関数は、指定された日付部分を指定された単位数でインクリメントすることで、日付/時
刻式を変更します。例えば、datepart が 'month' で、integer-exp が 5 の場合は、DATEADD は
date-exp に 5 か月をインクリメントします。また、integer-exp に負の整数を指定して、日付部分を
ディクリメントすることもできます。
Caché SQL リファレンス 113
DATABASE
計算された日付は、TIMESTAMP として返されます。DATEADD は、常に以下の形式の完全な日
付/時刻式を返します。
yyyy-mm-dd hh:mm:ss
秒の小数部を含む date-exp を指定した場合は、返り値にも秒の小数部が含まれます。date-exp
の時刻部分を省略した場合、DATEADD は既定時刻の 00:00:00 を返します。date-exp の日付部
分を省略した場合、DATEADD は既定日付の 1900–01–01 を返します。
同様の日付/時刻変更の演算は、TIMESTAMPADD ODBC スカラ関数を使用して実行できます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DATEADD(datepart,integer-exp,date-exp)
日付部分
datepart パラメータは、以下の日付/時刻コンポーネントの 1 つで、正式な名前 (日付部分列) また
は省略形 (省略形列)のいずれかになります。これらのdatepart コンポーネント名と省略形では、大
文字と小文字は区別されません。
integer-exp が 1 の場合省略形日付部分
年に 1 をインクリメント。yyyear
月に 3 をインクリメント。qqquarter
月に 1 をインクリメント。mmmonth
日に 7 をインクリメント。wkweek
日に 1 をインクリメント。ddday
時間に 1 をインクリメント。hhhour
分に 1 をインクリメント。miminute
秒に 1 をインクリメント。sssecond
0.001 秒をインクリメント。msmillisecond
リテラルとして無効なdatepart値を指定した場合は、SQLCODE -8エラー・コードが発行されます。
一方、ホスト変数として無効な datepart 値を指定した場合は、SQLCODE エラーは発行されず、
DATEPART 関数は NULL 値を返します。
日付部分をインクリメントまたはディクリメントすると、他の日付部分も適切に変更されます。例えば、
時間のインクリメント結果が午前 0 時を超える場合、自動的に日がインクリメントされます。同様に、
順次、月などがインクリメントされます。DATEADDは、各月の日数やうるう年を考慮に入れて、常に
114 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
有効な日付を返します。例えば、1 月 31 日に 1 か月をインクリメントすると 2 月 28 日 (該当月の有
効な最終日付) が返されますが、指定された年がうるう年の場合は 2 月 29 日が返されます。
DATEADD と TIMESTAMPADD では四半期 (3 か月の間隔) が処理されます。DATEDIFF と
TIMESTAMPDIFF では四半期は処理されません。
日付式の形式
date-exp パラメータは、以下のいずれかの形式で指定できます。秒の小数部は指定、省略のどち
らでもかまいません。
• Caché %Date 論理値 (+$H)
• Caché %TimeStamp 論理値 (YYYY-MM-DD HH:MM:SS)
• Caché %String (互換性のある) 値
Caché %String (互換性のある) 値は、以下のいずれかの形式になります。
• 99999,99999 ($H 形式)
• Sybase/SQL-Server-date Sybase/SQL-Server-time
• Sybase/SQL-Server-time Sybase/SQL-Server-date
• Sybase/SQL-Server-date (既定時刻は 00:00:00)
• Sybase/SQL-Server-time (既定日付は 01/01/1900)
Sybase/SQL-Server-date は、以下の 5 形式のいずれかです。
mmdelimiterdddelimiter[yy]yydd Mmm[mm][,][yy]yydd [yy]yy Mmm[mm]yyyy Mmm[mm] ddyyyy [dd] Mmm[mm]
delimiter は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) です。
Sybase/SQL-Server-time は、以下の 3 形式のいずれかです。
HH:MM[:SS:SSS][{AM|PM}]HH:MM[:SS.S]HH['']{AM|PM}
年が 2 桁で表示される場合、%DATE ユーティリティの移動日付ウィンドウが使用され (使用できる
場合)、何世紀か判断されます。
DATEADD では、Sybase および Microsoft SQL Server との互換性が提供されています。
Caché SQL リファレンス 115
DATEADD
範囲と値のチェック
DATEADDは、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、NULL
文字列が返されます。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。年は 4 桁で指定される必要があります。
• 日付値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、日は
1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• インクリメント結果として返される年は、1841 から 9999 までの範囲内にある必要があります。こ
の範囲を超えると、<null> が返されます。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標
準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、
または '7a' は無効です。
例以下の例は、指定された日付に 1 週を加算します。
SELECT DISTINCT DATEADD('week',1,'1999-12-20') AS NewDateFROM Sample.Person
1週の加算は7日の加算になるので、上記の例は1999-12-27 00:00:00を返します。このDATEADD
では、時刻部分が省略されています。
以下の例は、元のタイムスタンプに 5 か月を加算します。
SELECT DISTINCT DATEADD('mm',5,'1999-12-20 12:00:00') AS NewDateFROM Sample.Person
5 か月を加算すると年がインクリメントされるので、上記の例は 2000-05-20 12:00:00 を返します。
以下の例も、元のタイムスタンプに 5 か月を加算します。
SELECT DISTINCT DATEADD('mm',5,'1999-01-31 12:00:00') AS NewDateFROM Sample.Person
上記の例は 1999-06-30 12:00:00 を返します。この DATEADD は、月だけでなく日の値も変更し
ます。これは単純に月をインクリメントすると、無効な日付の 6 月 31 日となるためです。
以下の例は、元のタイムスタンプに 45 分を加算します。
SELECT DISTINCT DATEADD('mi',45,'1999-12-20 12:00:00') AS NewTimeFROM sample.person
上記の例は 1999-12-20 12:45:00 を返します。
116 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下の例も、元のタイムスタンプに45分を加算しますが、この場合は日付もインクリメントされます。
SELECT DISTINCT DATEADD('mi',45,'1999-12-20 23:30:00') AS NewTimeFROM sample.person
上記の例は 1999-12-21 00:15:00 を返します。
以下の例は、元のタイムスタンプに 45 分をディクリメントします。
SELECT DISTINCT DATEADD('mi',-45,'1999-12-20 12:00:00') AS NewTimeFROM Sample.Person
上記の例は 1999-12-20 11:15:00 を返します。
以下の例は、現在の日付に 60 日を加算し、結果を各月の長さに合わせて調整します。
SELECT DISTINCT DATEADD('dd',60,CURRENT_DATE) AS NewDateFROM Sample.Person
以下の最初の例は指定された日付に 92日を加算し、2番目の例は指定された日付に 1四半期を
加算します。
SELECT DISTINCT DATEADD('dd',92,'1999-12-20') AS NewDateFROM sample.person
SELECT DISTINCT DATEADD('qq',1,'1999-12-20') AS NewDateFROM sample.person
最初の例は 2000-03-21 00:00:00 を返し、2 番目の例は 2000-03-20 00:00:00 を返します。1 四
半期をインクリメントすると、月部分に 3 がインクリメントされ、必要に応じて年部分がインクリメントさ
れます。また、結果月の最大日数に合わせて修正されます。
上記の例は、すべて datepart に省略形を使用しています。しかし、datepart には、以下の例のよう
に正式な名前を指定することもできます。
SELECT DISTINCT DATEADD('day',92,'1999-12-20') AS NewDateFROM sample.person
上記の例は 2000-03-21 00:00:00 を返します。
関連項目DATEDIFF DATENAME DATEPART TIMESTAMPADD TIMESTAMPDIFF
Caché SQL リファレンス 117
DATEADD
DATEDIFF
2 つの日付間の間隔を指定された時間単位の整数で返す、汎用日付/時刻関数です。
DATEDIFF(datepart,startdate,enddate)
引数
日付または時刻部分の名前 (または省略形)。引用符付き文字列として指
定されます。これは間隔が計算される時間単位を表します。
datepart
間隔の開始の日付/時刻。startdate
間隔の終了の日付/時刻。enddate から startdate を減算して、2 つの日付
間の datepart 間隔を決定します。
enddate
概要DATEDIFF 関数は、指定された日付範囲内にある間隔を、指定された datepart 時間単位で計算
された整数値で返します。日付の範囲は、startdate から始まり、enddate で終了します (enddate が
startdate よりも前の日付の場合、DATEDIFF は負の整数を返します)。
datepart パラメータは、以下の日付/時刻コンポーネントの 1 つで、正式な名前 (日付部分列) また
は省略形 (省略形列)のいずれかになります。これらのdatepart コンポーネント名と省略形では、大
文字と小文字は区別されません。
省略形日付部分
yyyear
mmmonth
wkweek
ddday
hhhour
miminute
sssecond
msmillisecond
DATEDIFF と TIMESTAMPDIFF では四半期 (3 か月の間隔) は処理されません。
118 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
リテラルとして無効なdatepart値を指定した場合は、SQLCODE -8エラー・コードが発行されます。
一方、ホスト変数として無効な datepart 値を指定した場合は、SQLCODE エラーは発行されず、
DATEDIFF 関数は NULL 値を返します。
秒の小数部を含む startdate と enddate を指定した場合は、1000 分の 1 秒 (0.001) 単位で表され
た秒の小数部数として差分を取得できます。
DATEDIFFでは、Sybase およびMicrosoft SQL Server との互換性が提供されています。同様の日
付/時刻比較演算は、TIMESTAMPDIFF ODBC スカラ関数を使用して実行することもできます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DATEDIFF(datepart,startdate,enddate)
日付式の形式
startdate パラメータと enddate パラメータは、以下のいずれかの形式で指定できます。
• Caché %Date 論理値 (+$H)
• Caché %TimeStamp 論理値 (YYYY-MM-DD HH:MM:SS)
• Caché %String (互換性のある) 値
Caché %String (互換性のある)値は、以下のいずれかの形式になります。秒の小数部は指定、省略
のどちらでもかまいません。
• 99999,99999 ($HOROLOG 形式)
• Sybase/SQL-Server-date Sybase/SQL-Server-time
• Sybase/SQL-Server-time Sybase/SQL-Server-date
• Sybase/SQL-Server-date (既定時刻は 00:00:00)
• Sybase/SQL-Server-time (既定日付は 01/01/1900)
Sybase/SQL-Server-date は、以下の 5 形式のいずれかです。
mmdelimiterdddelimiter[yy]yydd Mmm[mm][,][yy]yydd [yy]yy Mmm[mm]yyyy Mmm[mm] ddyyyy [dd] Mmm[mm]
delimiter は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) です。
Caché SQL リファレンス 119
DATEDIFF
Sybase/SQL-Server-time は、以下の 3 形式のいずれかです。
HH:MM[:SS:SSS][{AM|PM}]HH:MM[:SS.S]HH['']{AM|PM}
年が 2 桁で表示される場合、%DATE ユーティリティの移動日付ウィンドウが使用され (使用できる
場合)、何世紀か判断されます。
範囲と値のチェック
DATEDIFF は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、
NULL 文字列が返されます。
• 有効な startdate または enddate は、日付文字列 (yyyy-mm-dd)、時刻文字列 (hh:mm:ss)、ま
たは日付/時刻文字列 (yyyy-mm-dd hh:mm:ss) で構成されます。日付と時刻の両方が指定さ
れている場合は、両方が有効でなければなりません。例えば、時刻文字列が指定されていない
場合は年数値を返すことができますが、無効な時刻文字列が指定されている場合は年数値を
返すことができません。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。例えば、日の値が省略されている場合、年数値を返すこと
はできません。年は4桁で指定される必要があります。入力値の日付部分を省略した場合は、
DATEDIFF では既定で '1900–01–01' になります。
• 時刻文字列は、適切な区切り文字で適切にフォーマットされている必要があります。時刻要素
の値はゼロの場合もあるため、1つ以上の時刻要素を省略でき (区切り文字はそのまま残す場
合と省略する場合がある)、これらの要素はゼロ値として返されます。したがっ
て、'hh:mm:ss'、'hh:mm:'、'hh:mm'、'hh::ss'、'hh::'、'hh'、および ':::' は、すべて有効です。時
間 (Hour) 要素を省略するには、日付式に文字列の日付部分がないことと、少なくとも 1 つの
区切り文字 (:) があることが必要です。
• 日付/時刻値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、
日は 1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 日付値または時刻値が10よりも小さい場合、そのほとんどの先頭のゼロは、記載、省略のどち
らでもかまいません。ただし、10 よりも小さい時間 (Hour) 値が日付/時刻文字列の一部の場合
は、その先頭にゼロを付ける必要があります。その他の非標準的な整数値は許可されません。
例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
例以下の例では、2 つのタイムスタンプ間に 353 日間の差 ('dd') があるので、353 を返します。
SELECT DISTINCT DATEDIFF('dd','1999-01-01 00:00:00','1999-12-20 12:00:00')FROM sample.person
120 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下の例では、2 つのタイムスタンプ間に 31 年間の差 ('yy') があるので、31 を返します。
SELECT DISTINCT DATEDIFF('yy','1968-12-21 13:19:00','1999-12-20 00:00:00')FROM sample.person
上記の例は、datepart に省略形を使用しています。ただし、以下の例のように、正式な名前を指定
することもできます。
SELECT DISTINCT DATEDIFF('year','1968-09-10 13:19:00','1999-12-20 00:00:00')FROM sample.person
関連項目DATEADD DATENAME DATEPART TIMESTAMPADD TIMESTAMPDIFF
DATENAME
日付/時刻式の指定された部分の値名を含む CHARACTER STRING を返す、汎用日付/時刻関
数です。
DATENAME(datepart,date-expression)
引数
取得する日付/時刻情報のタイプ。datepart
日付/時刻式。ここから datepart が返されます。date-expression
は datepart タイプの値を含まなければなりません。
date-expression
概要DATENAME関数は、日付/時刻値の指定された部分の名前 (月名の "June" など) を返します。結
果は、CHARACTER STRING として返されます。結果が数値である場合 (日の数字 "23" など) で
も、CHARACTER STRING として返されます。この情報を整数として返すには、DATEPARTを使用
します。複数の日付部分を含む文字列を返すには、TO_DATE を使用します。
datepart パラメータは、以下の日付/時刻コンポーネントの 1 つ (1 つのみ) からなる文字列で、正
式な名前 (日付部分列) または省略形 (省略形列) のいずれかになります。これらの datepart コン
ポーネント名と省略形では、大文字と小文字は区別されません。
返り値省略形日付部分
1840-9999yyyear
1-4qqquarter
January、...、Decembermmmonth
Caché SQL リファレンス 121
DATENAME
返り値省略形日付部分
1-53wkweek
Sunday、Monday、Tuesday、Wednesday、Thursday、
Friday、Saturday
dwweekday
1-366dydayofyear
1-31ddday
0-23hhhour
0-59miminute
0-59sssecond
0-99 (2 桁の精度)msmillisecond
SQL_TIMESTAMP : yy-mm-dd hh:mm:ssstssqltimestamp
リテラルとして無効なdatepart値を指定した場合は、SQLCODE -8エラー・コードが発行されます。
一方、ホスト変数として無効な datepart 値を指定した場合は、SQLCODE エラーは発行されず、
DATENAME 関数は NULL 値を返します。
このテーブルに示されている返り値は、それぞれの日付部分の既定値です。これらの日付部分の
いくつかの返り値は、各種日付/時刻オプションで SET OPTION コマンドを使用することで変更で
きます。
DATENAME では、Sybase および Microsoft SQL Server との互換性が提供されています。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DATENAME(datepart,date-expression)
日付式の形式
date-expression パラメータは、以下のいずれかの形式になります。
• Caché %Date 論理値 (+$H)
• Caché %TimeStamp 論理値 (YYYY-MM-DD HH:MM:SS)
• Caché %String (互換性のある) 値
Caché %String (互換性のある) 値は、以下のいずれかの形式になります。
• 99999,99999 ($H 形式)
• Sybase/SQL-Server-date Sybase/SQL-Server-time
• Sybase/SQL-Server-time Sybase/SQL-Server-date
122 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• Sybase/SQL-Server-date (既定時刻は 00:00:00)
• Sybase/SQL-Server-time (既定日付は 01/01/1900)
Sybase/SQL-Server-date は、以下の 5 形式のいずれかです。
mmdelimiterdddelimiter[yy]yydd Mmm[mm][,][yy]yydd [yy]yy Mmm[mm]yyyy Mmm[mm] ddyyyy [dd] Mmm[mm]
delimiter は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) です。
Sybase/SQL-Server-time は、以下の 3 形式のいずれかです。
HH:MM[:SS:SSS][{AM|PM}]HH:MM[:SS.S]HH['']{AM|PM}
年が 2 桁で表示される場合、%DATE ユーティリティの移動日付ウィンドウが使用され (使用できる
場合)、何世紀か判断されます。
範囲と値のチェック
DATENAME は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、
NULL 文字列が返されます。
• 有効な date-expressionは、日付文字列 (yyyy-mm-dd)、時刻文字列 (hh:mm:ss)、または日付/
時刻文字列 (yyyy-mm-dd hh:mm:ss) で構成されます。日付と時刻の両方が指定されている場
合は、両方が有効でなければなりません。例えば、時刻文字列が指定されていない場合は年
数値を返すことができますが、無効な時刻文字列が指定されている場合は年数値を返すことが
できません。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。例えば、日の値が省略されている場合、年数値を返すこと
はできません。年は 4 桁で指定される必要があります。
• 時刻文字列は、適切な区切り文字で適切にフォーマットされている必要があります。時刻要素
の値はゼロの場合もあるため、1つ以上の時刻要素を省略でき (区切り文字はそのまま残す場
合と省略する場合がある)、これらの要素はゼロ値として返されます。したがっ
て、'hh:mm:ss'、'hh:mm:'、'hh:mm'、'hh::ss'、'hh::'、'hh'、および ':::' は、すべて有効です。時
間 (Hour) 要素を省略するには、date-expression に文字列の日付部分がないことと、少なくと
も 1 つの区切り文字 (:) があることが必要です。
• 日付/時刻値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、
日は 1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
Caché SQL リファレンス 123
DATENAME
• 日付値または時刻値が10よりも小さい場合、そのほとんどの先頭のゼロは、記載、省略のどち
らでもかまいません。ただし、10 よりも小さい時間 (Hour) 値が日付/時刻文字列の一部の場合
は、その先頭にゼロを付ける必要があります。その他の非標準的な整数値は許可されません。
例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
例以下の例は、すべて指定された日付の曜日名 ('dw') である 'Wednesday' を返します。
SELECT DISTINCT DATENAME('dw','2004-02-25') AS DayNameFROM Sample.Person
SELECT DISTINCT DATENAME('dw','02/25/2004') AS DayNameFROM Sample.Person
SELECT DISTINCT DATENAME('dw',59590) AS DayNameFROM Sample.Person
以下の例は、指定された日付の月名 ('mm') である 'December' を返します。
SELECT DISTINCT DATENAME('mm','1999-12-20 12:00:00') AS MonthNameFROM Sample.Person
以下の例は、指定された日付の年名 ('yy') である '1999' (文字列) を返します。
SELECT DISTINCT DATENAME('yy','1999-12-20 12:00:00') AS YearFROM Sample.Person
上記の例は、日付部分に省略形を使用していることに注意してください。ただし、以下の例のように、
正式な名前を指定することもできます。
SELECT DISTINCT DATENAME('year','1999-12-20 12:00:00') AS YearFROM Sample.Person
以下の例は、正式な SQL タイムスタンプを返します。
SELECT DISTINCT DATENAME('sts','1999-12-20') AS TStampFROM Sample.Person
この場合、DATENAME は欠けている時間情報を埋めて、タイムスタンプ文字列の '1999–12–20
00:00:00' を返します。
関連項目
• SQL関数:DATEADDDATEDIFF DATEPART TO_DATE TIMESTAMPADDTIMESTAMPDIFF
• Caché ObjectScript 関数 : $ZDATETIME
124 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DATEPART
日付/時刻式の指定された部分の値を表す整数を返す、汎用日付/時刻関数です。
DATEPART(datepart,date-expression)
引数
取得する日付/時刻情報のタイプ。datepart
日付/時刻式。そこから指定された datepart が返されます。
date-expression は datepart タイプの値を含まなければなりませ
ん。
date-expression
概要DATEPART 関数は、指定された日付/時刻式の、指定された日付/時刻部分を表す INTEGER を
返します。この情報を文字列として返すには、DATENAME を使用します。sqltimestamp オプション
は、データ型 TIMESTAMP の文字列として値を返します。
DATEPART が返すのは、date-expression の 1 要素のみの値です。複数の日付部分を含む文字
列を返すには、TO_DATE を使用します。
datepart パラメータは、以下の日付/時刻コンポーネントの 1 つで、正式な名前 (日付部分列) また
は省略形 (省略形列)のいずれかになります。これらのdatepart コンポーネント名と省略形では、大
文字と小文字は区別されません。
返り値省略形日付部分
1840-9999yyyear
1-4qqquarter
1-12mmmonth
1-53wkweek
1-7 (Sunday、...、Saturday)dwweekday
1-366dydayofyear
1-31ddday
0-23hhhour
0-59miminute
0-59sssecond
Caché SQL リファレンス 125
DATEPART
返り値省略形日付部分
0-99 (2 桁の精度)msmillisecond
SQL_TIMESTAMP : yy-mm-dd hh:mm:ssstssqltimestamp
リテラルとして無効なdatepart値を指定した場合は、SQLCODE -8エラー・コードが発行されます。
一方、ホスト変数として無効な datepart 値を指定した場合は、SQLCODE エラーは発行されず、
DATEPART 関数は NULL 値を返します。
このテーブルに示されている返り値は、それぞれの日付部分の既定値です。これらの日付部分の
いくつかの返り値は、各種日付/時刻オプションで SET OPTION コマンドを使用することで変更で
きます。
DATEPART では、Sybase および Microsoft SQL Server との互換性が提供されています。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DATEPART(datepart,date-expression)
日付の入力形式
date-expression 引数は、以下のいずれかの形式になります。
• Caché %Date 論理値 (+$H)
• Caché %TimeStamp 論理値 (YYYY-MM-DD HH:MM:SS)
• Caché %String (互換性のある) 値
Caché %String (互換性のある) 値は、以下のいずれかの形式にできます。
• 99999,99999 ($H 形式)
• Sybase/SQL-Server-date Sybase/SQL-Server-time
• Sybase/SQL-Server-time Sybase/SQL-Server-date
• Sybase/SQL-Server-date (既定時刻は 00:00:00)
• Sybase/SQL-Server-time (既定日付は 01/01/1900)
Sybase/SQL-Server-date は、以下の 5 形式のいずれかです。
mmdelimiterdddelimiter[yy]yydd Mmm[mm][,][yy]yydd [yy]yy Mmm[mm]yyyy Mmm[mm] ddyyyy [dd] Mmm[mm]
delimiter は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) です。
126 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
Sybase/SQL-Server-time は、以下の 3 形式のいずれかです。
HH:MM[:SS:SSS][{AM|PM}]HH:MM[:SS.S]HH['']{AM|PM}
年が 2 桁で表示される場合、%DATE ユーティリティの移動日付ウィンドウが使用され (使用できる
場合)、何世紀か判断されます。
範囲と値のチェック
DATEPART は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、
NULL 文字列が返されます。
• 有効な date-expressionは、日付文字列 (yyyy-mm-dd)、時刻文字列 (hh:mm:ss)、または日付/
時刻文字列 (yyyy-mm-dd hh:mm:ss) で構成されます。日付と時刻の両方が指定されている場
合は、両方が有効でなければなりません。例えば、時刻文字列が指定されていない場合は年
数値を返すことができますが、無効な時刻文字列が指定されている場合は年数値を返すことが
できません。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。例えば、日の値が省略されている場合、年数値を返すこと
はできません。年は 4 桁で指定される必要があります。
• 時刻文字列は、適切な区切り文字で適切にフォーマットされている必要があります。時刻要素
の値はゼロの場合もあるため、1つ以上の時刻要素を省略でき (区切り文字はそのまま残す場
合と省略する場合がある)、これらの要素はゼロ値として返されます。したがっ
て、'hh:mm:ss'、'hh:mm:'、'hh:mm'、'hh::ss'、'hh::'、'hh'、および ':::' は、すべて有効です。時
間 (Hour) 要素を省略するには、date-expression に文字列の日付部分がないことと、少なくと
も 1 つの区切り文字 (:) があることが必要です。
• 日付/時刻値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、
日は 1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 日付値または時刻値が10よりも小さい場合、そのほとんどの先頭のゼロは、記載、省略のどち
らでもかまいません。ただし、10 よりも小さい時間 (Hour) 値が日付/時刻文字列の一部の場合
は、その先頭にゼロを付ける必要があります。その他の非標準的な整数値は許可されません。
例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
例以下の5つの例は、すべて日付時刻文字列の年の部分を整数(この場合は2004) として返します。
date-expression はさまざまな形式で指定でき、datepart は正式な名前または省略形で指定できる
ことに注意してください。
Caché SQL リファレンス 127
DATEPART
SELECT DISTINCT DATEPART('yy','2004-12-20 12:00:00') AS YearFROM Sample.Person
SELECT DISTINCT DATEPART('year','2004-02-25') AS YearFROM Sample.Person
SELECT DISTINCT DATEPART('YY','02/25/2004') AS YearFROM Sample.Person
SELECT DISTINCT DATEPART('YEAR',59590) AS YearFROM Sample.Person
SELECT DISTINCT DATEPART('Year','59590,23456') AS YearFROM Sample.Person
以下の例は、年の四半期を返します。
SELECT DISTINCT DATEPART('qq','2003-07-20') AS QuarterFROM Sample.Person
以下の例は、すべて日付時刻文字列の分部分である 20 を返します。
SELECT DISTINCT DATEPART('mi','1999-1-20 12:20:07') AS MinutesFROM Sample.Person
SELECT DISTINCT DATEPART('mi','1999-02-20 10:20:') AS MinutesFROM Sample.Person
SELECT DISTINCT DATEPART('mi','1999-02-20 10:20') AS MinutesFROM Sample.Person
以下の例は、すべて日付時刻文字列の秒部分である 0 を返します。
SELECT DISTINCT DATEPART('ss','1999-02-20 03:20:') AS SecondsFROM Sample.Person
SELECT DISTINCT DATEPART('ss','1999-02-20 03:20') AS SecondsFROM Sample.Person
SELECT DISTINCT DATEPART('ss','1999-02-20') AS SecondsFROM Sample.Person
以下の例は、データ型 TIMESTAMP の文字列として完全な SQL タイムスタンプを返します。最初
の例では、DATEPART が欠けている時間情報を埋めて、タイムスタンプの '2004–02–25 00:00:00'
を返します。
SELECT DISTINCT DATEPART('sts','2/25/2004') AS DTStampFROM Sample.Person
SELECT DISTINCT DATEPART('sts','59590,23456') AS DTStampFROM Sample.Person
以下の例は、DOB フィールドの日 (Day) の部分の数値を返します。
SELECT DOB,DATEPART('dd',DOB) AS DatePtFROM Sample.Person
128 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例えば、DOB が 05/12/1950 であれば、DATEPART は 12 を返します。
関連項目DATEDIFF DATENAME TIMESTAMPADD TIMESTAMPDIFF TO_DATE
DAYNAME
与えられた日付式の曜日名を含む文字列を返す、スカラ日付/時刻関数です。
{fn DAYNAME(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタ
ンプ・リテラルである式。
date-expression
概要DAYNAMEは、指定された日付に該当する曜日名を返します。既定として返される曜日名は、Sunday、
Monday、Tuesday、Wednesday、Thursday、Friday、Saturday です。
これらの既定曜日名の値を変更するには、WEEKDAY_NAME オプションで SET OPTION コマンド
を使用します。
曜日名は、日付整数または以下の形式の日付文字列に対して算出されます。
yyyy-mm-dd hh:mm:ss
年部分 (yyyy) は、1841 から 9999 までの 4 桁の整数である必要があります。この範囲外の年や実
在しない日付 (例えば、2002–14–07 や 2003–02–29) が指定された場合は、NULL 文字列を返しま
す。2 桁の年は、1900 から 1999 の範囲と想定されます。
DATENAME 関数を使用して、同じ曜日情報を取得することもできます。TO_DATE を使用すると、
その他の日付要素で曜日名または曜日の省略形を検索できます。曜日名に対応する整数を返す
には、DAYOFWEEK、DATEPART、または TO_DATE を使用します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DAYNAME(date-expression)
例以下の 2 つの例は、指定された日付 (2004 年 2 月 25 日) の曜日が水曜日なので、Wednesday と
いう文字列を返します。
Caché SQL リファレンス 129
DAYNAME
SELECT DISTINCT {fn DAYNAME('2004-02-25')} AS WeekdayFROM Sample.Person
SELECT DISTINCT {fn DAYNAME(59590)} AS WeekdayFROM sample.person
以下の例は、今日の曜日名を返します。
SELECT DISTINCT {fn DAYNAME({fn NOW()})} AS Weekday_NowFROM Sample.Person
SELECT DISTINCT {fn DAYNAME(CURRENT_DATE)} AS Weekday_NowFROM Sample.Person
SELECT DISTINCT {fn DAYNAME(CURRENT_TIMESTAMP)} AS Weekday_NowFROM Sample.Person
関連項目
• SQL関数:DATENAMEDATEPARTDAYOFMONTHDAYOFWEEKDAYOFYEAR TO_DATE
• Caché ObjectScript 関数 : $ZDATE
DAYOFMONTH
与えられた日付式で、その月の日付を1から31までの整数値で返す、スカラ日付/時刻関数です。
{fn DAYOFMONTH(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。
date-expression
概要DAYOFMONTH は、日付整数または日付/時刻文字列を取ります。日付/時刻文字列は、以下の
形式で指定します。
yyyy-mm-dd hh:mm:ss
DAYOFMONTH は、月の日付を整数として返します。
日付/時刻文字列の日部分 (dd) は、1 から 31 までの整数である必要があります。ただし、ユーザ
の指定値に対して、範囲チェックは行われません。31 よりも大きな数と小数は、指定されたとおりに
返されます。(–)は区切り文字として使用されるため、負の数はサポートされません。入力では、先頭
のゼロはオプションです。出力では、先頭と末尾のゼロは抑制されます。
130 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
日部分が '0'、'00'、または数以外の値の場合、DAYOFMONTH は NULL を返します。日付文字
列の日部分が完全に省略されている場合 ('yyyy–mm hh:mm:ss')、または日付式が指定されていな
い場合も、同様に NULL が返されます。
日付/時刻文字列の各要素は、SQL スカラ関数の YEAR、MONTH、DAYOFMONTH、HOUR、
MINUTE、SECOND をそれぞれ使用して取得できます。DATEPART または DATENAME 関数を
使用して、DAYOFMONTHと同じ日要素を取得することもできます。DATEPARTおよびDATENAME
では、日の値に対して値と範囲のチェックが行われます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DAYOFMONTH(date-expression)
例以下の例は、指定された日付がその月の 25 番目の日であるため 25 を返します。
SELECT DISTINCT {fn DAYOFMONTH('2004-02-25')} AS DayNumFROM Sample.Person
SELECT DISTINCT {fn DAYOFMONTH(59590)} AS DayNumFROM Sample.Person
以下の例も、月の日付として数値25を返します。年は省略されていますが、区切り文字列 (–) がプ
レースホルダとしての役割を果たしています。
SELECT DISTINCT {fn DAYOFMONTH('-02-25 11:45:32')} AS DayNumFROM Sample.Person
以下の例は、<null> を返します。
SELECT DISTINCT {fn DAYOFMONTH('2000-02-00 11:45:32')} AS DayNumFROM sample.person
SELECT DISTINCT {fn DAYOFMONTH('2000-02 11:45:32')} AS DayNumFROM sample.person
SELECT DISTINCT {fn DAYOFMONTH('11:45:32')} AS DayNumFROM sample.person
以下の例は、今日の日付を示す値を返します。
SELECT DISTINCT {fn DAYOFMONTH({fn NOW()})} AS Day_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFMONTH(CURRENT_DATE)} AS Day_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFMONTH(CURRENT_TIMESTAMP)} AS Day_NowFROM Sample.Person
Caché SQL リファレンス 131
DAYOFMONTH
関連項目
• SQL 関数 : DATENAME DATEPART DAYNAME DAYOFWEEK DAYOFYEAR MONTH
TO_DATE
• Caché ObjectScript 関数 : $ZDATE
DAYOFWEEK
与えられた日付式で、その週の曜日を 1から 7 までの整数値で返す、スカラ日付/時刻関数です。
{fn DAYOFWEEK(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式
date-expression
概要DAYOFWEEK は日付整数または日付/時刻文字列を取り、その日付の曜日に対応する整数を返
します。返り値が示す曜日は以下のとおりです。
• 1 — 日曜日
• 2 — 月曜日
• 3 — 火曜日
• 4 — 水曜日
• 5 — 木曜日
• 6 — 金曜日
• 7 — 土曜日
日付/時刻文字列は、以下の形式で指定します。
yyyy-mm-dd hh:mm:ss
DATEPARTまたはTO_DATE関数を使用して、同じ曜日情報を取得できます。曜日の名前を返す
には、DAYNAME、DATENAME、または TO_DATE を使用します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
132 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
$SYSTEM.SQL.DAYOFWEEK(date-expression)
日付の検証
DAYOFWEEKは、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、
NULL 文字列が返されます。
• 有効な date-expression は、日付文字列 (yyyy-mm-dd) または日付/時刻文字列 (yyyy-mm-
dd hh:mm:ss) で構成されます。DAYOFWEEK は、文字列の日付部分のみを評価します。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。年は 4 桁で指定される必要があります。
• 日付値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、日は
1 から 31 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標
準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、
または '7a' は無効です。
例以下の例は、日付式の日 (2004 年 2 月 25 日) の曜日が水曜日なので、4 という数値を返します。
SELECT DISTINCT {fn DAYOFWEEK('2004-02-25')} AS WeekdayFROM Sample.Person
SELECT DISTINCT {fn DAYOFWEEK(59590)} AS WeekdayFROM Sample.Person
以下の例は、今日の曜日に対応する整数を返します。
SELECT DISTINCT {fn DAYOFWEEK({fn NOW()})} AS Weekday_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFWEEK(CURRENT_DATE)} AS Weekday_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFWEEK(CURRENT_TIMESTAMP)} AS Weekday_NowFROM Sample.Person
関連項目
• SQL関数 : DATENAME DATEPART DAYNAME DAYOFMONTH DAYOFYEAR TO_DATE
• Caché ObjectScript 関数 : $ZDATE
Caché SQL リファレンス 133
DAYOFWEEK
DAYOFYEAR
与えられた日付式の日付がその年の日付に対応する整数値を返す、スカラ日付/時刻関数です。
{fn DAYOFYEAR(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。
date-expression
概要DAYOFYEAR は、指定された日付式の日付がその年の日付に対応する 1 から 366 までの整数を
返します。DAYOFYEAR はうるう年の日付にも対応します。
日付式は、日付整数または日付/時刻文字列のどちらかになります。日付/時刻文字列は、以下の
形式で指定します。
yyyy-mm-dd hh:mm:ss
Caché の互換性のため、年部分 (yyyy) は 1840 から 9999 までの範囲の 4 桁の整数にする必要が
あります。DAYOFYEAR は、ユーザの指定値に対して範囲チェックを行いません。そのため、2 桁
の年も許可されます。年部分を省略した場合、DAYOFYEAR はうるう年想定規則 (例を参照) を適
用し、それに従って値を算出します。日部分 (dd) を省略した場合、DAYOFYEAR はその日をゼロ
(その月の最初の日よりも 1 少ない値) として評価します。
DATEPART または DATENAME 関数を使用して、同じ日付カウントを取得することもできます。
DATEPART および DATENAME では、日付式に対して値と範囲のチェックが行われます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.DAYOFYEAR(date-expression)
例以下の例は、日付式の日 (2004 年 3 月 4 日) がその年の 64 番目の日であるため、ともに整数 64
を返します (うるう年の日付であることが自動的に計算されます)。
SELECT DISTINCT {fn DAYOFYEAR('2004-03-04 12:45:37')} AS DayCountFROM Sample.Person
SELECT DISTINCT {fn DAYOFYEAR(59598)} AS DayCountFROM Sample.Person
134 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下の例では、年フィールドの値が両方とも省略されています。ただし、これらの例によって返され
る値は異なることに注意してください。最初の例は日付区切り文字で始まり、年値が無指定であるこ
とを示しています。この例では、無指定の年がうるう年でないと想定されるため、整数63が返されま
す。
SELECT DISTINCT {fn DAYOFYEAR('-03-04')} AS DayCountFROM Sample.Person
2 番目の例は、日付区切り文字の前に非数値プレースホルダがあり、年値が無指定であることを示
しています。この例では、非数値プレースホルダがうるう年を表すと想定されるため、整数64が返さ
れます。
SELECT DISTINCT {fn DAYOFYEAR('*-03-04')} AS DayCountFROM Sample.Person
以下の例は、日フィールドが省略されていることで指定された月の 0 番目の日と想定されるため、
整数 304 を返します。この例は、この後の例と同義です。
SELECT DISTINCT {fn DAYOFYEAR('2003-11')} AS DayCountFROM Sample.Person
SELECT DISTINCT {fn DAYOFYEAR('2003-11-00')} AS DayCountFROM Sample.Person
以下の例は今日の日付を示す値を返します。
SELECT DISTINCT {fn DAYOFYEAR({fn NOW()})} AS DayCount_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFYEAR(CURRENT_DATE)} AS DayCount_NowFROM Sample.Person
SELECT DISTINCT {fn DAYOFYEAR(CURRENT_TIMESTAMP)} AS DayCount_NowFROM Sample.Person
関連項目DATEPART DATENAME DAYNAME DAYOFMONTH DAYOFWEEK
Caché SQL リファレンス 135
DAYOFYEAR
DECLARE
カーソルを宣言します。
DECLARE cursor-name CURSOR FOR queryFOR READ ONLY
DECLARE cursor-name CURSOR FOR queryFOR UPDATE
引数
カーソルの名前。識別子です。cursor-name
カーソルの結果セットを定義する標準 SELECT 文。query
オプション—このカーソルによって行われる更新を防ぎます。カー
ソルは UPDATE、または DELETE 文の WHERE CURRENT OF
句では参照できません。
FOR READ ONLY
オプション — 既定の動作ではカーソルを使用した更新ができま
す。FOR UPDATE を明示的に指定するのは、互換性のためだけ
です。指定によって処理が実行されるわけではありません。
FOR UPDATE
概要DECLARE 文はカーソルに関する情報を指定し、後続の OPEN 文で使用されます。
既定では、更新はカーソルを使用して実行できます。FOR READ ONLY を指定した場合、クエリで
ORDER BY 文を使用して順番を指定した場合、またはそれ以外でクエリが更新用になっていない
場合は、カーソルを使用した更新はできません。
SQL 文として、DECLARE は埋め込み SQL からのみサポートされます。ダイナミック SQL の場合
は、代わりに単純な SELECT文 (INTO節のないもの) を使用するか、ダイナミック SQL と埋め込み
SQL の組み合わせを使用します。同様の操作は、ODBC でも ODBC API を使用してサポートされ
ます。
以下の埋め込みSQLは、EmpCursor という名前のカーソルを宣言して、オープン、フェッチ、クロー
ズする例です。
136 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET name="John Doe",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person FOR READ ONLY) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
以下の埋め込み SQL の例は、DECLARE を使用して、郵便番号が EmpZipCode 変数の値と同じ
である全従業員の姓と名を含むようにカーソル EmpCursor を設定します。
NEW EmpLast,EmpFirst,EmpZipCode &sql(DECLARE EmpCursor CURSOR FOR SELECT LastName,FirstName INTO :EmpLast,:EmpFirst FROM EmpTable where ZipCode = :EmpZipCode) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { SET EmpZipCode="02142" } &sql(OPEN EmpCursor) IF (SQLCODE) { WRITE SQLCODE,! QUIT } SET SQLCODE = 0 WHILE (SQLCODE = 0) { &sql(FETCH EmpCursor) WRITE !,EmpLast," ",EmpFirst } &sql(CLOSE EmpCursor) QUIT
関連項目CLOSE カーソル FETCH OPEN WHERE CURRENT OF
Caché SQL リファレンス 137
DECLARE
DECODE
与えられた式を評価し、指定された値を返す汎用 SQL 関数です。
DECODE(expr {,search,result}[,default])
引数
解読される式。expr
expr が比較される対象値。search
expr が search と一致する場合に返される値。result
オプション — expr が search と一致しない場合に返される既定値。default
概要search と result の複数の組み合わせを、コンマで区切って指定できます。default を 1 つ指定でき
ます。DECODE 式のパラメータ (expr、search、result、および default を含む) の最大数は、およそ
100 です。search、result、default の各値は、式から導き出すことができます。
DECODE 式を評価するために、Caché は expr を各 search 値と 1 つずつ比較します。
• expr が search 値と等しい場合は、対応する result が返されます。
• expr がどの search 値とも等しくない場合は、default 値が返されます。default が省略されてい
る場合は、NULL が返されます。
Caché が各 search 値を評価するのはそれを expr と比較する前だけで、すべての search 値を評価
してから expr と比較されるわけではありません。したがって、Caché は、search が expr と一致した
場合は、それ以降の search を評価しません。
DECODE は、最初の result 引数のデータ型を返します。最初の result 引数のデータ型が特定さ
れない場合、DECODE は VARCHAR を返します。
DECODE式では、Caché は 2つの NULL を同等とみなします。expr が NULL の場合、Caché は、
NULL である最初の search の result を返します。
DECODE は Oracle との互換性をサポートします。
例以下の例は、13 から 19 までの年齢を 'Teen' として "解読" します。default は 'Adult' です。
138 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT Age,Name,DECODE(Age, 13,'Teen',14,'Teen',15,'Teen',16,'Teen', 17,'Teen',18,'Teen',19,'Teen', 'Adult') AS AgeBracketFROM Sample.PersonORDER BY Age
以下の例は、Employee レコードの Company コード・フィールドの数値コードを解読し、対応する部
署名を返します。従業員のCompany コードが 1 から 10 までに該当しない場合、DECODE は既定
の "Admin (non-tech)" を返します。
SELECT Name,DECODE (Company, 1, 'TECH MARKETING', 2, 'TECH SALES', 3, 'DOCUMENTATION', 4, 'BASIC RESEARCH', 5, 'SOFTWARE DEVELOPMENT', 6, 'HARDWARE DEVELOPMENT', 7, 'QUALITY TESTING', 8, 'FIELD SUPPORT', 9, 'PHONE SUPPORT', 10, 'TECH TRAINING', 'Admin (non-tech)') AS TechJobsFROM Sample.Employee
この式では、expr パラメータが Company で、search と result パラメータの 10 個の組み合わせが
使用されています。"Admin (non-tech)" は default パラメータです。
関連項目CASE
Caché SQL リファレンス 139
DECODE
DELETE
テーブルの行を削除します。
DELETE restriction FROM table-nameWHERE conditional-expression
DELETE restriction FROM table-nameWHERE CURRENT OF cursorAND conditional-expression
引数
オプション — キーワード
%NOLOCK、%NOCHECK、%NOINDEX、%NOTRIGGER
のうちの 1 つ、またはこれらキーワードのコンマで
区切られたリスト。
restriction
行を削除するテーブル。テーブル行が削除される
ビューの指定をすることができます。詳細
は、"FROM" を参照してください。
FROM table-name
オプション — 削除される行の数を制限するのに使
用される条件を指定します。WHERE 節 (または
WHERE CURRENT OF 節) が指定されていない場
合、DELETE はテーブルからすべての行を削除し
ます。詳細は、"WHERE" を参照してください。
WHERE conditional-expression
オプション — DELETE が現在の cursor 位置で実
行されることを指定します。これはテーブルを指す
カーソルです。カーソルが指す行とその行に続くす
べての行を削除するか、または (AND 節が指定さ
れている場合は) 条件式と一致するすべての行を
削除します。詳細は、"WHERE CURRENT OF" を
参照してください。
WHERE CURRENT OF cursor
オプション — WHERE CURRENT OF 節とともに使
用して、削除を行う条件をさらに制限します。
AND conditional-expression
概要DELETEコマンドは、指定条件に適合する行をテーブルから削除します。テーブルからの行の削除
は、直接、またはビュー経由が可能です。ビュー経由で削除する場合は、CREATE VIEW で説明
されているように、必要条件や制限事項に従います。
140 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
WHERE CURRENT OF 節が使用される場合は、現在のカーソル位置で削除処理が行われます。
指定位置での実行の詳細は、"WHERE CURRENT OF" を参照してください。
また、DELETE 操作は、削除される行の数に %ROWCOUNT ローカル変数を設定します。
DELETEは、全か無かのイベントです。指定されたすべての行が削除されるか、削除が行われない
かのいずれかです。Caché は、SQLCODE ステータス変数を返し、DELETE の成功もしくは失敗を
示します。テーブルから行を削除するには、以下の条件を満たしている必要があります。
• テーブルに対する DELETE 特権が必要です。この特権を持っていないと SQLCODE -99 (特
権違反) エラーになります。詳細は、"GRANT" コマンドを参照してください。
• テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照する
DELETEをコンパイルすると、SQLCODE -115エラーが発生します。このエラーは実行時にの
み発生するのではなく、コンパイル時にも発生するようになったことに注意してください。"Caché
オブジェクトの使用法" の "オブジェクトの永続性" の章で READONLY オブジェクトの説明を
参照してください。
• ビュー経由で削除する場合、ビューを WITH READ ONLY として定義することはできません。
これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"CREATE VIEW" コ
マンドを参照してください。
• 削除する行が存在している必要があります。存在しない行を削除しようとすると、SQLCODE -
106 エラーが発生します。
• 削除対象に指定されたすべての行が削除可能である必要があります。複数行の DELETE は
アトミック処理です。1 行以上の行が削除不可能である場合、DELETE 操作は失敗し、行は削
除されません。例えば、指定された行の 1 行の削除が外部キーの参照整合性に違反する場
合、DELETE はすべての行の削除に失敗します。
制限引数
restriction 引数を指定すると、以下のように処理を制限します。
• %NOCHECK — DELETE 時に外部キー参照整合性チェックを抑制します。
• %NOLOCK—DELETE時に行をロックしません。単独のユーザ/処理がデータベースを更新す
る際にのみ使用します。
• %NOINDEX — インデックス・マップは DELETE 処理中には削除されません。
• %NOTRIGGER — DELETE 処理中にベース・テーブル・トリガが実行されません。
参照整合性
%NOCHECK を指定しない場合、Caché ではシステム構成設定を使用して外部キーの参照整合性
チェックを実行するかどうかが決まります。システムの既定値は以下のように設定できます。
• ObjectScript $SYSTEM.SQL.SetFilerRefIntegrity() 関数を呼び出します。
Caché SQL リファレンス 141
DELETE
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Perform Referential Integrity Checks on Foreign Keys for INSERT,
UPDATE, and DELETE] の現在の設定を表示および編集します。既定は “true” です。
DELETE 操作時には、すべての外部キー参照について、参照されるテーブルの該当する行に対
する共有ロックが取得されます。この行は、トランザクションの終了までロックされています。これによ
り、参照される行は、DELETEのロールバックがあってもそれより前に変更されることがなくなります。
トランザクションでのロック
%NOLOCK を指定しない場合、Caché は、INSERT、UPDATE、および DELETE 操作時に標準の
ロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。
既定のロックしきい値は、テーブルごとに 1000 ロックです。つまり、トランザクション時にテーブルか
ら 1000 を超える一意フィールド値を削除する場合は、ロックしきい値に到達し、Caché はロック・レ
ベルを自動的に一意フィールド値ロックからテーブル・ロックへと上げます。これによってトランザク
ション時に、ロック・テーブルをオーバーフローすることなく、大規模な削除を実行できます。このロッ
クしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの "SQL の概念"
の "トランザクション" を参照してください。
例以下の例は、TempEmployees テーブルからすべての行を削除します。
DELETE FROM TempEmployees
以下の例は、Employees テーブルから、従業員番号 234 番を削除します。
DELETE FROM Employees WHERE EmpId = 234
以下の例は、CurStatus 列が "Retired" に設定されているすべての行を、ActiveEmployees テーブ
ルから削除します。
DELETE FROM ActiveEmployees WHERE CurStatus = 'Retired'
関連項目
• テーブル FROM
• INSERT UPDATE
• 条件式 WHERE
• カーソル WHERE CURRENT OF
• ビュー CREATE VIEW
142 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DROP FUNCTION
関数を削除します。
DROP FUNCTION name FROM classname
引数
削除される関数の名前。この名前は、識別子です。name
オプション — 指定があれば、FROM classname 節は与えられたク
ラス名から関数を削除します。FROM節が指定されていない場合、
Caché はそのスキーマのすべてのクラスで該当する関数を検索
し、削除します。しかし、この名前での関数が見つからない場合、
または複数の同名の関数が見つかった場合、エラー・コードが返
されます。関数の削除の結果、クラスが空になる場合、DROP
FUNCTION はそのクラスも削除します。
FROM classname
概要DROP FUNCTION コマンドは関数を削除します。関数を削除するとき、Caché は、権限が与えられ
ている全ユーザおよびロールを無効にして、データベースから削除します。
関数の削除には、GRANT コマンドで指定された %DROP_FUNCTION 管理者特権が必要です。
関連項目CREATE FUNCTION
Caché SQL リファレンス 143
DROP FUNCTION
DROP INDEX
インデックスを削除します。
DROP INDEX index-name [ON [TABLE] table-name]
引数
削除されるインデックスの名前。インデックス名は未修飾、修飾のどちらで
もかまいません。
index-name
オプション — インデックスが関連付けられているテーブルの名前。ON table-name
または
ON TABLE
table-name
概要DROP INDEX 文はインデックスを削除します。DROP INDEX は、PRIMARY KEY や UNIQUE 制
約の定義によって作成された (CREATE TABLE や ALTER TABLE 文の、PRIMARY KEY や
UNIQUE オプションを使用して個別に作成された) インデックスには適用されません。
DROP INDEX コマンドは特権を必要とする操作です。DROP INDEX を使用する前
に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER 特権があることを
確認する必要があります。特権がない場合は、SQLCODE –99 エラー (特権違反) が返されます。
適切な特権を持っている場合は、GRANTコマンドを使用してこのような特権を割り当てることができ
ます。
DROP INDEX文は、table-name に対してテーブル・レベルのロックを取得します。これにより、他の
プロセスはこのテーブルのデータを変更できなくなります。このロックは、DROP INDEX操作が終了
すると自動的に解除されます。
IDKEYインデックスは、テーブルにデータがあるときは削除できません。削除しようとすると、SQLCODE
-325 エラー・コードが発行されます。
インデックス名
Caché SQL は、指定した index-name (SqlName とも呼ばれる) をクラスおよびグローバルにおける
対応インデックス名 (句読点文字を除く) に変換します。DROP INDEX はこの名前生成を使用して
インデックスへのすべての参照を削除します。
index-name は、未修飾 (EmpSalaryIndex)、修飾 (Employee.EmpSalaryIndex) のどちらでもかまいま
せん。また、ONまたはONTABLEキーワード句を使用して、その後にテーブル名を続けることで、
インデックスに関連付けられているテーブルを指定できます。
144 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DROP INDEX は、ネームスペース内のすべてのインデックス名が一意であると仮定していることに
注意してください。同じ名前のインデックスが複数あるときに、その関連テーブルを明示的に指定し
ない場合、DROP INDEX は、アルファベット順の検索で最初に検出されたテーブルに関連付けら
れているインデックスを削除します。
存在しないインデックス
存在しないインデックスを削除しようとすると、DROP INDEX は既定で SQLCODE -333 エラーを発
行します。ただし、構成オプションを以下のように設定することにより、システム全体でこの既定の設
定をオーバーライドできます。
• ObjectScript $SYSTEM.SQL.SetDDLNo333() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-333
] の設定が表示されます。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Allow DDL DROP of Non-existent Index] の現在の設定を表示しま
す。
既定値は “偽” (0) です。既定では、Caché は SQLCODE -333 エラーを返します。この設定を推
奨します。存在しないインデックスに対してDROP INDEXの処理をせず、エラー・メッセージも発行
しない場合は、 “真” (1) に設定します。
例以下の埋め込み SQL 例は、"EmpSalaryIndex" という名前のインデックスを作成し、後でそれを削
除します。この例のDROP INDEXでは、インデックスに関連付けられているテーブルが指定されて
おらず、このネームスペース内で "EmpSalaryIndex" が一意のインデックス名であると想定されてい
ます。
&sql(CREATE TABLE Employee ( EMPNUM INT NOT NULL, NAMELAST CHAR(30) NOT NULL, NAMEFIRST CHAR(30) NOT NULL, STARTDATE TIMESTAMP, SALARY MONEY, ACCRUEDVACATION INT, ACCRUEDSICKLEAVE INT, CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)) ) WRITE !,"SQLCODE=",SQLCODE," Created a table" &sql(CREATE INDEX EmpSalaryIndex ON TABLE Employee (Namelast,Salary)) WRITE !,"SQLCODE=",SQLCODE," Created an index" /* use the index */ &sql(DROP INDEX EmpSalaryIndex) WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
以下の埋め込み SQL 例は、ON TABLE 節を使用して、削除するインデックスに関連付けられてい
るテーブルを指定しています。
Caché SQL リファレンス 145
DROP INDEX
&sql(CREATE INDEX EmpVacaIndex ON TABLE Employee (NameLast,AccruedVacation)) WRITE !,"SQLCODE=",SQLCODE," Created an index" /* use the index */ &sql(DROP INDEX EmpVacaIndex ON TABLE Employee) WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
以下の埋め込み SQL 例は、修飾付きの名前構文を使用して、削除するインデックスに関連付けら
れているテーブルを指定しています。
&sql(CREATE INDEX EmpSickIndex ON TABLE Employee (NameLast,AccruedSickLeave)) WRITE !,"SQLCODE=",SQLCODE," Created an index" /* use the index */ &sql(DROP INDEX Employee.EmpSickIndex) WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
以下のコマンドは、存在しないインデックスを削除しようとしています。結果は、既定の SQL コード
-333 が返されます。
DROP INDEX PeopleIndex
関連項目CREATE INDEX
DROP METHOD
メソッドを削除します。
DROP METHOD name [ FROM classname ]
引数
削除するメソッドの名前。この名前は、識別子です。name
オプション — 指定があれば、FROM classname 節は、与えられた
classname からメソッドを削除します。FROM 節が指定されていな
い場合、Cachéはそのスキーマのすべてのクラスで該当するメソッ
ドを検索し、削除します。しかし、この名前でのメソッドが見つから
ない場合、または複数の同名のメソッドが見つかった場合、エラー・
コードが返されます。メソッドの削除の結果、クラスが空になる場
合、DROP METHOD はそのクラスも削除します。
FROM classname
146 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要DROP METHOD コマンドは、メソッドを削除します。メソッドを削除するとき、Caché は、全ユーザお
よびロールを無効にして、データベースから削除します。
メソッドの削除には、GRANT コマンドで指定された %DROP_METHOD 管理者特権が必要です。
関連項目CREATE METHOD
DROP PROCEDURE
プロシージャを削除します。
DROP PROCEDURE name FROM classnameDROP PROC name FROM classname
引数
削除するプロシージャの名前。この名前は、識別子です。name
オプション — 指定があれば、FROM classname 節は与えられた
classnameからプロシージャを削除します。FROM節が指定されて
いない場合、Cachéはそのスキーマのすべてのクラスで該当する
プロシージャを検索し、削除します。しかし、この名前でのプロシー
ジャが見つからない場合、または複数の同名のプロシージャが見
つかった場合、エラー・コードが返されます。プロシージャの削除
の結果、クラスが空になる場合、DROP PROCEDURE はそのクラ
スも削除します。
FROM classname
概要DROP PROCEDURE コマンドは、プロシージャを削除します。プロシージャを削除すると、Caché
は、そのプロシージャ権限が与えられている全ユーザおよびロールでそれを無効にし、データベー
スから削除します。
プロシージャの削除には、GRANT コマンドで指定された %DROP_PROCEDURE 管理者特権が必
要です。
関連項目CREATE PROCEDURE
Caché SQL リファレンス 147
DROP PROCEDURE
DROP QUERY
クエリを削除します。
DROP QUERY name FROM classname
引数
削除するクエリの名前。この名前は、識別子です。name
オプション — 指定があれば、FROM classname 節は与えられた
classnameからクエリを削除します。FROM節が指定されていない
場合、Cachéはそのスキーマのすべてのクラスで該当するクエリを
検索し、削除します。しかし、この名前でのクエリが見つからない場
合、または同名のクエリが複数見つかった場合、エラー・コードが
返されます。クエリの削除の結果、クラスが空になる場合、DROP
QUERY はそのクラスも削除します。
FROM classname
概要DROP QUERY コマンドはクエリを削除します。クエリを削除すると、Caché は、そのクエリ権限が与
えられている全ユーザおよびロールでそれを無効にし、データベースから削除します。
クエリの削除には、GRANT コマンドで指定された %CREATE_QUERY 管理者特権が必要です。
関連項目CREATE QUERY
DROP ROLE
ロールを削除します。
DROP ROLE role-name
引数
削除するロールの名前。この名前は、識別子です。role-name
概要DROP ROLE 文は、ロールを削除します。ロールを削除すると、Caché は、そのロール権限が与え
られている全ユーザおよびロールでそれを無効にし、データベースから削除します。
148 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DROP ROLE コマンドは特権を必要とする操作です。埋め込み SQL 内で DROP ROLE を使用す
る前に、以下の要件を 1 つ以上満たす必要があります。
• %Admin_Secure:USE 特権を持っている。
• ロールの所有者である。
• ロール WITH ADMIN OPTION を付与されている。
上記要件を 1 つ以上満たさない場合は、SQLCODE –99 エラー (特権違反) が返されます。
$SYSTEM.Security.Login メソッドを使用して、以下のようにユーザに適切な特権を割り当ててくださ
い。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の埋め込み SQL 例は、BkUser という名前のロールを作成し、後でそれを削除しています。
DO $SYSTEM.Security.Login("MyName","SecretPassword") &sql(CREATE ROLE BkName) IF SQLCODE=-99 { WRITE !,"You don't have CREATE ROLE privileges" } ELSE { WRITE !,"Created a role"} /* Use role */ &sql(DROP ROLE BkName) IF SQLCODE=-99 { WRITE !,"You don't have DROP ROLE privileges" } ELSE { WRITE !,"Dropped the role" }
関連項目
• SQL : CREATE ROLEユーザCREATE USER DROP USER GRANT REVOKE %CHECKPRIV
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
Caché SQL リファレンス 149
DROP ROLE
DROP TABLE
テーブルおよびデータを削除します。
DROP TABLE table[RESTRICT | CASCADE] [%DELDATA | %NODELDATA]
引数
削除するテーブルの名前。table
オプション — RESTRICT を指定すると、従属ビューや整合性制約のな
いテーブルのみが削除されます。CASCADEを指定すると、従属ビュー
や整合性制約のあるテーブルが削除され、テーブル削除処理の一環と
して、それを参照しているビューまたは整合性制約もすべて削除されま
す (下記の CASCADE の制約を参照)。
RESTRICT
CASCADE
オプション —これらのキーワードは、テーブルの削除時に、テーブルに
関連付けられているデータを削除するかどうかを指定します。既定で
は、テーブル・データを削除します。
%DELDATA
%NODELDATA
概要DROP TABLE コマンドはテーブルを削除します。
DROP TABLE コマンドは特権を必要とする操作です。DROP TABLE を使用する前
に、%DROP_TABLE管理者特権または指定されたテーブルに対するDELETE オブジェクト特権が
あることを確認する必要があります。特権がない場合は、SQLCODE –99 エラー (特権違反) が返さ
れます。適切な特権を持っている場合は、GRANT コマンドを使用して %DROP_TABLE 特権を割り
当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用
して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
DROP TABLE文は、tableに対してテーブル・レベルのロックを取得します。これにより、他のプロセ
スはテーブル削除の実行中にこのテーブルのデータを変更できなくなります。このロックは、DROP
TABLE 操作の一環として自動的に解除されます。
データを含むテーブル
既定では、DROP TABLE はテーブルのデータも削除します。このデータ削除設定は、テーブル・
ベースまたはシステム全体でオーバーライドできます。
テーブルの削除時に、DROP TABLE に %NODELDATA オプションを指定すると、テーブル・デー
タが自動的に削除されるのを防止できます。既定のシステム構成設定では、テーブル・データは削
150 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
除されます。テーブル・ベースでデータの削除を指定するには、システム全体の既定の設定でテー
ブル・データを削除しないように設定して、DROP TABLEに %DELDATAオプションを指定します。
テーブル・データの削除に関するシステム全体の既定値は、以下のように設定できます。
• ObjectScript $SYSTEM.SQL.SetDDLDropTabDelData 関数を呼び出します。現在の設定を確
認するには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[DROP TABLE
] の設定が表示されます。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Does DDL DROP TABLE Delete the Table's Data] の現在の設定を
表示します。
既定値は “真” (1) です。この設定を推奨します。テーブル定義の削除時に、DROP TABLE で
テーブル・データを削除しない場合は、このオプションを “偽” (0) に設定します。
外部キー制約
削除対象のテーブルを参照する別テーブルに外部キー制約が定義されている場合、そのテーブル
は削除できません。参照されているテーブルを削除する前に、それを参照しているすべての外部
キー制約を削除する必要があります。これらの外部キー制約を削除せずに DROP TABLE 操作を
実行すると、SQLCODE -320 エラーが返されます。
外部キー制約での既定の動作は、RESTRICT キーワード・オプションと同じです。この制約では、
CASCADE キーワード・オプションはサポートされません。
存在しないテーブル
存在しないテーブルを削除しようとすると、DROP TABLE は既定で SQLCODE -30 エラーを発行
します。ただし、システム構成を以下のように設定することにより、このエラー報告動作をオーバーラ
イドできます。
• ObjectScript $SYSTEM.SQL.SetDDLNo30() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-30 ]
の設定が表示されます。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Allow DDL DROP of Non-existent Table] の現在の設定を表示しま
す。
既定値は “偽” (0) です。この設定を推奨します。存在しないテーブルに対して DROP TABLE の
処理をせず、エラー・メッセージも発行しない場合は、 “真” (1) に設定します。
例以下の埋め込み SQL 例は、"Employees" という名前のテーブルを作成し、後でそれを削除してい
ます。この例では、テーブルの削除時に、このテーブルに関連付けられているデータを削除しない
ことを指定しています。
Caché SQL リファレンス 151
DROP TABLE
&sql(CREATE TABLE Employees ( NAMELAST CHAR (30) NOT NULL, NAMEFIRST CHAR (30) NOT NULL, STARTDATE TIMESTAMP, SALARY MONEY)) WRITE !,"Created a table" /* &sql(SQL code using Employees table) */ &sql(DROP TABLE Employees %NODELDATA) WRITE !,"Deleted a table"
関連項目ALTER TABLE CREATE TABLE INSERT JOIN SELECT テーブル UPDATE
DROP TRIGGER
トリガを削除します。
DROP TRIGGER name FROM table
引数
削除するトリガの名前。name
オプション—トリガを削除するテーブル。FROM節を指定しない場合は、
対象スキーマ全体で、指定されたトリガが検索されます。
FROM table
概要DROP TRIGGER 文はトリガを削除します。
DROP TRIGGER コマンドは特権を必要とする操作です。DROP TRIGGER を使用する前
に、%DROP_TRIGGER 管理者権限を持っている必要があります。特権がない場合は、SQLCODE
–99 エラー (特権違反) が返されます。適切な特権を持っている場合は、GRANT コマンドを使用し
て %DROP_TRIGGER 特権を割り当てることができます。埋め込み SQL では、以下のように $SYS-
TEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
DROP TRIGGER 文は、table に対してテーブル・レベルのロックを取得します。これにより、他のプ
ロセスはこのテーブルのデータを変更できなくなります。このロックは、DROP TRIGGER 操作が終
了すると自動的に解除されます。
152 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
FROM 節
トリガとそのテーブルは同じスキーマに存在している必要があります。トリガ名は、修飾、未修飾のど
ちらでもかまいません。未修飾の場合、既定では、トリガのスキーマは、FROM節で指定されたテー
ブルのスキーマになります。FROM 節が存在しないか、テーブル名が未修飾の場合は、トリガのス
キーマは既定でシステムの既定スキーマになります。トリガ名とテーブル名が両方とも修飾されてい
る場合は、両方が同じスキーマを指定している必要があります。そうでない場合、CachéはSQLCODE
-366 エラーを発行します。
Caché SQL では、トリガ名はスキーマ内の特定のテーブルに関して一意である必要があります。し
たがって、1つのスキーマ内に同じ名前のトリガが複数存在する場合があります。オプションのFROM
節は、削除するトリガを決めるために以下のように使用されます。
• FROM 節が指定されておらず、指定された名前と一致する一意のトリガがスキーマ内で見つ
かった場合、Caché はそのトリガを削除します。
• FROM節が指定され、指定された名前と FROM節のテーブル名の両方に一致する一意のトリ
ガがスキーマ内で見つかった場合、Caché はそのトリガを削除します。
• FROM 節が指定されておらず、指定された名前と一致する複数のトリガが見つかった場合、
Caché は SQLCODE -365 エラーを発行します。
• FROM節で指定されたテーブルに関して指定された名前のトリガが見つからないか、FROM節
が指定されていない場合にスキーマ内でどのテーブルに関しても指定された名前のトリガが見
つからない場合、Caché は SQLCODE -363 エラーを発行します。
例以下の例は、既定スキーマ (通常は SQLUser) 内で任意のテーブルに関連する Trigger_1 という
名前のトリガを削除します。
DROP TRIGGER Trigger_1
以下の例は、A スキーマ内で任意のテーブルに関連する Trigger_2 というトリガを削除します。
DROP TRIGGER A.Trigger_2
以下の例は、既定スキーマ内で Patient テーブルに関連する Trigger_3 というトリガを削除します。
Trigger_3 という名前のトリガが見つかっても、Patient と関連していなければ、Caché は SQLCODE
-363 エラーを発行します。
DROP TRIGGER Trigger_3 FROM Patient
以下の例はすべて、Test スキーマ内で Patient テーブルに関連する Trigger_4 というトリガを削除
します。
DROP TRIGGER Test.Trigger_4 FROM Patient
DROP TRIGGER Trigger_4 FROM Test.Patient
Caché SQL リファレンス 153
DROP TRIGGER
DROP TRIGGER Test.Trigger_4 FROM Test.Patient
関連項目CREATE TRIGGER トリガ動作 GRANT
DROP USER
ユーザ・アカウントを削除します。
DROP USER user-name
引数
削除するユーザの名前。user-name
概要DROP USER コマンドは、ユーザ・アカウントを削除します。
DROP USER コマンドは特権を必要とする操作です。埋め込み SQL 内で DROP USER を使用す
る前に、適切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE
–99 エラー (特権違反) が返されます。$SYSTEM.Security.Login メソッドを使用して、以下のように
ユーザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の文を発行して、PSMITH を削除できます。
DROP USER psmith
関連項目
• SQL : ユーザ CREATE USER ALTER USER GRANT REVOKE %CHECKPRIV
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
154 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DROP VIEW
ビューを削除します。
DROP VIEW view-name [CASCADE | RESTRICT]
引数
削除するビューの名前。view-name
オプション — view-name を参照する他のすべてのビューを削除する場合
はCASCADEキーワードを指定します。RESTRICTは、view-nameを参照
するビューが他に存在するときに SQLCODE -321 エラーを発行する場合
に指定します。既定値は RESTRICT です。
CASCADE
RESTRICT
概要DROP VIEW コマンドはビューを削除しますが、基となるテーブルやデータは削除しません。
DROP VIEW コマンドは特権を必要とする操作です。DROP VIEWを使用する前に、%DROP_VIEW
管理者特権または指定されたビューに対するDELETEオブジェクト特権を持っている必要がありま
す。特権がない場合は、SQLCODE –99 エラー (特権違反) が返されます。適切な特権を持ってい
る場合は、GRANT コマンドを使用して %DROP_VIEW 特権を割り当てることができます。埋め込み
SQLでは、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザと
してログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
存在しないビュー
存在しないビューを削除しようとすると、DROP VIEW は既定で SQLCODE -30 エラーを発行しま
す。ただし、システム構成を以下のように設定することにより、このエラー報告動作をオーバーライド
できます。
• ObjectScript $SYSTEM.SQL.SetDDLNo30() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQLCODE=-30 ]
の設定が表示されます。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Allow DDL DROP of Non-existent Table] の現在の設定を表示しま
す。
既定値は “偽” (0)です。この設定を推奨します。存在しないビューおよびテーブルに対してDROP
VIEW および DROP TABLE の処理をせず、エラー・メッセージも発行しない場合は、 “真” (1) に
設定します。
Caché SQL リファレンス 155
DROP VIEW
他のビューから参照されるビュー
クエリで他のビューから参照されているビューを削除しようとすると、DROPVIEWは既定でSQLCODE
-321 エラーを発行します。これは RESTRICT キーワードの動作です。
CASCADEキーワードを指定すると、クエリで他のビューによって参照されているビューの削除は成
功します。さらに、DROP VIEWはクエリでview-nameを参照しているすべてのビューも削除します。
例以下の埋め込み SQL 例は、"CityAddressBook" という名前のビューを作成し、その後そのビュー
を削除します。
&sql(CREATE VIEW CityAddressBook AS SELECT Name,Home_Street FROM Sample.Person WHERE Home_City='Boston') IF SQLCODE=0 { WRITE !,"View created" } ELSE { WRITE !,"CREATE VIEW error: ",SQLCODE QUIT } /* Use the view */ &sql(DROP VIEW CityAddressBook) IF SQLCODE=0 { WRITE !,"View dropped" } ELSEIF SQLCODE=-30 { WRITE !,"View non-existent" } ELSEIF SQLCODE=-321 { WRITE !,"View referenced by other views" } ELSE { WRITE !,"Unexpected DROP VIEW error: ",SQLCODE }
関連項目ビュー ALTER VIEW CREATE VIEW GRANT
%EXACT
文字列を EXACT 照合フォーマットに変換するケース変換関数です。
%EXACT(expression)
%EXACT expression
引数
列名、文字リテラル、または他の関数の結果を指定できる文字列式。基本
となるデータ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とする
ことができます。
expression
概要%EXACT は、EXACT照合シーケンス内の expression を返します。照合シーケンスは、まず純粋な
数値 (x=+x としての値) を数値順で並べ、次に他のすべての文字列は文字順で並べます。
156 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
文字列に対する EXACT 照合シーケンスは、ANSI 標準の ASCII 照合シーケンスと同じものです。
数字は大文字のアルファベット文字の前に照合され、大文字のアルファベット文字は小文字のアル
ファベット文字の前に照合されます。句読点文字は、そのシーケンスのそれぞれの場所で照合され
ます。
%EXACT は、Caché SQL 拡張機能であり、SQL 検索クエリ用として使用されます。
例以下の例は、%EXACT を使用して、'Smith' よりも照合順序が高いすべての Name 値を返します。
最初の例は括弧構文を使用し、2 番目の例は括弧を省略しています。
SELECT Name FROM Sample.PersonWHERE %EXACT(Name) > 'Smith'
SELECT Name FROM Sample.PersonWHERE %EXACT Name > 'Smith'
関連項目ASCII %ALPHAUP %STRING %UPPER
EXISTS
要素の存在をチェックします。
EXISTS select-statement
引数
一般的に条件式を含む単純なクエリ。select-statement
概要EXISTS 条件は指定されたテーブルをテストしますが、主として、テーブル内に 1 つ以上の行が存
在するかどうかを調べます。EXISTS に続く SELECT 文は、何を含むかについてチェックされます。
その節は多くの場合以下の形式です。
EXISTS (SELECT... FROM... WHERE...)
一般的な文は、以下のようになります。
Caché SQL リファレンス 157
EXISTS
SELECT name FROM Table_A WHERE EXISTS (SELECT * FROM Table_B WHERE Table_B.Number = Table_a.Number)
この例では、サブクエリによって指定された単独あるいは複数の行が存在するかどうかを、述語がテ
ストします。
このテストは、UNION 文ではなく SELECT 文で実行しなければならないことに注意してください。
また、NOT EXISTS 節は、テーブル内に行が存在しないことをテストします。以下は、クエリが NOT
EXISTS 節を照会する例です。
SELECT EmployeeName,Age FROM Employees WHERE NOT EXISTS (SELECT * FROM BonusTable WHERE NOT (BonusTable.Result = 'Positive' AND Employees.EmployeeNum = BonusTable.EmployeeNum))
これは、以下の FOR ALL 演算子の使用と同じです。
SELECT EmployeeName,Age FROM Employees WHERE FOR ALL BonusTable (BonusTable.Result='Positive' AND Employees.EmployeeNum=BonusTable.EmployeeNum)
関連項目条件式 SELECT
EXP
与えられた数値式の Log 指数値 (基数 e) を返す、スカラ数値関数です。
{fn EXP(float-expression)}
引数
FLOAT 型の式である対数の指数値。float-expression
概要EXP は自然対数の指数値 (基数 e) を FLOAT型として返します。NULL値を渡すと EXPは NULL
を返します。
EXP は ({ } 括弧構文とともに) ODBC スカラ関数としてのみ使用できます。
158 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例以下の例は、整数 15 の指数値を返します。
SELECT DISTINCT {fn EXP(15)} AS LogExpFROM Sample.Person
これは、3269017.372... を返します。
以下の埋め込み SQL の例は、整数 0 から 10 までの基数 e の指数値を返します。
SET a=0 WHILE a<11 { &sql(SELECT {fn EXP(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"Exponential of ",a," = ",b SET a=a+1 } }
以下の埋め込み SQL の例は、整数 1 から 10 までに対する LOG 関数と EXP 関数の関係を示し
ます。
SET a=1 WHILE a<11 { &sql(SELECT {fn LOG(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"Logarithm of ",a," = ",b } &sql(SELECT ROUND({fn EXP(:b)},12) INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Exponential of log ",b," = ",c SET a=a+1 } }
ここでは、システムの計算制限によって生じる非常に小さな差異を修正するROUND関数が必要な
ことに注意してください。上記の例では、この目的で ROUND がとりあえず小数点以下 12 桁に設
定されています。
関連項目
• SQL 関数 : LOG LOG10 POWER ROUND
• Caché ObjectScript 関数 : $ZEXP
Caché SQL リファレンス 159
EXP
%EXTERNAL
DISPLAY 形式の式を返す汎用形式変換関数です。
%EXTERNAL(expression)
%EXTERNAL expression
引数
変換される式。expression
概要%EXTERNAL は expression を DISPLAY 形式に変換します。これはフィールドやデータ型の Logi-
calToDisplay メソッドが実行する任意の変換による VARCHAR データ型です。DISPLAY 形式は、
データの入力と表示ができる形式です。
%EXTERNAL は、Caché SQL の拡張です。
例以下の例は、同じフィールドの内部形式と外部形式を示します。%EXTERNAL形式は、既定の表示
形式と同じであることに注意してください。
この例では、内部形式はエンコードされたリストです。
SELECT FavoriteColors,%INTERNAL(FavoriteColors) AS InternalVal,%EXTERNAL(FavoriteColors) AS ExternalValFROM Sample.Person
この例では、Date of Birth (DOB) の内部形式は Caché $HOROLOG カウンタです。
SELECT DOB,%INTERNAL(DOB) AS InternalVal,%EXTERNAL(DOB) AS ExternalValFROM Sample.Person
関連項目%INTERNAL %ODBCIN %ODBCOUT
160 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
$EXTRACT
文字列から、指定された位置にある文字を抽出する汎用 SQL 関数です。
$EXTRACT(string[,from[,to]])
引数
部分文字列を抽出するターゲット文字列。string
オプション — 抽出する文字のターゲット文字列内での位置 (1 文字を抽出する場
合はその文字の位置、複数文字を抽出する場合はその先頭文字の位置)。1 か
ら始まる正の整数として指定します。
from
オプション — 抽出する文字の範囲の最終位置 (その文字まで抽出)。1 から始ま
る正の整数として指定します。
to
概要$EXTRACTは stringで指定した位置から部分文字列を返します。返される部分文字列の内容は、
使用する引数によって決まります。
• $EXTRACT(string) は、文字列の先頭文字を抽出します。
• $EXTRACT(string,from) は、from で指定した位置の文字を抽出します。例えば、変数 var1 が
文字列 "ABCD" を含むときは、以下のコマンドは "B" を抽出します (2 番目の文字)。
SELECT DISTINCT $EXTRACT('ABCD',2) AS Extracted FROM Sample.Person
• $EXTRACT(string,from,to) は、fromの位置で開始し toの位置で終了する文字列の範囲を抽
出します。例えば、以下のコマンドは、文字列 "1234Alabama567" から文字列 "Alabama" (つ
まり、5 番目の位置から 11 番目の位置までにあるすべての文字) を抽出します。
SELECT DISTINCT $EXTRACT('1234Alabama567',5,11) AS Extracted FROM Sample.Person
この関数は、データ型 VARCHAR を返します。
引数
string
string には、変数名、数値、文字列リテラル、または任意の有効な式を指定できます。
Caché SQL リファレンス 161
$EXTRACT
from
from 値には、正の整数を指定する必要があります (例外は、"メモ" を参照)。小数値の場合は、小
数桁が切り捨てられ、整数部分のみが使用されます。
from 値が文字列内の文字数よりも大きいときは、$EXTRACT は NULL 文字列を返します。
from が to 引数なしで指定されている場合は、その位置にある 1 文字が抽出されます。
to 引数とともに使用されている場合、from は抽出する範囲の先頭を表し、to 値よりも小さな値でな
くてはなりません。fromが to と等しい場合、$EXTRACTは指定した位置にある 1文字を返します。
from が to よりも大きいときは、$EXTRACT は NULL 文字列を返します。
to
to引数は、from引数とともに使用する必要があります。必ず正の整数を指定します。小数値の場合
は、小数桁が切り捨てられ、整数部分のみが使用されます。
toの値が fromの値以上である場合、$EXTRACTは指定した部分列を返します。toが文字列の長
さより大きい場合、$EXTRACTは fromの位置から文字列の終了までの部分文字列を返します。to
が from よりも小さい場合、$EXTRACT は NULL 文字列を返します。
例以下の例は文字列の 4 番目の文字 "S" を返します。
SELECT DISTINCT $EXTRACT('THIS IS A TEST',4) AS Extracted FROM Sample.Person
以下の例は、先頭から 7 番目の文字までの部分文字列 "THIS IS" を返します。
SELECT DISTINCT $EXTRACT('THIS IS A TEST',1,7) AS Extracted FROM Sample.Person
以下の埋め込み SQL 例は、a から 2 番目の文字 ("B") を抽出して、この値を変数 y に割り当てま
す。
SET a="ABCD" &sql(SELECT $EXTRACT(:a,2) INTO :y FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The extract returns ",y }
以下の埋め込み SQL 例は、from 値が "1" のときに、引数が 1 つの形式と 2 つの形式が同じ結果
になることを示しています。両方の $EXTRACT 関数は、"H" を返します。
162 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a="HELLO" &sql(SELECT $EXTRACT(:a),$EXTRACT(:a,1) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The one-arg form returns ",b WRITE !,"The two-arg form returns ",c }
メモ
$PIECE および $LIST と比較した $EXTRACT
$EXTRACT は、文字列からの整数位置により、部分文字列を返します。$PIECE と $LIST は両方
とも、特別にフォーマットされた文字列を処理します。
$PIECE は、文字列内に区切り文字が使用されている標準文字の文字列から、部分文字列を返し
ます。
$LISTは、要素 (文字ではない)の整数位置により、エンコードされたリストから要素のサブリストを返
します。$LISTは、通常の文字列に対して使用できません。また、$EXTRACTは、エンコードされた
リストに対して使用できません。
$EXTRACT、$FIND、$LENGTH、および$PIECE関数は、標準文字の文字列に対して処理を実行
します。さまざまな$LIST関数は、エンコードされた文字列を操作します。この文字列は、標準の文
字列とは互換性がありません。唯一の例外は、$LISTGET 関数と、引数が 1 つおよび 2 つの形式
の $LIST 関数です。これらの関数は、入力としてエンコードされた文字の文字列を受け取り、単一
要素値を標準文字の文字列として出力します。
$EXTRACT と Unicode
$EXTRACT関数は、バイトではなく、文字を操作します。したがって、以下の例で示すように、Unicode
の文字列は ASCII 文字列と同様に処理されます。以下の埋め込み SQL の例では、"pi"
($CHAR(960)) に対して Unicode 文字を使っています。
SET a="QT PIE" SET b=("QT "_$CHAR(960)) &sql(SELECT $EXTRACT(:a,-33,4), $EXTRACT(:a,4,4), $EXTRACT(:a,4,99), $EXTRACT(:b,-33,4), $EXTRACT(:b,4,4), $EXTRACT(:b,4,99) INTO :a1,:a2,:a3,:b1,:b2,:b3 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"ASCII form returns ",!,a1,!,a2,!,a3 WRITE !,"Unicode form returns ",!,b1,!,b2,!,b3 }
Caché SQL リファレンス 163
$EXTRACT
NULL と無効な引数
• string が NULL 文字列の場合は、NULL 文字列が返されます。
• from が文字列の長さよりも大きい場合は、NULL 文字列が返されます。
• fromがゼロまたは負の数のときにtoが指定されていない場合は、NULL文字列が返されます。
• to がゼロ、負の数、または from よりも小さな数の場合は、NULL 文字列が返されます。
• to が有効な値の場合は、from はゼロまたは負の数でもかまいません。$EXTRACT は、この
from 値を 1 として処理します。
無効な引数値に対して、SQLCODE エラーは発行されません。
以下の例は、負の from 値が 1 として評価されるため、$EXTRACT は先頭から 7 番目の文字まで
の部分文字列 "THIS IS" を返します。
SELECT DISTINCT $EXTRACT('THIS IS A TEST',-7,7) FROM Sample.Person
以下の埋め込みSQLの例にある$EXTRACT関数呼び出しは、すべてNULL文字列を返します。
SET a="THIS IS A TEST" SET b="" &sql(SELECT $EXTRACT(:a,33), $EXTRACT(:a,-7), $EXTRACT(:a,3,2), $EXTRACT(:a,-7,0), $EXTRACT(:a,-7,-10), $EXTRACT(:b,-33,4), $EXTRACT(:b,4,4), $EXTRACT(:b,4,99), $EXTRACT(NULL,-33,4), $EXTRACT(NULL,4,4), $EXTRACT(NULL,4,99) INTO :a1,:a2,:a3,:a4,:a5,:b1,:b2,:b3,:c1,:c2,:c3 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"FROM too big: ",a1 WRITE !,"FROM negative, no TO: ",a2 WRITE !,"TO smaller than FROM: ",a3 WRITE !,"TO not a positive integer: ",a4,a5 WRITE !,"LIST is null string: ",b1,b2,b3,c1,c2,c3 }
関連項目
• SQL 関数 : $FIND $LENGTH $LIST $LISTGET $PIECE
• Caché ObjectScript 関数 : $EXTRACT $FIND $LENGTH $LIST $LISTBUILD $LISTGET
$PIECE
164 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
FETCH
カーソルからデータを取り出します。
FETCH cursor-name [INTO host-variable-list]
引数
カーソルの名前。識別子です。cursor-name
オプション — フェッチの列からローカル変数にデータをコピー
します。host-variable-list には、1つのホスト変数またはコンマ
で区切られた複数のホスト変数のリストを指定します。この変
数がカーソルに関連付けられたデータの格納先になります。
INTO節は、オプションです。指定されていない場合は、FETCH
文はカーソルのみを配置します。
INTO host-variable-list
概要埋め込み SQL アプリケーション内で、FETCH 文はカーソルからデータを取り出します。操作の必
須順序は、DECLARE、OPEN、FETCH、CLOSE です。
SQL 文として埋め込み SQL からだけサポートされています。同様の操作は、ODBC でも ODBC
API を使用してサポートされます。
INTO 節は、DECLARE 文の節、FETCH 文の節、またはその両方として指定できます。INTO 節
は、ローカル変数内に配置されるフェッチの列からデータを配置します。リスト内の各変数は左から
右に、カーソル結果セット内で対応する列に関連しています。各変数のデータ型は、結果セット列
に対応するデータ型の暗黙の変換に一致するかサポートされる必要があります。変数の数は、カー
ソル選択リスト内の列数と一致しなければなりません。
FETCH オペレーションは %ROWCOUNT ローカル変数を、取り出される行の数に設定します。
例以下の埋め込み SQL の例は、EmpCursor という名前のカーソルからデータを取り出す FETCH文
を示しています。INTO 節は DECLARE 文に指定されています。
Caché SQL リファレンス 165
FETCH
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name,Home_State INTO :name,:state FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
以下の埋め込み SQL の例は、EmpCursor という名前のカーソルからデータを取り出す FETCH文
を示しています。INTO 節は、FETCH 文の一部として指定されています。
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor INTO :name,:state) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
以下の埋め込み SQL の例は、対応する DECLARE の INTO 節をオーバーライドする INTO 節を
持つ FETCH 文を示しています。
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor INTO :n1,:s1) QUIT:SQLCODE WRITE !,"DURING DecVars: Name=",name," State=",state WRITE !,"DURING FetchVars: Name=",n1," State=",s1 } &sql(CLOSE EmpCursor) WRITE !,"AFTER DecVars: Name=",name," State=",state WRITE !,"AFTER FetchVars: Name=",n1," State=",s1
関連項目CLOSE カーソル DECLARE OPEN
166 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
$FIND
値を基準に部分文字列を特定し、文字列内でのその部分文字列の末尾位置を表す整数を返す汎
用 SQL 関数です。
$FIND(string,substring[,position])
引数
検索するターゲット文字列。変数名、数値、文字列リテラル、または任意の
有効な式を指定できます。
string
検索する部分文字列。変数名、数値、文字列リテラル、または任意の有効な
式を指定できます。
substring
オプション—検索を開始するターゲット文字列内の位置。必ず正の整数を指
定します。
position
概要$FIND は、文字列内の部分文字列の末尾位置を示す整数を返します。$FIND は、substring を求
めて string を検索します。substring が見つかると、$FIND はsubstring に続く最初の文字の位置を
整数で返します。substring が見つからなければ、$FIND は 0 の値を返します。
position オプションを使用して、検索の開始位置を指定できます。position 値が string 内の文字数
よりも大きい場合、$FIND は 0 の値を返します。position が省略されている場合は、文字列位置 1
が既定です。position がゼロ、負の数、または非数値文字列の場合は、位置 1 が既定です。
この関数は、データ型 SMALLINT を返します。
例以下の例では、string が文字列 "ABCDEFG" で、substring が文字列 "BCD" です。$FIND 関数
は、"BCD" の次の文字 ("E") の位置を示す値 5 を返します。
SELECT DISTINCT $FIND('ABCDEG','BCD') AS SubPointFROM Sample.Person
以下の例は、数値 987654321 で数値 7 を検索し、substring の後の位置を示す 4 を返します。
SELECT DISTINCT $FIND(987654321,7) AS SubPointFROM Sample.Person
以下の例は、substring "AA" の最初のインスタンスの後の文字の位置を示す 3 を返します。
SELECT DISTINCT $FIND('AAAAAA','AA') AS SubPointFROM Sample.Person
Caché SQL リファレンス 167
$FIND
以下の例では、$FIND は文字列に含まれていない部分文字列を検索します。結果はゼロ (0) を返
します。
SELECT DISTINCT $FIND('AABBCCDD','AC') AS SubPointFROM Sample.Person
以下の例では、$FIND は 7 番目の文字から検索を開始します。この例は、7 文字目以降での "R"
の出現箇所の次の位置を示す 14 を返します。
SELECT DISTINCT $FIND('EVERGREEN FOREST','R',7) AS SubPointFROM Sample.Person
以下の例では、$FIND は文字列の最後の文字の後から、検索を開始します。結果はゼロ (0) を返
します。
SELECT DISTINCT $FIND('ABCDEFG','G',10) AS SubPointFROM Sample.Person
以下の埋め込み SQL の例は、1 よりも小さい position が 1 として処理されることを示しています。
SET a="ABCDEFG" SET b="F" &sql(SELECT $FIND(:a,:b), $FIND(:a,:b,1), $FIND(:a,:b,0), $FIND(:a,:b,-35) INTO :a1,:a2,:a3,:a4 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The input string: ",a WRITE !,"Two-arg: ",a1 WRITE !,"3rd arg 1: ",a2 WRITE !,"3rd arg 0: ",a3 WRITE !,"3rd arg negative: ",a4 }
以下の埋め込み SQL の例は、$FIND を使用して、Unicode 文字の pi、つまり $CHAR(960) が含ま
れる文字列を検索しています。最初の $FIND は、pi の次の文字の位置を示す 5 を返します。2 番
目の $FIND は、4 文字目から検索を開始し、4 文字目が検索文字の pi に該当するため、同様に
5 を返します。3 番目の $FIND は 5 文字目から検索を開始し、5 文字目以降での pi の出現箇所
の次の位置を示す 13 を返します。位置 12 が文字列の最後の文字であっても、位置 13 が返され
ることに注意してください。
168 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a="QT "_$CHAR(960)_" HONEY "_$CHAR(960) SET b=$CHAR(960) &sql(SELECT $FIND(:a,:b), $FIND(:a,:b,4), $FIND(:a,:b,5) INTO :a1,:a2,:a3 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The input string: ",a WRITE !,"From beginning: ",a1 WRITE !,"From position 4: ",a2 WRITE !,"From position 5: ",a3 }
メモ
$FIND、$EXTRACT、$PIECE、および $LIST
• $FIND は、値により部分文字列を検索し、位置を返します。
• $EXTRACT は、位置により部分文字列を検索し、部分文字列の値を返します。
• $PIECEは、区切り文字または区切り文字列により部分文字列を検索し、部分文字列の値を返
します。
• $LISTは、特別にエンコードされた文字列を操作します。文字列のカウントにより部分文字列を
検索し、部分文字列の値を返します。
$FIND、$EXTRACT、$LENGTH、および$PIECE関数は、標準の文字列を操作します。さまざまな
$LIST関数は、エンコードされた文字列を操作します。この文字列は、標準の文字列とは互換性が
ありません。唯一の例外は、$LISTGET 関数と、引数が 1 つおよび 2 つの形式の $LIST 関数で
す。これらの関数は、入力としてエンコードされた文字の文字列を受け取り、単一要素値を標準文
字の文字列として出力します。
関連項目
• SQL 関数 : $EXTRACT $LENGTH $LIST $LISTGET $PIECE
• Caché ObjectScript 関数 : $EXTRACT $FIND $LENGTH $LIST $LISTBUILD $LISTGET
$PIECE
Caché SQL リファレンス 169
$FIND
FLOOR
与えられた数値式に等しいか、より小さい最大整数値を返す、スカラ数値関数です。
{fn FLOOR(numeric-expression)}
引数
下限値を計算する数。numeric-expression
概要FLOOR は、numeric-expression と同じデータ型を返します。numeric-expression に NULL 値、空
文字列 ('')、または数値でない文字列を指定すると、FLOOR は NULL を返します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.FLOOR(numeric-expression)
例以下の例は、FLOOR の実行結果です。
SELECT DISTINCT {fn Floor(167.45)} AS FloorNumFROM Sample.Person
これは、167 を返します。
SELECT DISTINCT {fn Floor(167.00)} AS FloorNumFROM Sample.Person
これは、167 を返します。
SELECT DISTINCT {fn Floor(-167.45)} AS FloorNumFROM Sample.Person
これは、-168 を返します。
SELECT DISTINCT {fn FLOOR(-167.00)} AS FloorNumFROM Sample.Person
これは、-167 を返します。
関連項目CEILING
170 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
FROM
クエリの対象となる 1 つ以上のテーブルを指定する SELECT 節です。
SELECT ...FROM [%INORDER] [%FULL] table [[AS] alias][,table [[AS] alias]][,...]
引数
オプション — このキーワードにより、クエリ・オプティ
マイザは、FROM 節にリストされるテーブルの順番
で結合を実行します。コンパイル時間を最小限にし
ます。
%INORDER
オプション — このキーワードにより、クエリ・オプティ
マイザは、すべての代替結合シーケンスを検査し、
アクセス・パフォーマンスを最大限に引き出します。
キーワードが指定されていない場合、これが既定に
なります。
状況により、両方のキーワードを指定することが重
要になる場合があります。
%FULL
データを取得する1つ以上のテーブルまたはビュー。
コンマで区切られたリストまたはJOIN構文で指定さ
れます。JOIN 構文でのビューの使用にはいくつか
の制限が適用されます。括弧で囲んだサブクエリも
指定できます。
table
オプション — テーブル名のエイリアス。AS キーワー
ドは省略可能で、これの有無に関係なくエイリアスを
指定できます。
AS alias
概要FROM節は、SELECT文内でデータを照会する 1つ以上のテーブル (もしくはビューまたはサブク
エリ) を指定します。複数のテーブルは、コンマで区切られたリスト、または他の JOIN 構文によって
区切られたリストとして指定されます。各テーブル名には、オプションとしてエイリアスを指定できま
す。
テーブル名のエイリアスは、SELECT 文で複数のテーブルのフィールド名を指定するときに使用さ
れます。FROM 節に 2 つ (またはそれ以上) のテーブルが指定されている場合は、
tablename.fieldnameの形式でSELECT節の各フィールドを指定することで、どのテーブルの
フィールドを対象とするのかを明確にできます。この場合、テーブル名は長い名前が多いので、短
いエイリアスを指定すると便利です。
Caché SQL リファレンス 171
FROM
以下の例は、テーブル名のエイリアスの使用方法を示します。
SELECT e.Name,c.NameFROM Sample.Company AS c,Sample.Employee AS e
AS キーワードは省略できます。このキーワードは、互換性とわかりやすい表記のためのものです。
複数のテーブルを指定すると、Caché SQLはこれらのテーブルに対して結合オペレーションを実行
します。テーブル名がコンマで区切られているときは、交差結合が実行されます。テーブル名リスト
に他の結合構文(コンマではなく)を指定すると、別のタイプの結合オペレーションを実行できます。
詳細は、"JOIN" を参照してください。
SQLコンパイラがこれらの結合を実行する方法は、実行時のパフォーマンスに影響する場合があり
ます。このため、Caché SQL には %INORDER と %FULL という 2 つの最適化オプションが用意され
ています。
%INORDER
SQL コンパイラ・オプティマイザは、リストされたテーブル順で結合を実行します。矢印構文で参照
されるテーブルの結合順に制限はありません。インデックスを使用しても影響は受けません。
指定されるテーブル順が外部結合に必要な順番と一致しない場合、–34 エラーである
"%INORDER:FROM order inconsistent with outer join order" が返されます。これを避けるため
に、%INORDER のみを ANSI 形式の左外部結合で使用することをお勧めします。
ビューとテーブル・サブクエリは、FROM 節で指定された順番で処理されます。
• Streamed View : %INORDER は、ビュー内のテーブル処理順に影響を与えません。
• Merged View : %INORDER は、ビューの参照時にビューのテーブルをビューの FROM節順に
処理します。
%FULL
このオプション・キーワードにより、コンパイラ・オプティマイザは、すべての代替結合シーケンスを検
査し、アクセス・パフォーマンスを最大限に引き出します。例えば、ストアド・プロシージャを生成する
場合、コンパイル時間が長くなると最適なアクセス・パフォーマンスを引き出す場合があります。これ
が、コンパイラの既定の最適化です。
FROM 節に矢印構文を使ってアクセスするテーブルがある場合、%INORDER キーワードと %FULL
キーワードの両方を指定すると、順番の制約がないテーブルを作成できます。
FROM 節のサブクエリ
FROM 節ではサブクエリを指定できます。サブクエリは括弧で囲まれます。サブクエリは、JOIN 構
文での使用や AS キーワードを使用したオプションのエイリアス割り当てなども含めて、テーブルと
同様に扱われます。FROM節には、複数のテーブル、ビュー、およびサブクエリを任意の組み合わ
せで含むことができますが、"JOIN" で説明されている JOIN 構文の制約を受けます。
以下の例は、FROM 節のサブクエリを示しています。
172 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT name,regionFROM (SELECT t1.name,t1.state,t2.region FROM Employees AS t1 LEFT OUTER JOIN Regions AS t2 ON t1.state=t2.state)GROUP BY region
関連項目
• SELECT
• JOIN
GETDATE
現在の日付と時刻を返す、汎用日付/時刻関数です。
GETDATE([precision])
引数
オプション—時刻の精度を秒の小数部の桁数として指定します。有効値は
整数の 0 ~ 9 で、既定値は 0 (秒の小数部はなし) です。この既定値は構
成可能です。
precision
概要GETDATEは、引数なしまたはオプションの精度引数で発行できます。時刻は%TimeStamp形式で
返されます。ODBC タイプは TIMESTAMP で、LENGTH は 16、PRECISION は 19 です。
日付と時刻を表す文字列は、以下の形式で返されます。
yyyy-mm-dd hh:mm:ss.ffff
"f" は、秒単位の小数精度を表します。
既定の日付/時刻形式を変更するには、各種日付/時刻オプションでSETOPTIONコマンドを使用
します。
GETDATE は、主に SELECT 文のセレクト・リストや、クエリのWHERE 節で使用されます。レポート
の設計では、GETDATEは、レポートが作成されるたびに、そのときの時刻/日付を印刷するために
使用できます。またGETDATEは、トランザクションが発生した時刻のログ記録など、活動を追跡す
るのに便利です。
GETDATEはフィールドの既定値に使用できます。GETDATEはCURRENT_TIMESTAMPの同義
語で、Sybase や Microsoft SQL Server との互換性を確保するために用意されています。
Caché SQL リファレンス 173
GETDATE
現在の日付と時刻をTIMESTAMPデータ型で返す場合は、CURRENT_TIMESTAMPおよびNOW
関数を使用できます。CURRENT_TIMESTAMPは精度をサポートしますが、NOWはサポートしませ
ん。
現在の日付のみを返すには、CURDATE または CURRENT_DATE を使用します。現在の時刻の
みを返すには、CURRENT_TIME または CURTIME を使用します。これらの関数では、DATE また
は TIME データ型が使用されます。これらの関数は、いずれも精度をサポートしません。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。TIMESTAMP データ型
は、同じ形式で値を格納および表示します。TIME および DATE データ型は $HOROLOG形式の
整数として値を格納し、SQL で表示されるときは日付または時刻表示形式に変換され、埋め込み
SQL から返されるときは整数として返されます。日付および時刻のデータ型は、CAST または
CONVERT 関数を使用して変更できます。
すべての Caché SQL タイムスタンプ関数は、ローカル・タイム・ゾーン設定に依存します。ユニバー
サルな (タイム・ゾーンに依存しない)現在のタイムスタンプを取得するには、Caché ObjectScript の
$ZTIMESTAMP 特殊変数を使用します。
秒の小数部の精度
GETDATE では、小数点以下 9 桁までの精度の値を返すことができます。返される精度の桁数は
precision 引数を使用して設定されます。precision 引数の既定値は、以下の方法で構成できます。
• SET OPTION で TIME_PRECISION オプションを使用します。
• ObjectScript $SYSTEM.SQL.SetDefaultTimePrecision() 関数を呼び出します。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Default time precision for GETDATE(), CURRENT_TIME, and CUR-
RENT_TIMESTAMP] の現在の設定を表示および編集します。
返される小数点以下の桁数の既定値を含めて 0 ~ 9 の整数を指定します。初期の既定値は 0 で
す。実際に返される精度はプラットフォームに依存し、システムで使用可能な精度を超えたprecision
の桁はゼロとして返されます。
例以下の例は、現在の日付と時刻を返します。
SELECT DISTINCT GETDATE() AS DateTimeFROM Sample.Person
以下の例は、2 桁の精度で現在の日付と時刻を返します。
SELECT DISTINCT GETDATE(2) AS DateTimeFROM Sample.Person
以下の埋め込み SQL の例は、ローカル・タイムスタンプ (タイム・ゾーン依存) とユニバーサル・タイ
ムスタンプ (タイム・ゾーン非依存) を比較します。
174 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET b=$ZDATETIME($ZTIMESTAMP,3) &sql(SELECT GETDATE() INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"GetDate is: ",a WRITE !,"ZTimestamp is: ",b }
以下に例を示します。
UPDATE Orders SET LastUpdate = GETDATE() WHERE Orders.OrderNumber=:ord
この例は、Orders テーブルの選択された行の LastUpdate フィールドに、現在のシステム日付と時
刻を設定します。
以下の例では、CREATE TABLE 文は GETDATE を使用して、StartDate フィールドに対して既定
値を設定します。
CREATE TABLE Employees( EmpId INT NOT NULL, LastName CHAR(40) NOT NULL, FirstName CHAR(20) NOT NULL, StartDate TIMESTAMP DEFAULT GETDATE())
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL タイムスタンプ関数:CAST CONVERT CURRENT_TIMESTAMP NOW TIMESTAMPADD
TIMESTAMPDIFF
• SQL 現在の日付/時刻関数 : CURDATE CURRENT_DATE CURRENT_TIME CURTIME
• Caché ObjectScript : $ZDATETIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
Caché SQL リファレンス 175
GETDATE
GRANT
ユーザまたはロールに特権を与えます。
GRANT admin-privilege TO grantee[WITH ADMIN OPTION]
GRANT role TO grantee[WITH ADMIN OPTION]
GRANT object-privilege ON object-list TO grantee[WITH GRANT OPTION]
引数
コンマで区切られた、1つ以上のユーザまたはロールのリスト。有
効な値は、ユーザのリスト、ロールのリスト、"*"、または _PUBLIC
です。アスタリスク (*) は、現在定義されていて %All ロールを持た
ないすべてのユーザを指定します。_PUBLIC キーワードにより、
現在定義されているすべてのユーザと未定義のユーザが指定さ
れます。
grantee
許可されている管理者レベル特権または管理者レベル特権のコ
ンマで区切られたリスト。以下のうち 1つ以上をさまざまな順序で
使用してリストを構成します :
%CREATE_METHOD、%DROP_METHOD、%CREATE_FUNC-
TION、%DROP_FUNCTION、%CREATE_PROCEDURE、%DROP_PRO-
CEDURE、%CREATE_QUERY、%DROP_QUERY、%CRE-
ATE_TABLE、%ALTER_TABLE、%DROP_TABLE、%CRE-
ATE_VIEW、%ALTER_VIEW、%DROP_VIEW、%CREATE_TRIG-
GER、%DROP_TRIGGER
%DB_OBJECT_DEFINITION : 上記の 16 種類の特権をすべて与
えます。
admin-privilege
特権が与えられているロール、またはコンマで区切られたロール
のリスト
role
付与対象の基本レベル特権、または基本レベル特権のコンマで
区切られたリスト。%ALTER、DELETE、SELECT、INSERT、
UPDATE、EXECUTE、および REFERENCES のうち 1 つ以上をさ
まざまな順序で使用してリストを構成できます。"ALL
[PRIVILEGES]" または “*” のどちらかを引数の値として使用し
て、テーブルとビューのすべての特権を与えることもできます。
object-privilege
176 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
object-privilege (複数の場合もあります) が与えられる 1 つ以上
のテーブル、ビュー、またはストアド・プロシージャのコンマで区切
られたリスト。 “*” を使用すると、現在のネームスペース内で非
表示になっていないすべてのストアド・プロシージャへのEXECUTE
特権の付与を指定することができます。
object-list
概要GRANTコマンドは、指定したテーブル、ビュー、またはその他のエンティティ上で指定タスクを実行
する特権を、指定したユーザやロールに与えます。以下の基本操作を実行できます。
• ユーザに特権を与える
• ロールに特権を与える
• ユーザにロールを与える
• ロールにロールを与え、ロールの階層を作成する
ユーザに特権を与える場合は、そのユーザが即座にその特権を行使できます。ロールに特権を与
える場合は、そのロールを与えられたユーザが即座にその特権を行使できます。特権を削除する
と、そのユーザは即座にその特権を失います。特定の特権は、特定のユーザに一度だけ与えれば
よいので効率的です。複数のユーザが同じ特権を1人のユーザに複数回与えることができますが、
1 回の REVOKE でその特権は削除されます。
特権はネームスペースごとに付与されます。
GRANT はすぐに作成および実行され、通常一度しか実行されないため、Caché では、ODBC、
JDBC、またはダイナミック SQL での GRANT にはクエリ・キャッシュは作成されません。* の展開は
GRANT コマンドの実行時に行われます。
GRANT admin-privilege
管理者特権はユーザまたはロールに適用します。特定のオブジェクトに連携していないすべての特
権 (つまりそのユーザやロールの一般特権)は、管理者特権とみなされます。このような特権はネー
ムスペースごとに付与されます。割り当てを受けるように指定されたユーザ(またはロール)が存在し
ない場合、Caché は SQLCODE -118 を発行します。
GRANT role
この形式の GRANT は、指定されたユーザにロールを割り当てます。また、別のロールにロールを
割り当てることもできます。割り当てるように指定されたロールが存在しない場合、CachéはSQLCODE
100 を発行します。割り当てを受けるように指定されたユーザ (またはロール) が存在しない場合、
Caché は SQLCODE -118 を発行します。
ロールは、SQL の GRANT コマンドおよび REVOKE コマンド、または Caché システム・セキュリティ
を使用して付与または削除できます。ただし、Caché システム・セキュリティ では、他のロールに対
Caché SQL リファレンス 177
GRANT
するロールの付与や削除はできず、$ROLES特殊変数を使用してもロールに対して与えられたロー
ルは表示されません。
GRANT object-privilege
オブジェクト特権は、ユーザまたはロールに特定のオブジェクトに対する特権を与えます。テーブル
とビュー、またはそのどちらか一方に特権を与えると、オブジェクト特権になります。%ALTERおよび
DELETE の特権は、テーブルやビューの定義へのアクセス権を与えます。SELECT、INSERT、
UPDATE、およびREFERENCEの各特権は、テーブル・データへのアクセス権を与えます。EXECUTE
特権は、ストアド・プロシージャへのアクセス権を与えます。ALL PRIVILEGES 特権は、テーブルと
ビューのすべての特権を与えますが、EXECUTE 特権は与えません。
注釈: INSERT 特権を与えるには、同じテーブルまたはビューの SELECT 特権も与える必要が
あります。
以下の例は、UPDATE 特権の付与方法を示しています。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER Deborah IDENTIFY BY birdpw) WRITE !,"CREATE USER error code: ",SQLCODE &sql(CREATE TABLE SQLUSER.T1 (Field1 INT, Field2 INT, PRIMARY KEY (Field1))) WRITE !,"CREATE TABLE error code: ",SQLCODE &sql(GRANT UPDATE ON SQLUSER.T1 TO Deborah) WRITE !,"GRANT error code: ",SQLCODE
指定されたオブジェクトが存在しない場合、Caché は SQLCODE -30 を発行します。指定された
ユーザが存在しない場合、Caché は SQLCODE -118 を発行します。指定されたオブジェクト特権
がすでに与えられている場合、Caché は SQLCODE 100 を発行します。
WITH GRANT OPTION 節
オブジェクトの所有者は自動的に、このオブジェクトに関わるすべての特権を維持します。GRANT
文の TO 節は、アクセスが与えられるユーザまたはロールを指定します。grantee を指定する TO
オプションを使用した後は、WITH GRANT OPTION キーワードを任意で指定して、grantee が他の
ユーザに同じ特権を与えることもできます。
例えば、以下のコマンドを使用して、EMPLOYEESテーブルの%ALTER、SELECT、または INSERT
特権を Chris というユーザに与えることができます。
GRANT %ALTER, SELECT, INSERT ON EMPLOYEES TO Chris
Chris に他のユーザに対するこれらの特権を与えることができるようにするために、GRANT コマンド
は WITH GRANT OPTION 句を含みます。
GRANT %ALTER, SELECT, INSERT ON EMPLOYEES TO Chris WITH GRANT OPTION
178 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
%SQLCatalog_SQLUserPrivs() 呼び出しを使用した GRANT 文の結果を見出すことができます。
例えば、以下の GRANT 文を使用した後は、
GRANT %ALTER ON TestTab1Usr1 TO PUBLIC WITH GRANT OPTION
GRANT SELECT ON TestTab2Usr1 TO PUBLIC
%SQLCatalog_SQLUserPrivs('_PUBLIC') への呼び出しは、以下の結果セットを返します。
"TABLE_TYPE", "TABLE_NAME", "PRIVILEGE", "GRANTED_BY", "GRANT_OPTION""TABLE", "TestTab1Usr1", "%ALTER", "_SYSTEM", "Yes""TABLE", "TestTab2Usr1", "SELECT", "_SYSTEM", "No"
GRANT_OPTION (最初の行の最後のフィールド) の "Yes" は、WITH GRANT OPTION の使用を
指示しています。
WITH ADMIN OPTION 節
WITH ADMIN OPTION 節が grantee に特権を与えると、grantee は自分が与えられたのと同じ特
権を他のユーザに与える権利を持つことになります。システム特権を与えるには、そのユーザが
WITH ADMIN OPTION でシステム特権を与えられている必要があります。
ユーザがロールを与えることができるのは、自分に WITH ADMIN OPTION でそのロールが与えら
れているか、%Admin/Secure:"U" 特権を持っている場合です。
WITH ADMIN OPTIONでの特権の付与は、同じ特権のこのオプションなしでの前回の付与に置き
換わります。したがって、ユーザに WITH ADMIN OPTION なしで特権を与え、次に同じ特権を
WITH ADMIN OPTION 付きで同じユーザに与えると、そのユーザは WITH ADMIN OPTION 権
限を保有します。一方、WITH ADMIN OPTIONなしでの付与は、同じ特権のこのオプション付きで
の前回の付与に置き換わりません。特権から WITH ADMIN OPTION 権限を削除するには、その
特権を削除して、この節なしで同じ特権を再度与える必要があります。
Caché 5.1 セキュリティ
バージョン 5.1 以降では、GRANT は、%GRANT_ANY_PRIVILEGE、%CRE-
ATE_USER、%ALTER_USER、%DROP_USER、%CRE-
ATE_ROLE、%GRANT_ANY_ROLE、%DROP_ANY_ROLEの一般的な管理者特権はサポートされな
くなりました。これらの特権の管理は、SQL を介してではなく、システム・レベルで処理されます。こ
れらの SQL特権は以前のバージョンの Caché で使用可能であり、既存のコード内で使用されてい
る場合があります。このような特権のいずれかをユーザに与えようとすると、実行はできますが、特権
が与えられるのではなく、その名前のロールが与えられます。
GRANT コマンドは特権を必要とする操作です。埋め込み SQL 内で GRANT を使用する前に、適
切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE –99 エ
ラー (特権違反) が返されます。$SYSTEM.Security.Login メソッドを使用して、以下のようにユーザ
に適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
Caché SQL リファレンス 179
GRANT
特権の強制
特権の強制は、以下に示すような [SQL Security Enabled] 構成オプションの設定によって決まりま
す。
• ObjectScript $SYSTEM.SQL.SetSQLSecurity() 関数を呼び出します。現在の設定を確認する
には、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[SQL ON:]の
設定が表示されます。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[SQL Security Enabled] の現在の設定を表示します。
既定値は “真” (1) です。 “真” の場合、自分に特権を与えられているアクションのみユーザは実
行できます。この設定を推奨します。
このオプションが “偽” (0) に設定されている場合、SQL セキュリティは無効になります。つまり、特
権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しな
くてもテーブルの作成が可能になります。この場合、SQL マネージャはユーザとして "_SYSTEM"
を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブ
ルやビューに対してアクションを実行することができます。
例以下の例は、ユーザとロールを作成してからそのロールをユーザに割り当てます。ユーザがすでに
存在する場合は、SQLCODE = -118が発行されます。ロールがすでに存在する場合は、SQLCODE
= -104 が発行されます。特権またはロールがすでに割り当てられている場合は、SQLCODE は発
行されません (SQLCODE = 0)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER User1 IDENTIFY BY fredpw) WRITE !,"CREATE USER error code: ",SQLCODE &sql(CREATE ROLE workerbee) WRITE !,"CREATE ROLE error code: ",SQLCODE &sql(GRANT %CREATE_TABLE TO workerbee) WRITE !,"GRANT privilege error code: ",SQLCODE &sql(GRANT workerbee TO User1) WRITE !,"GRANT role error code: ",SQLCODE
以下の例は、ユーザを作成し区切り識別子を持つロールを作成してから、そのロールをユーザに割
り当てます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER User1 IDENTIFY BY fredpw) WRITE !,"CREATE USER error code: ",SQLCODE &sql(SET OPTION SUPPORT_DELIMITED_IDENTIFIERS=true) WRITE !,"SET OPTION error code: ",SQLCODE &sql(GRANT "%DB/USER" TO User1) WRITE !,"GRANT role error code: ",SQLCODE
関連項目
• %CHECKPRIV REVOKE
180 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• ユーザ CREATE USER CREATE ROLE
• CREATE FUNCTION CREATE METHOD CREATE PROCEDURE CREATE QUERY
• CREATE TABLE CREATE VIEW CREATE TRIGGER
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
GROUP BY
1 つ以上の列に基づいて、クエリの結果行をグループ化する SELECT 節です。
SELECT ...GROUP BY field
引数
検索されたデータから 1 つ以上のフィールドが、通
常はコンマ区切りのリストとして指定されます。
field
概要GROUP BY は SELECT 文の節です。オプションの GROUP BY 節は、FROM 節とオプションの
WHERE 節の後、オプションの HAVING 節と ORDER BY 節の前に記述されます。
GROUP BY 節はクエリの結果行を受け取り、単独または複数のデータベース列によって結果行を
個別のグループに分割します。SELECT を GROUP BY と併用するとき、GROUP BY フィールドの
個別の各値に対して、1 行が取り出されます。GROUP BY 節は概念的には Caché の拡張である
%FOREACH と似ていますが、%FOREACH はクエリ全体の母集団を制約することなく、サブ母集団
で集約の選択ができるのに対し、GROUP BY はクエリ全体で実行します。
GROUP BY 節を含むクエリでは、READ COMMITTED 分離レベルはサポートされていません。
READ COMMITTED として定義されたトランザクションでは、GROUP BY節がない SELECT文は、
コミットされている変更データのみを返します。つまり、このような文は現在のトランザクションの前の
データの状態を返します。GROUP BY 節のある SELECT 文は、コミットされているかどうかに関係
なく、実行されたすべての変更データを返します。
関連項目
• SELECT
• JOIN
Caché SQL リファレンス 181
GROUP BY
HAVING
1 つ以上の制限条件を指定する SELECT 節です。
SELECT fieldsFROM tableHAVING condition-expression
SELECT aggregatefunc(field %AFTERHAVING)FROM tableWHERE condition-expression
引数
検索するデータにパラメータを指定する修飾子。condition-expression
概要オプションの HAVING 節は、FROM 節とオプションの WHERE 節および GROUP BY 節の後、オ
プションの ORDER BY 節の前に記述されます。
SELECT 文の HAVING 節は、クエリで選択された特定の行の適格/不適格を決めます。適格な行
とは、condition-expression が真である行です。condition-expression は、AND、OR、および NOT
演算子によってリンク可能な論理テスト (述語) のリストです。
HAVING 節は、データ・セット全体ではなく、グループに対して処理を実行できる WHERE 節に似
ています。そのため、ほとんどの場合、HAVING節は、%AFTERHAVINGキーワードとともに使用す
るか、GROUP BY 節と組み合わせて使用されます。詳細は、"WHERE" 節を参照してください。
HAVING 節は、サブ母集団の集約と、全体の母集団の集約とを頻繁に比較します。
%AFTERHAVING%AFTERHAVING キーワードは集約関数とともに使用して、HAVING 条件の適用後に、集約演算
を実行することを指定できます。
SELECT Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person HAVING Age > 40 ORDER BY Age
SELECT DISTINCT Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person HAVING Age > 40 ORDER BY Age
182 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT DISTINCT Age,LIST(Age) AS AllAges, LIST(Age %AFTERHAVING) AS AllOlder FROM Sample.Person HAVING Age > 55 ORDER BY Age
論理述語SQL の述語は以下のカテゴリに分類されます。
• 比較述語
• BETWEEN 述語
• LIKE 述語
• NULL 述語
• IN 述語
• EXISTS 述語
比較述語
以下は、使用できる比較述語です。
SQL 比較述語
処理述語
等しい=
等しくない<>
より大きい>
より小さい<
以上>=
以下<=
以下の例は、比較述語を使用しています。21 より小さい Age ごとに 1 つのレコードが返されます。
SELECT Name, Age FROM Sample.PersonGROUP BY AgeHAVING Age < 21ORDER BY Age
Caché の %STARTSWITH 拡張も利用できるので、部分的一致も実行できます。以下の例
は、%STARTSWITH を使用します。2 で始まる Age ごとに 1 つのレコードが返されます。
Caché SQL リファレンス 183
HAVING
SELECT Name, Age FROM Sample.PersonGROUP BY AgeHAVING Age %STARTSWITH '2'ORDER BY Age
SQL は照合 (値がソートされる順番) という点から比較演算子を定義します。まったく同様の方法で
照合する場合の 2 つの値は等しくなります。2 つ目の値の後に照合される場合、値は別の値よりも
大きくなります。例えば、文字列値に対する既定照合は大文字と小文字を区別しません。以下はそ
の例です。
値式
真'AAA' = 'AAA'
真'AAA' = 'aaa'
真'AAA' = 'Aaa'
真'BBB' > 'aaa'
BETWEEN 述語
これは、「以上」と「以下」の組み合わせと同じ働きをします。以下の例は、BETWEEN述語を使用し
ています。18 と 35 を含む、18 から 35 までの Age ごとに 1 つのレコードが返されます。
SELECT Name, Age FROM Sample.PersonGROUP BY AgeHAVING Age BETWEEN 18 AND 35ORDER BY Age
LIKE 述語
これにより、以下のワイルドカード文字を使用してパターン・マッチングを実行できます。
LIKE ワイルドカード文字
以下と一致文字
単独の文字“_”
0 文字以上の文字のシーケンス“%”
以下はその例です。
SELECT Name, Address FROM Sample.VendorGROUP BY NameHAVING Name LIKE '%Com%'
文字列 'Com' を含む企業名ごとに 1 つのレコードが返されます。
LIKE比較演算子は、大文字と小文字を区別します。上記の例で'com'のような文字列を受け入れ
るには、%SQLUPPER を使用します。
184 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT Name, Address FROM Sample.VendorGROUP BY NameHAVING %SQLUPPER(Name) LIKE '%COM%'
注釈: LIKE は照合を使用しません。
LIKE ESCAPEは、LIKE述語のエスケープ文字として任意の 1文字の定義をサポートします。この
エスケープ文字は、直後の文字をワイルドカードやフォーマッティング文字ではなくリテラル文字とし
て解釈するよう指示します。以下の例では、LIKE ESCAPE を使用して '%_' の値を返しています。
SELECT * FROM MyTableHAVING symbol_field LIKE '#%#_' ESCAPE '#'
NULL 述語
定義されていない値を検出します。すべてのNULL値またはすべてのNULLでない値を検出でき
ます。
SELECT Name, FavoriteColors FROM Sample.PersonHAVING FavoriteColors IS NULL
SELECT Name, FavoriteColors FROM Sample.PersonHAVING FavoriteColors IS NOT NULL ORDER BY FavoriteColors
GROUP BY 節を使用すると、指定されたフィールドの NULL でない値ごとに 1 つのレコードを取り
出すことができます。
SELECT Name, FavoriteColors FROM Sample.PersonGROUP BY FavoriteColorsHAVING FavoriteColors IS NOT NULL ORDER BY FavoriteColors
IN 述語
IN には 2 つの形式があります。1 つ目は、OR 演算子で複数の等値比較を結合する省略表現とし
て使用します。以下はその例です。
SELECT Name, Home_State FROM Sample.PersonGROUP BY Home_StateHAVING Home_State IN ('ME','NH','VT','MA','RI','CT')
上記の文は、stateが括弧のリスト内の値と等しい場合、真と評価します。リストの要素は定数または
式を指定できます。等式テストと同様に、照合が IN 比較に適用されます。
IN 述語の等値比較に日付または時刻を使用すると、適切なデータ型変換が自動的に実行されま
す。HAVING 節フィールドが TimeStamp 型の場合、Date 型または Time 型の値は Timestamp に
変換されます。HAVING 節フィールドが Date 型の場合、TimeStamp 型または String 型の値は
Date に変換されます。HAVING 節フィールドが Time 型の場合、TimeStamp 型または String 型の
値は Time に変換されます。
Caché SQL リファレンス 185
HAVING
以下の 2 つの例は、同じ等値比較を実行し、同じデータを返します。GROUP BY フィールドは、成
功した等値比較ごとに 1 つのレコードのみを返すことを指定しています。DOB フィールドは Date
データ型です。
SELECT Name,DOB FROM Sample.Person GROUP BY DOBHAVING DOB IN ({d '1951-02-02'},{d '1987-02-28'})
SELECT Name,DOB FROM Sample.PersonGROUP BY DOBHAVING DOB IN ({ts '1951-02-02 02:37:00'},{ts '1987-02-28 16:58:10'})
詳細は、"日付/時刻文" を参照してください。
サブクエリで IN を使用し、列の値 (あるいは他の式) がサブクエリの行の値と等しいかどうかをテス
トできます。以下はその例です。
SELECT Name,Home_State FROM Sample.PersonHAVING Name IN (SELECT Name FROM Sample.Employee HAVING Salary < 50000)
サブクエリは、SELECT リスト内に必ず 1 項目を持ちます。
EXISTS 述語
サブクエリが空のセットを評価するかどうかをテストするために、サブクエリを使用して処理します。
SELECT t1.disease FROM illness_tab t1 WHERE EXISTS (SELECT t2.disease FROM disease_registry t2 WHERE t1.disease = t2.disease HAVING COUNT(t2.disease) > 100)
例
SELECT Name,Salary,AVG(Salary) AS AvgPay, AVG(Salary %AFTERHAVING) AS AvgTopPay FROM Sample.Employee WHERE Home_City = 'Boston' HAVING Salary > AVG(Salary)
このクエリは、Boston の全従業員の名前や平均給与と、同じく Boston で給与が平均以上である従
業員の給与の平均を検索します。
関連項目
• SELECT WHERE 節 GROUP BY 節
• クエリ
186 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
HOUR
与えられた日付/時刻式内で時間の構成要素に対応する0から23までの整数値を返す、スカラ日
付/時間関数です。
{fn HOUR(time-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。基本となるデータ型は、TIME または
TIMESTAMP とすることができます。
time-expression
概要HOUR は、時刻整数または日付/時刻文字列の時間部分を返します。日付/時刻文字列は、以下
の形式で指定します。
yyyy-mm-dd hh:mm:ss
この既定の時刻形式を変更するには、SET OPTION コマンドを使用します。
時間は 24 時間法で表されます。時間 (hh) 部分は、0 から 23 までの範囲の整数でなければなりま
せん。ただし、ユーザの指定値に対して、範囲チェックは行われません。23よりも大きな数、負の数、
および小数は、指定されたとおりに返されます。入力では、先頭のゼロはオプションです。出力で
は、先頭と末尾のゼロは抑制されます。
時間部分が '0'、'00'、または数値でない値の場合、HOURはゼロを返します。また、時刻文字列の
時間部分が完全に省略されている場合 (':mm:ss' または '::ss') や時刻式が指定されていない場合
も、ゼロ時が返されます。
DATEPART または DATENAME を使用して、同じ時刻情報を取得できます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.ABS(numeric-expression)
例以下の 2 つの例は、time-expression 値が 18:45:38 なので、ともに数値 18 を返します。
SELECT DISTINCT {fn HOUR('2000-02-16 18:45:38')} AS Hour_GivenFROM Sample.Person
SELECT DISTINCT {fn HOUR(67538)} AS Hour_GivenFROM Sample.Person
Caché SQL リファレンス 187
HOUR
以下の例は、日付/時刻文字列の時刻部分が省略されているので、ゼロ時を返します。
SELECT DISTINCT {fn HOUR('2000-02-16')} AS Hour_GivenFROM Sample.Person
以下の例は、すべて現在の時刻の時間部分を返します。CURRENT_TIME と CURTIME は時刻文
字列を返し、NOW は日付/時刻文字列を返します。
SELECT DISTINCT {fn HOUR(CURRENT_TIME)} AS Hour_NowFROM Sample.Person
SELECT DISTINCT {fn HOUR({fn CURTIME()})} AS Hour_NowFROM Sample.Person
SELECT DISTINCT {fn HOUR({fn NOW()})} AS Hour_NowFROM Sample.Person
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL 関数 : MINUTE SECOND CURRENT_TIME CURTIME NOW DATEPART DATENAME
• Caché ObjectScript : $ZTIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
IFNULL
NULL テストを行い、適切な式を返す汎用スカラ関数です。
IFNULL (expression-1,expression-2,expression-3){fn IFNULL(expression-1,expression-2)}
引数
NULL であるかどうか評価される式。expression-1
expression-1 が NULL の場合に返される式。expression-2
オプション — expression-1 が NULL でない場合に返される式。
expression-3 が指定されないで expression-1 が NULL でない場合、
NULL 値が返されます。
expression-3
概要Caché は IFNULL を SQL 汎用関数と ODBC スカラ関数の両方としてサポートしています。双方は
大変よく似た処理を実行しますが、機能上は異なります。SQL 汎用関数は、3 つの引数をサポート
します。ODBC スカラ関数は、2 つの引数をサポートします。
188 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SQL 汎用関数は expression-1 を評価し、以下の 3 つの値のいずれかを返します。
• expression-1 が NULL の場合は、expression-2 を返します。
• expression-1 が NULL でない場合は、expression-3 を返します。
• expression-1 が NULL でなく、expression-3 が指定されていない場合は、NULL を返します。
ODBC スカラ関数は expression-1 を評価し、以下の 2 つの値のいずれかを返します。
• expression-1 が NULL の場合は、expression-2 を返します。
• expression-1 が NULL でない場合は、expression-1 を返します。
expression-2 と expression-3 に使用するデータ型は、expression-1 のデータ型と互換性がなけれ
ばなりません。DISPLAY モードまたは ODBC モードで返されるデータ型は、expression-2 のデー
タ型によって決まります。
注釈: 2 つの引数の汎用関数と ODBC スカラ関数の機能は同じではありません。例にあるよう
に、両者は異なる値を返します。
以下の表は、さまざまな SQL 比較関数を示します。比較テストが真 (A は B と等しい) の場合、各
関数は特定の値を返し、偽 (A は B と等しくない) の場合、別の値を返します。
返り値比較テストSQL 関数
真 = NULL
偽 = 式 1
式 1 = 式 2NULLIF
真 = 式 2
偽 = NULL
式 1 = NULLIFNULL (2-引数形式)
真 = 式 2
偽 = 式 1
式 1 = NULLISNULL
真 = 式 2
偽 = 式 1
式 1 = NULLNVL
真 = 式 2
偽 = 式 3
式 1 = NULLIFNULL (3-引数形式)
Caché SQL リファレンス 189
IFNULL
例以下の例は、FavoriteColors が NULLの場合は文字列 'No Preference' を返し、そうでない場合は
NULL を返します。
SELECT Name,IFNULL(FavoriteColors,'No Preference') AS ColorPrefFROM Sample.Person
以下の例では、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合
は FavoriteColors の値を返します。
SELECT Name,IFNULL(FavoriteColors,'No Preference',FavoriteColors) AS ColorPrefFROM Sample.Person
以下の例は、FavoriteColors が NULLの場合は文字列 'No Preference' を返し、そうでない場合は
文字列 'Preference' を返します。
SELECT Name,IFNULL(FavoriteColors,'No Preference','Preference') AS ColorPrefFROM Sample.Person
以下の ODBC 例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでな
い場合はそのデータ値を返します。
SELECT Name,{fn IFNULL(FavoriteColors,'No Preference')} AS ColorsFROM Sample.Person
以下の汎用関数と ODBC スカラ関数の例は、最初の式が NULL なので、ともに 2 番目の式 (99)
を返します。
SELECT DISTINCT {fn IFNULL(NULL,99)}AS NullTestFROM Sample.Person
SELECT DISTINCT IFNULL(NULL,99) AS NullTestFROM Sample.Person
以下の汎用関数と ODBC スカラ関数の例は、異なる値を返します。ODBC の例は、最初の式が
NULL ではないので、最初の式 (33) を返します。
SELECT DISTINCT {fn IFNULL(33,99)}AS NullTestFROM Sample.Person
この例を以下の汎用関数の例と比較してください。以下の例は、最初の式がNULLではないので、
<null> を返します。
SELECT DISTINCT IFNULL(33,99) AS NullTestFROM Sample.Person
190 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目ISNULL NVL
INSERT
テーブルに 1 行以上の新しい行を追加します。
INSERT [restriction] INTO tableDEFAULT VALUES |[(columnlist)] VALUES (valuelist) |[(columnlist)] VALUES host-variable |[(columnlist)] query |SET column1=value1 {,column2=value2, . . . }
引数
オプション — キーワード
%NOLOCK、%NOCHECK、%NOINDEX、%NOTRIGGER
のうちの 1 つ、またはこれらのキーワードのコン
マで区切られたリスト。
restriction
挿入を実行するテーブルまたはビューの名前。table
オプション—列名のコンマ区切りのリスト。値のリ
ストに対応した順序で指定します。省略した場合、
値のリストは列番号順にすべての列に適用され
ます。
columnlist
対応する columnlist の各フィールドのデータ値を
指定するコンマ区切りのスカラ式のリスト。
valuelist
対応する columnlist の各フィールドのデータ値を
指定するホスト変数 (以下の例を参照)。
host-variable
対応する columnlist の各フィールドに 1 行以上
の行のデータ値を指定する、クエリの結果セット。
query
1 つの列名。この列のデータ値として、等号で対
になっている value が設定されます。
column
対になった列の値のソースとなるスカラ式。value
概要INSERT 文には以下の 2 つの使用方法があります。
Caché SQL リファレンス 191
INSERT
• INSERT では、新しい 1 行のデータ値をテーブルに挿入できます。
• SELECT 付きの INSERT では、新しい複数の行のデータ値をテーブルに挿入できます。
INSERT 文は、テーブルに新しい行を 1 行追加します。
SELECT 文と組み合わせた INSERT 文では、テーブルに複数の新しい行を挿入できます。このテ
クニックは一般に、あるテーブルに他のテーブルから抽出した既存のデータを追加する場合に使用
されます。このような INSERTの使用方法は、以下の "INSERT クエリ結果"のセクションで説明され
ています。
テーブルには、直接挿入することも、ビュー経由で挿入することもできます。ビュー経由で挿入する
場合は、CREATE VIEW で説明されているように、必要条件や制限事項に従います。
INSERTは、全か無かのイベントです。行がすべて挿入されるか、まったく挿入されないかのいずれ
かです。Caché は、SQLCODE ステータス変数を返し、INSERT の成功もしくは失敗を示します。
テーブルに行を挿入するには、以下の条件を満たしている必要があります。
• テーブル名が存在している必要があります。存在しないテーブルに対して挿入を実行すると、
SQLCODE -30 エラーが返されます。
• テーブルに対する INSERT特権と SELECT特権の両方が必要です。これらの特権を持ってい
ないと SQLCODE -99 (特権違反) エラーになります。詳細は、"GRANT" コマンドを参照してく
ださい。
• テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照する
INSERT をコンパイルすると、SQLCODE -115 エラーが発生します。このエラーは実行時にの
み発生するのではなく、コンパイル時にも発生するようになったことに注意してください。"Caché
オブジェクトの使用法" の "オブジェクトの永続性" の章で READONLY オブジェクトの説明を
参照してください。
• ビュー経由でテーブルを更新する場合、ビューをWITH READ ONLY として定義することはで
きません。これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"CREATE
VIEW" コマンドを参照してください。
• すべての必須フィールドが挿入処理に指定されている必要があります。必須フィールドの値を
指定せずに行を挿入すると、SQLCODE -108 エラーが返されます。
• 挿入に READONLY として定義されているフィールドを含めることはできません。読み取り専用
フィールドを参照する INSERTをコンパイルすると、SQLCODE -138エラーが発生します。この
エラーは実行時にのみ発生するのではなく、コンパイル時にも発生するようになったことに注意
してください。
• システム生成値のみが格納される、RowID、IDKey、IDENTITY などのフィールドを挿入対象に
含めることはできません。これらのフィールドのいずれかに非NULLフィールド値を挿入すると、
SQLCODE -111 エラーが返されます。これらのフィールドのいずれかに NULL を挿入すると、
Caché はその NULL をシステム生成値でオーバーライドします。したがって、挿入処理は成功
し、エラー・コードは発行されません。
192 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• 各フィールドの値が有効な値である必要があります。無効なフィールド値を挿入すると、SQLCODE
-104 エラーが返されます。
• すべてのフィールド値がすべてのフィールド制約に合格する必要があります。例えば、一意制
約のあるフィールドに重複フィールド値を挿入すると、SQLCODE -119 エラーが返されます。
列のリストを省略すると、INSERT は、すべての列が列番号順で挿入されるものと判断します。列の
リストを指定すると、個々の値は、列のリスト内の列の名前と位置的に一致する必要があります。
INSERT オペレーションは、%ROWCOUNT 変数を、影響を受けた行の数に設定します (必ず 0 ま
たは 1 のどちらか)。
INSERT DEFAULT VALUES
フィールド値がすべてそのフィールドの既定値に設定されているかNULL値に設定されている行を
テーブルに挿入できます。これには、以下のコマンドを使用します。
INSERT INTO Mytable DEFAULT VALUES
制限引数
restriction 引数を指定すると、以下のように処理を制限します。
• %NOCHECK — 外部キーの参照整合性チェックは実行されません。ビュー経由で INSERT を
実行する際、ビューの WITH CHECK OPTION 検証は実行されません。
• %NOLOCK — INSERT 時に行をロックしません。単独のユーザ/処理がデータベースを更新す
る際にのみ使用します。
• %NOINDEX — インデックス・マップは INSERT 処理中には設定されません。
• %NOTRIGGER — ベース・テーブル・トリガは INSERT 処理中にはかかりません。
参照整合性
%NOCHECK を指定しない場合、Caché ではシステム構成設定を使用して外部キーの参照整合性
チェックを実行するかどうかが決まります。システムの既定値は以下のように設定できます。
• ObjectScript $SYSTEM.SQL.SetFilerRefIntegrity() 関数を呼び出します。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Perform Referential Integrity Checks on Foreign Keys for INSERT,
UPDATE, and DELETE] の現在の設定を表示および編集します。既定は “true” です。
INSERT 操作時に、すべての外部キー参照について、参照されるテーブルの該当する行に対する
共有ロックが取得されます。この行は、トランザクションの終了までロックされています。これにより、
参照されている行は、INSERT の参照整合性チェックからトランザクションの終了までの間、変更さ
れないことが保証されます。
Caché SQL リファレンス 193
INSERT
ストリーム・データの INSERT
ストリーム・フィールドには以下のタイプのデータ値を挿入できます。
• 数値リテラル。
• 文字列リテラル。ただし、文字列リテラルはオブジェクト参照 (oref) 文字列表現の形式をとるこ
とはできません。例えば、値 [email protected] は文字列リテラルではなく、文字列版の oref
とみなされます。
• 一時的なストリームの文字列版 oref。この文字列の oref は、%qstrhandle(%qacn) 配列内の 1つ
の配列エントリとして存在している必要があります。文字列の oref は配列の添え字でなければ
ならず、oref の値自体がデータ内に存在している必要があります。
詳細は、以下の埋め込み SQL の例を参照してください。
SET oref=##class(User.MyStream).%OpenId(1) SET %qstrhandle(1,oref)=oref SET InputValue=oref_"" &sql(INSERT INTO MyStreamTable (MyStreamField) VALUES (:InputValue))
%qstrhandle の最初の添え字の値は、ローカル変数 %qacn です。上記のケースでは、%qacn は
未定義で、既定で 1 となります。そのため、%qstrhandle 配列は以下のようにも設定できます。
SET oref=##class(User.MyStream).%OpenId(1) SET %qacn=2 SET %qstrhandle(%qacn,oref)=oref
適切に定義されていないストリーム値を挿入すると、SQLCODE -412 エラー : "
" が返されます。
INSERT クエリ結果
SELECT文との組み合わせにより、1 つの INSERT を使用して複数の行をテーブルに挿入すること
ができます。SELECTが1つのテーブルの複数の行から列データを抽出し、INSERTがこの列デー
タを格納した新しい対応する行を別のテーブル内に作成します。
以下の例では、2 つの埋め込み SQL プログラムを使用して INSERT のこの使用方法を示します。
最初の例で新しいテーブルSample.Studentsを作成し、2番目の例でこのテーブルにSample.Person
から抽出したデータを追加します。
この動作をはっきり示すために、2 つの埋め込み SQL プログラムは示されている順序で実行してく
ださい (埋め込み SQL では参照されるテーブルがすでに存在していなければ INSERT 文をコンパ
イルすることができないため、ここでは2つの埋め込みSQLプログラムを使用する必要があります)。
194 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
WRITE !,"starting up" &sql(CREATE TABLE Sample.Students ( StudentName VARCHAR(16), StudentAge INTEGER)) IF SQLCODE=0 { WRITE !,"Created table, SQLCODE=",SQLCODE } ELSEIF SQLCODE=-201 { WRITE !,"Table already exists, SQLCODE=",SQLCODE }
WRITE !,"inserting data" &sql(INSERT INTO Sample.Students (StudentName,StudentAge) SELECT Name,Age FROM Sample.Person WHERE Age <= '21') IF SQLCODE=0 { WRITE !,"Inserted record, SQLCODE=",SQLCODE } ELSE { WRITE !,"Insert failed, SQLCODE=",SQLCODE }
データを表示するには、システム管理ポータルで SAMPLES ネームスペースの [グローバル] オプ
ションを選択します。"Sample.StudentD" までスクロールし、[データ] オプションをクリックします。
INSERT クエリ結果の操作はアトミック処理です。指定された行がすべてテーブルに挿入されるか、
1 行も挿入されないかのいずれかです。例えば、指定された行のいずれかの挿入が外部キーの参
照整合性に違反する場合、INSERT は失敗し、1 行も挿入されません。
トランザクションでのロック
%NOLOCK を指定しない場合、Caché は、INSERT、UPDATE、および DELETE 操作時に標準の
ロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。
既定のロックしきい値は、テーブルごとに 1000 ロックです。つまり、トランザクション時に 1000 行を
超える行(一意フィールド値)をテーブルに挿入する場合は、ロックしきい値に到達し、Cachéはロッ
ク・レベルを自動的に一意フィールド値ロックからテーブル・ロックへと上げます。これによってトラン
ザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な挿入を実行できます。こ
のロックしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの "SQL の
概念" の "トランザクション" を参照してください。
例以下の埋め込み SQL の例は、Name、DOB、SSN の 3 つのフィールド値を持つ行を挿入します。
&sql(INSERT INTO Sample.Person (Name,DOB,SSN) VALUES ('David Vanderbilt', 46639,'123-45-6789')) WRITE !,"Error code=",SQLCODE,!,"Row count=",%ROWCOUNT
ホスト変数構文では、INSERT に値の配列を渡すために、最後の添え字が未定義の変数参照を使
用できます。以下はその例です。
&sql(INSERT INTO Sample.Employee VALUES :emp("profile",)) WRITE !,"SQL Error code: ",SQLCODE," Row Count: ",%ROWCOUNT
これは、挿入された "Employee" 行の各フィールドを以下のように設定します。
emp("profile",col)
Caché SQL リファレンス 195
INSERT
ここでの "col" は、Sample.Employee テーブル内のフィールド列番号です。
以下の例は、SELECTクエリの結果によって複数行のデータを指定し、これを INSERT文への入力
データとして使用する方法を示しています。
INSERT INTO StudentRoster (NAME,GPA,ID_NUM) SELECT FullName,GradeAvg,ID FROM temp WHERE SchoolYear = '2004'
関連項目ALTER TABLE CREATE TABLE DROP TABLE JOIN SELECT テーブル UPDATE VALUES
%INTERNAL
LOGICAL 形式の式を返す汎用形式変換関数です。
%INTERNAL(expression)
%INTERNAL expression
引数
変換される式。expression
概要%INTERNAL は、expression を LOGICAL 形式に変換します。これは、DISPLAY や ODBC 形式を
オーバーライドするのに使用されます。LOGICAL形式は、データのメモリ内形式です(処理が実行
される形式)。
%INTERNAL は、Caché SQL の拡張です。
例以下の例は、同じフィールドの内部形式と外部形式を示します。%EXTERNAL形式は、既定の表示
形式と同じであることに注意してください。
この例では、内部形式はエンコードされたリストです。
SELECT FavoriteColors,%INTERNAL(FavoriteColors) AS InternalVal,%EXTERNAL(FavoriteColors) AS ExternalValFROM Sample.Person
この例では、Date of Birth (DOB) の内部形式は Caché $HOROLOG カウンタです。
SELECT DOB,%INTERNAL(DOB) AS InternalVal,%EXTERNAL(DOB) AS ExternalValFROM Sample.Person
196 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目%EXTERNAL %ODBCIN %ODBCOUT
INTO
選択された値をホスト変数に格納するように指定する SELECT 節です。
INTO :var1 [,:var2]...
引数
ホスト言語で宣言されたホスト変数です。INTO節内で指定すると、変数名の前に
コロン (:) が付きます。複数の変数は、コンマ区切りのリストとして指定できます。
添え字付き変数が使用できます。
:var1
概要SELECT 文の INTO 節は、SELECT によって取得された (あるいは計算された) フィールド値を使
用して一連の対応するホスト変数を設定します。このオプションの INTO 節は、select-item リストの
後、FROM 節の前に表示されます。
注釈: INTO 節とホスト変数は、埋め込み SQL内でのみ使用されます。ホスト変数は、ダイナミッ
ク SQL では使用されません。ダイナミック SQL では、出力変数と同様の機能が
%Library.ResultSet によって用意されています。
ホスト変数と INTO 節を使用するときには、以下の規則が適用されます。
• ホスト言語が変数のデータ型を宣言する場合、すべてのホスト変数は SELECT 文を呼び出す
前にホスト言語で宣言される必要があります。取得したフィールド値のデータ型は、ホスト変数
の宣言と一致する必要があります (Caché ObjectScript では変数にデータ型を宣言しません)。
• INTO節内のホスト変数の数は、select-item リスト内で指定されたフィールドの数と一致する必
要があります。選択したフィールドの数とホスト変数の数が異なる場合、SQL は "cardinality
mismatch" エラーを返します。
• 選択したフィールドとホスト変数は、相対的な位置によって一致させます。したがって、これらの
2 つのリスト内の対応する項目は同じシーケンスで表示される必要があります。
• ホスト変数には単一の値のみを含めることができます。したがって、埋め込みSQL内のSELECT
では1行のデータのみが取得されます。既定では、この行はテーブルの最初の行になります。
WHERE節で一意のデータ値を指定することにより、特定の行を選択することができます。集約
値 (count、sum、average など) を返す SELECT は、単一の値も返します。
INTO 節を指定する場合、SQL は選択したフィールド値を表示しません。
Caché SQL リファレンス 197
INTO
包含するプログラムのホスト変数値の使用に関する重要な制限事項の詳細は、"ホスト変数"を参照
してください。
例以下の例は、Caché ObjectScript プログラム内で埋め込み SQL を使用します。SQL は、テーブル
の最初のレコードから 3 フィールドを選択し (埋め込み SQL は常に 1 つのレコードを取得します)、
INTO を使用して 3 つの対応するホスト変数を設定します。これらの変数は Caché ObjectScript
WRITE コマンドによって使用されます。SQLCODE 変数を埋め込み SQL から返されるときに直ち
にテストできるので、プログラミングをする上で便利です。
NEW SQLCODE WRITE !,"Going to get the first record" &sql(SELECT Home_State, Name, Age INTO :state, :name, :age FROM Sample.Person) IF SQLCODE=0 { WRITE !," Name=",name WRITE !," Age=",age WRITE !," Home State=",state } ELSE { WRITE !,"SQL error ",SQLCODE }
以下の埋め込み SQL の例は、ホスト変数 (today) を SELECT 文に渡します。計算結果は INTO
節変数値 (:tomorrow) になります。このホスト変数値は、包含するプログラムに渡されます。
SET today=$HOROLOG &sql(SELECT :today+1 INTO :tomorrow FROM Sample.Person) IF SQLCODE=0 { WRITE !,"Tomorrow is: ",$ZDATE(tomorrow) } ELSE { WRITE !,"SQL error ",SQLCODE }
入力および出力ホスト変数値の使用に関する制限事項の詳細は、"ホスト変数" を参照してくださ
い。
以下の例は、Caché ObjectScript プログラム内で埋め込み SQL を使用して 2 つのテーブルのレ
コードをカウントします。SQLはCOUNT集約関数を使用してレコードをカウントし、INTO節を指定
して各カウントに添え字付き変数を設定します。これらの変数はCaché ObjectScript WRITE コマン
ドによって使用されます。
WRITE !,"Counting the records" &sql(SELECT COUNT(*) INTO :total(1) FROM Sample.Person) &sql(SELECT COUNT(*) INTO :total(2) FROM Sample.Employee) IF SQLCODE=0 { WRITE !,"Total Person records=",total(1) WRITE !,"Total Employee records=",total(2) } ELSE { WRITE !,"SQL error ",SQLCODE }
198 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目
• SQL : SELECT クエリ ホスト変数 埋め込み SQL
• Caché ObjectScript : SET コマンド
ISNULL
NULL テストを行い、適切な式を返す汎用 SQL 関数です。
ISNULL(check-expression,replace-expression)
引数
評価される式。check-expression
check-expression が NULL の場合に返される式。replace-expression
概要ISNULL は check-expression を評価し、2 つの値のうち 1 つを返します。
• check-expression が NULL の場合は、replace-expression を返します。
• check-expression が NULL でない場合は、check-expression を返します。
replace-expression の可能なデータ型は、check-expression のデータ型と互換性がある必要があり
ます。DISPLAY モードまたは ODBC モードで返されるデータ型は、check-expression のデータ型
によって決まります。
以下の表は、さまざまな SQL 比較関数を示します。比較テストが真 (A は B と等しい) の場合、各
関数は特定の値を返し、偽 (A は B と等しくない) の場合、別の値を返します。
Caché SQL リファレンス 199
ISNULL
返り値比較テストSQL 関数
真 = NULL
偽 = 式 1
式 1 = 式 2NULLIF
真 = 式 2
偽 = NULL
式 1 = NULLIFNULL (2-引数形式)
真 = 式 2
偽 = 式 1
式 1 = NULLISNULL
真 = 式 2
偽 = 式 1
式 1 = NULLNVL
真 = 式 2
偽 = 式 3
式 1 = NULLIFNULL (3-引数形式)
ISNULL関数はNVL関数と同じであり、Oracle との互換性のために提供されているという点に注意
してください。
例以下の例では、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合
は FavoriteColors の値を返します。
SELECT Name,ISNULL(FavoriteColors,'No Preference') AS ColorPrefFROM Sample.Person
ISNULL の動作を IFNULL と比較します。
SELECT Name,IFNULL(FavoriteColors,'No Preference') AS ColorPrefFROM Sample.Person
以下の例では、最初の式が NULL なので、2 番目の式 (99) を返します。
SELECT DISTINCT ISNULL(NULL,99) AS NullTestFROM Sample.Person
以下の例は、最初の式が NULL ではないので、最初の式 (33) を返します。
SELECT DISTINCT ISNULL(33,99) AS NullTestFROM Sample.Person
200 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目IFNULL NVL
JOIN
2 つのテーブルのデータを基にして、テーブルを作成します。
[INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOINtable [[AS] identifier] ON condition-expression
CROSS JOIN table [[AS] identifier]
NATURAL [INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOINtable [[AS] identifier]
[INNER | LEFT [OUTER] | RIGHT [OUTER] ] JOINtable [[AS] identifier] USING (identifier-commalist)
概要JOIN は、2 つのテーブルを組み合わせて、オプションの制限条件に従う結合テーブルを作成しま
す。新規のテーブルのすべての行は、制限された条件を満たしている必要があります。JOIN は、
テーブルのデータを別のテーブルのデータと結合する手段を提供し、レポートやクエリの定義に頻
繁に使用されます。
JOIN 式は SELECT 文で FROM 節の一部として使用されます。FROM 節の JOIN 式には複数の
JOIN を含めることができます。キーワードの %INORDER および %FULL を FROM キーワードの直
後に使用して、複数の JOIN を最適化することができます。これらのキーワードの詳細は、"FROM"
節を参照してください。
JOIN の説明
Cachéは、JOINの複数の異なる構文形式をサポートします。しかし、これら複数の公式化は以下の
4 つの結合のタイプに参照します。
同等の構文ANSI 結合構文
FROM 節での table1,table2 という記号表現 (コンマで区切ら
れたテーブルのリスト) と同じです。
CROSS JOIN
JOIN と同じ。記号表現 : "=" (WHERE 節内)INNER JOIN
LEFT JOIN と同じ。記号表現 : "=*" (WHERE 節内)。これは
お勧めしません。新しいコードでは使用しないでください。
LEFT OUTER JOIN
RIGHT JOIN と同じ。記号表現 : "*=" (WHERE 節内)。これは
お勧めしません。新しいコードでは使用しないでください。
RIGHT OUTER JOIN
Caché SQL リファレンス 201
JOIN
CROSS JOINは最初のテーブルの行すべてを次のテーブルの行すべてと交差させる結合です。結
果は、多くの重複データを持つ、大きな、論理的に総合的なテーブル (デカルト積) になります。通
常、この結合はコンマで区切られたテーブルのリストを FROM節内で指定し、その後WHERE節を
使用して制限条件を指定することによって実行されます。
INNER JOINは、最初のテーブルの行を次のテーブルの行とリンクする結合です。最初のテーブル
の行で、次のテーブル内に対応する行が見つからないものはリンクしません。結果は、各フィールド
が一意のデータを含む、小さなテーブルになります。
LEFT OUTER JOIN と RIGHT OUTER JOIN は機能上ほとんどの点で同一であり (構文が逆)、そ
のため、集合的に単方向外部結合とみなされる場合が多くあります。単方向外部結合は、最初の
テーブル(ソース・テーブル)のすべての行を次のテーブルの行とリンクさせる結合です。最初のテー
ブルの行に一致する行が次のテーブルで見つからない場合でも、リンクは行われます。結果はテー
ブルで、最初のテーブル (ソース・テーブル) 内にあるフィールドの中には、NULL データと組み合
わされるものもあります。
単方向外部結合を指定する場合、FROM節のテーブルを指名する順番が非常に重要です。LEFT
OUTER JOIN では、最初に指定するテーブルが結合のソース・テーブルです。RIGHT OUTER
JOIN では、2 つ目に指定するテーブルが結合のソース・テーブルです。この 2 つのタイプの単方
向外部結合にはわずかに異なる制限があります。
NATURAL JOIN
NATURAL JOIN は、INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN の前に
NATURAL キーワードを付けたものです。JOIN の前に NATURAL という語を付けると、2 つのテー
ブルで同じ名前を持つすべての列において結合が実行されます。NATURAL JOIN では、同じ名
前を持つすべての列で自動的に等値条件が実行されるため、ON 節や USING 節を指定すること
はできません。
NATURAL JOINのどちらのオペランドでも、単純なベース・テーブル参照(ビューやサブクエリでは
ない) のみがサポートされます。
NATURAL JOIN は、JOIN 式内の最初の JOIN としてのみ指定することができます。
ON 節
INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN には ON 節を指定できます。ON
節のある JOIN のどちらのオペランドでも、テーブル、ビュー、およびサブクエリがサポートされます
(以下で説明する単方向外部結合の制限事項に従います)。ON節のある JOIN は、JOIN 式内のど
こでも指定することができます。ON 節のある JOIN に NATURAL キーワードを接頭語として付けた
り、USING 節を指定することはできません。
INNER JOIN では、ON 節の条件式に制限はなく、どのような式も有効です。これには、より大きい
(>) やより小さい (<) などの算術演算子や、OR や NOT などの論理演算子も含まれます。また、括
弧を使用して INNER JOIN の条件式をグループ化したり、構文的に意味のあるものにすることもで
きます。
202 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
LEFT OUTER JOIN と RIGHT OUTER JOIN には、以下に説明するさまざまな制限事項が適用さ
れます。
USING 節
INNER JOIN、LEFT OUTER JOIN、または RIGHT OUTER JOIN には USING 節を指定できます。
USING 節のある JOIN のどちらのオペランドでも、単純なベース・テーブル参照 (ビューやサブクエ
リではない) のみがサポートされます。USING 節のある JOIN は、JOIN 式内の最初の JOIN として
のみ指定できます。USING 節のある JOIN に NATURAL キーワードを接頭語として付けたり、ON
節を指定することはできません。
USING節では、1つ以上の列名をコンマで区切ったリストを括弧で囲みます。重複する列名は無視
されます。括弧は必須です。
USING節では、ON節で表現される等値条件を簡潔に表現することができます。例えば、t1 INNER
JOIN t2 USING (a,b)は t1 INNER JOIN t2 ON t1.a=t2.a AND t1.b=t2.b と同じで
す。
単方向外部結合Caché は、単方向外部結合の LEFT OUTER JOIN および RIGHT OUTER JOIN をサポートしま
す。双方向外部結合はサポートしません。
標準の "内部" 結合では、あるテーブルの行が別のテーブルの行にリンクしている場合、後者の
テーブルの行と対応しない前者のテーブルの行は、出力テーブルから除外されます。
単方向外部結合では、すべての行が一致しなくても、テーブルの行はすべて出力テーブルに含ま
れます。前者のテーブルは後者のテーブルから該当する情報を引き出しますが、後者のテーブル
に一致する行がなくても、自分の行を犠牲にすることはありません。
例えば、クエリがTable 1を最初にリストし、左外部結合を作成する場合、対応するレコードがTable
2 内に存在しなくても、Table 1 のすべての行を見ることができます。
単方向外部結合を指定する場合、FROM 節のテーブルを指名する順番が非常に重要です。左外
部結合では、指定した最初のテーブルは結合のソース・テーブルです。右外部結合では、指定した
2 番目のテーブルが結合のソース・テーブルです。
RIGHT OUTER JOIN は JOIN 式内の最初の JOIN としてのみサポートされます。
外部結合構文
Caché には、外部結合の表示に 3 種類の形式があります。
1. ANSI標準構文のLEFTOUTER JOIN と RIGHTOUTER JOIN。以下の例で示しているように、
SQL 標準構文は WHERE 節ではなく、SELECT 文の FROM 節で外部結合を入力します。
FROM tbl1 LEFT OUTER JOIN tbl2 ON (tbl1.key = tbl2.key)
2. エスケープ構文 {oj join-expression} を使用する、ODBC仕様外部結合拡張構文(join-expression
は任意の ANSI 標準結合構文)。
Caché SQL リファレンス 203
JOIN
3. WHERE 節で A=*B などの条件を使用する、シンボル外部結合拡張構文。左外部結合は
WHERE節の =の場所で、=*などのシンボルを使用して指定されます (これは、Microsoft SQL
ServerやSybaseで使用される構文とは逆であることに注意してください)。右外部結合はWHERE
節の = の場所で、*= などのシンボルを使用して指定されます。
注釈: シンボル外部結合構文 (=* および *=) は使用しないことを強くお勧めします。ANSI
標準構文の LEFT OUTER JOIN と RIGHT OUTER JOIN を使用してください。
3 種類の外部結合形式は互換性があり混在させることもできますが、ANSI 標準構文
は ODBC と互換性のある唯一の構文である (また、最新の Microsoft 製品に移植可
能である) ことから、可能な限りANSI 標準構文を使用することを強くお勧めします。ま
た、ANSI 標準構文では、シンボル構文で原則的に指定できない多くのオペレーショ
ンを指定することもできます。さらに、インターシステムズでは、古いシンボル外部結合
構文で、新しい機能、拡張検証、オプティマイザの改善をサポートする予定はありませ
ん。
外部結合の制限事項
FROM 節内の ANSI 標準外部結合には、以下の制限があります。
• RIGHTOUTER JOINの場合、左のオペランドが結合式、ビュー、またはサブクエリでないこと。
右のオペランドにはそのような制限はありません。
• LEFT OUTER JOIN の場合、右のオペランドが結合式ではないこと。ただし、ビューとサブクエ
リは可能です。左のオペランドにはそのような制限はありません。
ANSI 標準外部結合では、ON 節により結合を規定する条件式の機能を実現します。外部結合の
ON 節には、内部結合の ON 節よりも厳しい制限があります。外部結合には、以下の制限がありま
す。
• ON 節が 1 つ以上の等値条件で構成されていること。外部結合では等値条件のみが可能で
す。少なくとも 1 つの条件が 2 つの列の比較でなければなりません。
• 複数の等値条件を AND論理演算子で組み合わせることができます。ORおよび NOTの論理
演算子は使用できません。
• コードをわかりやすくするために、複数の等値条件を括弧で囲むことができます。外部結合の
ON 節の制限事項のために、このような括弧は構文的に意味を持ちません。
ON 節の条件は以下のいずれかの基準を満たしている必要があります ("A LEFT OUTER JOIN B
ON 条件式" または "A RIGHT OUTER JOIN B ON 条件式" の場合を想定)。
• A の列が B の列に等しいこと。
• LEFT OUTER JOIN の場合、B の列が定数式 (リテラル値またはパラメータ) と等しいこと。
• RIGHT OUTER JOIN の場合、A の列が定数式 (リテラル値またはパラメータ) と等しいこと。
204 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
等式のオペランドは任意の順序で指定できます。例えば、ON A.field1=B.field3 は ON
B.field3=A.field1 と同じであり、ON A.field1=literal は ON literal=A.field1 と同じです。
ON 節の等式の演算子に対しては、以下の列のオペランド値を使用できます。
• ベース・テーブルの列。等式のどちら側であっても、ベース・テーブルの列の指定に適用される
制限はありません。
• ベース・テーブルの列に展開されるビューの列。このタイプのビュー列は外部結合のソース・
テーブル側でのみ指定可能です。ソース・テーブルは、LEFT OUTER JOIN の左側、または
RIGHT OUTER JOIN の右側です。
• ストリーム・ビューの列。ストリーム・ビューは、DISTINCT、GROUP BY、または UNION のキー
ワードを含むビュー、または集約関数を使用して生成された列を持つビューです。結合テーブ
ルのどちら側であっても、ストリーム・ビューの列の指定に適用される制限はありません。
• ソース・テーブルの列は複数の等式で使用することができます。ソースでないテーブルの列で
は等式は 1 つのみ使用可能です。
WHERE 節内のシンボル外部結合構文では、以下のオペランド値を使用できます。
• ベース・テーブルの列。外部結合のどちら側であっても、ベース・テーブルの列の指定に適用
される制限はありません。
• ベース・テーブルの列に展開されるビューの列。このタイプのビュー列は外部結合のソース・
テーブル側でのみ使用可能です (ソース・テーブルは、LEFT OUTER JOIN (=*) の左側、また
は RIGHT OUTER JOIN (*=) の右側です)。
• ストリーム・ビューの列。ストリーム・ビューは、DISTINCT、GROUP BY、または UNION のキー
ワードを含むビュー、または集約関数を使用して生成された列を持つビューです。外部結合の
どちら側であっても、ストリーム・ビューの列の指定に適用される制限はありません。
詳細は、"Caché SQL の使用法" の "OUTER JOIN の制限" を参照してください。
NULL の埋め込み
単方向外部結合では、NULL の埋め込みが実行されます。ソース・テーブルの行で、マージされる
列に NULL 値が存在する場合は、ソースでないテーブルの対応するフィールドに NULL 値が返さ
れます。
左外部結合条件は、以下の構文で表されます。
A.x LEFT OUTER JOIN B.y
これは、A のすべての行が返されることを指定します。返された A の各行では、A.x=B.y などの B
行がある場合、対応するすべての B 値も返されます。
A.x=B.y などの B 行がない場合は、NULL の埋め込みによって A 行に対するすべての B 値を
NULL として返すようにします。
Caché SQL リファレンス 205
JOIN
例えば、患者に関する情報を格納した Patient テーブルがあり、このテーブルに患者の主治医の
ID コードを示すフィールド Patient.DocID が含まれるとします。データベースには主治医がいない
患者のレコードがあるため、このような患者のレコードでは Patient.DocID フィールドは NULL にな
ります。ここで、Patient テーブルと Doctor テーブルの結合を実行して、患者名と対応する担当医
師名のテーブルを生成します。
以下は INNER JOIN の例です。
SELECT Patient.PName,Doctor.DName FROM Patient INNER JOIN Doctor ON Patient.DocID=Doctor.DocID
INNER JOIN では、NULL の埋め込みは実行されません。そのため、対応する担当医師名のない
患者名は返されません。
単方向外部結合では、NULLの埋め込みが実行されます。そのため、対応する担当医師名のない
患者名では、Doctor.DName に NULL が返されます。
SELECT Patient.PName,Doctor.DName FROM Patient LEFT OUTER JOIN Doctor ON Patient.DocID=Doctor.DocID
演算の順序
必要なNULLの埋め込みも含んだ単方向外部結合条件は、他の条件より前に適用されます。した
がって、NULL が埋め込まれた値では満たされない WHERE 節の条件 (例えば、B のフィールド上
の値域条件や等値条件) は、A と B の単方向外部結合を標準結合 (内部結合) に効果的に変換
します。
例えば、"Where Doctor.Age < 45" という句を、上記の 2 つの "Patient" テーブル・クエリに追加す
る場合、これらは同じになります。ただし、"WHERE Doctor.Age < 45 OR Doctor.Age IS NULL" と
いう句を追加する場合は、2 つのクエリにおける相違は変わりません。
外部結合と内部結合の混合通常Cachéは、括弧が使用されていない限り、内部結合と外部結合の混合したすべての構文を任
意の順序でサポートします。外部結合のON節内の条件には、いくつかの制約があります。例えば、
左外部結合では、これらの条件は A=B か X=B の形式にする必要があります。A は左のテーブル
のフィールド、B は右のテーブルのフィールド、X は定数かホスト変数です。
例以下の例は、Table 1 と Table 2 で実行される JOIN 操作の結果を示しています。
Table1 Table2 Column1 Column2 Column1 Column3 aaa bbb ggg hhh ccc ccc xxx zzz xxx yyy hhh zzz
206 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
CROSS JOIN の例
以下に例を示します。
SELECT * FROM Table1 CROSS JOIN Table2
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 aaa bbb ggg hhh aaa bbb xxx zzz ccc ccc ggg hhh ccc ccc xxx zzz xxx yyy ggg hhh xxx yyy xxx zzz hhh zzz ggg hhh hhh zzz xxx zzz
NATURAL JOIN の例
以下に例を示します。
SELECT * FROM Table1 NATURAL JOIN Table2
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 xxx yyy xxx zzz
NATURAL JOIN を実行する場合、Caché は同じ名前を持つ列を統合しません。
ON 節のある INNER JOIN の例
以下に例を示します。
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 hhh zzz ggg hhh
USING 節のある INNER JOIN の例
以下に例を示します。
SELECT * FROM Table1 INNER JOIN Table2 USING (Column1)
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 xxx yyy xxx zzz
LEFT OUTER JOIN の例
以下に例を示します。
SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.Column1=Table2.Column3
Caché SQL リファレンス 207
JOIN
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 aaa bbb null null ccc ccc null null xxx yyy null null hhh zzz ggg hhh
RIGHT OUTER JOIN の例
以下に例を示します。
SELECT * FROM Table1 RIGHT OUTER JOIN Table2 ON Table1.Column1=Table2.Column3
以下のテーブルを作成します。
Column1 Column2 Column1 Column3 hhh zzz ggg hhh null null xxx zzz
関連項目
• SELECT 文 FROM 節 ORDER BY 節 WHERE 節
• テーブル ALTER TABLE CREATE TABLE DROP TABLE
• INSERT UPDATE
LCASE
文字列内のすべての大文字を、小文字に変換するスカラ文字関数です。
{fn LCASE(string-expression)}
引数
文字列式。その中の文字が小文字に変換されます。式は
列の名前や文字リテラル、または他のスカラ関数の結果を
指定できます。基本となるデータ型は、任意の文字タイプ
(CHAR や VARCHAR など) とすることができます。
string-expression
概要LCASE は、大文字を小文字に変換します。これは、アルファベットでない文字に影響を与えませ
ん。句読点および先頭の空白スペースを変更しません。末尾の空白スペースを削除します。LCASE
は、数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削除
されます。
LOWER 関数も、大文字から小文字への変換に使用できます。
208 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
%SQLUPPER関数は、大文字と小文字を区別しない比較または照合に対してデータ値を変換する、
SQL で優先的な方法です。ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
例以下の例は、各人の名前を小文字で返します。
SELECT Name,{fn LCASE(Name)} AS LowName FROM Sample.Person
また、LCASE は、ギリシャ文字を大文字から小文字に変換する以下の埋め込み SQL の例で示す
ように、Unicode (非 ASCII) アルファベット文字でも動作します。
SET a=$CHAR(920,913,923,913,931,931,913) &sql(SELECT {fn LCASE(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a,!,b }
関連項目
• SQL 関数 : LOWER UCASE
• Caché ObjectScript 関数 : $ZCONVERT
LEFT
文字列式の最初 (一番左) の文字から、指定された数の文字を返す文字列関数です。
{fn LEFT(string-expression,count)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、(CHAR や
VARCHAR など) 任意の文字タイプとすることができます。
string-expression
string-expressionの最初から返す文字の数を指定する整数。count
概要LEFT は、文字列の最初から指定された数の文字を返します。LEFT は、文字列を埋め込みませ
ん。文字列内の文字数よりも多い文字数を指定した場合、LEFTはその文字列を返します。引数に
NULL を渡すと、LEFT は NULL を返します。
Caché SQL リファレンス 209
LEFT
LEFT は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、Sample.Person テーブル内の各名前の左端から 7 文字を返します。
SELECT Name,{fn LEFT(Name,7)}AS ShortName FROM Sample.Person
以下の埋め込み SQL の例は、LEFT による文字列自体よりも長い count の処理方法を示していま
す。
&sql(SELECT Name,{fn LEFT(Name,40)} INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a,"=original",!,b,"=LEFT 40" }
埋め込みは実行されません。
関連項目LTRIM RIGHT RTRIM
LENGTH
文字列式の文字の数を返す文字列関数です。
LENGTH(string-expression)
{fn LENGTH(string-expression)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文
字タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
概要LENGTH は、与えられた文字列式について、そのバイト数ではなく、文字数を示す整数を返しま
す。
• LENGTH は、表示値ではなく、内部 (データ・ストレージ) 値の長さを返します。
210 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• LENGTHには、末尾の空白や文字列の終了文字は含まれません。先頭の空白は含まれます。
LTRIM 関数を使用して、文字列から先頭の空白を削除できます。
• LENGTH は、先頭と末尾のゼロを削除して、数字をキャノニック形式に変換します。
• LENGTH は NULL を渡すと NULL、空文字列を渡すと 0 を返します。
LENGTH は、{ } 括弧構文による ODBC スカラ関数、または SQL 汎用関数として使用できる点に
注意してください。
例以下の例は、値 12 を返します。
SELECT DISTINCT LENGTH('INTERSYSTEMS') AS CharCountFROM Sample.Person
以下の例は、先頭と末尾のゼロを削除し、長さ 1 を返します。
SELECT DISTINCT {fn LENGTH(00000.00)} AS CharCountFROM Sample.Person
以下の2つの例は両方とも、先頭と末尾の空白を持つ文字列の長さを返します。1番目は、LENGTH
が末尾の空白を含まず先頭の空白を含むため、15を返します。2番目は、LTRIMが先頭の空白を
含まないため、12 を返します。
SELECT DISTINCT LENGTH(' INTERSYSTEMS ') AS CharCountFROM Sample.Person
SELECT DISTINCT LENGTH(LTRIM(' INTERSYSTEMS ')) AS CharCountFROM Sample.Person
以下の例は、Sample.Person テーブル内の各 Name 値の文字数を返します。
SELECT Name,{fn LENGTH(Name)} AS CharCountFROM Sample.PersonORDER BY CharCount
以下の例は、DOB (誕生日) フィールド内の文字数を返します。(LENGTH、CHAR_LENGTH、
CHARACTER_LENGTH によって) 返される長さは、日付の内部 ($HOROLOG) 形式であり、表示
形式ではありません。DOB の表示長は、10 文字です。3 つの長さ関数は、すべて内部長 5 を返し
ます。
SELECT DOB,{fn LENGTH(DOB)} AS LenCount,CHAR_LENGTH(DOB) AS CCount,CHARACTER_LENGTH(DOB) AS CtrCountFROM Sample.Person
以下の埋め込み SQL の例は、Unicode 文字の文字列の長さを返します。返される長さは、文字数
(7) であり、バイト数ではありません。
Caché SQL リファレンス 211
LENGTH
SET a=$CHAR(920,913,923,913,931,931,913) &sql(SELECT LENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The Greek Sea: ",a,!,$LENGTH(a),!,b }
関連項目
• SQL 関数 : CHAR_LENGTH CHARACTER_LENGTH
• Caché ObjectScript 関数 : $LENGTH
$LENGTH
文字列内の文字数、または文字列内の区切られた部分文字列数を返す汎用 SQL 関数です。
$LENGTH(expression[,delimiter])
引数
ターゲット文字列。数値、文字列リテラル、変数名、または任意の有効な
式を指定できます。
expression
オプション — ターゲット文字列にある部分文字列の境界を示す文字列。
文字列リテラルを使用する必要がありますが、長さは自由です。また、引
用符で囲む必要があります。
delimiter
概要$LENGTH は使用される引数に応じて、指定した文字列にある文字数あるいは指定した文字列に
ある部分文字列数を返します。
• $LENGTH(expression) は、文字列の文字数を返します。expression が NULL 文字列の場合、
$LENGTH は 0 を返します。
• $LENGTH(expression,delimiter) は、文字列内の部分文字列数を返します。$LENGTH は、指
定されたdelimiterで相互に分離されている部分文字列数を返します。この数は常に文字列内
の区切り文字数に 1 を加えたものです。
delimiter が NULL 文字列の場合は、$LENGTHは 0 を返します。区切り文字がその他の有効
な文字列リテラルで、文字列が NULL 文字列の場合は、$LENGTH は 1 を返します。
この関数は、データ型 SMALLINT を返します。
212 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例以下の例は、文字列の長さ 6 を返します。
SELECT DISTINCT $LENGTH('ABCDEG') AS StringLengthFROM Sample.Person
以下の例は、ドル記号 ($) で区切られた文字列内の部分文字列数 3 を返します。
SELECT DISTINCT $LENGTH('ABC$DEF$EFG','$') AS SubStringsFROM Sample.Person
指定された区切り文字が文字列内に見つからない場合は、文字列全体が 1 つの部分文字列とな
るため、$LENGTH は 1 を返します。
SELECT DISTINCT $LENGTH('ABCDEG','$') AS SubStringsFROM Sample.Person
以下の埋め込み SQL の例では、最初の $LENGTH 関数は、a の文字数である 11 を返します (ス
ペース文字もカウントされます)。2 番目の $LENGTH 関数は、部分文字列の区切り文字に b のス
ペース文字を使用し、a の部分文字列数である 2 を返します。
SET a="HELLO WORLD" SET b=" " &sql(SELECT $LENGTH(:a), $LENGTH(:a,:b) INTO :a1,:a2 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The input string: ",a WRITE !,"Number of characters: ",a1 WRITE !,"Number of substrings: ",a2 }
以下の例は、テストされた文字列が NULL 文字列なので 0 を返します。
SELECT DISTINCT $LENGTH(NULL) AS StringLengthFROM Sample.Person
以下の例は、指定された区切り文字が見つからないので1を返します。この場合は、部分文字列が
1 つ (NULL 文字列) あることになります。
SELECT DISTINCT $LENGTH(NULL,'$') AS SubStringsFROM Sample.Person
以下の例は、区切り文字列が NULL 文字列なので 0 を返します。
SELECT DISTINCT $LENGTH('ABCDEFG',NULL) AS SubStringsFROM Sample.Person
Caché SQL リファレンス 213
$LENGTH
メモ
$LENGTH、$PIECE、および $LIST
• 引数が 1つの $LENGTHは、文字列の文字数を返します。この関数は、位置を基準に部分文
字列を特定し、その部分文字列値を返す $EXTRACT 関数とともに使用できます。
• 引数が 2つの $LENGTHは、区切り文字列に基づいて、文字列の部分文字列数を返します。
この関数は、区切り文字を基準に部分文字列を特定し、その部分文字列値を返す $PIECE関
数とともに使用できます。
• $LENGTH は、$LISTBUILD または $LIST を使用して作成された、エンコードされたリストには
使用できません。エンコードされたリスト文字列の部分文字列 (リスト要素) 数を調べるには、
$LISTLENGTH を使用します。
$LENGTH、$FIND、$EXTRACT、および$PIECE関数は、標準文字の文字列に対して処理を実行
します。さまざまな$LIST関数は、エンコードされた文字列を操作します。この文字列は、標準の文
字列とは互換性がありません。唯一の例外は、$LISTGET 関数と、引数が 1 つおよび 2 つの形式
の $LIST 関数です。これらの関数は、入力としてエンコードされた文字の文字列を受け取り、単一
要素値を標準文字の文字列として出力します。
関連項目
• SQL 関数 : $EXTRACT $FIND $LIST $LISTGET $PIECE
• Caché ObjectScript 関数 : $EXTRACT $FIND $LENGTH $LIST $LISTBUILD $LISTGET
$PIECE
LIST
コンマで区切られたリストの値を生成する集約関数です。
LIST ([ DISTINCT ] string-expr [%FOREACH(col-list)] [%AFTERHAVING])
引数
文字列として評価する SQL 式。通常は選択されたテーブ
ルの列の名前です。
string-expr
オプション — 列名、またはコンマで区切られた列名のリス
ト。%FOREACHの詳細は、"SELECT"を参照してください。
%FOREACH(col-list)
オプション — HAVING 節にある条件を適用します。%AFTERHAVING
214 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要LIST 集約関数は、指定された列のすべての値のコンマ区切りのリストを返します。LIST は、コンマ
で区切られた値のリストを返します。値を連結した文字列を返すには、これと類似したXMLAGG関
数を使用してください。
LIST は、各行グループの string-expr に対する、すべての値で構成されるコンマで区切られたリス
トを含む文字列を返します。string-expr が NULL 値である行は、リストに追加されません。
以下の例は、Sample.PersonテーブルのHome_State列内にあるすべての値のコンマで区切られた
リストを作成します。
SELECT DISTINCT LIST(Home_State) AS All_State_ValuesFROM Sample.Person
このリストには重複値が含まれます。
LIST DISTINCTは、各行グループの string-expr に対する、すべての異なる値で構成されるコンマ
で区切られたリストを含む文字列を返します。string-expr が NULL値である行は、リストに追加され
ません。
以下の例は、Sample.Person テーブルの Home_State 列内にあるすべての個別 (一意) の値のコン
マで区切られたリストを作成します。
SELECT DISTINCT LIST(DISTINCT Home_State) AS All_Unique_State_ValuesFROM Sample.PersonORDER BY Home_State
例以下の例は、Sample.Person テーブルの FavoriteColors 列内にあるすべての個別値のコンマで区
切られたリストを作成します。したがって、各行は All_Colors 列と同じ値を持ちます。ある行が
FavoriteColors に NULL 値を持つと、この値はリストに含まれなくなります。データ値は、内部形式
で返されます。
SELECT Name,FavoriteColors,LIST(DISTINCT FavoriteColors) AS All_ColorsFROM Sample.PersonORDER BY FavoriteColors
以下の例は、各州のHome_City列内にあるすべての個別値のコンマで区切られたリストを作成しま
す。同じ州のすべての行には、その州の個別の市の値すべてのリストが含まれます。
SELECT Home_State, Home_City,LIST(DISTINCT Home_City %FOREACH(Home_State)) AS All_Cities_In_StateFROM Sample.PersonORDER BY Home_State
例えば、以下の AutoClub のようなテーブルがあるとします。
Caché SQL リファレンス 215
LIST
年モデルメーカー名前
1971FirebirdPontiacSmith,Joe
1997SW2SaturnSmith,Joe
1999BonnevillePontiacSmith,Joe
1966MustangFordJones,Scott
2000MiataMazdaJones,Scott
クエリは以下のとおりです。
SELECT DISTINCT Name, LIST(Make) AS List_Of_MakesFROM AutoClub WHERE Name = 'Smith,Joe'
これは、以下を返します。
メーカー名前
Pontiac,Saturn,PontiacSmith,Joe
クエリは以下のとおりです。
SELECT DISTINCT Name, LIST(DISTINCT Make) AS List_Of_MakesFROM AutoClub WHERE Name = 'Smith,Joe'
これは、以下を返します。
メーカー名前
Pontiac,SaturnSmith,Joe
関連項目集約関数 XMLAGG SELECT
216 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
$LIST
リスト内の要素を返す汎用 SQL 関数です。
$LIST(list[,position[,end]])
引数
有効なリストとして評価される式。リストにはエンコードが含まれるので、listは
Caché ObjectScript $LISTBUILD 関数を使用して作成するか、$LIST を使用
して他のリストから抽出する必要があります。
list
オプション — 指定したリストの開始位置。整数として評価される式です。position
オプション — 指定したリストの終了位置。整数として評価される式です。end
概要$LIST は、リストから要素を返します。返される要素は、使用する引数によって決まります。
• $LIST(list) は、リストの最初の要素をテキスト文字列として返します。
• $LIST(list,position) は、指定された位置にある要素をテキスト文字列として返します。position
の引数は、必ず整数に評価されます。
• $LIST(list,position,end) は、指定された開始 position から指定された end位置までの範囲の、
リストの要素を含む "サブリスト" (エンコードされたリスト文字列) を返します。
この関数は、データ型 VARCHAR を返します。
引数
list
1 つ以上の要素を含む、エンコードされたリスト文字列。リストは、Caché ObjectScript $LISTBUILD
関数を使用して作成します。以下の埋め込み SQL の例に示すように、ホスト変数を使用して、SQL
$LIST 関数にリストを指定できます。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,2) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The element returned is ",b }
リストは、$LIST 関数を使用して、別のリストから抽出することもできます。
Caché SQL リファレンス 217
$LIST
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,2,3) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { &sql(SELECT $LIST(:b,1) INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The element returned is ",c } }
以下の埋め込み SQL の例では、subList は有効な list 引数ではありません。これは通常の文字列
として返された 1 つの要素であり、エンコードされたリスト文字列ではないためです。引数が 3 つの
形式の $LIST のみが、エンコードされたリスト文字列を返します。この場合は、SQL -400 の致命的
なエラーが発生します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,2) INTO :sublist FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { &sql(SELECT $LIST(:sublist,1) INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The sublist is" ZZDUMP c ; Variable not set } }
position
返されるリスト要素の位置。リスト要素は、1から始まります。positionが省略されている場合は、最初
の要素が返されます。position の値が 0、またはリストの要素の数よりも大きい場合、Caché SQL は
値を返しません。position の値がマイナス 1 (–1) の場合、$LIST はリストの最後の要素を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,-1) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The last element is ",b }
end引数が指定されている場合、position は要素範囲の最初の要素を指定します。(position と end
が同じ値のとき)要素が1つだけ返されますが、その要素はエンコードされた文字列として返されま
す。したがって、$LIST(x,2) (要素を通常の文字列として返す) は $LIST(x,2,2) (要素をエン
コードされた文字列として返す) と同じではありません。
218 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
end
要素範囲の最後の要素の位置。end を指定するには、position を指定する必要があります。end が
指定されている場合、返される値はエンコードされたリスト文字列です。このようにエンコードされて
いるため、他の $LIST 関数で処理する必要があります。
end の値によって、次のように処理されます。
• position よりも大きい場合、要素のリストを含むエンコードされた文字列が返されます。
• position と等しい場合、1 つの要素を含むエンコードされた文字列が返されます。
• position よりも小さい場合、値は返されません。
• list の要素数よりも大きい場合、リストの最後の要素を指定するのと同じです。
• マイナス 1 (–1) のとき、リストの最後の要素を指定するのと同じです。
end を指定する場合、position 値はゼロ (0) に指定できます。この場合、0 は 1 と同じです。
例以下の埋め込み SQL の例で、2 つの WRITE 文は、ともにリストの先頭要素である "Red を返しま
す。最初のWRITE 文では、既定で先頭要素が記述され、2 番目のWRITE 文では、position 引数
が 1 に設定されているため先頭要素が記述されます。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a),$LIST(:a,1) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The one-arg sublist is ",b WRITE !,"The two-arg sublist is ",c }
以下の埋め込み SQL の例はリストで 2 つ目の要素である "Blue" を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,2) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The second element is ",b }
以下の埋め込み SQL の例は "Red Blue" を返します。"Red Blue" は先頭要素で開始して、2 つ目
の要素で終了する 2 要素のリスト文字列です。WRITE ではなく ZZDUMP を使用しますが、これは
特殊 (印字不可能) 文字をリストに含むためです。
Caché SQL リファレンス 219
$LIST
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,1,2) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The encoded sublist is" ZZDUMP b ; Prints "Red Blue " }
以下の埋め込みSQLの例は、長さがわからないリストの最後の要素を返します。最初のWRITE文
では、最後の要素が通常の文字列として返され、2 番目の WRITE 文では、エンコードされた文字
列として返されます。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTLENGTH(:a),$LIST(:a,-1) INTO :b,:plain FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { &sql(SELECT $LIST(:a,:b,-1) INTO :encoded FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The final element as a string: ",plain WRITE !,"The final element as an encoded string: " ZZDUMP encoded } }
メモ
無効なパラメータ値
list引数の式が有効なリストとして評価されない場合は、SQLCODE-400の致命的なエラーが発生
します。
SET a="the quick brown fox" &sql(SELECT $LIST(:a,1) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The sublist is" ZZDUMP b ; Variable not set }
position 引数または end 引数の値が -1 よりも小さい場合は、SQLCODE -400 の致命的なエラー
が発生します。
220 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,-2,3) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The sublist is" ZZDUMP b ; Variable not set }
position 引数の値が存在しないリスト・メンバを参照するときに end 引数が使用されていない場合
は、SQLCODE -400 の致命的なエラーが発生します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,7) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The sublist is" ZZDUMP b ; Variable not set }
ただし、end 引数が使用されている場合は、エラーは発生せず、NULL 文字列が返されます。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LIST(:a,7,-1) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Error code ",SQLCODE WRITE !,"The sublist is" ZZDUMP b ; Prints a null string }
position 引数の値が、値が未定義の要素を指す場合は、SQL –400 の致命的なエラーが発生しま
す。
SET a=$LISTBUILD("Red",,"Green") &sql(SELECT $LIST(:a,2) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The sublist is" ZZDUMP b ; Variable not set }
2 つのパラメータと 3 つのパラメータの $LIST
$LIST(list,1) と $LIST(list,1,1) は同じではありません。前者は文字列を返すのに対し、後者は要素
が 1つのリスト文字列を返します。返す要素がない場合、引数が 2つの形式は値を返さず、3つの
形式は NULL 文字列を返します。
Caché SQL リファレンス 221
$LIST
Unicode
リスト要素内に Unicode 文字が 1 つでもあれば、リスト要素全体が Unicode (ワイド) 文字として表さ
れます。リスト内の他の要素は影響されません。
以下の埋め込み SQL の例は、2 つのリストを示しています。a リストは、ASCII 文字のみが含まれる
2 つの要素で構成されます。b リストは 2 つの要素で構成され、最初の要素には Unicode 文字
($CHAR(960)、つまり pi 記号) が含まれ、2 番目の要素には ASCII 文字のみが含まれます。
SET a=$LISTBUILD("ABC"_$CHAR(68),"XYZ") SET b=$LISTBUILD("ABC"_$CHAR(960),"XYZ") &sql(SELECT $LIST(:a,1),$LIST(:a,2),$LIST(:b,1),$LIST(:b,2) INTO :a1,:a2,:b1,:b2 FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The ASCII list a elements: " ZZDUMP a1 ZZDUMP a2 WRITE !,"The Unicode list b elements: " ZZDUMP b1 ZZDUMP b2 }
Caché は、b の先頭要素全体をワイド Unicode 文字でエンコードすることに注意してください。b の
2 番目の要素には Unicode 文字が含まれないため、Caché は 1 バイトの ASCII 文字を使用してエ
ンコードします。
関連項目
• SQL 関数 : $LISTDATA $LISTFIND $LISTGET $LISTLENGTH $PIECE
• Caché ObjectScript 関数 : $LIST $LISTBUILD $LISTDATA $LISTFIND $LISTGET
$LISTLENGTH
$LISTDATA
指定された要素が存在し、データ値を持つかどうかを示す値を返す汎用 SQL 関数です。
$LISTDATA(list[,position])
引数
有効なリストとして評価される式。list
オプション — list 内の要素を指定する整数式。position
222 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要$LISTDATA は、リスト内の指定された要素のデータを調べます。position 引数で指定された要素
が list に存在し、データ値を持つ場合、$LISTDATA は値 1 を返します。要素が list に存在しない
か、またはデータ値を持たない場合、$LISTDATA は値 0 を返します。
この関数は、データ型 SMALLINT を返します。
引数
list
list はエンコードされた文字の文字列で、Caché ObjectScript $LISTBUILD 関数を使用して作成さ
れるか、SQL または Caché ObjectScript $LIST 関数を使用して既存のリストから抽出されます。
position
position 引数を省略した場合、$LISTDATA は先頭要素を評価します。position 引数の値が -1 の
場合は、リストの最終要素を指定するのと同じ意味です。position引数の値が存在しないリスト・メン
バを参照する場合は、$LISTDATA は 0 を返します。
例以下の埋め込み SQL の例では、position 引数にさまざまな値を指定した結果を示します。
以下のすべての $LISTDATA 文は、1 を返します。
KILL Y SET a=$LISTBUILD("Red",,Y,"","Green") &sql(SELECT $LISTDATA(:a), $LISTDATA(:a,1), $LISTDATA(:a,4), $LISTDATA(:a,5), $LISTDATA(:a,-1) INTO :b,:c, :d, :e, :f FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"1st element status ",b ; 1st element default WRITE !,"1st element status ",c ; 1st element specified WRITE !,"4th element status ",d ; 4th element null string WRITE !,"5th element status ",e ; 5th element in 5-element list WRITE !,"last element status ",f ; last element in 5-element list }
以下の $LISTDATA 文は、同じ 5 つの要素のリストに対して 0 の値を返します。
Caché SQL リファレンス 223
$LISTDATA
KILL Y SET a=$LISTBUILD("Red",,Y,"","Green") &sql(SELECT $LISTDATA(:a,2), $LISTDATA(:a,3), $LISTDATA(:a,0), $LISTDATA(:a,6) INTO :b,:c, :d, :e FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"2nd element status ",b ; 2nd element is undefined WRITE !,"3rd element status ",c ; 3rd element is killed variable WRITE !,"0th element status ",d ; zero position non-existent WRITE !,"6th element status ",e ; 6th element in 5-element list }
メモ
無効なパラメータ値
list引数の式が有効なリストとして評価されない場合は、SQLCODE-400の致命的なエラーが発生
します。
&sql(SELECT $LISTDATA('fred') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The the element is ",b }
position 引数の値が -1 よりも小さい場合は、SQL –400 の致命的なエラーが発生します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTDATA(:a,-3) INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"A neg-num position status ",c }
position が数値以外の値の場合は、このエラーは発生しません。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTDATA(:a,'g') INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Error code ",SQLCODE WRITE !,"A non-num position status ",c }
関連項目
• SQL 関数 : $LIST $LISTFIND $LISTGET $LISTLENGTH
• Caché ObjectScript 関数 : $LIST $LISTBUILD $LISTDATA $LISTFIND $LISTGET
$LISTLENGTH
224 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
$LISTFIND
指定されたリストで、要求された値を検索する汎用 SQL 関数です。
$LISTFIND(list,value[,startafter])
引数
有効なリストとして評価される式。リストにはエンコードが含まれるので、
list は Caché ObjectScript $LISTBUILD 関数を使用して作成するか、
$LIST を使用して他のリストから抽出する必要があります。
list
検索要素を含む式。これは文字列です。value
オプション—リスト位置として翻訳される整数式。この位置の後の要素か
ら検索を開始します。ゼロと –1 が有効値で、–1 は要素を返しません。ゼ
ロが既定です。
startafter
概要$LISTFIND 関数は、指定された list で、要求された value の最初のインスタンスを検索します。
startafter引数で指定された位置の次の要素から検索を開始します。startafter引数を省略すると、
$LISTFIND は startafter 引数値を 0 とみなし、先頭要素 (要素 1) から検索を開始します。値が見
つかると、$LISTFIND は一致する要素の位置を返します。値が見つからない場合、$LISTFIND は
0を返します。startafter引数が存在しないリスト・メンバを参照する場合も、$LISTFIND関数は同様
に 0 を返します。
この関数は、データ型 SMALLINT を返します。
例以下の埋め込み SQL の例は、要求された文字列の最初に発生した位置である 2 を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Blue') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
以下の埋め込み SQL の例は 0 を返し、要求された文字列が見つからなかったことを表します。
Caché SQL リファレンス 225
$LISTFIND
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Orange') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
以下の 3 つの埋め込み SQL の例は、startafter 引数の実行結果です。最初の例は、要求された
文字列が startafter 位置にあるため、要求した文字列が見つからず 0 を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Blue',2) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
2 番目の例は、startafter がゼロ (既定値) に設定されているため、要求された文字列が先頭位置
にあるのを見つけます。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Red',0) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
3 番目の例は、要求された文字列の 1 つ目が startafter 位置より前にあるため、2 つ目を見つけて
5 を返します。
SET a=$LISTBUILD("Red","Blue","Green","Yellow","Blue") &sql(SELECT $LISTFIND(:a,'Blue',3) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
$LISTFIND関数は、完全な要素のみと一致します。したがって、以下の例ではすべての要素に"B"
が含まれているものの、リスト要素が文字列 "B" とは同じでないため、0 が返されます。
SET a=$LISTBUILD("ABC","BCD","BBB") &sql(SELECT $LISTFIND(:a,'B') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
226 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
メモ
無効な引数値
list 引数の式が有効なリストとして評価されない場合、$LISTFIND 関数を使用すると SQLCODE -
400 の致命的なエラーが発生します。
SET a="Blue" &sql(SELECT $LISTFIND(:a,'Blue') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
startafter 引数の値が -1 の場合、$LISTFIND は常にゼロ (0) を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Blue',-1) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
startafter 引数の値が -1 より小さい場合、$LISTFIND 関数を呼び出すと、SQLCODE -400 の致
命的なエラーが発生します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTFIND(:a,'Blue',-3) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The position is ",b }
関連項目
• SQL 関数 : $LIST $LISTDATA $LISTGET $LISTLENGTH
• Caché ObjectScript 関数 : $LIST $LISTBUILD $LISTDATA $LISTFIND $LISTGET
$LISTLENGTH
Caché SQL リファレンス 227
$LISTFIND
$LISTGET
リスト内の要素または指定された既定値を返す汎用 SQL 関数です。
$LISTGET(list[,position[,default]])
引数
有効なリストとして評価される式。list
オプション — 指定したリスト内の位置として解釈される式。position
オプション — list 要素が未定義の値を持つときに、返り値を作成する式。default
概要$LISTGETは、指定したリスト内の要求した要素を標準文字の文字列として返します。position引数
値が存在しないメンバを参照している場合、または未定義値を持つ要素を指している場合は、指定
された既定値を返します。
$LISTGET 関数は、$LIST 関数の引数が 1 つおよび 2 つの形式とまったく同じですが、$LIST が
NULL 文字列を返す条件下では、$LISTGET は既定値を返します。
この関数は、データ型 VARCHAR を返します。
引数
list
1つ以上の要素を含む、エンコードされた文字の文字列。リストは、Caché ObjectScript $LISTBUILD
関数を使用して作成します。リストは、$LIST 関数を使用して、別のリストから抽出することもできま
す。
position
position引数は、必ず整数として評価される必要があります。省略する場合、関数はリストの先頭要
素を既定で調べます。position 引数の値が -1 の場合は、リストの最終要素を指定するのと同じ意
味です。
default
これは文字列です。default 引数を省略すると、長さゼロの文字列を既定値とします。
例以下の埋め込み SQL の例の $LISTGET 関数は、どちらもリストの先頭要素である "Red" を返しま
す。
228 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a),$LISTGET(:a,1) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The one-arg element returned is ",b WRITE !,"The two-arg element returned is ",c }
以下の埋め込み SQL の例の $LISTGET 関数は、どちらも、リストの最終要素である 3 つ目の要素
"Green" を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a,3),$LISTGET(:a,-1) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The third element is ",b WRITE !,"The last element is ",c }
以下の埋め込み SQLの例の $LISTGET関数は、どちらも、リストの未定義の 2つ目の要素が見つ
かった場合に、値を返します。最初の例は、ユーザが既定値として定義した疑問符(?)を返します。
2 つ目の例は、既定値が指定されていないため NULL 文字列を返します。
SET a=$LISTBUILD("Red",,"Green") &sql(SELECT $LISTGET(:a,2,'?'),$LISTGET(:a,2) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The default value is ",b WRITE !,"The no-default value is ",c }
以下の埋め込み SQL の例の $LISTGET 関数は、どちらも 3 つの要素リストの最終要素よりも大き
い位置を指定します。最初の例は、既定値が指定されていないため NULL 文字列を返します。2
つ目の例は、ユーザ指定の既定値 "ERR" を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a,4),$LISTGET(:a,4,'ERR') INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The no-default 4th element is ",b WRITE !,"The default for 4th element is ",c }
以下の埋め込み SQL の例の $LISTGET 関数は、どちらも NULL 文字列を返します。
Caché SQL リファレンス 229
$LISTGET
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a,0),$LISTGET(NULL) INTO :b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The zero element is ",b WRITE !,"The NULL element is ",c }
メモ
無効なパラメータ値
list 引数の式が有効なリストに評価されない場合は、$LISTGET が返す変数が未定義のままになる
ため、SQLCODE -400 の致命的なエラーが発生します。これは、以下の埋め込み SQL の例に示
すように default 値が指定されている場合でも発生します。
&sql(SELECT $LISTGET('fred',1,'failsafe') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The non-list element is ",b ; Variable not set }
position 引数の値が -1 よりも小さい場合は、$LISTGET が返す変数が未定義のままになるため、
SQLCODE -400 の致命的なエラーが発生します。これは、以下の埋め込み SQL の例に示すよう
に default 値が指定されている場合でも発生します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a,-3,'failsafe') INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"A neg-num position returns ",c ; Variable not set }
position が数値以外の値の場合は、このエラーは発生しません。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTGET(:a,'g','failsafe') INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"A non-num position returns ",c }
関連項目
• SQL 関数 : $LIST $LISTDATA $LISTFIND $LISTLENGTH
230 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• Caché ObjectScript 関数 : $LIST $LISTBUILD $LISTDATA $LISTFIND $LISTGET
$LISTLENGTH
$LISTLENGTH
指定されたリストの要素数を返す汎用 SQL 関数です。
$LISTLENGTH(list)
引数
リストとして評価される任意の式。リストにはエンコードが含まれるので、listはCaché
ObjectScript $LISTBUILD 関数を使用して作成するか、$LIST を使用して他のリス
トから抽出する必要があります。
list
概要$LISTLENGTH は、list にある要素の数を返します。
この関数は、データ型 SMALLINT を返します。
例以下の埋め込み SQL の例は、リストに 3 つの要素が存在するため、3 を返します。
SET a=$LISTBUILD("Red","Blue","Green") &sql(SELECT $LISTLENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
メモ
無効なリスト
list が無効なリストの場合は、SQLCODE -400 の致命的なエラーが発生します。
SET a="fred" &sql(SELECT $LISTLENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b ; Variable not set }
Caché SQL リファレンス 231
$LISTLENGTH
Caché ObjectScript $LISTBUILD 関数を使用して、NULL 文字列のみが含まれるリストを作成した
場合、これは 1 つの要素からなる有効な list です。
SET a=$LISTBUILD("") &sql(SELECT $LISTLENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
NULL リスト
以下の 3つの埋め込み SQL の例は、$LISTLENGTH SQL 関数での NULL リストの処理結果を示
します。最初の 2 つの例は、list が NULL 文字列で、NULL 文字列を返します。
SET a="" &sql(SELECT $LISTLENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
&sql(SELECT $LISTLENGTH(NULL) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
3 つ目の例は、list が値 $CHAR(0) で、これは無効なリストのため、SQLCODE -400 の致命的なエ
ラーが発生します。
&sql(SELECT $LISTLENGTH('') INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
この結果は、Caché ObjectScript $LISTLENGTH 関数で NULL リストを処理する場合と異なること
に注意してください。ゼロ長の文字列は有効なリスト (ゼロ要素) のため、Caché ObjectScript 関数
は 0 を返します。
WRITE $LISTLENGTH("")
$LISTLENGTH と入れ子のリスト
以下の埋め込み SQL の例は、$LISTLENGTHが入れ子になっているリストの個々の要素を認識し
ないため、3 を返します。
232 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a=$LISTBUILD("Apple","Pear",$LISTBUILD("Walnut","Pecan")) &sql(SELECT $LISTLENGTH(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"The number of elements is ",b }
関連項目
• SQL 関数 : $LIST $LISTDATA $LISTFIND $LISTGET
• Caché ObjectScript 関数 : $LIST $LISTBUILD $LISTDATA $LISTFIND $LISTGET
$LISTLENGTH
LOG
与えられた数値式の自然対数を返す、スカラ数値関数です。
{fn LOG(float-expression)}
引数
FLOAT タイプの式。float-expression
概要LOG は、FLOAT タイプとして float-expression の自然対数 (基数 e) を返します。
LOG は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、整数の自然対数を返します。
SELECT DISTINCT {fn LOG(5)} AS LogarithmFROM Sample.Person
これは、1.60943791... を返します。
以下の埋め込み SQL の例は、整数 1 から 10 までに対する LOG 関数と EXP 関数の関係を示し
ます。
Caché SQL リファレンス 233
LOG
SET a=1 WHILE a<11 { &sql(SELECT {fn LOG(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"Logarithm of ",a," = ",b } &sql(SELECT ROUND({fn EXP(:b)},12) INTO :c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"Exponential of log ",b," = ",c SET a=a+1 } }
ここでは、システムの計算制限によって生じる非常に小さな差異を修正するROUND関数が必要な
ことに注意してください。上記の例では、この目的で ROUND がとりあえず小数点以下 12 桁に設
定されています。
関連項目
• SQL 関数 : EXP LOG10 ROUND
• Caché ObjectScript 関数 : $ZLN
LOG10
与えられた数値式の対数 (底 - 10) を返す、スカラ数値関数です。
{fn LOG10(float-expression)}
引数
FLOAT タイプの式。float-expression
概要LOG10 は、FLOAT タイプとして float-expression の常用対数の値を返します。
LOG10 は { } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、整数の常用対数を返します。
234 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT DISTINCT {fn LOG10(5)} AS Log10FROM Sample.Person
これは、.69897000433... を返します。
以下の埋め込み SQL の例は、1 から 10 の整数の常用対数を返します。
SET a=1 WHILE a<11 { &sql(SELECT {fn LOG10(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"Log-10 of ",a," = ",b SET a=a+1 } }
関連項目
• SQL 関数 : EXP LOG ROUND
• Caché ObjectScript 関数 : $ZLOG
LOWER
文字列式内のすべての大文字を、小文字に変換する汎用 SQL 関数です。
LOWER(string-expression)
引数
文字列式。その中の文字が小文字に変換されます。式は列
の名前や文字リテラル、または他のスカラ関数の結果を指
定できます。基本となるデータ型は、任意の文字タイプ(CHAR
や VARCHAR など) とすることができます。
string-expression
概要LOWERは大文字を小文字に変換します。これは、アルファベットでない文字に影響を与えません。
句読点および先頭の空白スペースを変更しません。末尾の空白スペースを削除します。LCASEは、
数値または NULL 値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは
数値から削除されます。
LCASE 関数も、大文字から小文字への変換に使用できます。
Caché SQL リファレンス 235
LOWER
%SQLUPPER関数は、大文字と小文字を区別しない比較または照合に対してデータ値を変換する、
SQL で優先的な方法です。ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
例以下の例は、各人の名前を小文字で返します。
SELECT Name,LOWER(Name) AS LowName FROM Sample.Person
また、LOWERは、ギリシャ文字を大文字から小文字に変換する以下の埋め込み SQLの例で示す
ように、Unicode (非 ASCII) アルファベット文字でも動作します。
SET a=$CHAR(920,913,923,913,931,931,913) &sql(SELECT LOWER(:a) INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a,!,b }
関連項目
• SQL 関数 : LCASE UCASE
• Caché ObjectScript 関数 : $ZCONVERT
LTRIM
先頭の空白を削除した文字列を返す文字列関数です。
LTRIM(string-expression)
{fn LTRIM(string-expression)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文
字タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
概要LTRIM は文字列式から先頭の空白を削除し、その文字列を VARCHAR タイプとして返します。
string-expression が NULL の場合、LTRIM は NULL を返します。string-expression が完全に空
白スペースで構成されている文字列の場合、LTRIM は空文字列 ('') を返します。
236 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
LTRIM は末尾の空白をそのまま残します。末尾の空白を削除するには、RTRIM を使用します。先
頭や末尾のあらゆるタイプの文字を削除するには、TRIM を使用します。空白を追加するには、
SPACE を使用します。
LTRIM は、{ } 括弧構文による ODBC スカラ関数、または SQL 汎用関数として使用できる点に注
意してください。
例以下の埋め込み SQLの例は、文字列から先頭の 5つの空白を削除します。末尾の 5つの空白は
そのまま残します。
SET a=" Test string with 5 leading and 5 trailing spaces. " &sql(SELECT {fn LTRIM(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Before LTRIM",!,"start:",a,":end" WRITE !,"After LTRIM",!,"start:",b,":end" }
これは、以下を返します。
Before LTRIMstart: Test string with 5 leading and 5 trailing spaces.:endAfter LTRIMstart:Test string with 5 leading and 5 trailing spaces. :end
関連項目RTRIM TRIM SPACE
MAX
指定された列内の最大データ値を返す集約関数です。
MAX([ALL | DISTINCT] expression)
引数
オプション — すべての値に集約関数を適用します。ALL は、MAX によっ
て返される値に影響を与えません。これは、SQL-92 の互換性のために
用意されたものです。
ALL
オプション — それぞれの一意な値が考慮されるように指定します。
DISTINCT は、MAX によって返される値に影響を与えません。これは、
SQL-92 の互換性のために用意されたものです。
DISTINCT
任意の有効な式。通常、最大値が返される値を持つ列の名前。expression
Caché SQL リファレンス 237
MAX
概要MAX 集約関数は、expression の最大値を返します。一般的に expression は、クエリで返される複
数行の中のフィールドの名前 (または、フィールド名を 1 つ以上含む式) です。
MAX は、テーブルまたはビューを参照する SELECT クエリまたは SELECT サブクエリで使用でき
ます。MAX は、一般のフィールド値とともに SELECT リストや HAVING 節で表示できます。
MAX は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON 節
では MAX を使用できません。
その他の集約関数とは異なり、ALLおよび DISTINCT キーワードはMAX内で何も実行しません。
これらは、SQL–92 の互換性のために用意されたものです。
データ値MAX によって使用される指定されたフィールドは、数値または非数値です。最大値は照合順で最
大となる値に定義されます。したがって、'Z'が最大のアルファベット値です。空文字列 ('')値は、ゼ
ロ (0) として処理されます。
データ・フィールドの NULL 値は、MAX 集約関数値を得る場合は無視されます。クエリから行が返
されない場合や、すべての行のデータ・フィールド値がNULLの場合、MAXはNULLを返します。
現在のトランザクションで発生する変更すべての集約関数と同様に、MAX も必ず、現在のトランザクションの分離レベルに関係なく、コミッ
トされていない変更も含めてデータの現在の状態を返します。詳細は、"SET TRANSACTION" と
"START TRANSACTION" を参照してください。
例以下のクエリは、Sample.Employee データベース内の最高 (最大) 給与額を返します。
SELECT MAX(Salary) As TopSalary FROM Sample.Employee
以下のクエリは、Sample.Employee データベース内で検出された照合順の最低 (最小) および最高
(最大) の名前を返します。
SELECT MIN(Name), MAX(Name) FROM Sample.Employee
以下のクエリは、Sample.Employeeデータベース内のHome_Stateが 'VT'である従業員の最高 (最
大) 給与額を返します。
SELECT MAX(Salary) FROM Sample.Employee WHERE Home_State = 'VT'
以下のクエリは、Sample.Employeeデータベース内のHome_State ごとに、従業員数および最高 (最
大) の従業員給与額を返します。
238 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT Home_State, COUNT(Home_State) As NumEmployees, MAX(Salary) As TopSalary FROM Sample.Employee GROUP BY Home_State ORDER BY TopSalary
関連項目MIN
MIN
指定された列内の最小データ値を返す集約関数です。
MIN([ALL | DISTINCT] expression)
引数
オプション —すべての値に集約関数を適用します。ALLは、MIN によって
返される値に影響を与えません。これは、SQL-92 の互換性のために用
意されたものです。
ALL
オプション — それぞれの一意な値が考慮されるように指定します。
DISTINCT は、MIN によって返される値に影響を与えません。これは、
SQL-92 の互換性のために用意されたものです。
DISTINCT
任意の有効な式。通常、最小値が返される値を持つ列の名前。expression
概要MIN集約関数は、expressionの最小値を返します。一般的にexpressionは、クエリで返される複数
行の中のフィールドの名前 (または、フィールド名を 1 つ以上含む式) です。
MIN は、テーブルまたはビューを参照する SELECT クエリまたは SELECT サブクエリで使用できま
す。MIN は、一般のフィールド値とともに SELECT リストや HAVING 節で表示できます。
MIN は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON 節
では MIN を使用できません。
その他の集約関数とは異なり、ALL および DISTINCT キーワードは MIN 内で何も実行しません。
これらは、SQL–92 の互換性のために用意されたものです。
Caché SQL リファレンス 239
MIN
データ値MINによって使用される指定されたフィールドは、数値または非数値です。最小値は照合順で最小
の値に定義されます。したがって、'a'が最小のアルファベット値です。数値フィールドでは、ゼロ (0)
または負の数値が存在している場合でも、空文字列 ('') は最小値として認識されます。
データ・フィールドの NULL 値は、MIN 集約関数値を得る場合は無視されます。クエリから行が返
されない場合や、すべての行に対するデータ・フィールド値が NULL の場合、MIN は NULL を返
します。
現在のトランザクションで発生する変更すべての集約関数と同様に、MINも必ず、現在のトランザクションの分離レベルに関係なく、コミット
されていない変更も含めてデータの現在の状態を返します。詳細は、"SET TRANSACTION" と
"START TRANSACTION" を参照してください。
例以下のクエリは、Sample.Employee データベース内の最低 (最小) 給与額を返します。
SELECT MIN(Salary) As LowSalary FROM Sample.Employee
以下のクエリは、Sample.Employee データベース内で検出された照合順の最低 (最小) および最高
(最大) の名前を返します。
SELECT MIN(Name), MAX(Name) FROM Sample.Employee
以下のクエリは、Sample.Employee データベース内の Home_State が VT である従業員の最低 (最
小) 給与額を返します。
SELECT MIN(Salary) FROM Sample.Employee WHERE Home_State = 'VT'
以下のクエリは、Sample.Employeeデータベース内のHome_State ごとに、従業員数および最低 (最
小) の従業員給与額を返します。
SELECT Home_State, COUNT(Home_State) As NumEmployees, MIN(Salary) As LowSalary FROM Sample.Employee GROUP BY Home_State ORDER BY LowSalary
関連項目MAX
240 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
MINUTE
与えられた日付/時刻式で、分の構成要素に対応する0から59までの整数値を返す、スカラ日付/
時刻関数です。
{fn MINUTE(time-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。基本となるデータ型は、TIME または
TIMESTAMP とすることができます。
time-expression
概要MINUTE は、時刻整数または日付/時刻文字列の分部分を返します。日付/時刻文字列は、以下
の形式で指定します。
yyyy-mm-dd hh:mm:ss
この既定の時刻形式を変更するには、SET OPTION コマンドを使用します。
分 (mm) 部分は、0 から 59 までの範囲の整数でなければなりません。ただし、ユーザの指定値に
対して、範囲チェックは行われません。59 よりも大きな数、負の数、および小数は、指定されたとお
りに返されます。入力では、先頭のゼロはオプションです。出力では、先頭と末尾のゼロは抑制され
ます。
分部分が '0'、'00'、または非数値の場合、MINUTEはゼロを返します。また、時刻文字列の分部分
が完全に省略されている場合 ('hh'、'hh:'、'hh::'、'hh::ss')、時刻式が指定されていない場合、また
は時刻式形式が無効の場合にも、ゼロ分が返されます。
DATEPART または DATENAME を使用して、同じ時刻情報を取得できます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.MINUTE(time-expression)
例以下の例は、日付/時刻文字列の時刻式が 45 分を表しているので、両方とも 45 を返します。
SELECT DISTINCT {fn MINUTE('2000-02-16 18:45:38')} AS Minutes_GivenFROM Sample.Person
SELECT DISTINCT {fn MINUTE(67538)} AS Minutes_GivenFROM Sample.Person
Caché SQL リファレンス 241
MINUTE
以下の例は、日付/時刻文字列から時刻式が省略されているので、ゼロ分を返します。
SELECT DISTINCT {fn MINUTE('2000-02-16')} AS Minutes_GivenFROM Sample.Person
以下の例は、すべて現在の時刻の分部分を返します。CURRENT_TIME と CURTIME は時刻文字
列を返し、NOW は日付/時刻文字列を指定します。
SELECT DISTINCT {fn MINUTE(CURRENT_TIME)} AS Minutes_NowFROM Sample.Person
SELECT DISTINCT {fn MINUTE({fn CURTIME()})} AS Minutes_NowFROM Sample.Person
SELECT DISTINCT {fn MINUTE({fn NOW()})} AS Minutes_NowFROM Sample.Person
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL 関数 : HOUR SECOND CURRENT_TIME CURTIME NOW DATEPART DATENAME
• Caché ObjectScript : $ZTIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
MOD
ある数を別の数で割った係数 (剰余) を返す、スカラ数値関数です。
{fn MOD(dividend,divisor)}
引数
除算の分子 (被除数) である数字。dividend
除算の分母 (除数) である数字。divisor
概要MODは、被除数を除数で割った余り (係数)を返します。負の被除数を含む除算に対しては、負ま
たはゼロを返します。どちらかの引数に NULL 値を渡すと、MOD は NULL を返します。
MOD は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、MOD で返された余りを示しています。
242 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT DISTINCT {fn MOD(5,3)} AS RemainderFROM Sample.Person
これは、2 を返します。
以下の例は、負の被除数を使用した MOD で返される余りを示しています。
SELECT DISTINCT {fn MOD(-5,3)} AS RemainderFROM Sample.Person
これは、1 を返します。
以下の例は、負の除数を使用した MOD で返される余りを示しています。
SELECT DISTINCT {fn MOD(5,-3)} AS RemainderFROM Sample.Person
これは、–1 を返します。
関連項目CEILING FLOOR ROUND TRUNCATE
MONTH
与えられた日付式で、その月を 1 から 12 までの整数値として返す、スカラ日付/時刻関数です。
{fn MONTH(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタ
ンプ・リテラルである式。
date-expression
概要MONTH は、日付整数または日付/時刻文字列の月部分を返します。日付/時刻文字列は、以下
の形式で指定します。
yyyy-mm-dd hh:mm:ss
月 (mm) 部分は、1 から 12 までの範囲の整数でなければなりません。ただし、ユーザの指定値に
対して、範囲チェックは行われません。12よりも大きな数、ゼロ、小数は、指定されたとおりに返され
ます。(–) は区切り文字として使用されるため、負の数はサポートされません。入力では、先頭のゼ
ロはオプションです。出力では、先頭と末尾のゼロは抑制されます。
Caché SQL リファレンス 243
MONTH
月部分が '0'、'00'、または数以外の値の場合、MONTH はゼロを返します。日付文字列の月部分
が完全に省略されている場合 ('yyyy––dd')、または日付式が指定されていない場合も、ゼロが返さ
れます。
MONTH は、日付文字列内にある 2 番目の数値文字列を月の値として解釈します。そのため、日
付文字列の年の部分を省略すると ('mm-dd hh:mm:ss')、2 番目の数値 ('dd') を月の値として処理
する結果になります。したがって、不明な年の値に対して、先頭にハイフンあるいはプレースホルダ
を指定する必要があります。Caché との互換性に関しては、一般的に、9999が好ましい既定の年の
値です。
日付/時刻文字列の要素は、SQL スカラ関数の YEAR、MONTH、DAYOFMONTH、HOUR、
MINUTE、SECOND をそれぞれ使用して取得できます。DATEPART または DATENAME 関数を
使用して、同じ要素を取得することもできます。日付要素は、TO_DATE を使用して取得できます。
DATEPART および DATENAME では、月の値に対して値と範囲のチェックが行われます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.MONTH(date-expression)
例以下の例は、2 月は 1 年の中で 2 番目の月なので、両方とも 2 を返します。
SELECT DISTINCT {fn MONTH('2000-02-16')} AS Month_GivenFROM Sample.Person
SELECT DISTINCT {fn MONTH(59589)} AS Month_GivenFROM Sample.Person
以下の例は、月が省略されているため、ゼロを返します。
SELECT DISTINCT {fn MONTH('2000--16')} AS Month_GivenFROM Sample.Person
SELECT DISTINCT {fn MONTH('12:34:55')} AS Month_GivenFROM Sample.Person
SELECT DISTINCT {fn MONTH('2000 12:34:55')} AS Month_GivenFROM Sample.Person
以下の例は、省略された年に対してプレースホルダ文字(-)が指定されているため、2を返します。
SELECT DISTINCT {fn MONTH('-02-16')} AS Month_GivenFROM Sample.Person
以下の例は、現在の月を返します。
SELECT DISTINCT {fn MONTH({fn NOW()})} AS Month_NowFROM Sample.Person
SELECT DISTINCT {fn MONTH(CURRENT_DATE)} AS Month_NowFROM Sample.Person
244 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目
• SQL 関数 : DATEPART DATENAME DAYOFMONTH MONTHNAME TO_DATE
• Caché ObjectScript 関数 : $ZDATE
MONTHNAME
与えられた日付式の月名を含む文字列を返す、スカラ日付/時刻関数です。
{fn MONTHNAME(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタ
ンプ・リテラルである式。
date-expression
概要MONTHNAMEは、日付整数または日付/時刻文字列を入力として取ります。日付/時刻文字列は、
以下の形式で指定します。
yyyy-mm-dd hh:mm:ss
返される月の名前は、January から December です。
MONTHNAME は、指定された日付が有効であることをチェックします。年は 1841 ~ 9999、月は
01 ~ 12、日はその月に適切な数字 (例えば、02/29 はうるう年のみ有効) である必要があります。
日付が無効の場合、MONTHNAME は SQLCODE = -400 (致命的なエラーが発生しました) を設
定します。
月の名前は、既定のアメリカ英語の省略のない月の名前になります。これらの月の名前の値を変更
するには、MONTH_NAME オプションで SET OPTION コマンドを使用します。
DATENAME 関数を使用して、同じ月名情報を取得することもできます。TO_DATE を使用すると、
他の日付要素で月の名前または月名の省略形を検索できます。月に対応する整数を返すには、
MONTH、DATEPART、または TO_DATE を使用します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.MONTHNAME(date-expression)
Caché SQL リファレンス 245
MONTHNAME
例以下の例は、日付式 (February 16, 2000) の月は 2 月なので、両方とも、文字列 "February" を返
します。
SELECT DISTINCT {fn MONTHNAME('2000-02-16')} AS NameOfMonthFROM Sample.Person
SELECT DISTINCT {fn MONTHNAME(59589)} AS NameOfMonthFROM Sample.Person
以下の例は、現在の月を返します。
SELECT DISTINCT {fn MONTHNAME({fn NOW()})} AS NameMonthNowFROM Sample.Person
SELECT DISTINCT {fn MONTHNAME(CURRENT_DATE)} AS NameMonthNowFROM Sample.Person
以下の埋め込み SQL の例は、MONTHNAME が無効な日付 (2001 年はうるう年ではない) をどの
ように処理するかを示します。
SET testdate="2001-02-29" &sql(SELECT {fn MONTHNAME(:testdate)} AS NameOfMonth INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"returns: ",a } QUIT
SQLCODE -400 エラー・コードが発行されます。
関連項目
• SQL 関数 : DATEPART DATENAME DAYOFMONTH MONTH TO_DATE
• Caché ObjectScript 関数 : $ZDATE
- (負の数)
式を数値の負の数として返す、単項演算子です。
-expression
引数
数値式。expression
246 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要単項演算子は、数値データ型カテゴリのすべてのデータ型の式の中でも、1つの式でしか処理を実
行しません。
– (負の数) は Caché SQL の拡張です。
例以下の例は、Sample.Person からの Age 列、Age の平均の – (負の数) 値、および平均年齢を引い
た Age の 3 つの数値フィールドを返します。
SELECT Age, -(AVG(age)) AS NegAvg, Age-AVG(Age) AS AgeRelAvgFROM Sample.Person
関連項目+ (正の数)
NOW
現在の日付と時刻を返す、スカラ日付/時刻関数です。
{fn NOW()}{fn NOW}
概要NOW は引数を持たず、TIMESTAMP 型として日付と時刻を返します。引数の括弧はオプションで
す。
以下の形式で現在の日付と時刻を返します。
yyyy-mm-dd hh:mm:ss
時間は 24 時間形式で表示されます。先頭のゼロは、すべてのフィールドで維持されます。
既定の日付/時刻形式を変更するには、各種日付/時刻オプションでSETOPTIONコマンドを使用
します。
現在の日付と時刻を返す場合は、CURRENT_TIMESTAMP および GETDATE 関数も使用できま
す。これらの関数は秒の小数部の精度をサポートし、NOW は精度をサポートしません。これらの関
数は、すべて TIMESTAMP データ型を使用します。
Caché SQL リファレンス 247
NOW
現在の日付のみを返すには、CURDATE または CURRENT_DATE を使用します。現在の時刻の
みを返すには、CURRENT_TIME または CURTIME を使用します。これらの関数では、DATE また
は TIME データ型が使用されます。これらの関数は、いずれも精度をサポートしません。
埋め込み SQL を使用するときは、これらのデータ型の動作が異なります。TIMESTAMP データ型
は、同じ形式で値を格納および表示します。TIME および DATE データ型は $HOROLOG形式の
整数として値を格納し、SQL で表示されるときは日付または時刻表示形式に変換され、埋め込み
SQL から返されるときは整数として返されます。日付および時刻のデータ型は、CAST または
CONVERT 関数を使用して変更できます。
すべての Caché SQL タイムスタンプ関数は、ローカル・タイム・ゾーン設定に依存します。ユニバー
サルな (タイム・ゾーンに依存しない)現在のタイムスタンプを取得するには、Caché ObjectScript の
$ZTIMESTAMP 特殊変数を使用します。
例以下の例は、両方とも現在のシステム日付と時刻を返します。
SELECT DISTINCT {fn NOW()} AS DateTimeFROM Sample.Person
SELECT DISTINCT {fn NOW} AS DateTimeFROM Sample.Person
以下の埋め込み SQL の例は、ローカル・タイムスタンプ (タイム・ゾーン依存) とユニバーサル・タイ
ムスタンプ (タイム・ゾーン非依存) を比較します。
SET b=$ZDATETIME($ZTIMESTAMP,3) &sql(SELECT {fn NOW} INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"SQL Now is: ",a WRITE !,"ZTimestamp is: ",b }
以下の例は、Orders テーブルの指定された行の LastUpdate フィールドに、現在のシステム日付と
時刻を設定します。
UPDATE Orders SET LastUpdate = {fn NOW()} WHERE Orders.OrderNumber=:ord
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL タイムスタンプ関数 : CAST CONVERT CURRENT_TIMESTAMP GETDATE
TIMESTAMPADD TIMESTAMPDIFF
• SQL 現在の日付/時刻関数 : CURDATE CURRENT_DATE CURRENT_TIME CURTIME
• Caché ObjectScript : $ZDATETIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
248 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
NULLIF
式が真であれば NULL を返す汎用 SQL 関数です。
NULLIF(expression1,expression2)
引数
SQL 式。expression1
SQL 式。expression2
概要expression1 が expression2 と等しい場合、NULLIF 関数は NULL を返します。それ以外は
expression1 を返します。DISPLAYモードまたはODBCモードで返されるデータ型は、expression1
のデータ型によって決まります。
NULLIF は、以下と同等です。
SELECT CASE WHEN value1 = value2 THEN NULLELSE value1ENDFROM MyTable
以下の表は、さまざまな SQL 比較関数を示します。比較テストが真 (A は B と等しい) の場合、各
関数は特定の値を返し、偽 (A は B と等しくない) の場合、別の値を返します。
Caché SQL リファレンス 249
NULLIF
返り値比較テストSQL 関数
真 = NULL
偽 = 式 1
式 1 = 式 2NULLIF
真 = 式 2
偽 = NULL
式 1 = NULLIFNULL (2-引数形式)
真 = 式 2
偽 = 式 1
式 1 = NULLISNULL
真 = 式 2
偽 = 式 1
式 1 = NULLNVL
真 = 式 2
偽 = 式 3
式 1 = NULLIFNULL (3-引数形式)
例以下の例は、NULLIF関数を使用して、Age=21を持つすべてのレコードの表示フィールドをNULL
に設定します。
SELECT Name,Age,NULLIF(Age,21) AS Nulled21FROM Sample.Person
関連項目CASE IFNULL ISNULL
NVL
NULL テストを行い、適切な式を返す汎用 SQL 関数です。
NVL(check-expression,replace-expression)
引数
評価される式。check-expression
check-expression が NULL の場合に返される式。replace-expression
250 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要NVL は check-expression を評価し、2 つの値のうち 1 つを返します。
• check-expression が NULL の場合は、replace-expression を返します。
• check-expression が NULL でない場合は、check-expression を返します。
引数 check-expression および replace-expression は、あらゆるデータ型を持つことができます。そ
れらのデータ型が異なる場合、Caché はそれらを比較する前に replace-expression を
check-expression のデータ型に変換します。返り値のデータ型は常に check-expression と同じで
す。ただし、check-expression が文字データでない場合は、返り値のデータ型はVARCHAR2にな
ります。
以下の表は、さまざまな SQL 比較関数を示します。比較テストが真 (A は B と等しい) の場合、各
関数は特定の値を返し、偽 (A は B と等しくない) の場合、別の値を返します。
返り値比較テストSQL 関数
真 = NULL
偽 = 式 1
式 1 = 式 2NULLIF
真 = 式 2
偽 = NULL
式 1 = NULLIFNULL (2-引数形式)
真 = 式 2
偽 = 式 1
式 1 = NULLISNULL
真 = 式 2
偽 = 式 1
式 1 = NULLNVL
真 = 式 2
偽 = 式 3
式 1 = NULLIFNULL (3-引数形式)
NVL は Oracle との互換性のためにサポートされており、ISNULL 関数と同じである点に注意してく
ださい。
例以下の例は、check-expression が NULL なので、replace-expression (99) を返します。
SELECT DISTINCT NVL(NULL,99) AS NullTestFROM Sample.Person
Caché SQL リファレンス 251
NVL
以下の例は、check-expression が NULL ではないので、check-expression (33) を返します。
SELECT DISTINCT NVL(33,99) AS NullTestFROM Sample.Person
以下の例では、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合
は FavoriteColors の値を返します。
SELECT Name,NVL(FavoriteColors,'No Preference') AS ColorPrefFROM Sample.Person
関連項目ISNULL IFNULL
%ODBCIN
LOGICAL 形式の式を返す汎用形式変換関数です。
%ODBCIN(expression)
%ODBCIN expression
引数
変換される式。expression
概要%ODBCINは、Fieldやデータ型のOdbcToLogical メソッドで値を渡した後、expression を LOGICAL
形式で返します。LOGICAL 形式は、データのメモリ内形式です (処理が実行される形式)。
%ODBCIN は、Caché SQL の拡張です。
例以下の例は、既定の表示形式 %ODBCIN および同じフィールドの %ODBCOUT 形式を示していま
す。
SELECT FavoriteColors,%ODBCIN(FavoriteColors) AS InVal,%ODBCOUT(FavoriteColors) AS OutValFROM Sample.Person
関連項目%EXTERNAL %INTERNAL %ODBCOUT
252 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
%ODBCOUT
ODBC 形式の式を返す汎用形式変換関数です。
%ODBCOUT(expression)
%ODBCOUT expression
引数
変換される式。expression
概要%ODBCOUTは、Fieldやデータ型のLogicalToOdbc メソッドで値を渡した後、expression をODBC
形式で返します。ODBC 形式は、ODBC を経由してデータを表示できる形式です。この形式は、
データが ODBC/SQL に公開されるときに使用されます。使用可能な形式は ODBC で定義したも
のに対応します。
%ODBCOUT は、Caché SQL の拡張です。
例以下の例は、既定の表示形式 %ODBCIN および同じフィールドの %ODBCOUT 形式を示していま
す。
SELECT FavoriteColors,%ODBCIN(FavoriteColors) AS InVal,%ODBCOUT(FavoriteColors) AS OutValFROM Sample.Person
関連項目%EXTERNAL %INTERNAL %ODBCIN
OPEN
カーソルをオープンします。
OPEN cursor-name
引数
カーソルの名前。識別子であり、すでに宣言されています。cursor-name
Caché SQL リファレンス 253
%ODBCOUT
概要OPEN 文は、カーソルの DECLARE 文で指定されているパラメータに従ってカーソルをオープンし
ます。オープンすると、カーソルを取得できます。オープンしたカーソルは、クローズする必要があり
ます。
SQL 文として、埋め込み SQL からのみサポートされます。同様の操作は、ODBC でも ODBC API
を使用してサポートされます。
例以下は、EmpCursor という名前のカーソルをオープンしてクローズする埋め込み SQL の例です。
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"DECLARE Error code ",SQLCODE QUIT } ELSE { WRITE !,"BEFORE: Name=",name," State=",state } &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
関連項目CLOSE カーソル DECLARE FETCH
ORDER BY
結果セットでの行のソートを指定する SELECT 節です。
ORDER BY ordering-item [ASC | DESC]{,ordering-item [ASC | DESC] ...}
引数
ソートの順序を決定するリテラルやスカラ式。ORDER BY 節は、単
一もしくは複数の順序付け項目を含むことができます。
ordering-item
オプション — 昇順 (ASC)、あるいは降順 (DESC) のいずれかでソー
トします。既定は昇順です。
ASC
DESC
254 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要ORDER BY 節は、テーブルやクエリの結果セットの行をソートします。この文は、SELECT 文、また
は複数の SELECT 文の UNION による、単一の結果セットに対して動作します。
コンマで区切られたリストとしてソートする、複数の行を指定することができます。ソートは最初にリス
トされている列で実行され、次に同じ列内の 2 番目の列のへと続きます。
列は、フィールド名、フィールドまたは定数の式、あるいは列番号で指定できます。最初の文字が数
字の場合、Caché は列番号を指定しているとみなします。それ以外は、フィールド名または式を指
定しているとみなされます。
以下の ORDER BY 節は、フィールド名でソートしています。
ORDER BY Home_State,LName,FName
以下の ORDER BY 節は、列番号 (SELECT 文で指定されているように、検索された列の数値順)
でソートしています。
ORDER BY 3,1,2
Caché 参照 (->) 構文は、例えば以下のようにフィールド名を指定するために使用できます。
ORDER BY Car->color
列番号は、SELECT節リスト内の位置を参照します。列番号は、テーブル自体の列の位置を参照し
ません。
整数や、またはいかなる番号でも、列番号を指定できます。標準的なトランケーション・ルールは、
整数の解決に適用されます。例えば 1.99 は切捨てにより 1 となります。
ソートは照合シーケンス順序で実行されます。ソートは、作成時に列に指定された照合に基づいて
実行されます。文字列の列の既定は %SQLUPPER です。式に対しては、既定照合は %EXACT で
す。ORDER BY節の %SQLSTRING(fieldxyz) などの式を使用して、既定をオーバーライドできます。
既定の昇順照合シーケンスは、空文字列 ('') よりも NULL を最小値とします。ORDER BYは、空白
スペースのみで構成される文字列と空文字列を区別しません。
列識別子の前の、オプションの ASC (昇順) や DESC (降順) キーワードで指定されたように、各列
のソートは昇順または降順の照合順で指定できます。ASC や DESC が指定されていない場合、
ORDER BY は列を昇順でソートします。以下はその例です。
SELECT A,B,C,M,E,X,JFROM LetterTableORDER BY 3,7 DESC,1 ASC
SELECT節リスト内の3番目にリストされた項目(C)のデータ値を昇順でソートします。この中では、
7番目にリストされた項目 (J) の値を降順でソートします。この中では、1番目にリストされた項目 (A)
の値を昇順でソートします。
Caché SQL リファレンス 255
ORDER BY
SELECTクエリがORDERBY節を指定する場合、結果のデータは更新できません。したがって、後
に続くDECLARE CURSOR FOR UPDATE文を指定する場合、FOR UPDATE節は無視され、カー
ソルは読み取り専用で宣言されます。
ORDERBYがUNIONに適用される場合、順序付け項目は数字か単純な列名にします。式は使用
できません。列名を使用する場合、列の名前付けがUNIONの最初の SELECT リストで行われたも
のとして結果の列を参照します。
例以下の 2つの例は、1 つの ORDER BY 節内で列のソートに異なる方法を指定しています。以下の
2つのクエリは同等です。1番目はソート項目として列名を使用し、2番目は列番号(選択したフィー
ルドのシーケンス番号) を使用しています。
SELECT Name,Age,Home_StateFROM Sample.PersonORDER BY Home_State,Age DESC
SELECT Name,Age,Home_StateFROM Sample.PersonORDER BY 3,2 DESC
関連項目クエリ SELECT UNION
PI
円周率の定数値を返すスカラ数値関数です。
{fn PI()}{fn PI}
概要PIは、引数を取りません。FLOATタイプとして数学定数pi を返します。引数の括弧はオプションで
す。
PI は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、両方とも pi 値を返します。
SELECT DISTINCT {fn PI()} AS ExactPiFROM Sample.Person
SELECT DISTINCT {fn PI} AS ExactPiFROM Sample.Person
256 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
これは、3.141592653589793238 を返します。
関連項目
• SQL 関数 : ROUND
• Caché ObjectScript 特殊変数 : $ZPI
$PIECE
指定された部分文字列を返す汎用 SQL 関数です。
$PIECE(plist,delimiter[,from[,to]])
引数
部分文字列を返すターゲット文字列。plist
部分文字列の識別に使用する区切り文字。delimiter
オプション—ターゲット文字列から返す部分文字列または部分文字列の範
囲の先頭を指定する整数。部分文字列は、delimiter で区切り 1 から始め
ます。省略すると、最初の部分文字列が返されます。
from
オプション—ターゲット文字列から返す部分文字列の範囲の最終部分文字
列を指定する整数。from とともに使用する必要があります。
to
概要$PIECE は、指定された部分文字列 (断片) を plist から返します。返される部分文字列は、使用す
るパラメータによって異なります。
• $PIECE(plist,delimiter) は、plist の最初の部分文字列を返します。delimiter が plist 内に見つ
かった場合、最初の delimiter の前にある部分文字列が返されます。delimiter が plist 内に見
つからない場合、返される部分文字列は plist です。
• $PIECE(plist,delimiter,from) は、plist の n 番目の部分文字列を返します。整数 n は from パ
ラメータで指定し、部分文字列は delimiter で区切ります。区切り文字は返されません。
• $PIECE(plist,delimiter,from,to) は、from で指定された部分文字列から to で指定された部分
文字列までの範囲にある部分文字を返します。4 つの引数の $PIECE が返す文字列は、from
から to までの部分文字列の間にあり、それらを区切っている delimiter を含んだすべての文字
列を返します。toが部分文字列数よりも大きい場合、返される部分文字列には、plist文字列の
末尾までのすべての部分文字列が含まれます。
Caché SQL リファレンス 257
$PIECE
引数
plist
部分文字列を返すターゲット文字列です。文字列リテラル、変数名、または文字列として評価される
任意の有効な式を指定できます。
通常、ターゲット文字列には、区切り文字として使用される文字(または文字列)が含まれます。この
文字または文字列は、plist 内でデータ値として使用することはできません。
ターゲット文字列として NULL 文字列 (NULL) を指定した場合、$PIECE は <null>、つまり NULL
文字列を返します。
delimiter
plist 内の部分文字列を区切るために使用する検索文字列です。(引用符で囲まれた) 数値または
文字列リテラル、変数名、あるいは文字列として評価される式を指定できます。
通常、区切り文字には、文字列データ内で決して使用されることがなく、部分文字列を区切る文字
としてのみ使用する特定の文字を設定します。区切り文字には、複数文字からなる検索文字列を指
定することもできますが、それを構成する個々の文字は文字列データ内で使用できます。
区切り文字として NULL 文字列 (NULL) を指定した場合、$PIECE は <null>、つまり NULL 文字列
を返します。
from
plist内の部分文字列の番号で、1から始まります。これは正の整数、整数変数の名前、または正の
整数として評価される式でなければなりません。部分文字列は区切り文字で区切ります。
• from パラメータが省略された場合または 1 に設定された場合、$PIECE は plist の最初の部分
文字列を返します。指定された区切り文字が plist にない場合、from 値の 1 は plist を返しま
す。
• from パラメータが計算によって plist の最後の部分文字列を指す場合、この部分文字列の後
に区切り文字があるなしに関係なく、この部分文字列が返されます。
• from の値が NULL、ゼロ、負の数の場合、または plist の部分文字列数よりも大きい場合、
$PIECE は NULL 文字列を返します。
from パラメータが to パラメータとともに使用される場合、from パラメータは文字列として返される部
分文字列の範囲の先頭を指定し、to の値よりも小さくなければなりません。
to
from パラメータによって先頭が指定された範囲を終了する、plist 内の部分文字列の番号です。返
される文字列には、from の位置の部分文字列と to の位置の部分文字列に加えて、その両者の間
の部分文字列とそれらを区切る区切り文字が含まれます。to引数は、正の整数、整数変数の名前、
258 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
または正の整数に評価される式でなければなりません。to パラメータは必ず from とともに使用し、
from の値よりも大きな値にする必要があります。
• from が to よりも小さい場合、$PIECE は、from 位置の部分文字列と to 位置の部分文字列を
含む、この範囲内にあるすべての区切られた部分文字列からなる文字列を返します。この返さ
れた文字列には、範囲内にある部分文字列と区切り文字が含まれます。
• 区切られた部分文字列の数よりも toが大きい場合、返される値には、from位置の部分文字列
から plist 文字列の末尾までのすべての文字列データ (部分文字列と区切り文字) が含まれま
す。
• from が to と同じ場合、from 位置の部分文字列が返されます。
• from が to よりも大きい場合、$PIECE は NULL 文字列を返します。
• to が NULL 文字列 (NULL) の場合、$PIECE は NULL 文字列を返します。
例以下の例は、"," 区切り文字で識別された最初の部分文字列である 'Red' を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',')FROM Sample.Person
以下の例は、"," 区切り文字で識別された 3 番目の部分文字列である 'Blue' を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',',3)FROM Sample.Person
以下の例は、colorlist の 3 番目から 5番目の要素である 'Blue,Yellow,Orange' を、"," で区切って
返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',',3,5)FROM Sample.Person
以下の $PIECE 関数はどちらも '123' を返します。これは、from が 1 のとき、引数が 2 つの形式と
3 つの形式が同等であることを示しています。
SELECT DISTINCT $PIECE('123#456#789','#') AS TwoArgFROM Sample.Person
SELECT DISTINCT $PIECE('123#456#789','#',1) AS ThreeArgFROM Sample.Person
以下の例は、複数文字の区切り文字列 '#-#' を使用して、3番目の部分文字列 '789' を返します。
この場合、区切り文字列を構成する個々の文字の '#' と '-' はデータ値として使用でき、指定され
た文字シーケンス (#-#) のみが区切り文字列として認識されます。
SELECT DISTINCT$PIECE('1#2-3#-#45##6#-#789','#-#',3)FROM Sample.Person
Caché SQL リファレンス 259
$PIECE
以下の例は 'MARCH;APR;MAY' を返します。これは 3 番目から 5 番目の部分文字列で構成さ
れ、delimiter ';' で区別されています。
SELECT DISTINCT$PIECE('JAN;FEB;MARCH;APR;MAY;JUN',';',3,5)FROM Sample.Person
以下の例は、"A,B"を返します。これは、$PIECEを入れ子にできることを示しています。曲折アクセ
ント記号 (^) で区切られた nestlist の 2 番目の部分を探し、次にコンマ (,) で区切られた部分文字
列 "A,B,C" の最初と 2 番目の部分を探します。
メモ
データ値をアンパックする $PIECE の使用法
$PIECE は、通常、区切り文字で区切られた複数のフィールドを含むデータ値を "アンパック" する
ために使用されます。一般的な区切り文字には、スラッシュ (/)、コンマ (,)、スペース ( )、およびセミ
コロン (;) があります。以下の例の値は、$PIECE の使用を示した良い例です。
'John Jones/29 River St./Boston MA, 02095''Mumps;Measles;Chicken Pox;Diptheria''45.23,52.76,89.05,48.27'
$PIECE および $LENGTH
2つの引数の$LENGTHは、区切り文字に基づいて、文字列の部分文字列数を返します。$LENGTH
を使用して文字列の部分文字列数を調べ、$PIECE を使用して個々の部分文字列を抽出します。
$PIECE および $LIST
$PIECE 関数と $LIST 関数によって使用されるデータ格納方法には互換性がなく、組み合わせて
使用することはできません。例えば、$LISTBUILD を使用して作成されたリストに対して $PIECE を
使用すると、予測できない結果を生じる可能性があり、これは避けるべきです。このことは、SQL 関
数および対応する Caché ObjectScript 関数の両方に当てはまります。
$LIST 関数は、特定の区切り文字を使用せずに部分文字列を指定します。区切り文字または区切
り文字シーケンスの設定が特定のデータ型 (ビット文字列データなど) に対して不適切な場合は、
$LISTBUILD と $LIST SQL 関数を使用して部分文字列の格納と検索を行ってください。
NULL 値
$PIECEは、値がNULL文字列 (NULL)の部分文字列と、存在しない部分文字列を区別しません。
両方とも、<null>、つまり NULL 文字列値が返されます。例えば、以下の 2 つの例は、from 値の
7 に対して、ともに NULL 文字列値を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black',',',7)FROM Sample.Person
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black,',',',7)FROM Sample.Person
260 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
最初の例では、7 番目の文字列がないので、NULL 文字列が返されます。2 番目の例では、plist
文字列の最後に区切り文字で示された 7 番目の文字列があり、この 7 番目の部分文字列の値が
NULL 文字列です。
以下の例は、plist 内に NULL 値がある場合を示しています。これは部分文字列 3 を抽出します。
この部分文字列は存在しますが、NULL 文字列です。
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',3)FROM Sample.Person
以下の例も、NULL 文字列を返します。指定された部分文字列が存在しないためです。
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',0)FROM Sample.Person
SELECT DISTINCT $PIECE('Red,Green,,Blue,Yellow,Orange,Black,',',',8,20)FROM Sample.Person
以下の例では、plist 文字列内に delimiter が使用されていないため、$PIECE 関数は plist 文字列
全体を返します。
SELECT DISTINCT $PIECE('Red,Green,Blue,Yellow,Orange,Black,','#')FROM Sample.Person
入れ子になった $PIECE 操作
複雑な抽出を実行するために、$PIECE参照を入れ子にすることができます。内側の $PIECE で返
された部分文字列が外側の $PIECE の操作対象になります。各 $PIECE はそれぞれの区切り文字
を使用します。例えば、以下の例は、州の省略形の 'MA' を返します。
SELECT DISTINCT $PIECE($PIECE('John Jones/29 River St./Boston MA 02095','/',3),' ',2)FROM Sample.Person
以下は、入れ子になった $PIECE操作のもう 1つの例で、区切り文字の階層が使用されています。
最初に、内側の $PIECE が曲折アクセント記号 (^) の区切り文字を使用して、文字列の 2番目の部
分文字列である 'A,B,C' を探します。次に、外側の $PIECE がコンマ (,) 区切り文字を使用して、
部分文字列 'A,B,C' の最初と 2 番目の部分文字列 ('A,B') を返します。
SELECT DISTINCT$PIECE($PIECE('1,2,3^A,B,C^@#!','^',2),',',1,2)FROM Sample.Person
関連項目
• SQL 関数 : $EXTRACT $FIND $LENGTH $LIST
• Caché ObjectScript 関数 : $EXTRACT $FIND $LENGTH $LIST $PIECE
Caché SQL リファレンス 261
$PIECE
POSITION
文字列内にある文字列式の位置を返す汎用 SQL 関数です。
POSITION(string-expression-1 IN string-expression-2)
引数
検索する文字列式。式は、列の名前、文字列リテラル、ま
たは他のスカラ関数の結果にできます。基本となるデータ
型は、任意の文字タイプ (CHAR や VARCHAR2 など) と
することができます。
string-expression-1
検索する文字列式であるstring-expression-1を含む文字
列式。
string-expression-2
概要POSITIONは、string-expression-2 内の string-expression-1 の最初の場所の位置を返します。位
置情報は、整数として返されます。string-expression-1 が見つからない場合、0 (ゼロ) が返されま
す。どちらかの引数に NULL値 を渡すと、POSITION は NULL を返します。
POSITION は、大文字と小文字を区別します。大小文字変換関数の 1 つを使用して、文字列の大
文字と小文字のインスタンスをどちらも配置します。
例以下の例は、"b" が文字列の 11 番目の文字であるため 11 を返します。
SELECT DISTINCT POSITION('b' IN 'The quick brown fox') AS PosIntFROM Sample.Person
以下の例は、Sample.Person テーブル内の各名前に対する姓 (苗字) の長さを返します。残りの名
前フィールドから姓を区切るために使用するコンマを配置し、次にその位置から 1 を減算します。
SELECT Name,POSITION(',' IN Name)-1 AS LNameLenFROM Sample.Person
以下の例では、Sample.Person テーブル内の各名前にある文字 "B" の最初のインスタンスの位置
を返します。POSITIONは大文字と小文字を区別するため、%SQLUPPER関数を使用して、検索を
実行する前にすべての名前の値を大文字に変換します。%SQLUPPER は文字列の最初に空白ス
ペースを加えるため、この例では 1 を減算して、実際の文字位置を取得します。指定した文字列を
配置できないと、検索はゼロ (0) を返します。この例では、1を減算しているので、これらの検索で表
示される値は –1 です。
262 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT Name,POSITION('B' IN %SQLUPPER(Name))-1 AS BPosFROM Sample.Person
+ (正の数)
式を数値の正の数として返す単項演算子です。
+expression
引数
数値式。expression
概要単項演算子は、1 つの式でしか処理を実行しません。この式は、数値データ型カテゴリのすべての
データ型の式にできます。
+ (正の数) は Caché SQL の拡張です。
関連項目- (負の数)
POWER
与えられた式の値を、指定の数で累乗して返すスカラ数値関数です。
{fn POWER(numeric-expression,power)}
引数
基本の数値。numeric-expression
numeric-expression を累乗する指数。power
概要POWER は、ある数を累乗します。結果の値は numeric-expression と同じタイプで返されます。引
数に NULL 値を渡すと、POWER は NULL を返します。
POWER は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
Caché SQL リファレンス 263
+ (正の数)
例以下の例は、5 を 3 乗します。
SELECT DISTINCT {fn POWER(5,3)} AS CubedFROM Sample.Person
これは、125 を返します。
以下の埋め込み SQL の例は、2 の最初の 16 のべき乗を返します。
SET a=1 WHILE a<17 { &sql(SELECT {fn POWER(2,:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"2 to the ",a," = ",b SET a=a+1 } }
関連項目
• SQL 関数 : EXP LOG10 SQRT
• Caché ObjectScript 関数 : $ZPOWER
QUARTER
与えられた日付式で、その年の四半期を 1 から 4 までの整数値として返す、スカラ日付/時刻関数
です。
{fn QUARTER(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または
日付やタイムスタンプ・リテラルである式。
date-expression
264 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要QUARTER は日付整数または日付/時刻文字列を受け取り、その年の四半期を整数として返しま
す。日付/時刻文字列は、以下の形式で指定します。
yyyy-mm-dd hh:mm:ss
四半期の期間は以下のとおりです。
期間四半期
1 月 1 日 から 3 月 31 日まで1
4 月 1 日から 6 月 30 日まで2
7 月 1 日から 9 月 30 日まで3
10 月 1 日から 12 月 31 日まで4
QUARTER は、日付/時刻文字列の月の部分のみを評価します。QUARTER は、ユーザの指定値
に対して値や範囲チェックを実行しません。無効な月の値の場合、月 = 0 では 1が返され、月 > 12
では 4 が返されます。
DATEPARTまたはDATENAME関数を使用しても、同じ四半期情報を取得できます。DATEPART
および DATENAME は、正式な日付文字列上で値と範囲チェックを実行します。DATEADD また
は TIMESTAMPADD 関数を使用して、指定した四半期数で日付をインクリメントできます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.QUARTER(date-expression)
例以下の例は、与えられた日付 (2 月 25 日) が 1 年の第 1 四半期内にあるので、どちらも 1 を返し
ます。
SELECT DISTINCT {fn QUARTER('2004-02-25')} AS Q_GivenFROM Sample.Person
SELECT DISTINCT {fn QUARTER(59590)} AS Q_GivenFROM Sample.Person
以下の例は、現在の四半期を返します。
SELECT DISTINCT {fn QUARTER({fn NOW()})} AS Q_NowFROM sample.person
SELECT DISTINCT {fn QUARTER(CURRENT_DATE)} AS Q_NowFROM Sample.Person
Caché SQL リファレンス 265
QUARTER
関連項目DATEPART DATENAME DATEADD MONTH
REPEAT
指定した回数だけ文字列を繰り返す汎用スカラ関数です。
REPEAT(expression,repeat-count){fn REPEAT(expression,repeat-count)}
引数
繰り返される式。expression
繰り返す回数。整数で表現します。repeat-count
概要REPEATは、連結した expression の repeat-count インスタンスの文字列を返します。repeat-count
が小数の場合、整数部のみを使用します。repeat-count が数字でない場合、REPEATはNULLを
返します。
例以下の例は、REPEAT の 2 つの形式を示します。どちらの例も、文字列 'BANGBANGBANG' を返
します。
SELECT DISTINCT REPEAT('BANG',3) AS TripledFROM Sample.Person
SELECT DISTINCT {fn REPEAT('BANG',3)} AS TripledFROM Sample.Person
266 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
REVOKE
ユーザまたはロールから特権を削除します。
REVOKE admin-privilege FROM grantee
REVOKE role FROM grantee
REVOKE [GRANT OPTION FOR] object-privilegeON object-list FROM grantee [CASCADE]
引数
許可されている管理者レベル特権、または管理者レベル特権のコ
ンマで区切られたリスト。以下のうち 1 つ以上をさまざまな順序で
使用してリストを構成できます :
オブジェクト定義特権 : %CRE-
ATE_METHOD、%DROP_METHOD、%CREATE_FUNC-
TION、%DROP_FUNCTION、%CREATE_PROCEDURE、%DROP_PRO-
CEDURE、%CREATE_QUERY、%DROP_QUERY、%CRE-
ATE_TABLE、%ALTER_TABLE、%DROP_TABLE、%CRE-
ATE_VIEW、%ALTER_VIEW、%DROP_VIEW、%CREATE_TRIG-
GER、%DROP_TRIGGER
%DB_OBJECT_DEFINITION は、16 個のオブジェクト定義特権をす
べて削除します。
admin-privilege
SQL システム特権、SQL オブジェクト特権、またはロールを持つ
1人以上のユーザのリスト。有効な値は、コンマで区切られたユー
ザまたはロールのリスト、または "*" です。アスタリスク (*) は、現
在定義されていて%All ロールを持たないすべてのユーザを指定し
ます。
grantee
ロールまたはコンマで区切られたロールのリストで、ユーザにより
特権が無効とされるもの。
role
許可されている基本レベル特権、または基本レベル特権のコンマ
で区切られたリスト。%ALTER、DELETE、SELECT、INSERT、
UPDATE、EXECUTE、および REFERENCES のうち 1 つ以上を使
用してリストを構成できます。すべての権限を削除する場合は、引
数の値として "ALL [PRIVILEGES]" または "*" のいずれかを使
用します。
object-privilege
Caché SQL リファレンス 267
REVOKE
object-privilege (複数の場合もあります) を削除する 1 つ以上の
テーブル、ビュー、またはストアド・プロシージャのコンマで区切ら
れたリスト。 “*” を使用すると、現在のネームスペース内で非表
示になっていないすべてのストアド・プロシージャから EXECUTE
特権を削除するように指定できます。
object-list
概要REVOKE 文は、ユーザまたはロールからロールまたは特権を削除します。GRANT コマンド動作の
逆を行います。特権全般の詳細は、"GRANT" コマンドを参照してください。
特権を持つユーザのみが削除できます。
指定したユーザ、ユーザのリスト、またはすべてのユーザ (* 構文の使用) からロールまたは特権を
削除できます。また、別のロールからロールを削除することもできます。
ロールは、SQLのGRANT コマンドおよびREVOKE コマンド、または ^SECURITY Caché システム・
セキュリティを使用して付与または削除できます。ただし、Caché システム・セキュリティでは、他の
ロールに対するロールの付与や削除はできず、$ROLES 特殊変数を使用してもロールに対して与
えられたロールは表示されません。
REVOKE はすぐに作成および実行され、通常一度しか実行されないため、Caché では、ODBC、
JDBC、またはダイナミック SQL での REVOKE にはクエリ・キャッシュは作成されません。
Caché 5.1 セキュリティ
バージョン 5.1 以降では、REVOKE は、%GRANT_ANY_PRIVILEGE、%CRE-
ATE_USER、%ALTER_USER、%DROP_USER、%CRE-
ATE_ROLE、%GRANT_ANY_ROLE、%DROP_ANY_ROLEの一般的な管理者特権はサポートされな
くなりました。これらの特権の管理は、SQL を介してではなく、システム・レベルで処理されます。こ
れらの SQL特権は以前のバージョンの Caché で使用可能であり、既存のコード内で使用されてい
る場合があります。このような特権のいずれかを削除しようとすると、実行はできますが、特権が削除
されるのではなく、指定されたユーザからその名前のロールの削除が試みられます。同様
に、%THRESHOLDを削除しようとすると、指定されたユーザからその名前のロールの削除が試みら
れます。
REVOKE コマンドは特権を必要とする操作です。埋め込み SQL 内で REVOKE を使用する前に、
適切な特権を持つユーザとしてログインする必要があります。特権がない場合は、SQLCODE –99
エラー (特権違反) が返されます。$SYSTEM.Security.Login メソッドを使用して、以下のようにユー
ザに適切な特権を割り当ててください。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql( )
例以下の埋め込み SQL の例は、2 人のユーザと 1 つのロールを作成し、そのロールをユーザに割り
当てます。その後、アスタリスク (*) 構文を使用してすべてのユーザからそのロールを削除します。
268 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
ユーザがすでに存在する場合は、SQLCODE = -118が発行されます。ロールがすでに存在する場
合は、SQLCODE = -104 が発行されます。ロールの付与または削除がすでに実行されている場合
は、SQLCODE は発行されません (SQLCODE = 0)。
DO $SYSTEM.Security.Login("_SYSTEM","SYS") &sql(CREATE USER User1 IDENTIFY BY fredpw) &sql(CREATE USER User2 IDENTIFY BY barneypw) WRITE !,"CREATE USER error code: ",SQLCODE &sql(CREATE ROLE workerbee) WRITE !,"CREATE ROLE error code: ",SQLCODE &sql(GRANT workerbee TO User1,User2) WRITE !,"GRANT role error code: ",SQLCODE &sql(REVOKE workerbee FROM *) WRITE !,"REVOKE role error code: ",SQLCODE
関連項目
• SQL : ユーザ CREATE USER DROP USER CREATE ROLE DROP ROLE GRANT
%CHECKPRIV
• Caché ObjectScript : $ROLES および $USERNAME 特殊変数
RIGHT
文字列式の末尾 (最右端) の文字から、指定された数の文字を返す、スカラ文字列関数です。
{fn RIGHT(string-expression,count)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文
字タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
string-expressionの末尾 (右端)から返す文字の数を指定す
る整数。
count
概要RIGHTは、string-expression の末尾 (右端) から文字を count 文字数分返します。どちらかの引数
に NULL 値を渡すと、RIGHT は NULL を返します。
RIGHT は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、Sample.Person テーブル内の各名前の右端から 2 文字を返します。
Caché SQL リファレンス 269
RIGHT
SELECT Name,{fn RIGHT(Name,2)}AS MiddleInitial FROM Sample.Person
以下の埋め込み SQL の例は、RIGHT による文字列自体よりも長い count の処理方法を示してい
ます。
&sql(SELECT Name,{fn RIGHT(Name,40)} INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a,"=original",!,b,"=RIGHT 40" }
埋め込みは実行されません。
関連項目LEFT LTRIM RTRIM
ROLLBACK
トランザクションをロール・バックします。
ROLLBACK [WORK]ROLLBACK TO SAVEPOINT pointname
引数
オプション — セーブポイントの名前。識別子として指定されます。pointname
概要ROLLBACK 文は、トランザクションをロール・バックし、作業を元に戻してロックを解除します。これ
により、データベースは以前の状態に復元されます。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
• ROLLBACK は現在のトランザクションの間に実行されたすべての作業をロール・バックし、トラ
ンザクション・レベル・カウンタをゼロにリセットしてすべてのロックを解除します。これにより、デー
タベースはトランザクションが開始する以前の状態に復元されます。
• ROLLBACK TO SAVEPOINT は、最新のセーブポイント以降に実行されたすべての作業を
ロール・バックし、トランザクション・レベル・カウンタをディクリメントします。すべてのセーブポイ
ントがロール・バックまたはコミットされ、トランザクション・レベル・カウンタがゼロにリセットされる
と、トランザクションは完了します。
270 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• ROLLBACK TO SAVEPOINT pointname は、指定されたセーブポイント以降に実行されたす
べての作業をロール・バックし、元に戻したセーブポイントの数だけトランザクション・レベル・カ
ウンタをディクリメントします。すべてのセーブポイントがロール・バックまたはコミットされ、トラン
ザクション・レベル・カウンタがゼロにリセットされると、トランザクションは完了します。指定された
セーブポイントが存在しない場合は、SQLCODE -375 が発行されます。
セーブポイントの設定方法の詳細は、"SAVEPOINT" を参照してください。
ロールバック対象外
以下のものは ROLLBACK 操作の影響を受けません。
• ロール・バックでは、クエリ・キャッシュの作成、変更、および削除は元に戻りません。これらの処
理は、トランザクションの一部として処理されません。
• ロール・バックでは既定クラスの IDKeyカウンタをディクリメントしません。IDKeyは$INCREMENT
によって自動的に生成されます。$INCREMENT は SQL トランザクションとは別にカウントを保
持しています。
関連項目
• SQL コマンド : COMMIT SAVEPOINT SET TRANSACTION START TRANSACTION トラン
ザクション
• Caché ObjectScript : TROLLBACK
ROUND
指定した桁数で数値を丸める汎用スカラ数値関数です。
ROUND(numeric-expr,integer-expr){fn ROUND(numeric-expr,integer-expr)}
引数
丸められる数字。数値式。numeric-expr
小数点からカウントして、どこまで丸めるかの桁数を指定する整数(ま
たは整数に評価される式)。ゼロ、正の整数、または負の整数を指定
できます。integer-expr が小数の場合、Caché は切り捨てによって最
も近い整数にします。
integer-expr
Caché SQL リファレンス 271
ROUND
概要numeric-expr を小数点から数えて integer-expr の桁に丸めます。丸めるとき、5 は常に切り上げら
れます。先頭と末尾のゼロはROUND操作の前に削除されます。ROUNDが返す値のデータ型は、
numeric-expr のデータ型と同じです。
• integer-expr が正の数である場合、丸めは小数点から右に数えたその桁数で実行されます。
integer-expr が小数桁数以上の数である場合、丸めやゼロの埋め込みは実行されません。
• integer-expr がゼロの場合は、最も近い整数に丸められます。つまり、丸めが小数点の右側 0
桁目で実行され、すべての小数桁と小数点が削除されます。
• integer-expr が負の数である場合、丸めは小数点から左に数えたその桁数で実行されます。
integer-expr が丸めの結果の整数桁数以上である場合は、ゼロが返されます。
• numeric-expr がゼロ (ただし 00.00 や -0 などのように表されている) 場合、ROUND は
integer-expr の値とは無関係に小数桁のない 0 (ゼロ) を返します。
• numeric-expr または integer-expr が NULL の場合、ROUND は NULL を返します。
ROUND と TRUNCATE は類似した処理を実行します。これらは両方とも、数値で有効な小数また
は整数の桁数を少なくする目的で使用できます。ただし、TRUNCATE では丸めは行われません。
例以下の例は、integer-expr の 0 (ゼロ) を使用していくつかの小数を整数に丸めます。5 は常に切り
上げられます。
SELECT DISTINCT ROUND(5.99,0) AS RoundUp, ROUND(5.5,0) AS Round5, {fn ROUND(5.329,0)} AS RoundoffFROM Sample.Person
以下の例は、pi を小数桁数 4 に丸めます。
SELECT DISTINCT {fn PI()} AS ExactPi, ROUND({fn PI()},4) AS ApproxPiFROM Sample.Person
以下の例は、小数桁数より大きな integer-expr を指定しています。
SELECT DISTINCT {fn ROUND(654.98700,9)} AS RoundedFROM Sample.Person
この場合は 654.987 が返されます (Caché が丸め処理を行う前に末尾のゼロを削除し、丸めもゼロ
の埋め込みも行われません)。
以下の例は、Salary の値を最も近い千ドルに丸めます。
SELECT Salary,ROUND(Salary, -3) AS PayBracketFROM Sample.EmployeeORDER BY Salary
272 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
Salary が 500 ドルより少ない場合は 0 (ゼロ) に丸められることに注意してください。
以下の例では、各 ROUNDで、丸められる桁数と同じか、それを超える負の integer-expr が指定さ
れています。
SELECT DISTINCT {fn ROUND(987,-3)} AS Round1, {fn ROUND(487,-3)} AS Round2, {fn ROUND(987,-4)} AS Round3, {fn ROUND(987,-5)} AS Round4FROM Sample.Person
最初の ROUND 関数では、丸めの結果の桁数が integer-expr より大きくなるため、1000 が返され
ます。これ以外の 3 つの ROUND 関数は 0 (ゼロ) を返します。
関連項目
• SQL 関数 : CEILING FLOOR MOD TRUNCATE
• Caché ObjectScript 関数 : $NORMALIZE $NUMBER
RTRIM
末尾の空白を削除した文字列を返す文字列関数です。
RTRIM(string-expression)
{fn RTRIM(string-expression)}
引数
列の名前、文字列リテラル、他のスカラ関数の結果などを表
すことができる文字列式。基本となるデータ型は、任意の文
字タイプ (CHAR や VARCHAR など) とすることができます。
string-expression
概要RTRIM は文字列式から末尾の空白を削除し、その文字列を VARCHAR タイプとして返します。
string-expression が NULL の場合、RTRIM は NULL を返します。string-expression が完全に空
白スペースで構成されている文字列の場合、RTRIM は空文字列 ('') を返します。
RTRIM は先頭の空白をそのまま残します。先頭の空白を削除するには LTRIM を使用します。先
頭や末尾のあらゆるタイプの文字を削除するには、TRIM を使用します。空白を追加するには、
SPACE を使用します。
RTRIM は、{ } 括弧構文による ODBC スカラ関数、または SQL 汎用関数として使用できる点に注
意してください。
Caché SQL リファレンス 273
RTRIM
例以下の埋め込み SQLの例は、文字列から末尾の 5つの空白を削除します。先頭の 5つの空白は
そのまま残します。
SET a=" Test string with 5 leading and 5 trailing spaces. " &sql(SELECT {fn RTRIM(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Before RTRIM",!,"start:",a,":end" WRITE !,"After RTRIM",!,"start:",b,":end" }
これは、以下を返します。
Before RTRIMstart: Test string with 5 leading and 5 trailing spaces.:endAfter RTRIMstart: Test string with 5 leading and 5 trailing spaces.:end
関連項目LTRIM TRIM SPACE
SAVEPOINT
トランザクション内のポイントを指定します。
SAVEPOINT pointname
引数
セーブポイントの名前。識別子として指定します。pointname
概要SAVEPOINT 文は、トランザクション内のポイントを指定します。これにより、事前に設定されたセー
ブポイントにトランザクションをロールバックできます。ロールバックは実行されたすべての処理を取
り消し、その期間に取得されたロックをすべて解放します。トランザクション内に任意の数のセーブポ
イントを設定できます。
実行期間の長いトランザクション、または内部制御構造を持つトランザクションでは、その時点で完
了しているすべての処理を取り消すのではなく、トランザクションの一部をロールバックできる方が便
利な場合が多くあります。セーブポイントを設定すると、トランザクション・レベル・カウンタが増え、そ
のセーブポイントと識別子が関連付けられます。
セーブポイントを設定した場合 :
274 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
COMMIT により、直前のセーブポイントから実行された処理をコミットして、トランザクション・レベル
をディクリメントし、セーブポイントを削除します。最後のセーブポイントがコミットされ、トランザクショ
ン・レベルがゼロになるまで COMMIT を発行し続けます。次の COMMIT により、START
TRANSACTION から実行された処理がコミットされ、トランザクションが終了します。
ROLLBACK TO SAVEPOINT pointnameは、指定したセーブポイントから実行された処理をロール
バックし、そのセーブポイントと中間のセーブポイントすべてを削除して、削除したセーブポイント数
分だけレベル・カウンタをディクリメントします。
ROLLBACKTO SAVEPOINTは、最新のセーブポイント以降に実行されたすべての作業をロール・
バックし、トランザクション・レベル・カウンタをディクリメントします。すべてのセーブポイントがロール・
バックまたはコミットされ、トランザクション・レベル・カウンタがゼロにリセットされると、トランザクション
は完了します。
ROLLBACK は現在のトランザクションの間に実行されたすべての作業をロール・バックし、トランザ
クション・レベル・カウンタをゼロにリセットしてすべてのロックを解除します。一般的な ROLLBACK
は、セーブポイントを無視します。ROLLBACK は、START TRANSACTION 以降実行された処理
をロールバックし、トランザクション開始前の状態に戻します。
セーブポイントが設定されていなければ、COMMIT によりトランザクション全体がコミットされ、
ROLLBACK によりトランザクション全体がロールバックされます。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
例次の埋め込み SQL の例では、2 つのセーブポイントを持つトランザクションを作成しています。
&sql(START TRANSACTION) &sql(DELETE FROM Sample.Person WHERE Name=NULL) IF SQLCODE'=0 {&sql(ROLLBACK)} ELSE {WRITE !,%ROWCOUNT," bad records deleted"} &sql(SAVEPOINT svpt_age1) &sql(DELETE FROM Sample.Person WHERE Age=NULL) &sql(SAVEPOINT svpt_age2) &sql(DELETE FROM Sample.Person WHERE Age>65) &sql(COMMIT) &sql(COMMIT) &sql(COMMIT)
Caché ObjectScript と SQL トランザクションTSTART と TCOMMIT を使用した Caché ObjectScript トランザクション処理は、SQL 文 START
TRANSACTION、SAVEPOINT、および COMMIT を使用した SQL トランザクション処理とは異なる
もので、互換性もありません。Caché ObjectScript および Caché SQL のいずれも、入れ子構造のト
ランザクションのサポートに制限があります。Caché ObjectScript トランザクション処理は、SQL ロッ
ク制御変数 (特に SQL ロック・エスカレーション変数) と相互にやり取りしません。アプリケーション
は、これら 2 種類のトランザクション処理を混同しないよう注意する必要があります。
トランザクションに SQL 更新文が含まれる場合、SQL の START TRANSACTION 文でトランザク
ションが開始され、COMMIT 文でコミットされます。トランザクションを開始するものでない限り、
Caché SQL リファレンス 275
SAVEPOINT
TSTART/TCOMMITを入れ子にして使用するメソッドをトランザクションに組み込むことができます。
メソッドとストアド・プロシージャは、通常、設計でトランザクションの主要なコントローラにならない限
り、SQL トランザクション制御文を使用しません。ストアド・プロシージャは、独自のトランザクション制
御モデルの ODBC/JDBC から呼び出されるため、通常 SQL トランザクション制御文を使用しませ
ん。
関連項目
• SQL コマンド : COMMIT ROLLBACK SET TRANSACTION START TRANSACTION トランザ
クション
• Caché ObjectScript コマンド : TCOMMIT
SECOND
与えられた日付/時刻式で、秒の構成要素に対応する0から59までの整数値を返す、スカラ日付/
時刻関数です。
{fn SECOND(time-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。基本となるデータ型は、TIME または
TIMESTAMP とすることができます。
time-expression
概要SECOND は、時間整数または日付/時刻文字列の秒部分を返します。日付/時刻文字列は、以下
の形式で指定します。
yyyy-mm-dd hh:mm:ss
この既定の時刻形式を変更するには、SET OPTION コマンドを使用します。
秒 (ss) 部分は、0 から 59 までの範囲の整数でなければなりません。ただし、ユーザの指定値に対
して、範囲チェックは行われません。59よりも大きな数、負の数、および小数は、指定されたとおりに
返されます。入力では、先頭のゼロはオプションです。出力では、先頭と末尾のゼロは抑制されま
す。
秒部分が '0'、'00'、または非数値の場合、SECOND はゼロ秒を返します。また、時刻文字列の秒
部分が完全に省略されている場合 ('hh'、'hh:mm'、'hh:mm:'、'hh::')、時刻式が指定されていない
場合、または時刻式が無効の場合にも、ゼロ秒が返されます。
276 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DATEPART または DATENAME を使用して、同じ時刻情報を取得できます。
秒の小数部
time-expression で指定されると、SECOND は秒の小数部を返します。末尾のゼロは切り捨てられ
ます。秒の小数部が指定されない場合 (例 : 38.00)、小数点区切り文字も切り捨てられます。
時刻値 ($HOROLOG)の標準Caché内部表現は、秒の小数部をサポートしません。タイムスタンプ
は、秒の小数部をサポートします。
以下の SQL 関数、SECOND、CURRENT_TIMESTAMP、DATENAME、DATEPART、および
GETDATE は、秒の小数部をサポートします。CURTIME、CURRENT_TIME、および NOW は秒の
小数部をサポートしません。
SQL SET OPTION 文では、秒の小数部に既定の精度 (小数桁数) を設定できます。
Caché ObjectScript $ZTIMESTAMP 特殊変数は、秒の小数部を表すために使用できます。Caché
ObjectScript 関数の $ZDATETIME、$ZDATETIMEH、$ZTIME、および $ZTIMEH は、秒の小数
部をサポートします。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.SECOND(time-expression)
例以下の例は、時刻式が 38 秒を表しているので、どちらも 38 を返します。
SELECT DISTINCT {fn SECOND('2000-02-16 18:45:38')} AS Seconds_GivenFROM Sample.Person
SELECT DISTINCT {fn SECOND(67538)} AS Seconds_GivenFROM Sample.Person
以下の例は、.9 秒 を返します。先頭や末尾のゼロは、切り捨てられます。
SELECT DISTINCT {fn SECOND('2000-02-16 18:45:00.9000')} AS Seconds_GivenFROM Sample.Person
以下の例は、日付/時刻文字列の秒部分が省略されているので、ゼロ秒を返します。
SELECT DISTINCT {fn SECOND('2000-02-16 18:45')} AS Seconds_GivenFROM Sample.Person
以下の例は、すべて現在の時刻の秒部分を返します。CURRENT_TIME と CURTIME は、時刻文
字列を返し、NOW は、日付/時刻文字列を返します。
SELECT DISTINCT {fn SECOND(CURRENT_TIME)} AS Seconds_NowFROM Sample.Person
SELECT DISTINCT {fn SECOND({fn CURTIME()})} AS Seconds_NowFROM Sample.Person
Caché SQL リファレンス 277
SECOND
SELECT DISTINCT {fn SECOND({fn NOW()})} AS Seconds_NowFROM Sample.Person
関連項目
• SQL の概念 : データ型 日付/時刻文
• SQL 関数 : HOUR MINUTE CURRENT_TIME CURTIME NOW DATEPART DATENAME
• Caché ObjectScript : $ZTIME 関数 $HOROLOG 特殊変数 $ZTIMESTAMP 特殊変数
SELECT
データベース内のテーブルから行を検索します。
SELECT [DISTINCT | ALL] [TOP parameter]select-item[INTO host-variable-list]FROM [%INORDER | %FULL] table-ref [[AS] t-alias]{,table-ref [[AS] t-alias]}[WHERE condition-expression][GROUP BY scalar-expression][HAVING condition-expression][ORDER BY item-order-list [ASC | DESC] ]
select-item ::=[t-alias.]*[t-alias.]scalar-expression [[AS] c-alias]{,[t-alias.]scalar-expression [[AS] c-alias]}
引数
オプション — DISTINCT キーワードは、返された各行
が、指定されたフィールドに対して一意の値を持つよう
に指定します。このキーワードを使用すると、SELECT
は余分な行を破棄します。
ALL キーワードは、SELECT条件を満たすすべての行
を返すように指定します。これはCaché SQLの既定で
す。ALL キーワードは、SQL の互換性のために指定さ
れたものです。
DISTINCT
ALL
オプション—整数あるいは整数に解釈される変数のい
ずれかです。表示する行数を指定します。この既定は、
SELECT 条件を満たすすべての行を表示します。
TOP parameter
278 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
検索する1つまたは複数の列。複数の列はコンマで区
別されたリストで指定。*シンボルですべての列を検索
することも可能。
select-item
オプション — select-item 値を格納する 1 つまたは複
数のホスト変数。詳細は、"INTO" 節を参照してくださ
い。
INTO host-variable-list
データを検索するテーブルまたはビュー。複数のテーブ
ルは、コンマ区切りのリストとして指定できます。テーブ
ルあるいはビューのあらゆる組み合わせを指定できま
す。ここで2つ以上のtable-refを指定する場合、Caché
は複数のテーブルに JOIN を実行して、JOIN 処理の
結果テーブルからデータを取得します。オプションで、
エイリアス (t-alias) をそれぞれの table-ref に割り当て
ることができます。クエリ実行を最適化する%INORDER
キーワードや %FULL キーワードも指定できます。詳細
は、"FROM" 節を参照してください。
FROM table-ref
オプション—検索するデータにパラメータを指定する修
飾子。詳細は、"WHERE" 節を参照してください。
WHERE condition-expression
オプション—検索したデータをどのように格納するかを
指定する 1 つまたは複数のスカラ式のコンマ区切りリ
スト。列名を含む場合もあります。詳細は、"GROUP
BY" 節を参照してください。
GROUP BY scalar-expression
オプション—検索するデータにパラメータを指定する修
飾子。詳細は、"HAVING" 節を参照してください。
HAVING condition-expression
オプション — select-item、あるいは行が表示される順
番を指定する項目のコンマ区切りリスト。各項目は、オ
プションの ASC (昇順)や DESC (降順) を持ちます。既
定は昇順です。ORDER BY 節は、クエリの結果に対し
てのみ使用できます。サブクエリであるSELECT文 (例
えばUNION文)には使用できません。詳細は、"ORDER
BY" 節を参照してください。
ORDER BY item-order-list
関数呼び出しや算術演算などの、フィールド識別子、
フィールド識別子を含む式、または一般の式。
scalar-expression
オプション — table-ref (テーブルまたはビュー) の名前
のエイリアス。
t-alias
オプション — 列 (フィールド) 名のエイリアス。c-alias
Caché SQL リファレンス 279
SELECT
概要SELECT 文は、Caché データベースのデータを検索します。最も単純な形式では、1 つ以上の項
目を単一のテーブルから検索します。この場合、それらの項目は select-item リストで指定し、テー
ブルは FROM table-ref 節で指定します。
Cachéは、SELECTの成功か失敗かを示した、ステータス変数SQLCODEを返します。また、SELECT
演算は、%ROWCOUNT ローカル変数を、選択された行の番号に設定します。
SELECT 文は独立したクエリとして使用することも、大きな文の一部、つまりサブクエリとして使用す
ることもできます。サブクエリは括弧で囲まれます。
UNION文で、1つまたは複数のSELECT文を単独のクエリに結合できます。クエリが単独のSELECT
文から構成されている場合、SELECT文はORDER BY文で完了でき、クエリが複数の SELECT文
の UNION である場合、UNION 文は ORDER BY 文で完了できます。
必須節
以下は、すべての SELECT 文に必要な節です。
• select-item リストは、テーブルから検索するか生成する 1 つまたは複数の項目 (select-item
引数)のコンマ区切りリストです。通常、これらの項目は、テーブルの列名です。select-itemは、
1 つまたは複数の個別の項目を指定するスカラ式、もしくはベース・テーブルのすべての列を
参照するアスタリスク (*) のうちのどちらかで構成されています。
• FROM 節 は、行を検索する 1 つまたは複数のテーブル、ビュー、サブクエリ、または JOIN 式
を指定します。
オプションの節
以下のオプションの節は、FORM節が返す仮想テーブルで動作します。すべてオプションですが、
使用する場合は正しい順序で指定する必要があります。
• WHERE 節 は、行が一致する 1 つまたは複数の条件制約を指定します。制約の詳細につい
ては、"条件式" を参照してください。したがって、WHERE 節は、条件制約を指定するすべて
のレコードを返します。
• GROUP BY 節 は、コンマで区切られた列のリストを指定します。列と一致する値を使用してク
エリの結果セットをサブセットに組み込み、返された行の順番を決めます。GROUP BY により、
列と同様スカラ式も可能になります。
• HAVING節は、1つまたは複数の条件制約を指定します。制約の詳細については、"条件式"
を参照してください。通常、GROUP BY 節で指定した各グループで動作します。したがって、
HAVING 節は、一般に、条件制約を満たすそれぞれの値に 1 つのレコードを返します。
• ORDER BY 節 は、列を表示すべき順番を指定します。ORDER BY 節は、SELECT 文がサブ
クエリでない場合のみ使用できます。例えば、ORDER BYはUNIONの結果に対して使用でき
ますが、UNION のサブクエリの SELECT 文には使用できません。
280 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
DISTINCT キーワードDISTINCT キーワードは、フィールド値の重複を取り除きます。
SELECT DISTINCT Home_State FROM Sample.Person
これによって、各個別の州名に対して、1つの行を返します。DISTINCTは、個々の行ではなく個別
の値を返すので、複数の項目を指定すると、すべての項目に個別な値をすべて検索します。以下
はその例です。
SELECT DISTINCT Home_State,Age FROM Sample.Person
Home_State と Age の値の異なる組み合わせを含むレコードをすべて検索します。
DISTINCT 節で指定された列が NULL 値を含む場合、DISTINCT は、以下の例に示すように、
NULL 値を持つ 1 行を返します。
SELECT DISTINCT FavoriteColors FROM Sample.Person
定義上、すべての行が個別の一意の識別子を含むので、構文 DISTINCT * は適切ですが意味
を持ちません。
DISTINCT 節は、1 つまたは複数の集約フィールドを持つように指定できます。
SELECT DISTINCT Age, AVG(Age) FROM Sample.Person
埋め込み SQL で DISTINCT キーワードを指定しても無意味です。埋め込み SQL の SELECT は
データ行を常に 1 行しか返さないためです。
TOP キーワードTOP キーワードは、SELECT 文が、指定された行数のみを返すように指定します。返された仮想
テーブルの "一番上" から、指定された行数分を返します。パラメータ引数を使用すると、返された
行が変数で指定されます。リテラル引数は返す行のリテラル数を指定します。
TOP キーワードは、サブクエリでは使用できません。
以下のクエリは、データベースに格納される順番で Sample.Person から取得する最初の 20 行を返
します。
SELECT TOP 20 Home_State,Name FROM Sample.Person
以下のクエリは、データベースに格納される順序で Sample.Person から取得する最初の 20 個の個
別 Home_State 値を返します。前のクエリによって返された重複した Home_State 値を持つ行は、こ
こでスキップされます。
SELECT DISTINCT TOP 20 Home_State FROM Sample.Person
以下のクエリは、最初の20個の個別Home_State値を返します。しかし、ここでは、"最初"の行は、
Sample.Person 内の行のすべての順序を ORDER BY 節に反映します。
Caché SQL リファレンス 281
SELECT
SELECT DISTINCT TOP 20 Home_State FROM Sample.Person ORDER BY Home_State
埋め込み SQL で TOP キーワードを指定しても無意味です。埋め込み SQL の SELECT はデータ
行を常に 1 行しか返さないためです。
Select-itemこれは、SELECT 文の必須要素です。それぞれの SELECT 文は select-item と FROM 節を持つ
必要があります。通常、select-item は、FROM 節で指定されたテーブル内のフィールドを参照しま
す。
select-item には、以下のものを指定できます。
• コンマで区切られた、1 つまたは複数の列名 (フィールド) のリスト。
SELECT Name,Age FROM Sample.Person
FROM 節で 1 つまたは複数のテーブルまたはビューを指定するとき、次の 2 つの例に示すよ
うに、ピリオドを使用して、select-item の一部としてテーブル名 (またはテーブル名エイリアス)
を含める必要があります。
完全テーブル名 :
SELECT Sample.Company.Name, Sample.Person.Name FROM Sample.Person, Sample.Company
テーブル名エイリアス :
SELECT p.Name, c.Name FROM Sample.Person AS p, Sample.Company AS c
select-item が埋め込みオブジェクト・プロパティ (シリアル・クラス) データを参照する場合、下
線構文を使用します。下線構文は、オブジェクト・プロパティの名前、アンダースコア、および埋
め込みオブジェクト内のプロパティ名で構成されています。例えば、Home_CityやHome_State
などです。詳細は、"Caché オブジェクトの使用法" の"オブジェクトと SQL" を参照してくださ
い。
SELECT Home_City,Home_State FROM Sample.Person
• テーブル内のすべての列を選択する、アスタリスク構文 (*)。
SELECT * FROM Sample.Person
select-itemがアスタリスク構文を使用する場合、テーブルのすべての列の参照を指定します。
アスタリスク構文は、修飾、未修飾のどちらでもかまいません。
- select-itemが未修飾で、アスタリスクがあるだけの場合、それがリストの唯一の select-item
になります。
282 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
- select-item がテーブル名 (またはテーブル名エイリアス) およびピリオド (.) を接頭語とし
て使用することによって修飾される場合、select-item は、指定されたテーブル内のすべて
の列を選択します。修飾されたアスタリスク構文は、別のテーブルの別の選択項目と結合
できます。
以下の例では、select-item は、1 つのテーブルからすべての列を選択する修飾されたア
スタリスク構文と、別のテーブルの列名のリストで構成されます。
SELECT TOP 50 Sample.Person.*, Sample.Company.Name, Sample.Company.Home_State FROM Sample.Person, Sample.Company
注釈: SELECT *は、アプリケーションの開発およびデバッグ中に非常に便利なCaché SQL
を完全にサポートしている部分です。しかし、稼動中のアプリケーションでは、好まれ
るプログラミングの実践は、アスタリスク構文形式を使用するよりも、明示的に選択した
フィールドを一覧表示することです。明示的にリストしたフィールドは、アプリケーション
をわかりやすく簡単に理解し、簡単に維持し、名前によってフィールドを簡単に検索
できるようにします。
• XMLELEMENT、XMLFOREST、または XMLCONCAT 関数。これらは、指定された列名から
検索したデータの値を XML (または HTML) タグで囲みます。詳細は "XMLELEMENT" を参
照してください。
• 1 つまたは複数の算術式を含む select-item リスト。これらの算術演算は、通常、1 つまたは複
数のフィールド値を使用します。
SELECT Name, Age, Age - AVG(Age) FROM Sample.Person
しかし、select-item リストのいずれのフィールド値も含めない算術演算を含むことが可能です。
SELECT Name, Age, 9 - 6 FROM Sample.Person
• 1 つまたは複数の SQL 変換関数を含む select-item リスト。
SELECT Name,UCASE(Name) FROM Sample.Person
• 1 つまたは複数の SQL 集約関数を含む select-item リスト。SQL 集約関数には、以下が含ま
れます。
- AVG — 列の値の平均
- SUM — 列の値の合計
- COUNT — 列の NULL でない値の数
- MAX — 列の最大値
- MIN — 列の最小値
- LIST — 指定された列内で使用されるすべての値のコンマ区切りリスト。
Caché SQL リファレンス 283
SELECT
- XMLAGG — 指定された列内で使用されるすべての値の連結文字列。
集約関数は、常に単独の値を返します。集約関数の引数は、以下のいずれかになります。
- 単独の列名 — クエリによって選択された行の NULL でないすべての値に対して、集約を
計算します。
SELECT AVG(Age) FROM Sample.Person
- 集約の計算にはスカラ式も利用可能です。
SELECT SUM(Age) / COUNT(*) FROM Sample.Person
- ワイルドカード (*) — テーブルの行数を計算するために、COUNT 関数とともに使用されま
す。
SELECT COUNT(*) FROM Sample.Person
- 選択個別関数 — 余剰値を消去することで、集約を計算します。
SELECT COUNT(DISTINCT Home_State) FROM Sample.Person
- ANSI SQLは単独のSELECT文内での列名と集約関数の組み合わせを許可しませんが、
Caché SQL は以下を許可することにより、標準を拡張しています。
SELECT Name, COUNT(DISTINCT Home_State) FROM Sample.Person
- %FOREACHを使用する集約関数。これによって、単独または複数の列の各個別の値に対
して集約関数が計算されます。
SELECT DISTINCT Home_State, AVG(Age %FOREACH(Home_State)) FROM Sample.Person
- %AFTERHAVING を使用する集約関数。これよって、HAVING 節で指定されるサブ母集
団で集約関数が計算されます。
SELECT AVG(Age %AFTERHAVING) FROM Sample.Person HAVING (Age > AVG(Age))
以上の文は、データベース内の年齢が平均よりも高いすべての人に対して平均年齢を返
します。
• Caché ObjectScript 外部関数は、データベースの列上でオペレーティングを呼び出します。
SELECT $$REFORMAT^ABC(name)FROM MyTable
このオプションをシステム全体で構成した場合のみ、SQL構文内で外部関数を呼び出すことが
できます。[システム管理ポータル] で [構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リ
ストで [SQL] を選択します。[Allow Extrinsic Functions in SQL Statements]の現在の設定を表
示および編集します。既定は “false” です。既定では、外部関数の呼び出しを実行しようとす
ると、SQLCODE -372 エラー・コードが発行されます。
284 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
外部関数を使用して %ルーチン (%文字で始まる名前を持つルーチン)を呼び出せません。実
行しようとすると SQLCODE -373 エラー・コードが発行されます。
• 指定されたテーブルのいずれのフィールドも参照しない select-item。
SELECT UCASE('fred') FROM Sample.Person
SELECT 7 * 7, 7 * 8 FROM Sample.Person
データが参照されない場合でも、指定されたテーブルは存在する必要があります。このタイプ
のクエリでは、行数は、指定されたテーブルの行数に対応して返されます。1 行のみを返すに
は、DISTINCT キーワードを使用します。
AS キーワード
select-item を指定する場合、オプションの AS キーワードを使用して、select-item に対するクエリ
によって返される列名を指定することができます。
select-item AS c-alias
AS 節を省略した場合、Caché SQL は、"Expression_1" または "Aggregate_3" などの一意の列名を
提供します。ここの番号は、クエリによって返される、フィールドの列番号を示します。ASキーワード
は、リスト内の各 select-item の直後に続きます。AS キーワードそれ自体は必須項目ではありませ
んが、構文を明確にします。
AS 節で指定する c-alias の名前は、有効な "識別子" である必要があります。
以下の例では、テーブル列 "Home_State" は、"US_State_Abbrev" という名前に変更されます。
SELECT Name, Home_State AS US_State_Abbrev FROM Sample.Person
以下の例では、AVG関数で作成された集約フィールド列は、"AvgAge"という名前を付けられます。
既定の名前は "Aggregate_3" (列 3 の集約フィールド) です。
SELECT Name, Age, AVG(Age) AS AvgAge FROM Sample.Person
以下の例は、AS キーワードがここで省略されていることを除き、前と同じです。このキーワードの使
用は推奨されますが、必須ではありません。
SELECT Name, Age, AVG(Age) AvgAge FROM Sample.Person
FROM 節FROM table-ref 節は、1 つ、またはコンマ区切りの複数のテーブル名やビュー名 (もしくは両方) を
指定する必須の節です。
テーブル名にエイリアス (t-alias) を使用できます。オプションで AS キーワードを使用できます。こ
の t-alias は、フィールド名を指定するときにそのテーブルを示すために使用できます。詳細
は、"FROM" を参照してください。
Caché SQL リファレンス 285
SELECT
以下の 3 つの SELECT 文は、2 つの個別のテーブルに対する行カウントと、両方のテーブルを指
定する SELECTに対する行カウントを示しています。後者の例は、より大きなテーブル、デカルト積
になります。この場合、1番目のテーブルのそれぞれの行が、2番目のテーブルのそれぞれの行に
一致します。これは、Cross Join という処理です。
SELECT COUNT(*)FROM Sample.Company
SELECT COUNT(*)FROM Sample.Vendor
SELECT COUNT(*)FROM Sample.Company, Sample.Vendor
多くの場合、Cross Join の広範囲なデータ重複は望ましくありません。その他の Join タイプをお勧
めします。Join は、FROM 節または WHERE 節のいずれかで指定されます。詳細は、"JOIN" を参
照してください。
Join 処理がコンマ区切りの table-ref リストで実行される順序は、FROM 節内のオプションの
%INORDER キーワードおよび %FULL キーワードを使用することにより最適化できます。詳細
は、"FROM" 節のリファレンス・ページを参照してください。
AS キーワード
table-ref を指定するときに、オプションの AS キーワードを使用して、そのテーブル名またはビュー
名のエイリアスを指定できます。
table1 AS t-alias1,table2 AS t-alias2,...
これは、以下に示すように、一般的には、ソース・テーブルでselect-itemのフィールドを指定するた
めに使用されます。
SELECT TOP 50 t1.*, t2.Name FROM Sample.Person AS t1, Sample.Company AS t2
AS 節で指定する t-alias の名前は、有効な "識別子" である必要があります。
FROM 節で、希望のエイリアスを持つ各テーブルの名前の直後に、AS キーワードと割り当てる
t-alias を続けます。
ASキーワードそれ自体は必須項目ではありませんが、構文を明確にします。以下の例は、ASキー
ワードがここで省略されていることを除き、前と同じです。このキーワードの使用は推奨されますが、
必須ではありません。
SELECT TOP 50 t1.*, t2.Name FROM Sample.Person t1, Sample.Company t2
286 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
WHERE 節WHERE 節は、クエリ選択から特定の行を適格とするか、もしくは不適格とします。適格な行とは、
condition-expression が真である行です。condition-expression は、AND、OR、および NOT 演算
子によってリンク可能な論理テスト (述語) のリストです。
SQL の述語は以下のカテゴリに分類されます。
• 比較述語
• BETWEEN 述語
• LIKE 述語
• NULL 述語
• IN 述語
• EXISTS 述語
詳細は、"WHERE" 節のリファレンス・ページを参照してください。
GROUP BY 節GROUP BY 節はクエリの結果行をとり、単独または複数のデータベース列によって結果行を個別
のグループに分割します。SELECT を GROUP BY 節と併せて使用するとき、GROUP BY フィール
ドの個別の各値に対して、1行が検索されます。GROUP BY節は概念的にはCaché の拡張である
%FOREACH と似ていますが、%FOREACH はクエリ全体を制約することなく、サブ母集団で集約の
選択を許可するのに対し、GROUP BY はクエリ全体で実行します。以下はその例です。
SELECT Home_State, COUNT(Home_State) AS Population FROM Sample.Person GROUP BY Home_State
このクエリは、各個別の Home_State に対し 1 行を返します。
詳細は、"GROUP BY" 節のリファレンス・ページを参照してください。
HAVING 節HAVING 節はグループで実行する WHERE 節と同じ働きをします。一般的に、GROUP BY 節また
は%AFTERHAVINGキーワードとの組み合わせで使用します。HAVING節は、クエリ選択から特定
の行を適格とするか、もしくは不適格とします。適格な行とは、condition-expressionが真である行で
す。condition-expression は、AND、OR、および NOT 演算子によってリンク可能な論理テスト (述
語) のリストです。詳細は、"HAVING" 節のリファレンス・ページを参照してください。
ORDER BY 節ORDER BY 節は、select-item、あるいは行が表示される順番を指定する項目のコンマ区切りリスト
が後続する、ORDER BYキーワードで構成されます。各項目は、オプションのASC (昇順)やDESC
(降順) を持ちます。既定は昇順です。ORDER BY節は、クエリの結果に対してのみ使用できます。
Caché SQL リファレンス 287
SELECT
サブクエリである SELECT 文 (例えば UNION 文) には使用できません。詳細は、"ORDER BY" 節
のリファレンス・ページを参照してください。
以下の例は、データベースのすべての行に選択されたフィールドを返し、年齢の昇順でこれらの行
を並べます。
SELECT Home_State, Name, Age FROM Sample.PersonORDER BY Age
SELECT とトランザクション処理トランザクションは、READ COMMITTED またはREAD UNCOMMITTEDのいずれかに定義されま
す。現在のトランザクションが READ UNCOMMITTED に定義されている場合、SELECT は、コミッ
ト前の現在のトランザクション中に加えられた変更も含めて現在のデータの状態を返します。この変
更は、後でロールバックされる場合もあります。
現在のトランザクションが READ COMMITTEDに定義されている場合、SELECT文による動作は、
状況により異なります。通常、SELECT文ではコミットされたデータのみが返されます。しかし、SELECT
文に DISTINCT キーワードや GROUP BY 節が含まれる場合、SELECT は、コミット前の現在のトラ
ンザクション中に加えられた変更も含めて現在のデータの状態を返します。SELECT内の集約関数
でも、指定された列のデータの現在の状態は、コミットされていない変更分を含めて返されます。
詳細は、"SET TRANSACTION" および "START TRANSACTION" を参照してください。
例以下の 4 つの例は、SELECT 節の異なる組み合わせを使用して、同様のクエリを実行します。これ
らの節は、正しい順序で指定する必要があります。4 つの例ではすべて、Sample.Person テーブル
から Name、Home_State、および Age の 3 つのフィールドが選択され、2 つのフィールド (AvgAge
と AvgMiddleAge) が計算されています。
HAVING/ORDER BY
以下の例では、AvgAge 計算フィールドは、Sample.Person 内のすべてのレコードで計算されます。
HAVING節は、AvgMiddleAge計算フィールドを制御し、Sample.Person内のすべてのレコードから
40を超えるものの平均年齢を計算します。したがって、すべての行でAvgAgeおよびAvgMiddleAge
が同じ値になります。ORDER BY節は、Home_State フィールド値によって、行の表示をアルファベッ
ト順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person HAVING Age > 40 ORDER BY Home_State
WHERE/HAVING/ORDER BY
以下の例では、WHERE 節は、指定された北東の 7 つの州に選択肢を限定します。AvgAge 計算
フィールドは、これらの Home_States のレコードで計算されます。HAVING 節は、指定された
288 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
Home_States 内のレコードで 40 を超える平均年齢を計算して、AvgMiddleAge 計算フィールドを設
定します。したがって、各行は AvgAge および AvgMiddleAge と同じ値を持ちます。ORDER BY 節
は、Home_State フィールド値によって、行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY') HAVING Age > 40 ORDER BY Home_State
GROUP BY/HAVING/ORDER BY
GROUP BY 節は、AvgAge 計算フィールドが、各 Home_State グループに対して個別に計算される
ようにします。また、GROUP BY節は、各Home_Stateで使用される最初のレコードに対する出力表
示を制限します。HAVING 節は、各 Home_State グループ内で 40 を超える平均年齢を計算して、
AvgMiddleAge計算フィールドを設定します。ORDER BY節は、Home_State フィールド値によって、
行の表示をアルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person GROUP BY Home_State HAVING Age > 40 ORDER BY Home_State
WHERE/GROUP BY/HAVING/ORDER BY
WHERE 節は、指定された北東の 7 つの州に選択肢を限定します。GROUP BY 節は、AvgAge 計
算フィールドが、7 つの各 Home_State グループに対して個別に計算されるようにします。また、
GROUP BY 節は、指定された Home_State で使用される最初のレコードに対する出力表示を制限
します。HAVING節は、7つの各Home_State内で 40を超える平均年齢を計算して、AvgMiddleAge
計算フィールドを設定します。ORDER BY 節は、Home_State フィールド値によって、行の表示をア
ルファベット順に並べます。
SELECT Name,Home_State,Age,AVG(Age) AS AvgAge, AVG(Age %AFTERHAVING) AS AvgMiddleAge FROM Sample.Person WHERE Home_State IN ('ME','NH','VT','MA','RI','CT','NY') GROUP BY Home_State HAVING Age > 40 ORDER BY Home_State
関連項目
• SELECT 節 : INTO FROM WHERE GROUP BY HAVING ORDER BY
• テーブル CREATE TABLE ALTER TABLE DROP TABLE
• JOIN UNION
• クエリ CREATE QUERY DROP QUERY
Caché SQL リファレンス 289
SELECT
• INSERT UPDATE DELETE
SET OPTION
実行オプションを設定します。
SET OPTION option_keyword = value
概要SET OPTION文では、コンパイル・モード、SQL構成設定、および日付、時刻、数値規則を管理す
るロケール設定などの、実行オプションを設定します。SET OPTION 文では、キーワード・オプショ
ンを 1 つのみ設定できます。
他の SET OPTION 引数 (ここには記載されていません) は、Caché で SQL 互換性に対し解析され
ますが、実行はしません。
SET OPTION では、準備および実行が即座に行われ、通常一度しか実行されないため、ODBC、
JDBC、またはダイナミック SQL で SET OPTION 用のクエリ・キャッシュは作成されません。
Caché でサポートされているオプションは以下のとおりです。
BLOB_SUPPORT
BLOB_SUPPORT ブーリアン・オプションでは、ストリーム・サポートのロジックをシステム全体で無効
または有効にします。使用可能な値は、0 と 1 です。ロジックを無効にした際 (BLOB_SUPPORT =
0)、ストリーミング・データはサポートされません。すべてのLONGVARCHARと LONGVARBINARY
は VARCHAR と VARBINARY 同様に扱われます。既定値は 1 です。
COMPILEMODE
COMPILEMODEオプションを使用して、現在のネームスペースのコンパイル・モードを、DEFERRED、
IMMEDIATE、または INSTALL に設定します。既定値は IMMEDIATE です。DEFERRED から
IMMEDIATE コンパイル・モードへ変更すると、Deferred Compile Queue のいずれのクラスもすぐに
コンパイルされるようになります。すべてのクラスのコンパイルが成功すると、SQLCODEは 0 を返し
ます。エラーがある場合は、-400 を返します。クラス・コンパイルのエラーは ^mtemp2 ("Deferred
Compile Mode","Error") に記録されています。SQLCODE=-400 が発生した場合は、このグローバ
ル構造を表示して、エラーの詳細メッセージを調べます。INSTALLコンパイル・モードはDEFERRED
コンパイル・モードと似ていますが、テーブルにデータがないDDLインストールにのみ使用してくだ
さい。
LOCK_TIMEOUT
LOCK_TIMEOUT 数値オプションで、SQL 実行中に構築される現在のプロセスのロックにタイムア
ウト (秒数)の設定ができます。このロック・タイムアウトは、グローバル参照でSQLコードの挿入、更
290 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
新、削除、および選択にロックをかける必要がある際に使用します。使用できる値は、正の整数で
す。タイムアウトの設定はプロセスごとに行います。ODBC 接続を切断し、再接続する場合、システ
ム全体の既定のタイムアウト設定を使用して再接続します。既定のシステム全体のロック・タイムアウ
トは、10 秒です。この既定値は、以下のように構成できます。
• ObjectScript $SYSTEM.SQL.SetLockTimeout() 関数呼び出し。現在の設定を確認するには、
$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Lock Timeout (in seconds)] の現在の設定を表示および編集します。
PKEY_IS_IDKEY
PKEY_IS_IDKEYブーリアン・オプションでは、主キーもシステム全体で IDキーであるか否かを指定
します。利用可能な値は TRUE と FALSE です。TRUE の場合、主キーは ID キーとして生成され
ます (つまり、テーブルの主キーはクラス定義の IDKey インデックスとなります)。これによりパフォー
マンスは向上しますが、生成された主キーの変更はできないという制限も付きます。設定後は、主
キーに割り当てられた値の変更や、別のキーを主キーに割り当てることはできません。このオプショ
ンを使用すると、主キーを照合する既定値も変更され、主キー文字列値は EXACT 照合を既定値
に設定します。FALSEの場合、主キーと IDキーは別々に定義され、主キー値は変更可能ですが、
主キー文字列値は SQLUPPER 照合を既定に設定します。
PKEY_IS_IDKEYオプションを設定するには、%Admin_Manage:USE特権が必要です。この特権がな
いと、SQLCODE -99 (特権違反) になります。このオプションを一度設定すると、システム全体です
べてのプロセスに対して有効です。このオプションに対するシステム全体の既定は、次のような方法
で設定できます。
• ObjectScript $SYSTEM.SQL.SetDDLPKeyNotIDKey() 関数呼び出し。現在の設定を確認する
には、$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Are Primary Keys Created through DDL not ID Keys]の現在の設定を表示しま
す。 “真” (true) を設定すると、主キー制約が DDL で指定されたときに、自動的にクラス定義
の IDKey インデックスになりません。 “偽” (false) の場合は、IDKey インデックスになります。こ
の値を “偽” (false) に設定すると、通常パフォーマンスが向上します。しかし主キーのフィール
ドを更新できなくなります。既定は “真 (true)” (1) です。
この PKEY_IS_IDKEY 設定は、他の SET OPTION PKEY_IS_IDKEY 経由でリセットするか、Caché
構成を再起動して、Caché システム構成の設定パラメータがリセットされるまで有効です。
SUPPORT_DELIMITED_IDENTIFIERS
SUPPORT_DELIMITED_IDENTIFIERSブーリアン・オプションで、区切り識別子がシステム全体を通
してサポートされるか否かを指定します。利用可能な値は TRUE と FALSE です。TRUE の場合、
二重引用符で区切られた文字列は、SQL 文の識別子と考えられます。FALSE の場合、SQL 文の
文字列リテラルと考えられます。
Caché SQL リファレンス 291
SET OPTION
SUPPORT_DELIMITED_IDENTIFIERSオプションを設定するには、%Admin_Manage:USE特権が必
要です。この特権がないと、SQLCODE -99 (特権違反)になります。このオプションを一度設定する
と、システム全体ですべてのプロセスに対して有効です。このSUPPORT_DELIMITED_IDENTIFIERS
設定は、他の SET OPTION SUPPORT_DELIMITED_IDENTIFIERS 経由でリセットするか、Caché
構成を再起動して、[システム管理ポータル] のシステム構成の設定パラメータがリセットされるまで
有効です。
このオプションに対するシステム全体の既定は、次のような方法で設定できます。
• ObjectScript $SYSTEM.SQL.SetDelimitedIdentifiers() 関数呼び出し。現在の設定を確認する
には、$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Support Delimited Identifiers] の現在の設定が表示されます。
既定は “偽 (false)” (0) です。 “真” (1) に設定すると、区切り識別子がシステム全体でサポートさ
れます。区切り識別子の詳細は、このドキュメントの "SQL の概念" の "識別子" のページを参照し
てください。
ロケール・オプション
ロケール・オプションは、現在のプロセスの日付、時刻、数値規則のCaché ロケール設定に使用す
るキーワード・オプションです。利用可能なキーワード・オプションは、AM、DATE_FORMAT、
DATE_MAXIMUM、DATE_MINIMUM、DATE_SEPARATOR、DECIMAL_SEPARATOR、MIDNIGHT、
MINUS_SIGN、MONTH_ABBR、MONTH_NAME、NOON、NUMERIC_GROUP_SEPARATOR、
NUMERIC_GROUP_SIZE、PM、PLUS_SIGN、TIME_FORMAT、TIME_PRECISION、TIME_SEPARA-
TOR、WEEKDAY_ABBR、WEEKDAY_NAME、および YEAR_OPTION です。これらのオプションは
すべてリテラルに設定可能で、いずれも既定 (アメリカ英語記述規則) をとります。これらオプション
のいずれかを無効な値に設定すると、「SQLCODE=-129エラー (SETOPTIONのロケール・プロパ
ティの値が不正です)」が返されます。日付と時刻形式とオプションの詳細は、Caché ObjectScript
"$ZDATETIME" 関数を参照してください。
説明日付/時刻オプション・キーワード
文字列。既定値は 'AM' です。AM
整数。規定値は 1 です。使用できる値は、0
から 12 です。これらの日付形式の詳細は、
Caché ObjectScript "$ZDATE" 関数を参照
してください。
DATE_FORMAT
整数。既定値は2980013 (12/31/9999) です。
前の日付は設定できますが、後の日付はで
きません。
DATE_MAXIMUM
292 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
説明日付/時刻オプション・キーワード
正整数。既定値は 0 (12/31/1840) です。後
の日付は設定できますが、前の日付はできま
せん。
DATE_MINIMUM
文字。既定値は '/' です。DATE_SEPARATOR
文字。既定値は '.' です。DECIMAL_SEPARATOR
文字列。既定値は 'MIDNIGHT' です。MIDNIGHT
文字。既定値は '-' です。MINUS_SIGN
文字列。既定値は 'Jan Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec' です (この文字列
は、既定の区切り文字である空白文字で始ま
ります)。
MONTH_ABBR
文字列。既定値は 'January February March
April May June ... November December' です
(この文字列は、既定の区切り文字である空
白文字で始まります)。
MONTH_NAME
文字列。既定値は 'NOON' です。NOON
文字。既定値は ',' です。NUMERIC_GROUP_SEPARATOR
整数。既定値は 3 です。NUMERIC_GROUP_SIZE
文字列。既定値は 'PM' です。PM
文字。既定値は '+' です。PLUS_SIGN
整数。既定値は 1 です。使用できる値は、1
から 4 です。これらの時刻形式の詳細は、
Caché ObjectScript "$ZTIME" 関数を参照し
てください。
TIME_FORMAT
整数。既定値は 0 です。TIME_PRECISION
文字。既定値は ':' です。TIME_SEPARATOR
文字列。既定値は 'Sun Mon Tue Wed Thu Fri
Sat' です (この文字列は、既定の区切り文字
である空白文字で始まります)。
WEEKDAY_ABBR
文字列。既定値は 'Sunday Monday Tuesday
Wednesday Thursday Friday Saturday' です
(この文字列は、既定の区切り文字である空
白文字で始まります)。
WEEKDAY_NAME
Caché SQL リファレンス 293
SET OPTION
説明日付/時刻オプション・キーワード
整数。既定値は0です。使用できる値は0か
ら 6 です。2 桁および 4 桁の年のこれらの表
示方法の詳細は、Caché ObjectScript
"$ZDATE" 関数を参照してください。
YEAR_OPTION
関連項目
• SQL日付および時刻の関数 : CURRENT_TIMESTAMP DATEPART DATENAME GETDATE
NOW
• SQL 日付関数 : DAYNAME DAYOFWEEK DAYOFMONTH DAYOFYEAR WEEK MONTH
MONTHNAME QUARTER YEAR CURDATE CURRENT_DATE TO_DATE
• SQL 時刻関数 : HOUR MINUTE SECOND CURTIME CURRENT_TIME
• Caché ObjectScript 関数 : $ZDATE $ZDATETIME $ZTIME
294 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET TRANSACTION
トランザクションのパラメータを設定します。
SET TRANSACTION %COMMITMODE commitmode-value
SET TRANSACTION transaction-mode
引数
オプション — トランザクションがデータベース
にコミットされる方法を指定します。利用可能
な値は、EXPLICIT、IMPLICIT、そして NONE
です。既定は IMPLICIT です。
%COMMITMODE commitmode-value
オプション—トランザクションのアクセス・モー
ドと分離モードを指定します。分離モード、ア
クセス・モード、またはコンマ区切りリストとし
て両方のモードの値を指定できます。分離モー
ドの有効な値は、ISOLATION LEVEL READ
COMMITTED と ISOLATION LEVEL READ
UNCOMMITTED です。既定は、ISOLATION
LEVEL READ COMMITTED です。アクセス・
モードに有効な値は READ ONLY と READ
WRITE です。ISOLATION LEVEL READ
UNCOMMITTED は、READ WRITE のアクセ
ス・モードと互換性がなく、コンパイル時にエ
ラーが発行されます。
transaction-mode
概要SET TRANSACTION文は、トランザクションを管理するパラメータを設定します。これらのパラメータ
は、次のトランザクションの開始時に発効し、現在のプロセスの間、またはリセットされるまでの間、有
効となります。START TRANSACTION コマンドを使用して、同じパラメータを設定できます。このコ
マンドでも、新しいトランザクションが開始されます。既定では、トランザクションは最初のデータベー
ス操作で開始され、COMMIT または ROLLBACK で完了するまで継続します。次のデータベース
操作で、次のトランザクションが開始されます。
%COMMITMODE
%COMMITMODE キーワードを使用すると、トランザクションのコミットを自動的に実行するかどうか
を指定できます。使用可能なオプションは以下のとおりです。
• NONE : トランザクション処理を自動化しない。START TRANSACTION や COMMIT 文で明
示的に呼び出さない限り、トランザクション処理は実行されません。
Caché SQL リファレンス 295
SET TRANSACTION
• IMPLICIT : 自動コミットをオンにする。トランザクション処理の実行方法 : それぞれのデータ
ベース処理 (挿入、更新、削除) が個別のトランザクションを構成します。文の実行が成功する
と、ロールバックのジャーナルはクリアされ、ロックが解放されます。COMMIT文は必要ありませ
ん。これが既定の設定です。
• EXPLICIT : トランザクションの自動コミットをオフにする。トランザクション処理の実行方法 :複
数のデータベース操作で 1 つのトランザクションが構成され、COMMIT 文でトランザクションが
完了します。
以下の関数呼び出しを使用することで、Caché ObjectScript で同じオプションを設定できます。
DO $SYSTEM.SQL.SetAutoCommit(0)
使用可能な関数の値は、0 (NONE)、1 (IMPLICIT)、および 2 (EXPLICIT) です。
ISOLATION MODE
ISOLATIONMODEを使用すると、コミットされていないデータベースへの変更分に対して、SELECT
クエリで読み取りアクセスできるようにするかどうかを指定できます。READCOMMITTEDオプション
は、コミットされた変更分のみがクエリ・アクセスで使用できることを示します。要求されたデータは変
更されているが、コミット (またはロールバック) されていない場合、クエリはトランザクションが完了す
るまで待機します。このデータが使用可能になるまで待機している間にロック・タイムアウトが発生し
た場合、SQLCODEエラーが発行されます。READCOMMITTEDが既定です。READUNCOMMIT-
TEDオプションは、すべての変更分がクエリ・アクセスで即座に使用できることを示します。ISOLATION
MODE は、SET TRANSACTION または START TRANSACTION コマンドを使用して明示的にリ
セットされるまで有効です。COMMIT または ROLLBACK 処理は、ISOLATION MODE の設定に
は影響しません。
SELECTDISTINCTまたはGROUP BY節を使用したクエリ処理や集約関数の呼び出しは、ISOLA-
TION MODEオプションに影響されません。集約関数は、コミットされていない変更分を含め、現在
の変更の状態をすべて返します。COUNT(*)のような集約関数は大量のレコードに関連し、絶えず
変更されている値を返すため、任意の時点の集約値はその時点のトランザクションで発生している
正確な変更の状態を反映することができません。
関連項目COMMIT ROLLBACK SAVEPOINT START TRANSACTION トランザクション
296 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SIGN
与えられた数値式の正負符号を返す、数値関数です。
SIGN(numeric-expression)
{fn SIGN(numeric-expression)}
引数
正負符号が返される数numeric-expression
概要SIGN は、以下の値を返します。
• numeric-expression がゼロより小さい場合、-1 を返します。
• numeric-expression がゼロの場合、0 (ゼロ) を返します。
• numeric-expression がゼロより大きい場合、1 を返します。
• numeric-expression が NULL の場合、NULL を返します。
SIGN は、ODBC スカラ関数 ({ } 括弧構文) や SQL 汎用関数として使用できます。
例以下の例は、SIGN の結果の例です。
SELECT DISTINCT SIGN(-49) AS PosNegFROM Sample.Person
これは、-1 を返します。
SELECT DISTINCT {fn SIGN(-0.0)} AS PosNegFROM Sample.Person
これは、0 を返します。
SELECT DISTINCT SIGN(-+-16.748) AS PosNegFROM Sample.Person
これは、1 を返します。
SELECT DISTINCT {fn SIGN(NULL)} AS PosNegFROM Sample.Person
これは、<null> を返します。
Caché SQL リファレンス 297
SIGN
関連項目NVL +(正の数) –(負の数)
SIN
与えられた角度の三角関数のサインを、ラジアン表示で返す、スカラ数値関数です。
{fn SIN(float-expression)}
引数
FLOAT タイプの式。ラジアンで表示される角度です。float-expression
概要SIN は、任意の数値を取り、浮動小数点数でサインを返します。NULL値 を渡すと、SIN は NULL
を返します。SIN は、非数値文字列を数値 0 (ゼロ) として扱います。
SIN は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、SIN の実行結果です。
SELECT DISTINCT {fn SIN(0.52)} AS SineFROM Sample.Person
これは、0.496880 を返します。
関連項目
• SQL 関数 : ACOS ASIN ATAN COS COT TAN
• Caché ObjectScript 関数 : $ZSIN
298 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SOME
クエリ内の値を比較します。
scalar-expression comparison-operator SOME query
引数
値が比較されるスカラ式。scalar-expression
有効な比較演算子。< (より小さい)、> (より大きい)、<> (等
しくない)、= (等しい) など。
comparison-operator
比較対象のクエリから取得するデータ。query
概要SOME演算子は、比較演算子と併用し、クエリで取得した行のいずれか、またはいくつかがスカラ式
を満たす場合に真となる、専用の条件式 (限定比較条件) を作成します。
例以下に例を示します。
SELECT DISTINCT(Customer.Customer),Customer.CustName FROM Orders,Customer WHERE Orders.Customer=Customer.ID AND 1000 <= SOME (SELECT OrderTotal FROM Orders WHERE Orders.Customer=Customer.ID)
これは、1 度でも $1000 以上の注文をしたことがある顧客のリストを返します。
関連項目ALL ANY
SPACE
文字列タイプのスペースを返す汎用 SQL 関数です。
SPACE(count){fn SPACE(count)}
引数
返される空白スペースの数を指定する整数式。count
Caché SQL リファレンス 299
SOME
概要SPACE は、空白スペースの文字列を count スペース分の長さだけ返します。
文字列から空白スペースを削除するには、LTRIM (先頭の空白) または RTRIM (末尾の空白) を使
用します。
例以下の埋め込み SQL の例は、name フィールドの空白の文字列の長さを返します。
&sql(SELECT SPACE(LENGTH(name)) INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Leave this much space:",a,"for names" }
関連項目LTRIM RTRIM TRIM
%SQLSTRING
値を文字列としてソートする照合関数です。
%SQLSTRING(expression[,maxlen])
%SQLSTRING expression
引数
列名、文字リテラル、または他の関数の結果となる文字列式。基本となる
データ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とすることが
できます。
expression
オプション — 照合された値が、maxlen の値にまで切り捨てられることを指
定する正の整数。
maxlen
概要%SQLSTRING は、expression を (大文字と小文字を区別する) 文字列としてソートされる形式に変
換します。%SQLSTRING は、後続の空白 (スペースやタブなど) を削除し、文字列の最初の部分に
空白を 1 つ追加します。この追加された空白は、NULL と数値を強制的に文字列として照合しま
す。先頭と末尾のゼロは数値から削除されます。
300 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
%SQLSTRING がすべての値に空白を追加するため、NULL 値を文字列長 1 を持つ空白として照
合します。%SQLSTRING は、空白 (スペースやタブなど) だけを含む値を SQL 空文字列 ('') として
照合します。%SQLSTRINGが空文字列 (長さがゼロ)に空白を追加すると、空文字列$CHAR(0) の
内部表現が追加された空白として照合し、文字列長 2 という結果になります。
オプションのmaxlenパラメータは、インデックス指定や照合の際にexpression文字列を指定された
文字数に切り捨てます。例えば、maxlen トランケーションを持つ長い文字列を挿入する場合、完全
な文字列が挿入され、SELECT 文で検索できます。この文字列に対するインデックス・グローバル
は、指定された長さに切り捨てられます。これは、ORDERBYと比較演算は、切り捨てられたインデッ
クス文字列のみを評価することを意味します。このようなトランケーションは、Caché添え字で255文
字制限を超える文字列に対してインデックスを指定するときに特に便利です。Caché 以外のシステ
ムから変換する際、VARCHAR(255) の索引を付け、次にデータをテーブルに挿入しようとして、問
題が生じることがありました。maxlenパラメータでは、長いフィールドにインデックスを指定する場合、
トランケーション・レングス・パラメータを使用することができます。
大文字/小文字を区別しない文字列変換に関しては、"%SQLUPPER" を参照してください。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.SQLSTRING(expression,maxlen)
例以下のクエリは、WHERE 節の %SQLSTRING を使用します。
SELECT Name FROM Sample.PersonWHERE %SQLSTRING Name %STARTSWITH ' Al'ORDER BY Name
WHERE節は、最初は(Name列内の)各名前を%SQLSTRING形式に変換し、次に、%STARTSWITH
を使用して “Al” から始まるすべての名前 (Allen や Alton など) を返します。%SQLSTRING が文
字列を変換する際に文字列の先頭に空白を追加するため、%STARTWITH 文字列は先頭の空白
を含むことに注意してください。
以下のクエリは、文字列トランケーションを持つ%SQLSTRINGを使用して、各名前の最初の2文字
を返します。文字列トランケーションは、%SQLSTRING が先頭の空白を追加するため、3 (2 ではな
く) になります。ORDER BY節は、この 2文字フィールドを使用して、行におおまかな照合順を配置
します。
SELECT Name, %SQLSTRING(Name,3) AS FirstTwoFROM Sample.PersonORDER BY FirstTwo
関連項目%SQLUPPER
Caché SQL リファレンス 301
%SQLSTRING
%SQLUPPER
値を大文字の文字列としてソートする照合関数です。
%SQLUPPER(expression[,maxlen])
%SQLUPPER expression
引数
列名、文字リテラル、または他の関数の結果となる文字列式。基本となる
データ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とすることが
できます。
expression
オプション — 照合された値が、maxlen の値までに切り捨てられることを指
定する整数。
maxlen
概要%SQLUPPER は、expression を (大文字と小文字を区別しない) 大文字の文字列としてソートされる
形式に変換します。%SQLUPPER は、すべてのアルファベット文字を大文字に変換し、後続の空白
(スペースやタブなど)を削除し、文字列の最初の部分に空白を1つ追加します。この追加された空
白は、NULL と数値を文字列として照合します。先頭と末尾のゼロは数値から削除されます。
%SQLUPPERがすべての値に空白を追加するため、NULL値を文字列長 1を持つ空白として照合
します。%SQLUPPER は、空白 (スペースやタブなど) だけを含む値を SQL 空文字列 ('') として照
合します。%SQLUPPER が空文字列 (長さがゼロ) に空白を追加すると、空文字列 $CHAR(0) の内
部表現が追加された空白として照合し、文字列長 2 という結果になります。
オプションの maxlen パラメータは、インデックス指定や照合の際に変換済みの expression 文字列
を指定された文字数に切り捨てます。例えば、maxlen トランケーションを持つ長い文字列を挿入す
る場合、完全な文字列が挿入され、SELECT文で検索できます。この文字列に対するインデックス・
グローバルは、指定された長さに切り捨てられます。これは、ORDER BY と比較演算は、切り捨てら
れたインデックス文字列のみを評価することを意味します。このようなトランケーションは、Caché 添
え字で 255 文字制限を超える文字列に対してインデックスを指定するときに特に便利です。Caché
以外のシステムから変換する際、VARCHAR(255) の索引を付け、次にデータをテーブルに挿入し
ようとして、問題が生じることがありました。maxlen パラメータでは、長いフィールドにインデックスを
指定する場合、トランケーション・レングス・パラメータを使用することができます。
大文字/小文字を区別する文字列変換に関しては、"%SQLSTRING" を参照してください。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.SQLUPPER(expression,maxlen)
302 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
その他の大文字/小文字変換関数
%SQLUPPER関数は、大文字と小文字を区別しない比較または照合に対してデータ値を変換する、
SQL で優先的な方法です。%SQLUPPER は、データの最初の部分に空白を追加します。それに
よって、数値データと NULL 値を文字列として解釈させます。
以下は、データ値の大文字と小文字変換に対する他のメソッドです。
• %ALPHAUP : 文字を大文字に変換し、コンマと疑問符以外のすべての句読点を削除し、すべ
ての空白 (先頭、末尾、埋め込み) を削除します。数値を文字列として解釈する変換を強制的
に実行しません。先頭と末尾のゼロは数値から削除されます。
• UPPER : 文字を大文字に変換し、句読点と先頭の空白を無視し、末尾の空白を削除します。
数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削
除されます。
• %UPPER : 文字を大文字に変換し、句読点と先頭の空白を無視し、末尾の空白を削除します。
数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削
除されます。
• UCASE : 文字を大文字に変換し、句読点と先頭の空白を無視し、末尾の空白を削除します。
数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削
除されます。
• LCASE : 文字を小文字に変換し、句読点と先頭の空白を無視し、末尾の空白を削除します。
数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削
除されます。
• LOWER : 文字を小文字に変換し、句読点と先頭の空白を無視し、末尾の空白を削除します。
数値を文字列として解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削
除されます。
• %STRING : 文字を大文字に変換し、コンマ以外のすべての句読点を削除し、すべての空白
(先頭、末尾、埋め込み) を削除します。データの最初の部分に空白を追加します。それによっ
て、数値データと NULL 値を文字列として解釈させます。先頭と末尾のゼロは数値から削除さ
れます。
例以下のクエリは、WHERE 節の %SQLUPPER を使用します。
SELECT Name FROM Sample.PersonWHERE %SQLUPPER Name %STARTSWITH ' AL'ORDER BY Name
WHERE節は、最初は (Name列内の)各名前を%SQLUPPER形式に変換し、次に、%STARTSWITH
を使用して “AL” から始まるすべての名前 (ALLEN や ALTON など) を返します。%SQLUPPER
が文字列を変換する際に文字列の先頭に空白を追加するため、%STARTSWITH 文字列は先頭の
空白を含むことに注意してください。
Caché SQL リファレンス 303
%SQLUPPER
以下のクエリは、文字列トランケーションを持つ %SQLUPPER を使用して、大文字の各名前の最初
の 2文字を返します。文字列トランケーションは、%SQLUPPERが先頭の空白を追加するため、3 (2
ではなく) になります。ORDER BY 節は、この 2文字フィールドを使用して、行におおまかな照合順
を配置します。
SELECT Name, %SQLUPPER(Name,3) AS FirstTwoFROM Sample.PersonORDER BY FirstTwo
関連項目%SQLSTRING
SQRT
与えられた数値式の平方根を返す、スカラ数値関数です。
{fn SQRT(float-expression)}
引数
平方根が計算される、FLOAT タイプの式。float-expression
概要SQRT は、FLOAT タイプとして float-expression の平方根を返します。NULL値 を渡すと、SQRT
は NULL を返します。
SQRT は、{ } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、49 の平方根を取ります。
SELECT DISTINCT {fn SQRT(49)} AS SRootFROM Sample.Person
これは、7 を返します。
以下の埋め込み SQL の例は、0 から 10 までの整数の平方根を返します。
304 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SET a=0 WHILE a<11 { &sql(SELECT {fn SQRT(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE QUIT } ELSE { WRITE !,"The square root of ",a," = ",b SET a=a+1 } }
関連項目
• SQL 関数 : POWER ROUND
• Caché ObjectScript 関数 : $ZSQR
START TRANSACTION
トランザクションの開始を表します。
START TRANSACTION[%COMMITMODE commitmode][transactionmodes]
引数
オプション — トランザクションがデータベースにコミットされる方
法を指定します。有効な値は、EXPLICIT、IMPLICIT、および
NONE です。既定は NONE です。
commitmode
オプション — トランザクションのアクセス・モードと分離モードを
指定します。分離モード、アクセス・モード、またはコンマ区切り
リストとして両方のモードの値を指定できます。分離モードの有
効な値は、ISOLATION LEVEL READ COMMITTED と
ISOLATION LEVEL READ UNCOMMITTEDです。アクセス・モー
ドに有効な値はREADONLY と READWRITEです。ISOLATION
LEVEL READ UNCOMMITTED は、アクセス・モードの READ
WRITE と互換性がないことに注意してください。
transactionmodes
概要START TRANSACTION 文は、トランザクションの開始を表します。通常、SQL トランザクションは、
START TRANSACTION という文で始まります。しかし、これはオプションです。COMMIT に続く最
初のデータベース処理は、トランザクションが明示的に開始されていない場合に、暗黙的にトランザ
Caché SQL リファレンス 305
START TRANSACTION
クションを開始します。トランザクションがすでに進行中の場合、START TRANSACTION を発行し
ても処理を実行せず、エラー・コードも返しません。
START TRANSACTION文を使用して、トランザクションを管理するパラメータを設定することができ
ます。これらのパラメータは、次のトランザクションの開始時に発効し、現在のプロセスの間、または
リセットされるまでの間、有効となります。SET TRANSACTION コマンドを使用して同じパラメータを
設定することができます。どちらのコマンドも使用できます。両方のコマンドはオプションです。
トランザクションの動作が正常完了できなかった場合は、SQLCODE -400 が発行されます。
%COMMITMODE
%COMMITMODE キーワードを使用すると、トランザクションのコミットを自動的に実行するかどうか
を指定できます。使用可能なオプションは以下のとおりです。
• NONE : トランザクション処理を自動化しない。START TRANSACTION や COMMIT 文で明
示的に呼び出さない限り、トランザクション処理は実行されません。
• IMPLICIT : 自動コミットをオンにする。トランザクション処理の実行方法 : それぞれのデータ
ベース処理 (挿入、更新、削除) が個別のトランザクションを構成します。文の実行が成功する
と、ロールバックのジャーナルはクリアされ、ロックが解放されます。COMMIT文は必要ありませ
ん。
• EXPLICIT : トランザクションの自動コミットをオフにする。トランザクション処理の実行方法 :複
数のデータベース操作で 1 つのトランザクションが構成され、COMMIT 文でトランザクションが
完了します。
以下の関数呼び出しを使用することで、Caché ObjectScript で同じオプションを設定できます。
DO $SYSTEM.SQL.SetAutoCommit(0)
使用可能な関数の値は、0 (NONE)、1 (IMPLICIT)、および 2 (EXPLICIT) です。
ISOLATION MODE
ISOLATIONMODEを使用すると、コミットされていないデータベースへの変更分に対して、SELECT
クエリで読み取りアクセスできるようにするかどうかを指定できます。READCOMMITTEDオプション
は、コミットされた変更分のみがクエリ・アクセスで使用できることを示します。要求されたデータは変
更されているが、コミット (またはロールバック) されていない場合、クエリはトランザクションが完了す
るまで待機します。このデータが使用可能になるまで待機している間にロック・タイムアウトが発生し
た場合、SQLCODE エラーが発行されます。READ UNCOMMITTED オプションは、すべての変更
分がクエリ・アクセスで即座に使用できることを示します。ISOLATIONMODEは、SETTRANSACTION
またはSTART TRANSACTIONコマンドを使用して明示的にリセットされるまで有効です。COMMIT
または ROLLBACK 処理は、ISOLATION MODE の設定には影響しません。
SELECTDISTINCTまたはGROUP BY節を使用したクエリ処理や集約関数の呼び出しは、ISOLA-
TION MODEオプションに影響されません。集約関数は、コミットされていない変更分を含め、現在
の変更の状態をすべて返します。COUNT(*)のような集約関数は大量のレコードに関連し、絶えず
306 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
変更されている値を返すため、任意の時点の集約値はその時点のトランザクションで発生している
正確な変更の状態を反映することができません。
Caché ObjectScript と SQL トランザクションTSTART と TCOMMIT を使用した Caché ObjectScript トランザクション処理は、SQL 文 START
TRANSACTION と COMMIT を使用した SQL トランザクション処理とは異なり、互換性はありませ
ん。Caché ObjectScript トランザクション処理は、入れ子になったトランザクションを限定的にサポー
トします。SQLトランザクション処理では、入れ子になったトランザクションのロールバック用のユーザ
定義セーブポイントがサポートされます。Caché ObjectScript トランザクション処理は、SQL ロック制
御変数 (特に SQL ロック・エスカレーション変数) と相互にやり取りしません。アプリケーションは、こ
れら 2 種類のトランザクション処理を混同しないよう注意する必要があります。
トランザクションに SQL 更新文が含まれる場合、SQL の START TRANSACTION 文でトランザク
ションが開始され、COMMIT 文でコミットします。トランザクションを開始するものでない限り、
TSTART/TCOMMITを入れ子にして使用するメソッドをトランザクションに組み込むことができます。
メソッドとストアド・プロシージャは、通常、設計でトランザクションの主要なコントローラにならない限
り、SQL トランザクション制御文を使用しません。ストアド・プロシージャは、独自のトランザクション制
御モデルの ODBC/JDBC から呼び出されるため、通常 SQL トランザクション制御文を使用しませ
ん。
関連項目トランザクション COMMIT ROLLBACK SAVEPOINT SET TRANSACTION
STRING
式を文字列に変換して連結する関数。
STRING(string1[,string2][,...][,stringn])
引数
フィールド名、文字列リテラル、数値、または他の関数の結果となる式。基
本となるデータ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とす
ることができます。フィールド名が指定されている場合は、論理値が使用
されます。
string
概要STRING は、1 つ以上の string を STRING 形式に変換し、これらの文字列を単一の文字列に連結
します。ケース変換は実行されません。
Caché SQL リファレンス 307
STRING
STRING は、文字列変換する前に数値をキャノニック形式に変換します。そのため、算術演算が実
行され、数値の先頭および末尾のゼロと先頭のプラス記号が取り除かれます。
string 引数の 1 つが NULL の場合、STRING は NULL を返します。string 引数の 1 つが空文字
列 ('') の場合、STRING はその他の引数を連結します。STRING は、空白を保持します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.STRING(expression,maxlen)
%SQLSTRING関数を使用すると、データを文字列の大文字と小文字を区別して比較するための値
に変換します。また、%SQLUPPER 関数は、データを文字列の大文字と小文字を区別せずに比較
するための値に変換します。
例以下の埋め込み SQL の例では、STRING により 3 つの部分文字列を単一の文字列に連結してい
ます。また、空白スペース、空文字列、および NULL の処理についても示しています。
&sql(SELECT STRING('a','b','c'), STRING('a',' ','c'), STRING('a','','c'), STRING('a',NULL,'c') INTO :w,:x,:y,:z FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Resulting string is:",w WRITE !,"Resulting string is:",x WRITE !,"Resulting string is:",y WRITE !,"Resulting string is:",z }
以下の埋め込み SQL の例では、STRING により数値を文字列に変換しています。これらすべての
STRING 関数は、文字列 '123' を返します。
&sql(SELECT STRING(123), STRING(+00123.00), STRING('1',23), STRING(1,(10*2)+3) INTO :w,:x,:y,:z FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Resulting string is:",w WRITE !,"Resulting string is:",x WRITE !,"Resulting string is:",y WRITE !,"Resulting string is:",z }
以下の埋め込み SQL の例では、STRING を使用してフィールドからサンプル・データを取得し、こ
れを文字列に変換しています。
308 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
&sql(SELECT STRING(Name,Age) INTO :x FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Resulting string is:",x }
関連項目%STRING %SQLUPPER %SQLSTRING
%STRING
非推奨。文字列を STRING 照合フォーマットに変換するケース変換関数です。
%STRING(expression[,maxlen])
%STRING expression
引数
列名、文字リテラル、または他の関数の結果を指定できる文字列式。基本
となるデータ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とする
ことができます。
expression
オプション —照合された値が、maxlen の値までに切り捨てられることを指
定する整数。
maxlen
概要この照合関数はお勧めしません。新規開発については、"%SQLSTRING" (大文字/小文字を区別
する文字列比較) または "%SQLUPPER" (大文字/小文字を区別しない文字列比較) を参照してく
ださい。
%STRING は、expression を STRING 形式に変換します。
• すべての文字を大文字に変換します。
• 句読点文字は、コンマ以外すべて削除します。
• 数値から先頭と末尾のゼロを削除します。
• すべての空白 (先頭、末尾、埋め込み) を削除します。
• 値の最初の部分にスペースを 1 つ追加します。それによって、数値データと NULL 値を文字
列として解釈させます。
Caché SQL リファレンス 309
%STRING
%STRING がすべての値に空白を追加するため、NULL 値を文字列長 1 を持つ空白として照合し
ます。%STRING は、空白 (スペースやタブなど) だけを含む値を SQL 空文字列 ('') として照合しま
す。%STRING が、空文字列 (長さがゼロ) に空白を追加すると、空文字列 $CHAR(0) の内部表現
が追加された空白として照合し、文字列長 2 という結果になります。
オプションのmaxlen トランケーション・パラメータは、Caché添え字で255文字制限を超える文字列
に対しインデックスを指定するときに特に便利です。Caché 以外のシステムから変換する際、VAR-
CHAR(255) フィールドにインデックスを指定し、次にデータをテーブルに挿入しようとすると、問題
が生じることがありました。maxlenパラメータでは、長いフィールドにインデックスを指定する場合、ト
ランケーション・レングス・パラメータを持つ STRING 照合を使用できます。
%STRING は、Caché SQL の拡張機能であり、SQL 検索クエリ用として使用するものです。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.STRING(expression,maxlen)
%SQLUPPER関数は、大文字と小文字を区別しない比較または照合に対してデータ値を変換する、
SQL で優先的な方法です。ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
例以下のクエリでは、
SELECT NameFROM Sample.PersonWHERE %STRING(Name) %STARTSWITH ' BR'
WHERE 節は、%STRING を使用して、("Name" 列内の) 各名前を STRING 形式に変換し、次
に、%STARTSWITH を使用して "BR" から始まるすべての名前 (BROWN や BRADY など) を返し
ます。%STARTSWITH引数に追加された空白文字に注意してください。これは、%STRINGが、その
値を返す文字列値にスペースを追加するため必要となります。
関連項目
• STRING
• %SQLUPPER
• %SQLSTRING
310 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SUBSTR
指定された文字式から得られた部分文字列を返す汎用 SQL 文字列関数です。
SUBSTR(string-expression,start[,length])
引数
部分文字列が得られる文字式。式は、列の名前、文字列リテ
ラル、または他のスカラ関数の結果となります。基本となる
データ型は、任意の文字タイプ (CHAR や VARCHAR など)
とすることができます。
string-expression
string-expression 内で、部分文字列が開始される場所を指
定する整数。正の数の開始位置は、文字列の最初からの文
字数を指定します。string-expression1 の最初の文字はポジ
ション 1にあります。負の数の開始位置は、文字列の最後か
らの文字数を指定します。start が 0 (ゼロ) の場合は 1 とし
て扱います。
start
オプション — 返される部分文字列の長さを指定する正の整
数。この値は、部分文字列が開始位置から右に length の文
字数を進んで終了することを指定します。省略された場合、部
分文字列は start から string-expression の最後まで進みま
す。
length
概要start は負もありうるので、元の文字列の先頭または末尾から部分文字列を取得します。
SUBSTR に引数として渡される浮動小数点は、小数部を切り捨てることにより、整数に変換されま
す。
• start が 0、–0、または1の場合、返される部分文字列は、その文字列の最初の文字で始まりま
す。
• start が、文字列の先頭よりも前に位置する負の数の場合、返される部分文字列は、その文字
列の最初の文字で始まります。
• start が文字列の範囲を超えていると、NULL が返されます。
• lengthが文字列内の残りすべての文字より長い場合、startから文字列の最後までの部分文字
列が返されます。
• length が 1 未満の場合、NULL が返されます。
• start または length のいずれかが NULL の場合、NULL が返されます。
Caché SQL リファレンス 311
SUBSTR
SUBSTR は、Oracle に対する互換性がサポートされています。
例以下の例は、3番目の文字 (C) から文字列の最後までを指定するので、部分文字列CDEFG を返
します。
SELECT DISTINCT SUBSTR('ABCDEFG',3) AS Sub FROM Sample.Person
以下の例は、3 番目の文字 (C) から 4 文字分 (F まで) の部分文字列を指定するので、部分文字
列 CDEF を返します。
SELECT DISTINCT SUBSTR('ABCDEFG',3,4) AS Sub FROM Sample.Person
以下の例は、Caché が、まずオリジナル文字列の末尾から逆方向に 5 文字をカウントし、そこから
4 文字分を返すように指定しているので、CDEF を返します。
SELECT DISTINCT SUBSTR('ABCDEFG',-5,4) AS Sub FROM Sample.Person
関連項目
• SQL 関数 : SUBSTRING
• Caché ObjectScript 関数 : $EXTRACT $PIECE
312 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SUBSTRING
より大きい文字列から部分文字列を返す文字列関数です。
SUBSTRING(string-expression,start,length)
SUBSTRING(string-expression FROM start FOR length)
{fn SUBSTRING(string-expression,start,length)}
引数
部分文字列が得られる文字式。式は文字リテラル(一重引用
符で囲む)、列の名前、または他のスカラ関数の結果となりま
す。基本となるデータ型は、任意の文字タイプ (CHAR や
VARCHAR など) とすることができます。
string-expression
string-expression 内で、部分文字列が開始する場所を指定
する整数。string-expression の最初の文字はポジション 1で
す。開始位置が文字列の長さ以上である場合、SUBSTRING
は空文字列 ('') を返します。開始位置が 1 以下である場合
(ゼロまたは負の数)、部分文字列はポジション 1 で開始しま
すが、部分文字列の lengthは開始位置により削減されます。
start
オプション — 返される部分文字列の長さを指定する整数。
lengthを指定しない場合、既定で残りの文字列が返されます。
length
概要start の値は、部分文字列の開始ポイントを管理します。
• start が 1 未満の場合、length の値は対応する量によってディクリメントされます。したがって、
start が 0 の場合、length の値は 1 まで減少します。start が –1 の場合、length の値は 2 まで
減少します。
length の値は、部分文字列のサイズを管理します。
• length が正の値の場合 (1 以上)、部分文字列は開始位置から右に向かって length 文字数ま
で進んで終わります (この有効な長さは、start の数が 1 より小さいと減少する場合もあります)。
• length が、文字列内の残りの文字より長い場合、string-expression の開始位置の右側から最
後までのすべての文字を返します。
• length が 0 未満の場合、NULL が返されます。
• length が負の数の場合、SQLCODE=–140 エラー・コードを返します。
Caché SQL リファレンス 313
SUBSTRING
SUBSTRING に引数として渡される浮動小数点は、小数部を切り捨てることにより、整数に変換され
ます。
すべての SUBSTRING 引数の値が NULL の場合、SUBSTRING は NULL を返します。
SUBSTRING は、部分文字列を文字列の最初の部分から抽出します。SUBSTR は、部分文字列を
文字列の最初の部分または最後の部分のいずれかから抽出できます。これらの 2 つの SQL 関数
は引数値をそれぞれ処理します。
SUBSTRING は、ODBC スカラ関数 ({ } 括弧構文) や SQL 汎用関数として使用されます。
例以下の例は、"forward" 文字列を返します。
SELECT DISTINCT {fn SUBSTRING( 'forward pass',1,7 )} AS SubTextFROM Sample.Person
以下の例は、"pass" 文字列を返します。
SELECT DISTINCT {fn SUBSTRING( 'forward pass',9,4 )} AS SubTextFROM Sample.Person
以下の例は、各名前の最初の 4 文字を返します。
SELECT Name,SUBSTRING(Name,1,4) AS FirstFourFROM Sample.Person
関連項目
• SQL 関数 : SUBSTR
• Caché ObjectScript 関数 : $EXTRACT $PIECE
314 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SUM
指定の列の値の合計値を返す、集約関数です。
SUM([ALL | DISTINCT] expression)
引数
オプション — SUMが expression のすべての値の合計を返すように指定し
ます。キーワードが指定されていない場合は、これが既定になります。
ALL
オプション — SUM が expression の個別の (一意の) 値の合計を返すよう
に指定します。指定されていない場合、既定は ALL です。
DISTINCT
任意の有効な式。普通は、合計値算出の対象となるデータ値を含む列の
名前を指定します。
expression
概要SUM 集約関数は、expression の値の合計を返します。一般的に expression は、クエリで返される
複数行の中のフィールド名 (または、フィールド名を 1 つ以上含む式) です。
SUMは、テーブルまたはビューを参照する SELECT クエリやサブクエリで使用できます。SUMは、
一般のフィールド値とともに SELECT リストや HAVING 節で使用できます。
SUM は、WHERE 節では使用できません。SELECT がサブクエリの場合を除いて、JOIN の ON 節
では、SUM を使用できません。
データ値既定では、集約関数は Display 値ではなく、Logical (内部) データ値を使用します。
通常、SUM は数値を含むフィールドまたは式に適用されます。タイプ・チェックは実行されないた
め、(ほとんど意味はありませんが) 非数値フィールドに対して実行できます。SUM では、空文字列
('') のように数値でない値はゼロ (0) として扱われます。
データ・フィールドの NULL 値は、SUM 集約関数値を得る場合は無視されます。クエリから行が返
されない場合や、すべての行のデータ・フィールド値がNULLの場合、SUMはNULLを返します。
現在のトランザクションで発生する変更すべての集約関数と同様に、SUM は、現在のトランザクションの分離レベルにかかわらず、コミット
されていない変更分を含め、常にデータの現在の状態を返します。詳細は、"SETTRANSACTION"
および "START TRANSACTION" を参照してください。
Caché SQL リファレンス 315
SUM
例以下のクエリは、Sample.Employeeデータベースに記録されている全従業員の給与の合計を返しま
す。
SELECT SUM(Salary) AS Total_Payroll FROM Sample.Employee
以下のクエリは、Sample.Employeeデータベースに記録されている役職ごとの給与の合計と平均値
を返します。
SELECT Title,SUM(Salary) AS Total,AVG(Salary) AS Average FROM Sample.Employee GROUP BY Title ORDER BY Average
以下のクエリは、算術式とともに使用される SUM を示しています。Sample.Employee データベース
に記録されている各役職に対して、現在の給与の合計と支払いに10%増加した給与の合計を返し
ます。
SELECT Title,SUM(Salary) AS Total,SUM(Salary * 1.1) AS Raises FROM Sample.Employee GROUP BY Title ORDER BY Title
以下のクエリは、CASE 文を使用して論理式とともに使用される SUM を示しています。すべての定
額給従業員をカウントし、SUM を使用して $90,000 以上の所得があるすべての定額給従業員をカ
ウントします。
SELECT COUNT(Salary) As AllPaid, SUM(CASE WHEN (Salary >= 90000) THEN 1 ELSE 0 END) As TopPaid FROM Sample.Employee
関連項目AVG COUNT
TAN
与えられた角度の三角関数のタンジェントを、ラジアン表示で返すスカラ数値関数です。
{fn TAN(float-expression)}
引数
FLOAT タイプの式。ラジアンで表示される角度です。float-expression
316 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要TAN は、任意の数値を取り、タンジェントを FLOAT として返します。NULL 値を渡すと、TAN は
NULL を返します。TAN は、非数値文字列を数値 0 (ゼロ) として扱います。
TAN は { } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例以下の例は、TAN の実行結果です。
SELECT DISTINCT {fn TAN(0.52)} AS TangentFROM Sample.Person
これは、0.572561 を返します。
関連項目
• SQL 関数 : ACOS ASIN ATAN COS COT SIN
• Caché ObjectScript 関数 : $ZTAN
TIMESTAMPADD
指定されたタイムスタンプに、特定タイプの間隔の数を加えることで計算された、新しいタイムスタン
プを返すスカラ数値関数です。
{fn TIMESTAMPADD(interval-type,integer-exp,timestamp-exp)}
引数
キーワードとして指定される、integer-exp が表す時刻/日付間隔の
タイプ。
interval-type
timestamp-exp に追加される整数値式。integer-exp
TIMESTAMP 値式。integer-exp の値によって増加します。timestamp-exp
概要TIMESTAMPADD関数は、指定された日付部分を指定された単位数でインクリメントすることで、日
付/時刻式を変更します。例えば、interval-type が SQL_TSI_MONTH で、integer-exp が 5 の場合
は、TIMESTAMPADD は timestamp-exp に 5 か月をインクリメントします。また、integer-exp に負
の整数を指定して、日付部分をディクリメントすることもできます。計算された日付は、TIMESTAMP
として返されます。1000 分の 1 秒 (0.001) でカウントして、秒の小数部でインクリメントあるいはディ
クリメントできます。
Caché SQL リファレンス 317
TIMESTAMPADD
TIMESTAMPADD は { } 括弧構文による ODBC スカラ関数としてのみ使用できる点に注意してくだ
さい。
同様の日付/時刻変更の演算は、DATEADD 汎用関数を使用して、タイムスタンプで実行できま
す。
間隔のタイプ
interval-type パラメータは、以下のタイムスタンプ間隔のいずれかになります。
• SQL_TSI_FRAC_SECOND
• SQL_TSI_SECOND
• SQL_TSI_MINUTE
• SQL_TSI_HOUR
• SQL_TSI_DAY
• SQL_TSI_WEEK
• SQL_TSI_MONTH
• SQL_TSI_QUARTER
• SQL_TSI_YEAR
タイムスタンプ間隔をインクリメントまたはディクリメントすると、他の間隔も適切に変更されます。例え
ば、時間のインクリメント結果が午前 0 時を超える場合、自動的に日がインクリメントされます。同様
に、順次、月などがインクリメントされます。TIMESTAMPADDは、各月の日数やうるう年を考慮に入
れて、常に有効な日付を返します。例えば、1 月 31 日に 1 か月をインクリメントすると 2 月 28 日
(該当月の有効な最終日付) が返されますが、指定された年がうるう年の場合は 2 月 29 日が返さ
れます。
DATEADD と TIMESTAMPADD では四半期 (3 か月の間隔) が処理されます。DATEDIFF と
TIMESTAMPDIFF では四半期は処理されません。
タイムスタンプ形式
timestamp-exp パラメータ値には、同じ論理形式と外部形式があります。文字列の形式は、以下の
とおりです。
yyyy-mm-dd hh:mm:ss
timestamp-exp パラメータ値には以下の特徴があります。
• timestamp-expが日付値のみを指定する場合、timestamp-expの日付部分は、結果のタイムス
タンプが計算される前は '1900–01–01' に設定されます。
• timestamp-exp が日付値のみを指定する場合、timestamp-exp の時刻部分は結果のタイムス
タンプが計算される前は '00:00:00' に設定されます。
318 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• 秒の小数部を含めても省略してもかまいません。
範囲と値のチェック
TIMESTAMPADD は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合
は、NULL 文字列が返されます。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。年は 4 桁で指定される必要があります。
• 日付値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、日は
1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• インクリメント結果として返される年は、1841 から 9999 までの範囲内にある必要があります。こ
の範囲を超えると、<null> が返されます。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標
準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、
または '7a' は無効です。
例以下の例は、元のタイムスタンプに 1 週間を加算します。
SELECT DISTINCT {fn TIMESTAMPADD(SQL_TSI_WEEK,1,'2003-12-20 12:00:00')}FROM Sample.Person
1 週の加算は 7 日の加算になるので、上記の例は 2003-12-27 12:00:00 を返します。
以下の例は、元のタイムスタンプに 5 か月を加算します。
SELECT DISTINCT {fn TIMESTAMPADD(SQL_TSI_MONTH,5,'1999-12-20 12:00:00')}FROM Sample.Person
この例は 5 か月を加算すると年がインクリメントされるので、2000-05-20 12:00:00 を返します。
以下の例も、元のタイムスタンプに 5 か月を加算します。
SELECT DISTINCT {fn TIMESTAMPADD(SQL_TSI_MONTH,5,'1999-01-31 12:00:00')}FROM Sample.Person
上記の例は 1999-06-30 12:00:00 を返します。この TIMESTAMPADD は、月だけでなく日の値も
変更します。これは単純に月をインクリメントすると、無効な日付の 6 月 31 日となるためです。
以下の例は、元のタイムスタンプに 45 分をインクリメントします。
SELECT DISTINCT {fn TIMESTAMPADD(SQL_TSI_MINUTE,45,'1999-12-20 00:00:00')}FROM Sample.Person
Caché SQL リファレンス 319
TIMESTAMPADD
上記の例は 1999-12-20 00:45:00 を返します。
以下の例は、元のタイムスタンプに 45 分をディクリメントします。
SELECT DISTINCT {fn TIMESTAMPADD(SQL_TSI_MINUTE,-45,'1999-12-20 00:00:00')}FROM Sample.Person
上記の例は 1999-12-19 23:15:00 を返します。この場合、時刻をディクリメントすると、日もディクリメ
ントされる点に注意してください。
関連項目TIMESTAMPDIFF DATEADD DATENAME DATEPART
TIMESTAMPDIFF
2 つのタイムスタンプ間の間隔を指定されたタイプの整数値で返す、スカラ数値関数です。
{fn TIMESTAMPDIFF(interval-type,startdate,enddate)}
引数
返り値が表示される時刻/日付間隔のタイプ。interval-type
TIMESTAMP 値式。startdate
startdate と比較される TIMESTAMP 値式。enddate
概要TIMESTAMPDIFF関数は、指定された間隔 (秒、日、週など) に対して、与えられた 2つのタイムス
タンプの差を返します (つまり、一方のタイムスタンプからもう一方を引きます)。返される値は、2 つ
のタイムスタンプ間の間隔数を示す INTEGER です (enddate が startdate より前の場合、
TIMESTAMPDIFF は負の INTEGER 値を返します)。1000 分の 1 秒 (0.001) でカウントして、小秒
数の間隔を返すことができます。
interval-type パラメータは、以下のタイムスタンプ間隔のいずれかになります。
• SQL_TSI_FRAC_SECOND
• SQL_TSI_SECOND
• SQL_TSI_MINUTE
• SQL_TSI_HOUR
• SQL_TSI_DAY
• SQL_TSI_WEEK
320 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• SQL_TSI_MONTH
• SQL_TSI_YEAR
TIMESTAMPDIFF と DATEDIFF では四半期 (3 カ月の間隔) は処理されません。
タイムスタンプ・パラメータ値には、同じ論理形式と外部形式があります。文字列の形式は 'yyyy-
mm-dd hh:mm:ss' です。
• 一方のタイムスタンプ式が TIME 値で、interval-type が日付 (日、週、月、年) を指定する場
合、式の日付部分は、結果のタイムスタンプが計算される前は '1900–01–01'に設定されます。
• 一方のタイムスタンプ式が DATE 値で、interval-type が時刻 (秒、分、時) を指定する場合、
式の時刻の部分は結果のタイムスタンプが計算される前は '00:00:00' に設定されます。
• 秒の小数部を含めても省略してもかまいません。
TIMESTAMPDIFFは { } 括弧構文によるODBC スカラ関数としてのみ使用できる点に注意してくだ
さい。同様の日付/時刻の比較の演算は、DATEDIFF 汎用関数を使用して、タイムスタンプで実行
できます。
範囲と値のチェック
TIMESTAMPDIFF は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合
は、NULL 文字列が返されます。
• 有効な startdate または enddate は、日付文字列 (yyyy-mm-dd)、時刻文字列 (hh:mm:ss)、ま
たは日付/時刻文字列 (yyyy-mm-dd hh:mm:ss) で構成されます。日付と時刻の両方が指定さ
れている場合は、両方が有効でなければなりません。例えば、時刻文字列が指定されていない
場合は年数値を返すことができますが、無効な時刻文字列が指定されている場合は年数値を
返すことができません。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。例えば、日の値が省略されている場合、年数値を返すこと
はできません。年は 4 桁で指定される必要があります。入力値の日付部分を省略した場合、
TIMESTAMPDIFF は既定で '1900–01–01' になります。
• 時刻文字列は、適切な区切り文字で適切にフォーマットされている必要があります。時刻要素
の値はゼロの場合もあるため、1つ以上の時刻要素を省略でき (区切り文字はそのまま残す場
合と省略する場合がある)、これらの要素はゼロ値として返されます。したがっ
て、'hh:mm:ss.nnn'、'hh:mm:ss'、'hh:mm:'、'hh:mm'、'hh::ss'、'hh::'、'hh'、':::' は、すべて有
効です。時間 (Hour) 要素を省略するには、日付式に文字列の日付部分がないことと、少なく
とも 1 つの区切り文字 (:) があることが必要です。
• 日付/時刻値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、
日は 1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
Caché SQL リファレンス 321
TIMESTAMPDIFF
• 日付値または時刻値が10よりも小さい場合、そのほとんどの先頭のゼロは、記載、省略のどち
らでもかまいません。ただし、10 よりも小さい時間 (Hour) 値が日付/時刻文字列の一部の場合
は、その先頭にゼロを付ける必要があります。その他の非標準的な整数値は許可されません。
例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
例以下の例は、後者のタイムスタンプ (1999-12-20 12:00:00) が、前者のタイムスタンプよりも 7 か月
分大きいので、7 を返します。
SELECT DISTINCT {fn TIMESTAMPDIFF(SQL_TSI_MONTH, '1999-5-19 00:00:00','1999-12-20 12:00:00')}FROM Sample.Person
以下の例は、後者のタイムスタンプ ('12:00:00') が、前者のタイムスタンプ (02:34:12) よりも 566 分
大きいので、566 を返します。
SELECT DISTINCT {fn TIMESTAMPDIFF(SQL_TSI_MINUTE, '02:34:12','12:00:00')}FROM Sample.Person
関連項目TIMESTAMPADD DATEDIFF
TO_CHAR
日付や値数を文字列へ変換する汎用 SQL 文字列関数です。
TO_CHAR(tochar-expression[,format])
TOCHAR(tochar-expression[,format])
引数
変換される論理日付、時刻、または数式。tochar-expression
オプション— tochar-expression変換用に日付、時刻、または
数の形式を指定する文字コード。
format
概要TO_CHAR と TOCHAR は互換性があり、Oracle 互換性のためにサポートされています。
TO_CHAR 関数には、以下の 3 つの使用法があります。
• 日付整数をフォーマットされた日付文字列に変換する。
322 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• 時刻整数をフォーマットされた時刻文字列に変換する。
• 数をフォーマットされた数値文字列に変換する。
TO_CHARは、日付または時刻を文字列に変換します。TO_DATEは、文字列を日付または時刻に
変換します。あるデータ型の日付を別のデータ型の日付に変換するには、CONVERT 関数を使用
します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.TOCHAR(tochar-expression,format)
以下に記述されている format のコード定義のロケールは、Caché ObjectScript の $ZDATE と
$ZDATEH ドキュメントに記述されているロケールと同じです。
Date-to-String 変換TO_CHAR の使用では、まず日付式を文字列に変換します。tochar-expression に対する値は、有
効な論理日付でなければなりません。
format文字列で使用されている、形式コードでない文字列はすべて、結果文字列のその位置にそ
のまま戻されます。
以下の表は、このバージョンの TO_CHAR で日付を変換するときの有効な日付の format パラメー
タ・コードを示しています。
意味形式コード
曜日 (1-7、1 は日曜日を指す)D
2 桁の日付 (01-31)DD
現在のロケールのWeekdayAbbrプロパティによって指定される、曜日の
略名。既定は、Sun Mon Tue Wed Thu Fri Sat です。
DY
現在のロケールの WeekdayName プロパティが指定する曜日名。既定
は、Sunday Monday Tuesday Wednesday Thursday Friday Saturday で
す。
DAY
2 桁の月数 (01-12、01 = 1 月)MM
現在のロケールのMonthAbbrプロパティによって指定される月の略名。
既定は、Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec です。
MON
現在のロケールの MonthName プロパティによって指定される正式な月
名。既定は、January February March April May June July August
September October November December です。
MONTH
4 桁の年数。YYYY
Caché SQL リファレンス 323
TO_CHAR
意味形式コード
下 3 桁の年数。YYY
下 2 桁の年数。YY
下 1 桁の年数。Y
下 2 桁の年数。RR
ユリウス日 (紀元前 (BCE) 4713 年 1 月 1日からの日数)。ユリウス日の
形式は、常に DD MON YYYY を返します。
J
ユリウス日
"ユリウス" 日の形式は、1840 年より前 (および 9999 年より後) の日付の表示を可能にするために
提供されています。
文字 'J' を含む文字列で構成される format を指定する場合、返される日付は、紀元前 (BCE) 4713
年 1 月 1 日からカウントされた "ユリウス" 日になります。文字 'J' のみが、この format 文字列内で
指定できます。その他すべての文字を取り込むと、文字 'J' がリテラルとして処理され、日付は標準
の日付として変換されます。
ユリウス日は、既定形式 DD MON YYYY で表示し、BCE (西暦紀元前) の日付に対して接尾語の
文字 'BC' を追加します。現在により近い (CE または AD) 日付には接尾辞を付けません。
ユリウス日には、最大 date-expression 値はありません。
以下の例は、29 May 4550BC を返します。
SELECT DISTINCT TO_CHAR(59684,'J') AS Julian_DateFROM Sample.Person
以下の例は、09 May 2005 を返します。
SELECT DISTINCT TO_CHAR(2453500,'J') AS Julian_DateFROM Sample.Person
Time-to-String 変換TO_CHAR を使用して、時刻式を文字列に変換できます。tochar-expression の値は、有効な論理
時刻の値でなければなりません。
format文字列で使用されている、形式コードでない文字列はすべて、結果文字列のその位置にそ
のまま戻されます。
以下の表は、このバージョンの TO_CHAR で時刻を変換するときの有効な時刻の format パラメー
タ・コードを示しています。
意味形式コード
時間 (1 ~ 12)HH
324 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
意味形式コード
時間 (1 ~ 12)HH12
時間 (0 ~ 23)HH24
分 (0 ~ 59)MI
秒 (0 ~ 59)SS
午前 0 時 00 分からの秒数 (0 ~ 86388)SSSSS
午前AM
午後PM
日付・時刻の変換例以下の例は、日付整数を受け取り、format文字列引数に従ってフォーマットされた日付文字列を返
します。
SELECT DISTINCT TO_CHAR(59684,'MM/DD/YYYY')FROM Sample.Person
文字列 05/29/2004 を返します。
以下の例は、時刻整数を受け取り、format文字列引数に従ってフォーマットされた時刻文字列を返
します。
SELECT TOP 1 TO_CHAR(TO_DATE(30000),'HH:MI:SS')FROM Sample.Person
文字列 10:07:22 を返します。
以下の例は、日付整数を受け取り、フォーマットされた日付文字列を返します。format 文字でない
文字が、リテラルとして出力文字列に渡されます。
SELECT DISTINCT TO_CHAR(59684,'That date is MM/DD/YYYY')FROM Sample.Person
文字列 That date is 05/29/2004 を返します。
以下の例は、日付整数を受け取り、フォーマットされた日付文字列を返します。
SELECT DISTINCT TO_CHAR(59684,'DAY MONTH DD, YYYY')FROM Sample.Person
文字列 Saturday May 29, 2004 を返します。
TO_CHAR と TO_DATE
以下の埋め込み SQL の例は、TO_CHAR 関数と TO_DATE 関数を比較させています。
Caché SQL リファレンス 325
TO_CHAR
最初の例は、TO_DATE を使用して、2 つのタイプの日付変換を示しています。最初の TO_DATE
は、日付文字列を受け取り、対応する日付整数 (59832) を返します ($ZDATE 関数がこの日付整
数をフォーマットされた日付10/24/2004 として表示するために使用されます)。2番目のTO_DATE
は、日付整数を受け取り、対応するフォーマットされた日付文字列 (2004–10–24) を返します。
&sql(SELECT TO_DATE('2004-10-24','YYYY-MM-DD'), TO_DATE('59832','YYYY-MM-DD') INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a WRITE !,$ZDATE(a) WRITE !,b }
対照的に、以下の例は、TO_CHAR を使用して、並列する日付変換を示しています。最初の
TO_CHARは、予想どおりに、日付整数を対応するフォーマットされた日付文字列に変換します。し
かし、2 番目の TO_CHAR は、予期しない結果を生じます。TO_CHAR は数値入力を予期している
ため、入力された日付区切り文字をマイナス記号として扱い、減算を実行します。したがって、その
日付整数 1970 (2004 引く 10 引く 24) つまり 1846–5–24 に対応する日付をフォーマットします。明
らかに、これはプログラマの意図した結果ではありません。
&sql(SELECT TO_CHAR(59832,'YYYY-MM-DD'), TO_CHAR(2004-10-24,'YYYY-MM-DD') INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a WRITE !,b }
Number-to-String 変換次に、TO_CHARを使用して数字を文字列に変換します。以下の表は、このバージョンのTO_CHAR
で数字を変換するときの format パラメータでの有効な形式コードを示しています。
format パラメータを省略すると、入力数値は整数として評価されます。先頭の 0 および先頭のプラ
ス記号は削除され、先頭のマイナス記号は保持されて、数字でない文字 (コンマやピリオドなど) が
初めて現れた箇所で切り捨てられます。先頭の空白やその他の形式は入りません。
説明例形式コー
ド
指定した桁数で値を返します。値が正の場合は先頭にスペースが
付きます。負の場合は先頭にマイナス記号が付きます。固定小数
点の整数部にゼロを戻すゼロ値を除いては、先頭のゼロは空白
になります。
99999
326 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
説明例形式コー
ド
先行するゼロを付けて戻します。
後のゼロを付けて戻します。
09999
99990
0
先頭に $ を付けて値を返します。ドル記号の前には、正の数を表
す空白が入ります。
$9999$
整数部がゼロの場合、(format パラメータの 0 の有無にかかわら
ず) 固定小数点の整数部に空白を返します。
B9999B
先頭にマイナス記号"-" を付けて負の値を返します。先頭にプラ
ス記号 "+" を付けて正の値を返します。
末尾にマイナス "-" を付けて負の値を返します。末尾にプラス記
号 "+" を付けて正の値を返します。
S9999
9999S
S
指定された位置に小数点区切り文字を配置して返します。使用さ
れる小数点区切りは、ロケールで定義されたものと同じです。既
定はピリオド "." です。format パラメータ内には、"D" は 1 つしか
許可されません。
99D99D
指定された位置にグループ・セパレータを配置して返します。使用
されるグループ・セパレータは、ロケールで定義されたものと同じ
です。既定はコンマ","です。10進法の右側にグループ・セパレー
タが表れることはありません。
9G999G
先頭や末尾に空白がない値を返します。FM90.9FM
指定された位置にコンマを付けて返します。10進法の右側にコン
マが表れることはありません。format パラメータをコンマで始める
ことはできません。
9,999,
指定した位置に 10進小数点 (ピリオド ".") を返します。format パ
ラメータ内には、"." は 1 つしか許可されません。
99.99.
formatパラメータが入力数値式より整数桁数が小さい場合、TO_CHARは数値を返さずに、複数の
シャープ記号 (##) の文字列を返します。シャープ記号の数は、現在の format パラメータの長さに
1 を加えたものです。
format パラメータが入力数値式より小数桁数が小さい場合、TO_CHAR は指定された桁数に数値
を丸めるか、小数形式でない場合は整数に丸めます。
Number-to-String の例次の埋め込み SQL の例では、数値から文字列への基本的な変換を示します。
Caché SQL リファレンス 327
TO_CHAR
&sql(SELECT TO_CHAR(1000,'9999'), TO_CHAR(10,'9999') INTO :numfull,:numshort FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",numfull WRITE !,"Formatted number:",numshort WRITE !,"Note leading blanks" }
これは、指定された数値の先頭に適切な個数の空白を付けて返します。符号なしの正の数の前に
は、必ず空白文字が入ります。指定された数値が format パラメータより桁数が小さい場合は、先頭
の空白はさらに追加されます。
以下の埋め込み SQL は、区切り文字の使用例を示します。
&sql(SELECT TO_CHAR(1000,'9,999.99'), TO_CHAR(1000,'9G999D99') INTO :comma,:groupsep FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",comma WRITE !,"Formatted number:",groupsep WRITE !,"Note leading blank" }
最初のTO_CHARは、文字列 ' 1,000.00' を返します。2番目のTO_CHARもこの値を返しますが、
区切り文字はロケールの設定により表示が異なります。
以下の埋め込み SQL は、プラス記号とマイナス記号の使用例を示します。
&sql(SELECT TO_CHAR(10,'99.99'), TO_CHAR(-10,'99.99'), TO_CHAR(10,'S99.99'), TO_CHAR(-10,'S99.99'), TO_CHAR(10,'99.99S'), TO_CHAR(-10,'99.99S') INTO :pos,:neg,:poslead,:neglead,:postrail,:negtrail FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",pos WRITE !,"Formatted number:",neg WRITE !,"Formatted number:",poslead WRITE !,"Formatted number:",neglead WRITE !,"Formatted number:",postrail WRITE !,"Formatted number:",negtrail WRITE !,"Note use of leading blank" }
先頭の空白は、符号の形式がない場合に正の数の前にのみ表示されます。先頭の空白は、符号
の配置にかかわらず、負の数の前、または符号付きの数値の前には表示されません。
以下の埋め込み SQL は、"FM" 形式の使用例を示します。これは、符号なしの正の数に対し、既
定の先頭の空白をオーバーライドします。
328 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
&sql(SELECT TO_CHAR(12345678.90,'99G999G999D99'), TO_CHAR(12345678.90,'FM99G999G999D99') INTO :num,:fmnum FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",num WRITE !,"Formatted number:",fmnum WRITE !,"Note leading blank" }
最初の TO_CHAR は、文字列 ' 12,345,678.90' を返します。2 番目の TO_CHAR は、文字列
'12,345,678.90' を返します (先頭に空白はありません)。
以下の埋め込み SQL は、先頭のドル記号の使用例を示します。
&sql(SELECT TO_CHAR(1234567890,'$9G999G999G999'), TO_CHAR(1234567890,'S$9G999G999G999'), TO_CHAR(12345678.90,'$99G999G999D99') INTO :d,:sd,:dD FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",d WRITE !,"Formatted number:",sd WRITE !,"Formatted number:",dD WRITE !,"Note leading blanks" }
ドル記号の前には必ず符号または空白文字が入ります。
以下の埋め込み SQL の例は、format パラメータが入力数値より整数桁数が小さい場合の動作を
示します。
&sql(SELECT TO_CHAR(1234567.89,'9'), TO_CHAR(1234567.89,'99'), TO_CHAR(1234567.89,'99D99') INTO :a,:b,:c FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",a WRITE !,"Formatted number:",b WRITE !,"Formatted number:",c }
TO_CHAR は、それぞれ、シャープ記号 "##"、"###"、および "######" を返します。
以下の埋め込み SQL の例は、format パラメータが入力数値式より小数桁数が小さい場合の動作
を示します。
Caché SQL リファレンス 329
TO_CHAR
&sql(SELECT TO_CHAR(1234567.4999,'9999999D9'), TO_CHAR(1234567.91,'9999999') INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Formatted number:",a WRITE !,"Formatted number:",b }
返される数字は、それぞれ、"1234567.5" と "1234568" に丸められます。
関連項目
• SQL 関数 : CONVERT TO_DATE TO_NUMBER
• Caché ObjectScript 関数 : $FNUMBER $ZDATE
TO_DATE
フォーマットされた文字列を日付 (あるいは日付をフォーマットされた文字列)に変換する汎用 SQL
文字列関数です。
TO_DATE(date-expression[,format])
TODATE(date-expression[,format])
引数
変換される式。式は、DATEデータ型の値または1~2980013
の整数になります。formatを指定した場合、基本となるデータ
型が CHAR または VARCHAR2 の文字列日付式にすること
もできます。
date-expression
オプション— date-expressionの形式を指定する日付形式。'J'
が指定される場合、date-expressionは整数となります。format
が省略されると、'DD MON YYYY' が既定値です。この既定は
変更できます。
format
概要TO_DATE と TODATE は互換性があり、Oracle 互換性のためにサポートされています。
TO_DATE 関数には、以下の 2 つの使用法があります。
• 日付をフォーマットされた日付表示文字列に変換する。入力日付は、DATEデータ型または整
数 $HOROLOG 日付値になります。
330 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
• フォーマットされた日付表示文字列を日付に変換する。
TO_DATEは、さまざまな文字列フォーマットで日付を入力して表示するために使用されます。DATE
データ型の変換を実行するには、CAST 関数または CONVERT 関数を使用します。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.TODATE(date-expression,format)
日付フィールド検索の表示形式TO_DATE を使用して、日付フィールドの検索に対する表示形式を指定します。TO_DATE のこの
形式は、データベースからの値の検索を目的として、SELECT 文内で主に使用されます。
date-expression 値は、有効な Logical %Date 値でなければならず、その値は DATE データ型の値
か、0 (12/31/1840) から 2980013 (12/31/9999) の間の整数値のいずれかになります。TO_DATE
は、日付 (例えば、59589) に対応する整数 date-expression を受け取ります。$HOROLOG 日付/
時刻文字列 (例えば、"59589,43381") は受け取りません。TO_DATE は、指定された format 内の
対応する日付を含む文字列を返します。
既定の日付形式
format が指定されていない場合、TO_DATE は、既定の形式で日付を返します。出荷時の既定の
形式は、DD MON YYYYです。例えば、'11 Nov 1993' です。この既定の形式は、以下の方法で変
更できます。
• ObjectScript $SYSTEM.SQL.SetToDateDefaultFormat() 関数呼び出し。現在の設定を確認す
るには、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、TO_DATE()
が表示されます。
以下の例は、既定の format を使用して有効な date-expression を指定する複数の方法を示してい
ます。
SELECT DISTINCT DOB, TO_DATE(DOB) AS DateIn, TO_DATE(59651) AS IntIn, TO_DATE('59651') AS IntStrIn, TO_DATE(CAST('1993-11-12' AS DATE)) AS DateCastInFROM Sample.Person
形式の要素
format は、以下の規則に従って指定された 1 つまたは複数の形式要素の文字列です。
• 形式要素は、大文字と小文字を区別しません。
• 形式要素の任意のシーケンスや数が許可されます ('J' 要素の例外を除く)。
• 形式文字列 'YYYYMMDD' と 'DDMMYYYY' は、要素間の区切り文字なしで指定できます。
Caché SQL リファレンス 331
TO_DATE
• その他すべての形式文字列は、英数字でない区切り文字(スペース、スラッシュ、ハイフンなど)
で要素を区切らなければなりません。区切り文字は、出力文字列にリテラルとして表示されま
す。
• 無効の形式要素の文字は、出力文字列にリテラルとして表示されます。
日付形式の要素
以下のテーブルは、整数を日付文字列に変換する際に format パラメータに対して有効な日付形
式要素のリストです。
意味要素
曜日 (1 ~ 7、1 は日曜日を指す)D
2 桁の日付 (01 ~ 31)DD
現在のロケールの WeekdayAbbr プロパティによって指定される、曜日の略
名。既定は、Sun Mon Tue Wed Thu Fri Sat です。
DY
現在のロケールの WeekdayName プロパティが指定する曜日名。既定は、
Sunday Monday Tuesday Wednesday Thursday Friday Saturday です。
DAY
2 桁の月数 (01 ~ 12、01 = 1 月)MM
現在のロケールの MonthAbbr プロパティによって指定される月の略名。既
定は、Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec です。略名の後
にはピリオドを付けません。
MON
現在のロケールの MonthName プロパティによって指定される正式な月名。
既定は、January February March April May June July August September
October November December です。
MONTH
2 桁の年数RR
4 桁の年数YYYY
下 3 桁の年数YYY
下 2 桁の年数YY
下 1 桁の年数Y
SET OPTION 文を使用して、これらの要素の既定値を変更できます。
ユリウス日
"ユリウス"日の形式は、1840年より前 (および 9999年より後)の日付の表示を可能にするために提
供されています。
文字 'J' を含む文字列で構成される format を指定する場合、返される日付は、紀元前 (BCE) 4713
年 1 月 1 日からカウントされた "ユリウス" 日になります。文字 'J' のみが、この format 文字列内で
332 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
指定できます。その他すべての文字を取り込むと、文字 'J' がリテラルとして処理され、日付は標準
の日付として変換されます。
ユリウス日は、既定形式 DD MON YYYY で表示し、BCE (西暦紀元前) の日付に対して接尾語の
文字 'BC' を追加します。現在により近い (CE または AD) 日付には接尾辞を付けません。
ユリウス日には、最大 date-expression 値はありません。
以下の例は、29 May 4550BC を返します。
SELECT DISTINCT TO_DATE(59684,'J') AS Julian_DateFROM Sample.Person
以下の例は、09 May 2005 を返します。
SELECT DISTINCT TO_DATE(2453500,'J') AS Julian_DateFROM Sample.Person
時刻形式の要素
TO_DATE を使用して、時刻式を文字列に変換できます。todate-expression の値は、有効な論理
時刻の値でなければなりません。
形式文字列で使用されている、形式コードでない文字列はすべて、結果文字列のその位置にその
まま戻されます。
以下の表は、このバージョンの TO_DATE で時刻式を変換するときの、有効な時刻の format パラ
メータ・コードを示しています。
意味形式コード
時間 (1 ~ 12)HH
時間 (1 ~ 12)HH12
時間 (0 ~ 23)HH24
分 (0 ~ 59)MI
秒 (0 ~ 59)SS
午前 0 時 00 分からの秒数 (0 ~ 86388)SSSSS
午前AM
午後PM
日付フィールド検索の例以下の例は、日付整数 (1840 年 12 月 31 日からの日数) を受け取り、指定された形式で対応する
日付を返します。
Caché SQL リファレンス 333
TO_DATE
SELECT DISTINCT TO_DATE(59684,'MM/DD/YYYY')FROM Sample.Person
これは、05/29/2004 を返します。
SELECT DISTINCT TO_DATE(59684,'DAY MONTH DD, YYYY')FROM Sample.Person
これは、Saturday May 29, 2004 を返します。
SELECT DISTINCT TO_DATE(59684)FROM Sample.Person
これは、既定の形式で 29 May 2004 を返します。
SELECT DISTINCT TO_DATE(59684,'I went to the store on DAY.')FROM Sample.Person
これは、I went to the store on Saturday. を返します。
以下の埋め込みSQLの例では、まず既定の形式で日付を返し、次に既定を変更した後に、新しい
既定の形式で同じ日付を返します。
&sql(SELECT TO_DATE(59684) INTO :x FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Date initial default format: ",x } DO $SYSTEM.SQL.SetToDateDefaultFormat("YYYY-MM-DD") &sql(SELECT TO_DATE(59684) INTO :y FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"Date new default format: ",y }
以下の埋め込み SQL の例では、形式文字列が区切り文字なしで複数の要素を含むことができる
2 つのケースを示します。
SELECT DISTINCT TO_DATE(59684,'DDMMYYYY'), TO_DATE(59684,'YYYYMMDD')FROM Sample.Person
これは 29052004 と 20040529 を返します。
以下の例は、DATE データ型のフィールドを受け取り、この日付のフォーマットされたバージョンを
返します。
SELECT DISTINCT DOB, TO_DATE(DOB,'DAY MONTH DD, YYYY')FROM Sample.Person
334 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下の例では、現在の日付を返し、指定した形式(または既定の形式)を使用してその結果をフォー
マットするさまざまな日付関数を使用しています。
SELECT DISTINCT TO_DATE(CURRENT_DATE,'MM/DD/YYYY'), TO_DATE({fn CURDATE()})FROM Sample.Person
日付変換の入力形式次に、TO_DATE を使用して、日付の入力形式を指定し、Logical %Date 値に変換します。
date-expression の値は、文字列日付式でなければなりません。date-expression の形式はformat
パラメータ内で指定されます。format は date-expression を有効な %Date 論理値に変換するキーと
して使用されます。
以下のテーブルは、TO_DATE のこのバージョンでの format パラメータに対する有効な日付形式
要素を示しています。
意味要素
2 桁の日付 (01 ~ 31)DD
2 桁の月数 (01 ~ 12、01 = 1 月)MM
現在のロケールのMonthAbbrプロパティによって指定される月の略名。既定
は、前のテーブルと同じです。
MON
現在のロケールの MonthName プロパティによって指定される正式な月名。
既定は、前のテーブルと同じです。
MONTH
4 桁の年数YYYY
下 2 桁の年数YY
入力形式の例以下の例は、日付文字列を受け取り、それを指定された形式コードに従って解釈し、対応する
$HOROLOG 日付整数を返します。
SELECT DISTINCT TO_DATE('May 29, 2004','MONTH DD, YYYY'), TO_DATE('2004***05***29','YYYY***MM***DD'), TO_DATE('05/29/2004','MM/DD/YYYY'), TO_DATE('29 May 2004')FROM Sample.Person
これらすべての TO_DATE 関数は、59684 を返します。
関連項目
• SQL 関数 : CAST CONVERT TO_CHAR TO_NUMBER
Caché SQL リファレンス 335
TO_DATE
• Caché ObjectScript 関数 : $ZDATE $ZDATEH
TO_NUMBER
与えられた文字列式を NUMBER データ型の値に変換する、汎用 SQL 文字列関数です。
TO_NUMBER(string-expression)
TONUMBER(string-expression)
引数
変換される文字列式。式は、列の名前、文字列リテラル、また
は他の関数の結果となります。基本となるデータ型は CHAR
や VARCHAR2 のタイプです。
string-expression
概要TO_NUMBER は、文字列を数に変換します。TO_CHAR は、数を文字列に変換します。
TO_NUMBER と TONUMBER の名前には、互換性があります。これらは、Oracle 互換性のために
サポートされています。
例以下の 2 つの例は、TO_NUMBER がどのように文字列を数に変換するかを示しています。先頭と
末尾のゼロを削除し、複数の記号を解析してプラス記号を削除し、非数値文字に出会うと数を切り
捨てます。
SELECT DISTINCT TO_NUMBER('+-+-01000.00+') AS NumFROM Sample.Person
これは、1000 を返します。
コンマは数値文字とはみなされないため、
SELECT DISTINCT TO_NUMBER('+-+-01,000.00+') AS NumFROM Sample.Person
これは、1 を返します。
以下の例は、TO_NUMBER をどのように使用して、文字列をデータベースに挿入する前に数に変
換するかを示しています。
UPDATE employees SET salary = salary + TO_NUMBER('1500.00') WHERE lname = 'WILLIAMS'
336 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
関連項目TO_CHAR TO_DATE
TRIM
先頭や末尾の文字列を削除する文字列を返す、汎用 SQL 文字列関数です。
TRIM(end_keyword string-expression-1 FROM string-expression-2)
引数
オプション — string-expression-2 のどちら側の端部を削
除するかを指定するキーワード。利用可能な値は
LEADING、TRAILING、BOTH です。既定値は BOTH で
す。
end_keyword
string-expression-2から削除する文字列を指定する文字
列式。指定された文字の各インスタンスを削除します。例
えば、'abc' が指定されると 'bbbaacaaa' を削除します。
string-expression-1
削除される文字列式。どちらの式も、列の名前や文字リテ
ラル、または他の関数の結果となります。基本となるデー
タ型は、任意の文字タイプ (CHAR や VARCHAR2 など)
とすることができます。
string-expression-2
概要文字列式に NULL値 を渡すと、TRIM は NULL を返します。
オプションの end_keyword 引数に利用可能な値は、以下のとおりです。
string-expression-1 内の文字が string-expression-2 の先頭から削除され
ることを指定するキーワード。
LEADING
string-expression-1 内の文字が string-expression-2 の末尾から削除され
ることを指定するキーワード。
TRAILING
string-expression-1 内の文字が string-expression-2 の先頭と末尾の両方
から削除されることを指定するキーワード。BOTH は既定で、end_keyword
が指定されていない場合に使用されます。
BOTH
LTRIM を使用して先頭の空白を削除、あるいは RTRIM を使用して末尾の空白を削除します。
Caché SQL リファレンス 337
TRIM
例以下の例は、end_keyword 既定を使用して、"abc" から先頭と末尾の空白を削除します。
SELECT DISTINCT TRIM(' ' FROM ' abc ') AS Trimmed FROM Sample.Person
以下の例は、文字列 "xxxabcxxx" の先頭から文字 "x" を削除して、"abcxxx" にします。
SELECT DISTINCT TRIM(LEADING 'x' FROM 'xxxabcxxx') AS Trimmed FROM Sample.Person
以下の例は、文字列 "xxxabcxxx" の先頭と末尾から文字 "x" を削除し、"abc" にします。
SELECT DISTINCT TRIM(BOTH 'x' FROM 'xxxabcxxx') AS Trimmed FROM Sample.Person
以下の例は、"abcxxyz" という文字列から末尾の文字列 "xyz" の全インスタンスを削除し、"abc" と
いう結果を出します。
SELECT DISTINCT TRIM(TRAILING 'xyz' FROM 'abcxxyz') AS Trimmed FROM Sample.Person
関連項目
• SQL 関数 : LTRIM RTRIM
• Caché ObjectScript 関数 : $ZSTRIP
TRUNCATE
指定された桁で数値を切り捨てるスカラ数値関数。
{fn TRUNCATE(numeric-expr,integer-expr)}
引数
切り捨てられる数字。数値または数値式。numeric-expr
小数点からカウントして、切り捨てる桁数を指定する整数
(または整数に評価する式)。ゼロ、正の整数、または負の
整数を指定できます。integer-expr が小数の場合、最も近
い整数に丸められます。
integer-expr
338 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
概要TRUNCATE は、numeric-expr を小数点から integer-expr 桁目で切り捨てます。数値の丸めやゼ
ロの埋め込みはしません。TRUNCATE処理の前に、先頭と末尾のゼロは削除されます。TRUNCATE
が返す値のデータ型は、numeric-expr のデータ型と同じです。
• integer-expr が正の数の場合、小数点から右の指定桁数で切り捨てられます。integer-expr が
小数桁数以上ある場合、切り捨てを実行したり、ゼロを加えることはありません。
• integer-expr が 0 の場合、数値は整数に切り捨てられます。つまり、切り捨ては小数点右側の
0 桁目で実行され、小数点以下と小数点そのものが切り捨てられます。
• integer-exprが負の数の場合、小数点左側のその桁数目で切り捨てられます。integer-exprの
絶対値がその数の整数桁数以上の場合、0 を返します。
• numeric-expr がゼロ (ただし、00.00、-0などの表示)の場合、TRUNCATEは、integer-expr の
値にかかわらず、小数桁なしの 0 (ゼロ) を返します。
• numeric-expr または integer-expr が NULL の場合、TRUNCATE は NULL を返します。
数値関数 TRUNCATE と ROUND の動作は似ています。両方とも小数桁または整数桁の有効桁
数を減らすために使用できます。ただし、TRUNCATE は丸めを行いません。TRIM を使用して、文
字列で同様のトランケーション処理を実行できます。
TRUNCATE は { } 括弧構文による ODBC スカラ関数としてのみ使用できます。
例次の2つの例では、数値を小数第2位で切り捨てます。最初は整数として integer-expr を指定し、
2 番目は (埋め込み SQL を使用して) 整数に変換するホスト変数として integer-expr を指定してい
ます。
SELECT DISTINCT {fn TRUNCATE(654.321,2)} AS TruncFROM Sample.Person
SET x=2 &sql(SELECT {fn TRUNCATE(654.321,:x)} INTO :a FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"truncated value is:",a }
両方の例とも、654.32 を返します (小数第 2 位で切り捨て)。
次の例では、integer-expr を小数桁数より大きく指定しています。
SELECT DISTINCT {fn TRUNCATE(654.32100,9)} AS TruncFROM Sample.Person
これは 654.321 を返します (切り捨て処理の前に末尾のゼロが削除されます。切り捨てやゼロの埋
め込みは発生しません)。
Caché SQL リファレンス 339
TRUNCATE
次の例では、0 の integer-expr を指定しています。
SELECT DISTINCT {fn TRUNCATE(654.321,0)} AS TruncFROM Sample.Person
これは 654 を返します (小数点以下すべてと小数点が切り捨てられます)。
次の例では、負の integer-expr を指定しています。
SELECT DISTINCT {fn TRUNCATE(654.321,-2)} AS TruncFROM Sample.Person
これは600を返します (整数桁が2桁切り捨てられ、0で置き換わります。丸めは実行されません)。
次の例では、負の integer-expr を数値の整数桁数と同じに指定しています。
SELECT DISTINCT {fn TRUNCATE(654.321,-3)} AS TruncFROM Sample.Person
これは 0 を返します。
関連項目
• SQL 関数 : ROUND RTRIM TRIM
• Caché ObjectScript 関数 : $NORMALIZE
UCASE
文字列内のすべての小文字を、大文字に変換するスカラ文字列関数です。
{fn UCASE(string-expression)}
引数
文字列式。その中の文字が大文字に変換されます。式は列
の名前や文字リテラル、または他のスカラ関数の結果を指定
できます。基本となるデータ型は、任意の文字タイプ (CHAR
や VARCHAR など) とすることができます。
string-expression
概要小文字を大文字に変換します。これは、非アルファベット文字に影響を与えません。句読点および
先頭の空白スペースを変更しません。UCASE は、末尾の空白を削除します。数値を文字列として
解釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削除されます。
340 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
%SQLUPPER関数は、大文字と小文字を区別しない比較または照合に対してデータ値を変換する、
SQL で優先的な方法です。ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
例以下の例は、各人名を大文字で返します。
SELECT Name,{fn UCASE(Name)} AS CapName FROM Sample.Person
また、UCASE は、ギリシャ文字を小文字から大文字に変換する以下の埋め込み SQL の例で示す
ように、Unicode (非 ASCII) アルファベット文字でも動作します。
SET a=$CHAR(950,949,965,963) &sql(SELECT {fn UCASE(:a)} INTO :b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,a,!,b }
関連項目
• SQL 関数 : %ALPHAUP LCASE %SQLUPPER UPPER %UPPER
• Caché ObjectScript 関数 : $ZCONVERT
UNION
1 つ以上の SELECT 文を組み合わせます。
select-statement {UNION [ALL] select-statement}
select-statement {UNION [ALL] (query)}
(query) {UNION [ALL] select-statement}
(query) {UNION [ALL] (query)}
引数
データベースからデータを検索する SELECT 文。select-statement
1 つまたは複数の SELECT 文を組み合わせるクエリ。query
Caché SQL リファレンス 341
UNION
概要UNION は 2 つ以上の "SELECT" 文を単一のクエリとして組み合わせ、結果セットにデータを取り
出します。SELECT文の間でUNIONを可能にするには、それぞれで指定された列数が一致し、そ
れぞれの指定された列が他の SELECT 文内の対応する列位置と互換性を持つデータ型である必
要があります。1 つの SELECT 内に NULL 列を指定し、列数を一致させるために別の SELECT 内
のデータ列と組み合わせることができます。この NULL 使用方法を以下の例に示します。
対応する列は2つのテーブル内で同じ名前をほとんど持たないため、結果セット列を識別するため
に AS 節を使用することをお勧めします。AS が指定されておらず、列名が同一でない場合、Caché
SQL は結果セット列に Literal_2 のような名前を割り当てます。
一般の UNION は、結果セットからの重複する行 (すべての値が同一) を削除します。UNION ALL
は、結果セット内に重複する行を保存します。
UNION 文は、結果セットに順番を付ける ORDER BY 節で終了できます。UNION 内の他の任意の
場所では ORDER BY 節を指定できません。
結果セット内の文字列フィールドには常に EXACT 照合が割り当てられます。
例以下の例は、2 つのテーブルのそれぞれで見つかったすべての Name に対応する行を持つ結果
セットを生成しています。Nameが両方のテーブルで見つかった場合、行が2つ作成されます。Name
が従業員の場合、State としての "オフィス" という用語と従業員の役職とを連結して、オフィスの場
所をリストします。Name が人の場合、State としての "自宅" という用語と役職に対する <null> とを
連結して、自宅の場所をリストします。ORDER BY 節は結果セットを処理し、行の組み合わせは
Name を使って順番に並べられます。
SELECT Name,Office_State||' office' AS State,Title FROM Sample.EmployeeUNIONSELECT Name,Home_State||' home',NULLFROM Sample.PersonORDER BY Name
関連項目
• クエリ
• SELECT ORDER BY
• CREATE QUERY CREATE PROCEDURE
342 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
UPDATE
指定されたテーブルの指定された列に新しい値を設定します。
UPDATE [restriction] table value-assignment-statement[WHERE condition-expression]
UPDATE [restriction] table value-assignment-statement[WHERE CURRENT OF cursor [AND condition-expression]]
where value-assignment-statement can be:SET columns = scalar-expressionsSET columns = [(columns)] VALUES (scalar-expressions)SET columns = [(columns)] VALUES host-variable
引数
オプション —
%NOLOCK、%NOCHECK、%NOINDEX、%NOTRIGGER
のキーワードのうちの1つ、またはこれらキーワー
ドのコンマで区切られたリスト。
restriction
データを更新するテーブルの名前。テーブルで更
新を実行するビューを指定できます。
table
オプション — 更新される行の数を制限するのに
使用される条件を指定します。WHERE節 (または
WHERE CURRENT OF 節) が指定されていない
場合、UPDATE はテーブル内のすべての行を更
新します。詳細は、"WHERE"を参照してください。
WHERE condition-expression
オプション — UPDATE が現在の cursor 位置で
実行されることを指定します。これはテーブルを
指すカーソルです。カーソルが指す行とその行に
続くすべての行を更新するか、または(AND節が
指定されている場合は) AND 条件式と一致する
すべての行を更新します。詳細は、"WHERE
CURRENT OF" を参照してください。
WHERE CURRENT OF cursor
コンマで区別されたリストとして指定する 1 つ以
上の列。
columns
コンマで区別された、スカラ式で表される 1 つ以
上の値。
scalar-expressions
ホスト変数。host-variable
Caché SQL リファレンス 343
UPDATE
概要UPDATE 文は、テーブルの列の既存値を変更します。テーブルの行の更新は、直接行う方法と、
ビューを使用した方法があります。ビューを使用して更新する場合は、CREATE VIEW で説明され
ているように、必要条件や制限事項に従います。
値割り当ての文内では、column-commalist を scalar-expression-commalist と等しく設定する際に、
値を設定した scalar-expression が各列に必要です。
UPDATE文は、既存のベース・テーブルの行(単独もしくは複数)に、新規の列の値を提供します。
更新には、2 つの構文が利用できます。WHERE 節または WHERE CURRENT OF 節が更新の範
囲を制限しない限り、すべての更新はテーブル全体を更新するとみなされます。例えば以下のよう
になります。
UPDATE Employees SET StatusDate = '05/12/98', status = 'Purged' WHERE status = 'Completed'
column-list引数はオプションです。使用する場合、更新したい列をコンマで区切られたリストにしま
す。省略した場合は、すべての列を更新するとみなされます。
SET 文 (単独または複数のスカラ式とともに使用される場合) には、テーブルを更新するために、コ
ンマで区切られた値のリストが必要です。値は column-list 内で列名と位置的に対応しなければな
りません。column-list が指定されていない場合、update-list は列番号順で指定された各ベース・
テーブル列に対する値を持つ必要があります。
UPDATEオペレーションは全か無かのイベントです。指定された行および列をすべて更新するか、
まったくしないかのいずれかです。また、UPDATE 操作により、%ROWCOUNT ローカル変数が更
新された行数に設定されます。
Caché は、UPDATE の成功または失敗を示す、ステータス変数 SQLCODE を返します。テーブル
の行を更新するには、以下の条件を満たしている必要があります。
• テーブルへの UPDATE 特権があること。この特権を持っていないと SQLCODE -99 (特権違
反) エラーになります。詳細は、"GRANT" コマンドを参照してください。
• テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照する
UPDATEをコンパイルしようとすると、SQLCODE-115エラーが返されます。このエラーは実行
時にのみ発生するのではなく、コンパイル時にも発生するようになったことに注意してくださ
い。"Caché オブジェクトの使用法" の "オブジェクトの永続性" の章で READONLY オブジェ
クトの説明を参照してください。
• ビュー経由でテーブルを更新する場合、ビューをWITH READ ONLY として定義することはで
きません。これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"CREATE
VIEW" コマンドを参照してください。
• RowId フィールドや IDENTITY フィールドのような変更不可フィールドは更新できません。これ
らのフィールドの値はシステムで生成され、ユーザは変更できません。これを実行しようとする
344 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
と、SQLCODE -107エラーが返されます。詳細は、"CREATE TABLE" コマンドを参照してくだ
さい。
• 複数行のUPDATEはアトミック処理です。1行または複数行の更新できない行があると、UPDATE
処理は失敗し、どの行も更新されません。例えば、指定された行の 1 つについての更新が外
部キーの参照整合性に違反する場合、UPDATE はどの行も更新できません。
制限引数
restriction 引数を指定すると、以下のように処理を制限します。
• %NOCHECK — 外部キーの参照整合性チェックは実行されません。ビューを介して UPDATE
を実行する場合、ビューの WITH CHECK OPTION 検証は実行されません。
• %NOLOCK — UPDATE 時に行をロックしません。単独のユーザ/処理がデータベースを更新
する際にのみ使用します。
• %NOINDEX — インデックス・マップは UPDATE 処理中には設定されません。
• %NOTRIGGER —ベース・テーブル・トリガはUPDATE処理中にはかかりません (実行されませ
ん)。BEFORE トリガおよび AFTER トリガのどちらも実行されません。
参照整合性
%NOCHECK を指定しない場合、Caché ではシステム構成設定を使用して外部キーの参照整合性
チェックを実行するかどうかが決まります。システムの既定値は以下のように設定できます。
• ObjectScript $SYSTEM.SQL.SetFilerRefIntegrity() 関数を呼び出します。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Perform Referential Integrity Checks on Foreign Keys for INSERT, UPDATE,
and DELETE] の現在の設定を表示および編集します。既定は “true” です。
UPDATE 処理中は、更新するフィールド値を持つ外部キーの参照があるたびに、参照するテーブ
ルの古い (更新前の) 参照行と新しい (更新後の) 参照行の両方で共有ロックを取得します。これら
の行は、トランザクションの終了までロックされます。古い行をロックすることにより、参照される行は、
UPDATE のロールバックがあってもそれより前に変更されることがなくなります。新しい行をロックす
ることにより、参照されている行は、UPDATE の参照整合性チェックからトランザクションの終了まで
の間、変更されないことが保証されます。
トランザクションでのロック
%NOLOCK を指定しない場合、Caché は、INSERT、UPDATE、および DELETE 操作時に標準の
ロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。
既定のロックしきい値は、テーブルごとに1000ロックです。これは、トランザクション時にテーブルか
ら 1000 を超える一意フィールド値を更新する場合、ロックしきい値に到達し、Caché がロック・レベ
ルを自動的に、一意フィールド値ロックからテーブル・ロックへと上げることを意味します。これによっ
Caché SQL リファレンス 345
UPDATE
てトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な更新を実行できま
す。このロックしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの
"SQL の概念" の "トランザクション" を参照してください。
関連項目
• テーブル CREATE TABLE ALTER TABLE DROP TABLE
• INSERT DELETE
• SELECT
• VALUES
• 条件式 WHERE
• カーソル WHERE CURRENT OF
• ビュー CREATE VIEW
UPPER
お勧めしません。アルファベット文字を UPPER 照合フォーマットに変換するケース変換関数です。
UPPER(expression)
UPPER expression
引数
列名、文字リテラル、または他の関数の結果となる文字列式。基本となる
データ型は、任意の文字タイプ (CHAR や VARCHAR2 など) とすることが
できます。
expression
概要この照合関数はお勧めしません。新規開発については "%SQLUPPER" を参照してくださ
い。%SQLUPPER は、数値、NULL 値、および空文字列の照会に優れています。
UPPER はすべてのアルファベット文字を大文字 (つまり UPPER 形式) に変換します。数、句読点、
および先頭の空白を変更しません。末尾の空白を削除します。UPPER は、数値を文字列として解
釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削除されます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.UPPER(expression)
346 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
例以下の例は、名前の大文字フォームが "JO" で始まる場合を選択して、すべての名前を返します。
SELECT NameFROM Sample.PersonWHERE UPPER(Name) %STARTSWITH 'JO'
以下の例は、名前が "JO" で始まる場合を選択して、すべての大文字表記の名前を返します。
SELECT UPPER(Name) AS CapNameFROM Sample.PersonWHERE Name %STARTSWITH 'JO'
関連項目%SQLUPPER %UPPER
%UPPER
お勧めしません。アルファベット文字を UPPER 照合フォーマットに変換するケース変換関数です。
%UPPER(expression)
%UPPER expression
引数
列名、文字リテラル、または他の関数の結果となる文字列式。基本となる
データ型は、任意の文字タイプ (CHARや VARCHAR2 など) とすることが
できます。
expression
概要この照合関数はお勧めしません。新規開発については "%SQLUPPER" を参照してくださ
い。%SQLUPPER は、数値、NULL 値、および空文字列の照会に優れています。
%UPPERはすべてのアルファベット文字を大文字(つまりUPPER形式)に変換します。数、句読点、
および先頭の空白を変更しません。末尾の空白を削除します。%UPPERは、数値を文字列として解
釈する変換を強制的に実行しません。先頭と末尾のゼロは数値から削除されます。
%UPPER は、Caché SQL の拡張機能であり、SQL 検索クエリ用として使用するものです。
例以下の例は、名前の大文字フォームが "JO" で始まる場合を選択して、すべての名前を返します。
Caché SQL リファレンス 347
%UPPER
SELECT NameFROM Sample.PersonWHERE %UPPER(Name) %STARTSWITH 'JO'
以下の例は、名前が "JO" で始まる場合を選択して、すべての大文字表記の名前を返します。
SELECT %UPPER(Name) AS CapNameFROM Sample.PersonWHERE Name %STARTSWITH 'JO'
関連項目%SQLUPPER UPPER
USER
現ユーザのユーザ名を返す汎用スカラ関数です。
USER
{fn USER}{fn USER()}
概要USER関数は引数を取らず、現ユーザのユーザ名を返します (認証 ID として参照)。汎用関数では
括弧を使用できません。ODBC スカラ関数は、空の括弧を指定したり、省略できます。
ユーザ名は CREATE USER コマンドを使用して定義します。
USER は、主に SELECT 文のセレクト・リストや、クエリの WHERE 節で使用されます。レポートの設
計では、USER はレポートが作成された現在のユーザを印刷するために使用されます。
例以下の例は、現在のユーザ名を返します。
SELECT DISTINCT USER AS CurrentUserFROM Sample.Person
以下の例は、現ユーザが生成したレコードの名前と作成日を選択します。
SELECT Name FROM Sample.Person WHERE Name = USER
関連項目CREATE USER GRANT
348 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
VALUES
フィールド内で使用するデータ値を指定します。
(field1{,fieldn})VALUES (value1{,valuen})
引数
フィールド名、またはコンマで区切られたフィールド名のリスト。field
値、あるいはコンマで区切られた値のリスト。各値は対応するフィールドに割り当て
られています。
value
概要VALUES 節は INSERT 文や UPDATE 文で使用され、フィールドに挿入するデータ値を指定しま
す。通常は、以下のとおりです。
• INSERT クエリは、以下の構文を使用します。
INSERT INTO tablename (fieldname,fieldname,...)VALUES (value,...)
• UPDATE クエリは、以下の構文を使用します。
UPDATE tablename (fieldname,fieldname,...)VALUES (value,...)
VALUES節の要素は、テーブル名の後で指定されているフィールドに連続して対応します。VALUES
節で 1 つの値だけが指定されている場合は、要素を括弧で囲む必要はありません。
以下の埋め込み SQL の例は、単独の行を "Employee" テーブルに追加する INSERT 文を示して
います。
&sql(INSERT INTO Employee (Name,SocSec,Telephone) VALUES("Boswell",333448888,"546-7989"))
INSERT クエリと UPDATE クエリは、テーブル名の後にフィールド名のリストを明示的に指定せず
に、VALUES 節を使用できます。テーブル名の後でフィールド名のリストを省略するには、クエリが
次の 2 つの基準を満たしている必要があります。
• VALUES 節で指定されている値の数は、テーブル内のフィールドの数と同じです (ID フィール
ドは除く)。
Caché SQL リファレンス 349
VALUES
• VALUES 節の値は、列 2 から始まるフィールドの内部列番号の順序でリストされます。列 1 は
常にシステムによって作成された ID フィールド用として使用されるので、VALUES節では指定
されません。
例えば、以下にクエリがあります。
INSERT INTO Sample.Person VALUES (5,"John")
以下に別のクエリがあります。
INSERT INTO Sample.Person (Age,Name) VALUES (5,"John")
テーブル "Sample.Person" が 2 つのユーザ定義のフィールドを持っている場合、上と下のクエリは
等しくなります。
この例では、値 5 が下位番号の列フィールドに割り当てられており、値 "John" がもう 1 つのフィー
ルドに割り当てられています。
VALUES 節は、以下の埋め込み SQL の例のように配列の要素を指定できます。
&sql( UPDATE Person(Tel) VALUES :per("tel",) WHERE ID = :id )
また、UPDATE クエリは、指定されていない最後の部分文字列を持つ配列を参照できます。した
がって、INSERT は配列要素の有無を使用して、値と既定値を新規に作成された行に割り当てま
す。UPDATE は配列要素の存在を使用して、対応するフィールドが更新されることを示します。例
えば、以下のような 6 列のテーブルに対する配列があるとします。
emp("profile",2)="Smith"emp("profile",3)=2emp("profile",3,1)="1441 Main St."emp("profile",3,2)="Cableton, IL 60433"emp("profile",5)=NULLemp("profile",7)=25emp("profile","next")="F"
列 1 は常に ID フィールド用のもので、ユーザ定義ではありません。挿入された "Employee" 行は
列 2 の "Name" を "Smith" に設定し、列 3 の "Address" が 2 行の値を持つように設定し、列 4 の
"Department" はここでは指定されていないので既定値に設定し、そして列 5 の "Location" は
NULLに設定します。"Location" の既定値は、対応する配列要素がNULL値で定義されているの
で、使用されません。配列要素 "7" と "next" は、"Employee" テーブルの列番号に対応しないの
で、クエリによって無視されます。ここでは、この配列を使用する UPDATE 文を示しています。
&sql(UPDATE Employee VALUES :emp('profile',) WHERE Employee = 379)
上記の定義と配列値により、この文は RowID = 379 である "Employee" 行の "Name" フィール
ド、"Address" フィールド、"Location" フィールドを更新します。
350 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
しかし、部分文字列を完全に省略するとエラー・コード -54 を発生させることになり、VALUES の後
に配列識別子 (最後の部分文字列は省略) が必要となります。
例えば以下のように、複数の行を対象にしたUPDATE クエリを持つ配列参照を使用することもでき
ます。
&sql(UPDATE Employee VALUES :emp('profile',) WHERE Type = 'PART-TIME')
VALUES 節変数は、ドット構文を使用できません。したがって、以下の埋め込み SQL の例では正
常に動作します。
SET sname = state.Name &sql(INSERT INTO StateTbl VALUES :sname)
以下は不適切です。
&sql(INSERT INTO State VALUES :state.Name)
NULL と空白文字列値は異なります。詳細は "NULL" を参照してください。後方互換性では、古い
既存データ内にあるすべての空白文字列 ('') 値は NULL 値とみなされます。新規データでは、空
白文字列は $CHAR(0) としてデータ内に保存されます。SQL では、NULL は 'NULL' と記述され
ます。以下はその例です。
INSERT INTO Sample.Person(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John',NULL)
SQL では、空白文字列は '' (2 つの一重引用符) と記述されます。以下はその例です。
INSERT INTO Sample.Person(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John','')
ID フィールドに NULL 値は挿入できません。
例以下の埋め込みSQLの例は、"Doe,John"のレコードを Sample.Personテーブルに挿入します。次
に、このレコードを選択して、このレコードを削除します。2 番目の SELECT で削除を確認します。
Caché SQL リファレンス 351
VALUES
SET x="Doe,John",y="123-45-6789",z="Metropolis" SET (a,b,c,d,e)=0 &sql(INSERT INTO Sample.Person (Name,SSN,Home_City) VALUES (:x,:y,:z)) IF SQLCODE'=0 { WRITE !,"INSERT Error code ",SQLCODE QUIT } &sql(SELECT Name,SSN,Home_City INTO :a,:b,:c FROM Sample.Person WHERE Name =:x) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"After INSERT:" WRITE !,"Name=",a," SSN=",b," City=",c WRITE !,"SQL code=",SQLCODE," Number of rows=",%ROWCOUNT } &sql(DELETE FROM Sample.Person WHERE Name=:x) &sql(SELECT Name,SSN INTO :d,:e FROM Sample.Person WHERE Name='Doe,John') IF SQLCODE <0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"After DELETE:" WRITE !,"Name=",d," SSN=",e WRITE !,"SQL code=",SQLCODE," Number of rows=",%ROWCOUNT }
関連項目INSERT UPDATE
WEEK
与えられた日付式で、その年の週を 1 から 53 までの整数値として返す、スカラ日付/時刻関数で
す。
{fn WEEK(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。
date-expression
概要WEEK は、日付整数または日付/時刻文字列を受け取り、その日付に対するその年の始めからの
週の数を返します。週は、$HOROLOG 日付 (1840 年 12 月 31 日からの日数) を使用して計算さ
れます。したがって、週は年と年をまたいでカウントされ、Week 1 は前年の最後の週から開始され
た 7 日間を終了した週となります。週は常に日曜日から始まり、したがって、暦年の最初の日曜日
は、Week 1 から Week 2 への切り替えを意味します。その年の最初の日曜日が 1 月 1 日である場
352 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
合、その日曜日は Week 1 に入ります。その年の最初の日曜日が 1 月 1 日より後の場合、その日
曜日は Week 2 の第 1 日目になります。このため、Week 1 は、一般的には、7 日間より短くなりま
す。DAYOFWEEK 関数を使用すると、週の曜日を決定できます。
1 年の週の合計数は、一般的に 53 です。うるう年には 54 になります。
DATEPART または DATENAME 関数を使用しても、DAYOFWEEK と同じ週情報が返されます。
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.WEEK(date-expression)
日付の検証
WEEK は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、NULL
文字列が返されます。
• 有効なdate-expressionは、CURRENT_DATEまたはNOWなどの関数によって返されるDATE
データ型値または TIMESTAMP データ型値になります。
• 有効な date-expression は、日付文字列 (yyyy-mm-dd) または、日付/時刻文字列 (yyyy-mm-
dd hh:mm:ss) になります。WEEK は、文字列の日付部分のみを評価します。
• 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式
が使用されている必要があります。年は 4 桁で指定される必要があります。
• 日付値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、日は
1 から 31 がそれぞれ有効範囲です。
• 月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有
効なのは、指定された年がうるう年の場合のみです。
• 10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標
準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、
または '7a' は無効です。
例以下の埋め込み SQL の例は、2005 年 1 月 2 日 (日曜日) と 2006 年 1 月 1 日 (日曜日) の週の
曜日と通算週を返します。
Caché SQL リファレンス 353
WEEK
SET x="2005-1-2" SET y="2006-1-1" &sql(SELECT {fn DAYOFWEEK(:x)},{fn WEEK(:x)}, {fn DAYOFWEEK(:y)},{fn WEEK(:y)} INTO :a,:b,:c,:d FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"2005 Day of Week is: ",a," (Sunday=1)" WRITE " Week of Year is: ",b WRITE !,"2006 Day of Week is: ",c," (Sunday=1)" WRITE " Week of Year is: ",d }
以下の例は、与えられた日付が 2004 年の第 9 週目にあたるので、9 を返します。
SELECT DISTINCT {fn WEEK('2004-02-25')} AS WeekFROM Sample.Person
SELECT DISTINCT {fn WEEK('2004-02-25 08:35:22')} AS WeekFROM Sample.Person
SELECT DISTINCT {fn WEEK(59590)} AS WeekFROM Sample.Person
以下の例は、54を返します。これは、この例のすぐ後に続く例で示されているように、この特定の日
付が 2 日目に開始する Week 2 で始まるうるう年にあるためです。
SELECT DISTINCT {fn WEEK('2000-12-31')} AS WeekFROM Sample.Person
SELECT DISTINCT {fn WEEK('2000-01-01')}||{fn DAYNAME('2000-01-01')} AS WeekofDay1,{fn WEEK('2000-01-02')}||{fn DAYNAME('2000-01-02')} AS WeekofDay2FROM Sample.Person
以下の例は、現在の週を返します。
SELECT DISTINCT {fn WEEK({fn NOW()})} AS Week_NowFROM Sample.Person
SELECT DISTINCT {fn WEEK(CURRENT_DATE)} AS Week_NowFROM Sample.Person
SELECT DISTINCT {fn WEEK(CURRENT_TIMESTAMP)} AS Week_NowFROM Sample.Person
関連項目DATEPART DATENAME DAYOFWEEK MONTH QUARTER YEAR
354 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
WHERE
1 つ以上の制限条件を指定する SELECT 節です。
SELECT fieldsFROM tableWHERE condition-expression
引数
検索するデータにパラメータを指定する修飾子。condition-expression
概要オプションのWHERE節は、1つまたは複数の条件を指定し、SELECT文で検索されたデータを制
限 (行をフィルタ削除) します。
WHERE 節は、クエリ選択から特定の行を適格とするか、もしくは不適格とします。適格な行とは、
condition-expression が真である行です。condition-expression は、AND、OR、および NOT 演算
子によってリンク可能な論理テスト (述語) のリストです。
SQL の述語は以下のカテゴリに分類されます。
• 比較述語
• BETWEEN 述語
• LIKE 述語
• NULL 述語
• IN 述語
• EXISTS 述語
比較述語以下は、使用できる比較述語です。
Caché SQL リファレンス 355
WHERE
SQL 比較述語
処理述語
等しい=
等しくない<>
より大きい>
より小さい<
以上>=
以下<=
以下はその例です。
SELECT Name, Age FROM Sample.PersonWHERE Age < 21
Caché の %STARTSWITH 拡張も利用できるので、部分的一致も実行できます。以下はその例で
す。
SELECT Name, Age FROM Sample.PersonWHERE Name %STARTSWITH 'SM'
SQL は照合 (値がソートされる順番) という点から比較演算子を定義します。まったく同様の方法で
照合する場合の 2 つの値は等しくなります。2 つ目の値の後に照合される場合、値は別の値よりも
大きくなります。例えば、文字列値に対する既定照合は大文字と小文字を区別しません。以下はそ
の例です。
値式
真'AAA' = 'AAA'
真'AAA' = 'aaa'
真'AAA' = 'Aaa'
真'BBB' > 'aaa'
BETWEEN 述語これは、「以上」と「以下」の組み合わせと同じ働きをします。以下はその例です。
SELECT Name, Age FROM Sample.PersonWHERE Age BETWEEN 18 AND 21
Sample.Person データベース内で 18 から 21 までの年齢のすべての名前を返します。
356 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
LIKE 述語これにより、以下のワイルドカード文字を使用してパターン・マッチングを実行できます。
LIKE ワイルドカード文字
以下と一致文字
単独の文字“_”
0 かそれ以上の文字のシーケンス“%”
以下はその例です。
SELECT Name, Address FROM Sample.VendorWHERE Name LIKE '%Com%'
文字列 'Com' を含む会社名をすべて探します。
LIKE比較演算子は、大文字と小文字を区別します。上記の例で'com'のような文字列を受け入れ
るには、%SQLUPPER を使用します。
SELECT Name, Address FROM Sample.VendorWHERE %SQLUPPER(Name) LIKE '%COM%'
注釈: LIKE は照合を使用しません。
LIKE ESCAPEは、LIKE述語のエスケープ文字として任意の 1文字の定義をサポートします。この
エスケープ文字は、直後の文字をワイルドカードやフォーマッティング文字ではなくリテラル文字とし
て解釈するよう指示します。以下の例では、LIKE ESCAPE を使用して '%_' の値を返しています。
SELECT * FROM MyTableWHERE symbol_field LIKE '#%#_' ESCAPE '#'
NULL 述語定義されていない値を見つけます。すべての NULL 値またはすべての非 NULL 値を検出できま
す。
SELECT Name, FavoriteColors FROM Sample.PersonWHERE FavoriteColors IS NULL
SELECT Name, FavoriteColors FROM Sample.PersonWHERE FavoriteColors IS NOT NULL
IN 述語IN には、等値比較とサブクエリ比較の 2 つの形式があります。
Caché SQL リファレンス 357
WHERE
等値比較
IN述語は、OR演算子で複数の等値比較を結合する省略表現として使用します。以下はその例で
す。
SELECT Name, Home_State FROM Sample.PersonWHERE Home_State IN ('ME','NH','VT','MA','RI','CT')
以上の文は、stateが括弧のリスト内の値と等しい場合、真と評価します。リストの要素は定数または
式です。等式テストと同様に、照合が IN 比較に適用されます。
IN 述語の等値比較に日付または時刻を使用すると、適切なデータ型変換が自動的に実行されま
す。WHERE フィールドが TimeStamp 型の場合、Date 型または Time 型の値は Timestamp に変
換されます。WHERE フィールドが Date 型の場合、TimeStamp 型または String 型の値は Date に
変換されます。WHERE フィールドが Time 型の場合、TimeStamp 型または String 型の値は Time
に変換されます。
以下の 2 つの例は、同じ等値比較を実行し、同じデータを返します。DOB フィールドは Date デー
タ型です。
SELECT Name,DOB FROM Sample.Person WHERE DOB IN ({d '1951-02-02'},{d '1987-02-28'})
SELECT Name,DOB FROM Sample.Person WHERE DOB IN ({ts '1951-02-02 02:37:00'},{ts '1987-02-28 16:58:10'})
詳細は、"日付/時刻文" を参照してください。
サブクエリ比較
サブクエリで IN を使用し、列の値 (あるいは他の式) がサブクエリの行の値と等しいかどうかをテス
トできます。以下はその例です。
SELECT Name,Home_State FROM Sample.PersonWHERE Name IN (SELECT Name FROM Sample.Employee HAVING Salary < 50000)
サブクエリは、SELECT リスト内に必ず 1 項目を持ちます。
EXISTS 述語サブクエリが空のセットを評価するか否かをテストするために、サブクエリを使用して処理します。
SELECT t1.disease FROM illness_tab t1 WHERE EXISTS (SELECT t2.disease FROM disease_registry t2 WHERE t1.disease = t2.disease HAVING COUNT(t2.disease) > 100)
関連項目条件式 SELECT
358 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
WHERE CURRENT OF
カーソルを使用している現在の行を指定する節です。
WHERE CURRENT OF cursor[AND condition-expression]
引数
処理が現在の cursor の場所で実行されることを指
定します。cursor はテーブルを指すカーソルです。
カーソルが指す行とその行に続くすべての行を更新
または削除するか、または(AND節が指定されてい
る場合は) AND 条件式と一致するすべての行を更
新または削除します。
cursor
オプション — WHERE CURRENT OF 節とともに使用
して、指定された処理を行う条件をさらに制限しま
す。"condition-expression" を参照してください。
AND condition-expression
概要WHERE CURRENT OF 節は、INSERT 文、UPDATE 文、DELETE 文で使用されます。以下の埋
め込み SQL の例のように、カーソル・ベースのコマンドで使用されます。
&sql(DELETE FROM Employees WHERE CURRENT OF EmployeeCursor)
最後の FETCH コマンドによって "EmployeeCursor" カーソルから取得した行を削除します。
WHERE CURRENT OF 節とともに SET を使用してフィールドの値を指定しても無効になります。実
行しようとすると、SQL error -69 (SET <field> = <value expression> not allowed with WHERE CUR-
RENT OF <cursor>) が生じます。
以下の例は、埋め込み SQL を使用した UPDATE 処理を示しています。
&sql(OPEN EmployeeCursor) FOR { &sql(FETCH EmployeeCursor) QUIT:SQLCODE'=0 &sql(UPDATE Employees SET VAR = :var WHERE CURRENT OF EmployeeCursor) } &sql(CLOSE EmployeeCursor)
関連項目
• カーソル DECLARE OPEN FETCH CLOSE
• INSERT DELETE UPDATE
Caché SQL リファレンス 359
WHERE CURRENT OF
XMLAGG
値を連結した文字列を作成する集約関数です。
XMLAGG ([ DISTINCT ] string-expr [%FOREACH(col-list)] [%AFTERHAVING])
引数
文字列として評価するSQL式。一般的には、これはデータ
を取得する列の名前です。
string-expr
オプション — 列名、またはコンマで区切られた列名のリス
ト。%FOREACHの詳細は、"SELECT"を参照してください。
%FOREACH(col-list)
オプション — HAVING 節にある条件を適用します。%AFTERHAVING
概要XMLAGG集約関数は、string-expr のすべての値を連結した文字列を返します。XMLAGGは、値
を連結した文字列を返します。コンマ区切りの値のリストを返すには、これと似た LIST 関数を使用
します。
• シンプルな XMLAGG は、選択された行の string-expr のすべての値で構成される連結文字
列を含む文字列を返します。string-expr が NULL の行は、無視されます。
以下の例は、Sample.Person テーブルの Home_State 列内にあるすべての値を連結した文字
列を 1 つの値として返します。
SELECT DISTINCT XMLAGG(Home_State) AS All_State_ValuesFROM Sample.Person
この文字列には重複値が含まれます。DISTINCT キーワードは、SELECT の結果に適用され
ます。この場合、結果は 1 つの値になります。
• XMLAGG DISTINCT は、string-expr のすべての個別の (一意の) 値で構成された連結文字
列を返します。string-expr が NULL の行は、無視されます。
以下の例は、Sample.Person テーブルの Home_State 列内にあるすべての個別の (一意の) 値
の連結文字列を作成します。
SELECT XMLAGG(DISTINCT Home_State) AS All_Unique_State_ValuesFROM Sample.Person
XML および XMLAGG
XMLAGG の一般的な使用方法の 1 つに、列の各データ・アイテムにタグ付けすることがあります。
これは以下の例で示すように、XMLAGG と XMLELEMENT を組み合わせて行います。
360 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
SELECT XMLAGG(XMLELEMENT("para",Home_State))FROM Sample.Person
この結果、以下のような文字列が出力されます。
<para>LA</para><para>MN</para><para>LA</para><para>NH</para><para>ME</para>...
例以下の例は、Sample.Person テーブルの FavoriteColors 列内にあるすべての個別値の連結文字
列を作成します。したがって、すべての行の All_Colors 列の値は同じになります。ある行が
FavoriteColors に NULL 値を持つと、この値は連結文字列に含まれなくなります。データ値は、内
部形式で返されます。
SELECT Name,FavoriteColors, XMLAGG(DISTINCT FavoriteColors) AS All_Colors_In_TableFROM Sample.PersonORDER BY FavoriteColors
以下の例は、各州の Home_City 列内にあるすべての個別値の連結文字列を作成します。同じ州
のすべての行には、その州の個別の市の値すべてのリストが含まれます。
SELECT Home_State, Home_City, XMLAGG(DISTINCT Home_City %FOREACH(Home_State)) AS All_Cities_In_StateFROM Sample.PersonORDER BY Home_State
例えば、以下の AutoClub のようなテーブルがあるとします。
YearModelMakeName
1971FirebirdPontiacSmith,Joe
1997SW2SaturnSmith,Joe
1999BonnevillePontiacSmith,Joe
1966MustangFordJones,Scott
2000MiataMazdaJones,Scott
クエリは以下のとおりです。
SELECT DISTINCT Name, XMLAGG(Make) AS String_Of_MakesFROM AutoClub WHERE Name = 'Smith,Joe'
これは、以下を返します。
String_Of_MakesName
PontiacSaturnPontiacSmith,Joe
Caché SQL リファレンス 361
XMLAGG
クエリは以下のとおりです。
SELECT DISTINCT Name, XMLAGG(DISTINCT Make) AS String_Of_MakesFROM AutoClub WHERE Name = 'Smith,Joe'
これは、以下を返します。
String_Of_MakesName
PontiacSaturnSmith,Joe
関連項目LIST 関数
XMLELEMENT 関数
SELECT 文
集約関数
XMLCONCAT
XML 要素を連結する関数です。
XMLCONCAT(XmlElement1,XmlElement2[,XmlElementN])
引数
XMLELEMENT 関数。連結する複数の XmlElement を指定します。XmlElement
概要XMLCONCAT 関数は、複数の XMLELEMENT 関数からの値を単一の文字列として返します。
XMLCONCAT は、テーブルまたはビューを参照する SELECT クエリまたは SELECT サブクエリで
使用できます。XMLCONCAT は、一般のフィールド値とともに SELECT リストで使用できます。
例以下のクエリは、2 つの XMLELEMENT 関数からの値を連結します。
SELECT Name,XMLCONCAT(XMLELEMENT("Para",Name), XMLELEMENT("Para",Home_City)) AS ExportString FROM Sample.Person
返されるデータ行は、次のようになります。
362 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
ExportString<Para>Emerson,Molly N.</Para><Para>Boston</Para>
以下のクエリは、XMLELEMENT 関数内で XMLCONCAT を入れ子にします。
SELECT XMLELEMENT("Item",Name, (XMLCONCAT( XMLELEMENT("Para",Home_City,' ',Home_State), XMLELEMENT("Para",'is residence')))) AS ExportStringFROM Sample.Person
返されるデータ行は、次のようになります。
ExportString<Item>Emerson,Molly N.<Para>Boston MA</Para><Para>is residence</Para></Item>
関連項目SELECT 文
XMLAGG 関数
XMLELEMENT 関数
Caché SQL リファレンス 363
XMLCONCAT
XMLELEMENT
指定された列から返された値にタグを付ける関数です。
XMLELEMENT(tag,expression[,expression])
XMLELEMENT(tag,XMLATTRIBUTES(expression [ASalias]),expression[,expression])
引数
XML (または HTML) のタグ名。NAME キーワードはオプションです。この
引数には、NAME "tag"、"tag"、および NAME という 3つの構文形式が
あります。最初の 2つは機能的に同じです。指定する場合は、tag を二重
引用符で囲む必要があります。tag の大文字/小文字の区別は保持され
ます。tag には、数字でない文字を少なくとも 1 つ含める必要があります
(0–9、小数点、先頭の + または –記号) 。その他の検証は、tag には実行
されません。NAME キーワードを tag の値なしで指定すると、既定のタグ
の値、<Name> ... </Name> となります。
NAME tag
任意の有効な式。普通は、タグ付けの対象となるデータ値を含む列の名
前を指定します。列またはその他の式のコンマ区切りリストを指定できま
す。これらすべては同じ tag で囲まれます。最初のコンマ区切り要素を、
XMLATTRIBUTES関数にすることができます。XMLATTRIBUTES要素は、
1 つのみ指定できます。
expression
概要XMLELEMENT 関数は、tag で指定された XML (または HTML) タグを付けた expression の値を
返します。XMLELEMENT は、テーブルまたはビューを参照する SELECT クエリまたは SELECT
サブクエリで使用できます。XMLELEMENT は、一般のフィールド値とともに SELECT リストで使用
できます。
一般的に expression は、クエリで返される複数行の中のフィールド名 (または、フィールド名を 1 つ
以上含む式) です。
364 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
指定された expression の値は、次の形式のように、開始タグと終了タグで囲んで返します。
<tag>value</tag>
タグを付ける値が空文字列 ('') または NULL の場合、次のように返します。
<tag></tag>
expression に複数のコンマ区切り要素が含まれる場合、次の形式のように、結果が連結されます。
<tag>value1value2</tag>
XMLELEMENT 関数は入れ子にして使用できます。XMLELEMENT と XMLFOREST 関数は任意
に組み合わせて入れ子にして使用できます。XMLELEMENT 関数は、XMLCONCAT を使用して
連結できます。
XMLATTRIBUTES 関数
XMLATTRIBUTES 関数は、XMLELEMENT 関数内でのみ使用できます。expression の要素が
XMLATTRIBUTES 関数の場合、次の形式で示すように、指定された式はタグの属性になります。
<tag ID='63' >value</tag>
XMLATTRIBUTES 関数は、XMLELEMENT 関数内で 1 つのみ指定できます。これは expression
で任意の要素にできますが、慣例では最初のexpressionの要素とします。属性値は一重引用符で
囲まれ、属性値とタグの閉じ山括弧 (>) との間に空白が挿入されます。
XMLELEMENT と XMLFOREST の比較
• XMLELEMENT は、単一のタグ内に expression リストの値を連結します。XMLFOREST は、各
expression アイテムに個別のタグを割り当てます。
• XMLELEMENTは、タグの値を指定する必要があります。XMLFORESTは、既定のタグの値を
使用することも、個々のタグの値を指定することもできます。XMLELEMENT は、空の (名前の
ない) タグ : <>value</> を指定できませんが、XMLFOREST はできます。
• XMLELEMENT は、XMLATTRIBUTES を使用してタグの属性を指定できます。XMLFOREST
は、タグの属性を指定できません。
• XMLELEMENT は、NULL のタグ文字列を返します。XMLFOREST は、NULL のタグ文字列
を返しません。
句読点文字値
データ値に、XML/HTML でタグまたはその他のコーディングとして解釈される句読点文字が含ま
れる場合、XMLFOREST と XMLELEMENT はこの文字を対応するエンコード形式に変換します。
アンド記号 (&) は & となります。
Caché SQL リファレンス 365
XMLELEMENT
アポストロフィ (') は ' となります。
引用符 (") は " となります。
左山括弧 (<) は < となります。
右山括弧 (>) は > となります。
入力文字列でアポストロフィを表すには、'can''t' のように、2 つのアポストロフィを指定します。
列のデータには、アポストロフィを 2 つ付ける必要はありません。
例次の例は、通常のデータおよび XML タグが付けられたデータとして、Sample.Person の各個人の
Name フィールドの値を返します。
SELECT Name, XMLELEMENT("Para",Name) AS ExportName FROM Sample.Person
返されるデータ行は、次のようになります。
Name ExportNameEmerson,Molly N. <Para>Emerson,Molly N.</Para>
次の例は、Sample.Person の個別の Home_City と Home_State のペアの値ごとに XML のタグ
<Address> ... </Address> を付けて返します。
SELECT DISTINCT XMLELEMENT(NAME "Address",Home_City,' ',Home_State) AS CityState FROM Sample.Person ORDER BY Home_City
上の例では、オプションの NAME キーワードが使用されています。以下の例は、NAME キーワード
を tag 値なしで使用します。
SELECT DISTINCT XMLELEMENT(NAME,Home_City,' ',Home_State) AS CityState FROM Sample.Person ORDER BY Home_City
この場合、同じデータを返しますが、既定のタグ <Name> ... </Name> が付けられます。
以下の例は、入れ子の XMLELEMENT 関数を使用します。
SELECT Name,XMLELEMENT("Para",Home_State, XMLELEMENT("Emphasis",Name),Age)FROM Sample.Person
返されるデータ行は、次のようになります。
<Para>CA<Emphasis>Emerson,Molly N.</Emphasis>24</Para>
366 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下のクエリは、Sample.Person の Name フィールドの値を返します。これはデータに XML のタグ
付けをし、このタグ内で ID フィールドをタグ属性として使用したものです。
SELECT XMLELEMENT("Para",XMLATTRIBUTES(ID),Name)AS ExportName FROM Sample.Person
返されるデータ行は、次のようになります。
ExportName<Para ID='101' >Emerson,Molly N.</Para>
属性のエイリアスの指定方法を、以下の例に示します。
SELECT XMLELEMENT("Para",XMLATTRIBUTES(ID AS ItemKey),Name)AS ExportName FROM Sample.Person
返されるデータ行は、次のようになります。
ExportName<Para ItemKey='101' >Emerson,Molly N.</Para>
関連項目XMLAGG 関数
XMLCONCAT 関数
XMLFOREST 関数
SELECT 文
XMLFOREST
複数の列から返された値にタグを付ける関数です。
XMLFOREST(expression [AS tag][,expression [AS tag]])
引数
式、または (通常は) 式のコンマ区切りのリスト。通常、これはタグ付けの
対象となるデータ値を含む列の名前です。リスト内のそれぞれの式は、独
自のタグで囲みます。
expression
オプション—前にある expressionのタグの値。tag に引用符がない場合、
tag の先頭は文字にする必要があります。空白および引用符は tag の中
で使用できません。二重引用符でタグを囲むと、これらの制限が取り除か
れます。tag を省略すると、タグの値は expression 列の名前または空タグ
になります。
AS tag
Caché SQL リファレンス 367
XMLFOREST
概要XMLFOREST関数は、独自のXML (またはHTML) タグを付けた expression のそれぞれの値を返
します。
XMLFOREST は、テーブルまたはビューを参照する SELECT クエリまたは SELECT サブクエリで
使用できます。XMLFOREST は、一般の列の値とともに SELECT リストで使用できます。
指定された expression の値は、次の形式のように、開始タグと終了タグで囲んで返します。
<tag>value</tag>
一般的に expression は、列名、または 1 つ以上の列名を含む式です。XMLFOREST は、それぞ
れの expression を次のようにタグ付けします。
• AS tag が指定された場合、XMLFOREST は指定されたタグを結果の値に付けます。tag の値
は大文字と小文字を区別します。
• AS tag が省略され、expression が列名の場合、XMLFOREST は列名を結果の値にタグ付けし
ます。列名の既定のタグは、常に大文字です。
• AS tagが省略され、expressionが列名でない場合 (集約関数、リテラル、2つの列の連結など)、
XMLFOREST は空白のタグを結果の値に付けます。例 : <>literal string</>
XMLFOREST は、コンマ区切りリストの各アイテムに個別のタグを割り当てます。XMLELEMENT
は、単一のタグ内にコンマ区切りリストのすべてのアイテムを連結します。
XMLFOREST 関数は入れ子にして使用できます。入れ子にした XMLFOREST 関数および
XMLELEMENT 関数は任意の組み合わせが可能です。XMLFOREST 関数は、XMLCONCAT を
使用して連結できます。
NULL 値
XMLFOREST関数は、実際のデータの値がある場合のみタグを返します。expressionの値がNULL
の場合、タグを返しません。空文字列('')は、データ値とみなされます。タグ付けする値が空文字列
('') の場合、XMLFOREST は以下を返します。
<tag></tag>
XMLFORESTは、NULLの処理方法において、XMLELEMENT と異なります。XMLELEMENTは、
フィールドの値が NULL の場合でも、常にタグの値を返します。
句読点文字値
データ値に、XML/HTML でタグまたはその他のコーディングとして解釈される句読点文字が含ま
れる場合、XMLFOREST と XMLELEMENT はこの文字を対応するエンコード形式に変換します。
アンド記号 (&) は & となります。
アポストロフィ (') は ' となります。
368 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
引用符 (") は " となります。
左山括弧 (<) は < となります。
右山括弧 (>) は > となります。
入力文字列でアポストロフィを表すには、'can''t' のように、2 つのアポストロフィを指定します。
列のデータには、アポストロフィを 2 つ付ける必要はありません。
例次のクエリは、通常のデータおよび XML タグが付けられたデータとして、Sample.Person の Name
列の値を返します。
SELECT Name,XMLFOREST(Name) AS ExportName FROM Sample.Person
返されるデータ行は、次のようになります。ここで、既定のタグは列名になります。
Name ExportNameEmerson,Molly N. <NAME>Emerson,Molly N.</NAME>
次のクエリは複数の列を指定します。
SELECT XMLFOREST(Name, Home_State AS POAbbrv, AVG(Age)) AS ExportDataFROM Sample.Person
返されるデータ行は、次のようになります。最初のタグは列名から生成され、2 番目のタグは AS 節
で指定され、3 番目のタグは値が列の値ではなく集約のため空白です。
ExportData<NAME>Emerson,Molly N.</NAME><POAbbrv>CA</POAbbrv><>32</>
関連項目XMLAGG 関数
XMLELEMENT 関数
XMLCONCAT 関数
SELECT 文
Caché SQL リファレンス 369
XMLFOREST
YEAR
与えられた日付式で年を返す、スカラ日付/時刻関数です。
{fn YEAR(date-expression)}
引数
列の名前や、他のスカラ関数の結果、または日付やタイムスタン
プ・リテラルである式。
date-expression
概要YEAR は、日付整数または日付/時刻文字列を受け取り、その年を整数として返します。
date-expression は、DATE データ型または TIMESTAMP データ型の日付、あるいは日付/時刻文
字列形式になります。
yyyy-mm-dd hh:mm:ss
年 (yyyy) 部分は、1840 から 9999 までの範囲の 4 桁の整数でなければなりません。ただし、ユー
ザの指定値に対して、範囲チェックは行われません。この範囲を超える数、負の数、および小数は、
指定されたとおりに返されます。2 桁の年は、4 桁の年に拡張されません。
注釈: Cachéの日付の内部表現と互換性を持たせるために、すべての年の値は、1840から 9999
までの 4 桁の整数で表記することを強くお勧めします。
TO_DATE および TO_CHAR SQL 関数は、"ユリウス日" をサポートしています。ユリウス
日は、1840年以前の年を表すために使用できます。Caché ObjectScriptは、ユリウス日な
どをサポートする関数を提供していません。
YEAR は、年の部分が 1 つまたは複数のゼロの文字列 ('0' または '0000') の場合、あるいは非数
値の場合に、ゼロを返します。YEARは、最初の数値文字列を年の値として解釈します。そのため、
日付文字列の年の部分を省略したり ('-mm-dd hh:mm:ss')、または日の部分を省略すると
('hh:mm:ss')、1 番目の数値 ('-mm' または 'hh') を年の値として処理します。したがって、不明な年
の値に対して、プレースホルダを指定する必要があります。Caché との互換性に関しては、一般的
に、9999 が好ましい値です。
年形式の既定は、4桁の年です。この年表示の既定を変更するには、YEAR_OPTIONオプションで
SET OPTION コマンドを使用します。
日付/時刻文字列の各要素は、SQL スカラ関数の YEAR、MONTH、DAYOFMONTH、HOUR、
MINUTE、SECOND をそれぞれ使用して取得できます。DATEPART または DATENAME 関数を
使用して、DAYOFMONTHと同じ日要素を取得することもできます。DATEPARTおよびDATENAME
では、年の値に対して値と範囲のチェックが行われます。
370 Caché SQL リファレンス
SQL コマンドおよび SQL 関数
以下のメソッド・コールを使用することで、Caché ObjectScript からこの関数を呼び出すこともできま
す。
$SYSTEM.SQL.YEAR(date-expression)
例以下の例は、整数 2004 を返します。検証は実行されません。
SELECT DISTINCT {fn YEAR('2004-02-16 12:45:37')} AS Year_GivenFROM Sample.Person
SELECT DISTINCT {fn YEAR(59590)} AS Year_GivenFROM Sample.Person
以下の例は、年フィールドに非数値のプレースホルダが含まれているため、年に 0 を返します。区
切り文字 (–) は、特定の文字 (列) の後ろに置く必要があります。そうしないと、月が年の値として返
されます。
年のプレースホルダとしてのアスタリスク。
SELECT DISTINCT {fn YEAR('*-02-16')} AS Year_GivenFROM Sample.Person
年のプレースホルダとしての空白文字。
SELECT DISTINCT {fn YEAR(' -02-16')} AS Year_GivenFROM Sample.Person
以下の例は、現在の年を返します。
SELECT DISTINCT {fn YEAR(GETDATE())} AS Year_NowFROM Sample.Person
以下の埋め込み SQL の例は、2 つの関数から現在の年を返します。CURRENT_DATE 関数は、
DATE データ型を返します。NOW 関数は、TIMESTAMP データ型を返します。YEAR は、両方の
入力データ型に 4 桁の年を表す整数を返します。
&sql(SELECT {fn YEAR(CURRENT_DATE)}, {fn YEAR({fn NOW()})} INTO :a,:b FROM Sample.Person) IF SQLCODE'=0 { WRITE !,"Error code ",SQLCODE } ELSE { WRITE !,"CURRENT_DATE year is: ",a WRITE !,"NOW year is: ",b }
関連項目
• SQL 関数 : DATENAME DATEPART DAYOFYEAR QUARTER WEEK TO_DATE
• Caché ObjectScript 関数 : $ZDATE
Caché SQL リファレンス 371
YEAR
SQL の概念
集約関数
複数の値や、集約関数によって集約された値をまとめて演算する関数です。
概要集約関数は、1つの列内の 1つ以上の値に対して処理を行い、1つの値を返します。サポートされ
る関数は以下のとおりです。
• SUM — 指定した列内の合計値を返します。
• AVG — 指定した列の平均値を返します。
• COUNT — テーブルや指定した列内の行数を返します。
• MAX — 指定した列内で使用されている最大値を返します。
• MIN — 指定した列内で使用されている最小値を返します。
• LIST — 指定した列で使用されているすべての値を、コンマで区切られたリストの形式で返しま
す。
• XMLAGG — 指定した列で使用されているすべての値を、連結された文字列として返します。
ロック
一般に、集約関数は多数の行のデータを使用するため、集計の計算に関係するすべての行にトラ
ンザクションのロックを発行することはできません。このため集約の計算中に、別のユーザがそのデー
タを変更する可能性があります。集約関数は、指定された列の現状態のデータを返します。現在の
状態には、別のユーザによるコミットされていない変更が含まれる場合もあります。
列名
既定では、集約関数の結果の列は "Aggregate_1"、"Aggregate_2" などの名前になります。違う列
名を指定するには、SELECT 文の説明にあるように AS キーワードを使用します。
関連項目AVG COUNT LIST MAX MIN SUM XMLAGG SELECT
Caché SQL リファレンス 373
算術式
Caché SQL での算術式の解析方法です。
概要SQL 式での算術演算子の優先順位は、SQL-92 標準と異なります。Caché SQL には演算子の優
先順位はなく、算術式は必ず左から右の順番で解析されます。この規則は、Caché ObjectScript で
も同様です。例えば、3+3*5=30 となります。演算順位を指定するには、括弧を使用します。例え
ば、3+(3*5)=18 となります。
関数の呼び出し
SQL 文からユーザ定義の SQL 関数を呼び出す方法を説明します。
概要SQL 文からユーザ定義の SQL 関数を呼び出すことができます。SQL 関数は、ストアド・プロシー
ジャとして作成されたクラス・メソッドです。SQL関数は値を返す必要があります。CREATEFUNCTION
文、CREATE METHOD 文、または CREATE PROCEDURE 文を使用して、SQL 関数を作成でき
ます。
SQL 関数を呼び出すには、SQL プロシージャの名前を指定します。SQL関数は、SQL コード中で
スカラ式を指定できる場所から実行できます。関数名はそのスキーマ名で修飾できますが、無修飾
でもかまいません。無修飾の関数名では、現在の既定のスキーマ名が使用されます。関数名は、区
切り文字付き識別子とすることができます。
SQL関数には、括弧で囲んだパラメータ・リストが必要です。パラメータ・リストは空でもかまいません
が、括弧は必ず記述します。指定したパラメータはすべて入力パラメータとして機能します。出力パ
ラメータはありません。
SQL 関数は入れ子にして使用できます。
指定した関数が見つからない場合は、SQLCODE -359 が発行されます。指定した関数名が不明
確な場合は、SQLCODE -358 が発行されます。
関連項目CALL CREATE FUNCTION CREATE METHOD CREATE PROCEDURE
374 Caché SQL リファレンス
SQL の概念
列
列の名前を指定します。
identifier {.[_]identifier} {- identifier} |identifier {.[_]*} {-identifier}
引数
列名のラベル、またはラベルの一部。identifier
概要列の名前は、文や句からその列を呼び出すことができるラベルを指定します。
• 列の名前の中で処理される部分は、ピリオドより前にある最後の識別子と、ピリオドより後にある
最初の識別子です。例えば、"one._two._*._*._col" という構文は、"two.col" という列の名前と同
じ機能をします。
• t.*構文はサブクエリとして解析されますが、実行されません。.*もサブクエリで、事前に解析を
終了します。しかし one._two._three._col はサブクエリで実行され、three.col が列の名前になり
ます。
つまり、t.* 構文はビューに対して、もしくはビュー内部では実行されないということです。a.*->b な
どは解析されますが、後に拒否されます。
注釈: Caché では、400 列を超えるテーブルの作成はお勧めできません。その場合は、データ
ベースを設計し直してください。これには、列を行に置き換える方法、列をいくつかの関連
テーブルに分割する方法、データを文字ストリームまたはビット・ストリームとして保存し、列
を減らす方法などがあります。
例指定したテーブルからすべての列を選択します。
SELECT *FROM Sample.Person
指定したテーブルから指定した列を選択します。
SELECT Name,AgeFROM Sample.Person
指定したテーブルから、テーブル名を接頭語として指定した列を選択します。
SELECT Sample.Employee.Name,Sample.Company.NameFROM Sample.Company,Sample.Employee
Caché SQL リファレンス 375
列
指定したテーブルから、テーブル名のエイリアスを接頭語として指定した列を選択します。
SELECT e.Name,c.NameFROM Sample.Company AS c,Sample.Employee AS e
あるテーブルから、テーブル名のエイリアスを接頭語として指定した列を選択します。さらに、他の
テーブルから、テーブル名のエイリアスを接頭語とし、ワイルドカードを使用してすべての列を選択
します。
SELECT e.Name,c.*FROM Sample.Company AS c,Sample.Employee AS e
関連項目
• SELECT
• テーブル CREATE TABLE ALTER TABLE
コメント
SQL コードではコメントを使用できます。
-- comment
概要
SQL コードのコメント
1 行のコメントを指定するには、行頭に 2 つのハイフンを記述します。コメントは独立した行として記
述できるほか、SQL コードと同じ行に記述することもできます。SQL コードの後にコメントを続ける場
合は、コードの末尾に空白を1つ以上置き、その後にハイフン2つのコメント演算子を記述します。
コメントには、ハイフンも含め、あらゆる文字を記述できます。その行の最後までがコメントです。
以下の例では、複数のコメントが使用されています。
-- The main query-- for this section of codeSELECT Name,Age -- Two fields selectedFROM Sample.Person -- Table name-- Other clauses could appear hereORDER BY Age-- End of query
コメントとして保持される SQL コード
埋め込み SQL 文は、ルーチンの .INT コード・バージョンのコメントとして保持することができます。
そのためには以下のように、構成オプションを設定します。
376 Caché SQL リファレンス
SQL の概念
• ObjectScript $SYSTEM.SQL.SetRetainSQL() 関数を呼び出します。現在の設定を確認するに
は、$SYSTEM.SQL.CurrentSettings() を呼び出します。これにより、[Retains SQL
Statements as Comments in .INT Code] 設定が表示されます。
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Retains SQL Statements as Comments in .INT Code]の現在の設定を表示しま
す。
このオプションを “真 (true)” (1) に設定すると、ルーチンの .INT コード・バージョンで SQL 文を
コメントとして維持できます。また、 “真 (true)” (1) に設定することで、コメントのテキスト中でその
SQL 文が使用している非 % 変数をすべてリストにできます。このリストの変数を Caché ObjectScript
プロシージャの PUBLIC 変数リストにもリストし、NEW コマンドで再び初期化する必要があります。
詳細は、"ホスト変数" を参照してください。
条件式
真か偽かを評価する論理条件を指定します。単数または複数の結合条件式を使って、検索条件を
構成します。
[NOT] predicate [IS [NOT]]
引数
基になる評価項目。これを満たすと値が真となります。predicate
概要条件式は、真または偽の値を持つ文を指定します。このような文を用いて、例えば、ある行をどのク
エリと関連させるかを決定できます。
検索条件の最も単純な形が条件式で、単数または複数の条件式から構成されています。AND と
OR 演算子とで複数の条件式をつなぐことができます。
条件式の基本要素は述語論理で、以下のような形式があります。
• 比較条件
• 間接条件
• LIKE 条件
• IN 条件
• マッチ条件
• 限定比較条件
Caché SQL リファレンス 377
条件式
比較条件には、> (より大きい)、>= (以上)、< (未満)、<= (以下)、= (等しい)、<> (等しくな
い)、%STARTSWITH があります。BETWEEN 条件は、2 つの比較条件をいっしょに使用します。
LIKE 条件は、パターン・マッチングを実行します。限定比較条件は、ANY、ALL および SOME 演
算子のいずれかを使用します。
これらの条件演算子は、WHERE 節で詳細に説明します。
例以下の例は、クエリの WHERE 節における多様な条件の使用を示しています。
SELECT PurchaseOrder FROM MyTable WHERE OrderTotal >= 1000 AND ItemName %STARTSWITH :partname AND AnnualOrders BETWEEN 50000 AND 100000 AND City LIKE 'Ch%' AND CustomerNumber IN (SELECT CustNum FROM TheTop100 WHERE TheTop100.City='Boston') AND :minorder > SOME (SELECT OrderTotal FROM Orders WHERE Orders.Customer = :cust)
関連項目ANY ALL SOME
規則
SQL コマンド・リファレンスで使用する規則を指定します。
概要以下は、このドキュメントで使用する形式規約です。これらの形式文字は、使用法を説明するもの
で、SQLプログラムのコーディングの際に指定するものではありません。SQLコーディングで使用す
る記号のテーブルは、"SQL 記号" のテーブルを参照してください。
378 Caché SQL リファレンス
SQL の概念
意味記号
角括弧で囲まれた引数はオプションです。何も指定しないか、1つ指定しま
す。
[ nnnn ]
中括弧で囲まれた引数はオプションで、複数回繰り返して使用できます。
何も指定しないか、1 つあるいは複数指定します。
中括弧は、{fn FUNCTION(arg)} の形式のODBCスカラ関数などでリテラル
文字としても使用されます。
{ nnnn }
垂直バーは OR を意味します。1 つまたは複数指定します。mmmm | nnnn
省略記号は、完全な SQL 文の未指定部分です。var1,var2,... のような繰り
返しの指定にも使用できます。
. . .
これは以下と同等であることを意味します。::=
引数が "item-list" として示される場合、引数は特定の文字で区切った 1 つまたは複数の特定の
item で構成できます。item-list からの相互参照は、item のページ自体を指します。
引数が "item-commalist" として示される場合、引数はコンマで区切った 1 つまたは複数の特定の
item で構成できます。item-commalist からの相互参照は、item のページ自体を指します。
項目が [(] [)] のように、角括弧 [ ] 付きの丸括弧内に示される場合、ペア構成 (単位) の
丸括弧 ( ) はオプションです。
カーソル
データへのポインタです。1 行ずつの操作ができます。
概要カーソルは、結果セット内に "position" を含むエンティティで、1 行ずつ操作するように設計されて
います。ライフ・サイクル内で操作できる関連コマンドは、以下のとおりです。
• DECLARE — カーソルの内容を指定する。
• OPEN — カーソルをオープンする。
• FETCH — 任意のカーソル位置からデータを取得する。
• CLOSE — 開いているカーソルをクローズし、メモリを解放する。
ホスト変数の指定に使用する INTO 節は、DECLARE 文と FETCH 文のいずれか、または両方の
節として指定できます。
Caché SQL リファレンス 379
カーソル
例以下の例は、埋め込み SQL 内で使用されている EmpCursor と呼ばれるカーソルです。
SET name="John Doe",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person) WRITE !,"BEFORE: Name=",name," State=",state &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"DURING: Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state
関連項目CLOSE DECLARE FETCH OPEN
データ型
SQL エンティティ (列など) が持っているデータの種類を指定します。
概要データ型は、列が保持する値の種類を指定します。SQL 式を定義するときは、以下のテーブルの
左側の列に記載されている DDL データ型を指定できます。指定された DDL データ型は、右側の
列に記載されている Caché データ型にマップされます。
重要: 以下に示す DDL または Caché の各データ型の式は、実際は 1 つのつながった
文字列です。これらの文字列にはスペース文字が含まれるものもありますが、通常、
空白は一切使用されません。以下のテーブルにある一部の空白は、読みやすくす
る目的で使用されています。
対応する Caché データ型DDL データ型
%Library.BigIntBIGINT
%Library.Binary(MAXLEN=%1)BINARY VARYING(%1)
%Library.Binary(MAXLEN=%1)BINARY(%1)
%Library.BooleanBIT
%Library.String(MAXLEN=1)CHAR
%Library.String(MAXLEN=%1)CHAR VARYING(%1)
%Library.String(MAXLEN=%1)CHAR(%1)
380 Caché SQL リファレンス
SQL の概念
対応する Caché データ型DDL データ型
%Library.String(MAXLEN=1)CHARACTER
%Library.String(MAXLEN=%1)CHARACTER VARYING(%1)
%Library.String(MAXLEN=%1)CHARACTER(%1)
%Library.DateDATE
%Library.TimeStampDATETIME
%Library.Numeric 64 ビット符号付整数
(MAXVAL=9223372036854775807,
MINVAL=-9223372036854775808, SCALE=0)。
DEC
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,
SCALE=0)。%1で有効な最大値は19です。%1
に 19より大きい値を指定してもエラーにはな
りませんが、既定で 19 になります。
DEC(%1)
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>,
SCALE=%2)
DEC(%1,%2)
%Library.Numeric 64 ビット符号付整数
(MAXVAL=9223372036854775807、
MINVAL=-9223372036854775808、
SCALE=0)。
DECIMAL
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,
SCALE=0)。%1で有効な最大値は19です。%1
に 19より大きい値を指定してもエラーにはな
りませんが、既定で 19 になります。
DECIMAL(%1)
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>,
SCALE=%2)
DECIMAL(%1,%2)
%Library.FloatDOUBLE
%Library.FloatDOUBLE PRECISION
Caché SQL リファレンス 381
データ型
対応する Caché データ型DDL データ型
%Library.FloatFLOAT
%Library.Float
(MAXVAL=<|'$$maxval^%apiSQL(%1)'|>,
MINVAL=<|'$$minval^%apiSQL(%1)'|>)
FLOAT(%1)
BStream%StringIMAGE
%Library.Integer (MAXVAL=2147483647,
MINVAL=-2147483648)
INT
%Library.Integer (MAXVAL=2147483647,
MINVAL=-2147483648)
INTEGER
CStream%StringLONG
BStream%StringLONG BINARY
BStream%StringLONG RAW
CStream%StringLONG VARCHAR(%1)
CStream%StringLONG VARCHAR
BStream%StringLONGVARBINARY
BStream%StringLONGVARBINARY(%1)
CStream%StringLONGVARCHAR
CStream%StringLONGVARCHAR(%1)
%Library.Currency(MAXVAL=922337203685477.5807,
MINVAL=-922337203685477.5808, SCALE=4)
MONEY
%Library.String(MAXLEN=1)NATIONAL CHAR
%Library.String(MAXLEN=%1)NATIONAL CHAR VARYING(%1)
%Library.String(MAXLEN=%1)NATIONAL CHAR(%1)
%Library.String(MAXLEN=1)NATIONAL CHARACTER
%Library.String(MAXLEN=%1)NATIONAL CHARACTER VARYING(%1)
%Library.String(MAXLEN=%1)NATIONAL CHARACTER(%1)
%Library.String(MAXLEN=%1)NATIONAL VARCHAR(%1)
%Library.String(MAXLEN=1)NCHAR
%Library.String(MAXLEN=%1)NCHAR(%1)
382 Caché SQL リファレンス
SQL の概念
対応する Caché データ型DDL データ型
CStream%StringNTEXT
%Library.Numeric 64 ビット符号付整数
(MAXVAL=9223372036854775807,
MINVAL=-9223372036854775808, SCALE=0)。
NUMBER
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1)'|>,
MINVAL=<|'$$minval^%apiSQL(%1)'|>,
SCALE=0)。%1で有効な最大値は19です。%1
に 19より大きい値を指定してもエラーにはな
りませんが、既定で 19 になります。
NUMBER(%1)
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>,
SCALE=%2)
NUMBER(%1,%2)
%Library.Numeric 64 ビット符号付整数
(MAXVAL=9223372036854775807,
MINVAL=-9223372036854775808, SCALE=0)。
NUMERIC
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,0)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,0)'|>,
SCALE=0)。%1で有効な最大値は19です。%1
に 19より大きい値を指定してもエラーにはな
りませんが、既定で 19 になります。
NUMERIC(%1)
%Library.Numeric
(MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>,
MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>,
SCALE=%2)
NUMERIC(%1,%2)
%Library.String(MAXLEN=%1)NVARCHAR(%1)
%Library.String(MAXLEN=%1)NVARCHAR(%1,%2)
%Library.Binary(MAXLEN=%1)RAW(%1)
%Library.FloatREAL
%Library.SmallIntSMALLINT
%Library.CurrencySMALLMONEY
CStream%StringTEXT
Caché SQL リファレンス 383
データ型
対応する Caché データ型DDL データ型
%Library.TimeTIME
%Library.TimeStampTIMESTAMP
%Library.TinyIntTINYINT
%Library.Binary(MAXLEN=%1)VARBINARY(%1)
%Library.String(MAXLEN=%1)VARCHAR(%1)
%Library.String(MAXLEN=%1)VARCHAR(%1,%2)
%Library.String(MAXLEN=%1)VARCHAR2(%1)
ストリーム・データ型
ストリーム・データ型は、SQLスカラ、集約、および単項関数の引数として使用できません。これらの
関数にストリーム・データ型を使用すると、SQLCODE -37 エラー・コードが返されます。
SQL システム・データ型マッピング
上記のテーブルでDDLおよびCachéデータ型の式に関して示した構文は、SQL.SystemDataTypes
用に構成された既定のマッピングです。システムで用意したデータ型とユーザ・データ型で個別の
マッピング・テーブルが用意されています。
現在のデータ型マッピングを表示および変更するには、[システム管理ポータル] で [システム構
成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL] を選択します。[SystemDataTypes]
の現在の値を表示するには、[内容] を選択します。
DDL データ型マッピングの理解
DDL から Caché にデータ型をマッピングするとき、通常のパラメータと関数パラメータに以下の規
則が適用されます。
• 通常のパラメータ — これらは、DDL データ型と、%# という形式の Caché データ型で認識され
ます。以下はその例です。
VARCHAR(%1)
これは、以下をマップします。
%String(MAXLEN=%1)
したがって、以下の DDL データ型は、以下のとおりです。
VARCHAR(10)
これは、以下をマップします。
%String(MAXLEN=10)
384 Caché SQL リファレンス
SQL の概念
• 関数パラメータ — これは DDL データ型のパラメータが、Caché データ型に入力される前にい
くつかの変換を行う必要があるときに使用されます。この例は、DDL データ型の数値精度やス
ケール・パラメータの、Caché データ型の MAXVAL、MINVAL、および SCALE パラメータへの
変換です。以下はその例です。
DECIMAL(%1,%2)
これは、以下をマップします。
%Numeric(FORMAT=<|'$$format^%apiSQL(%1,%2)'|>, MAXVAL=<|'$$maxval^%apiSQL(%1,%2)'|>, MINVAL=<|'$$minval^%apiSQL(%1,%2)'|>, SCALE=%2)
DDLデータ型の DECIMALはPrecision (%1) と Scale (%2) パラメータを持ちますが、Cachéデー
タ型の %Numericは精度パラメータを持ちません。そのため、DECIMALを %Numericに変換
するには、Precision パラメータが適切な %Numeric パラメータに変換される必要があります。
それには、Caché関数の format、maxval、およびminval を、DECIMALのパラメータに対して適
用します。特別な <|'xxx'|> 構文 (上記に示す) は、DDL プロセッサにパラメータ置換を指
示し、指定された値で関数を呼び出します。次に、<|'xxx'|> 式は、関数の呼び出しから返
された値で置き換えられます。
以下は実際に数値を使用した例で、精度 4 桁とスケール 2 が指定された DECIMALデータ型
です。
DECIMAL(4,2)
これは以下をマップします。
%Numeric(FORMAT=<|'$$format^%apiSQL(4,2)'|>, MAXVAL=<|'$$maxval^%apiSQL(4,2)'|>, MINVAL=<|'$$minval^%apiSQL(4,2)'|>, SCALE=2)
また、以下を評価します。
%Numeric(FORMAT=#.00,MAXVAL=99.99,MINVAL=-99.99,SCALE=2)
format、maxval、および minval 関数の詳細は、次のセクションを参照してください。
ユーザ定義の DDL データ型の作成
データ型の設定は、システム・データ型のパラメータ値のデータ型マッピングをオーバーライドする
か、新しいユーザ・データ型を定義することによって変更できます。
現在のユーザ・データ型マッピングを表示または変更したり、マッピングを追加するには、[システム
管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストで [SQL] を
選択します。[UserDataTypes] の現在の値を表示するには、[内容] を選択します。ユーザ・データ
型を追加するには、[新規アイテム追加] を選択します。表示されたボックスで、[キー] に
VARCHAR(100)、[値] に MyString100(MAXLEN=100) のように入力します。
Caché SQL リファレンス 385
データ型
結果として、[UserDataTypes] に以下に示すエントリが表示されます。
VARCHAR(100)=MyString100(MAXLEN=100)
ユーザ定義 DDL データ型を入力する際には、前の例に示したような、いくつかの便利なルーチン
を使用できます。
• format^%apiSQL() —与えられた精度とスケールで、各Caché数値データ型に対するFORMAT
キーワードの値を返します。構文は以下のとおりです。
format^%apiSQL(precision,scale)
これには精度とスケールの両方が必要です。
• maxval^%apiSQL() — 与えられた精度とスケールで、各Caché 数値データ型に対する最大有効
値 (MAXVAL) を返します。構文は以下のとおりです。
maxval^%apiSQL(precision,scale)
これには精度とスケールの両方が必要です。
• minval^%apiSQL() — 与えられた精度とスケールで、各 Caché 数値データ型に対する最小有効
値 (MINVAL) を返します。構文は以下のとおりです。
minval^%apiSQL(precision,scale)
これには精度とスケールの両方が必要です。
DDL データ型を、Stream のコレクション型を持つ Caché プロパティにマップする必要がある場合
は、テーブル内の Caché データ型として Character Streams には CStream%String を、Binary
Streams には BStream%String をそれぞれ指定します。
DDL マッピングが見つからない場合のデータ型の処理
[ユーザ DDL データ型マッピング] テーブルの DDL データ型列にないデータ型が DDL で検出さ
れると、次に [システム DDL データ型マッピング] テーブルが調べられます。どちらのテーブルにも
データ型マッピングがない場合は、そのデータ型は変換されず、DDLで指定されているクラス定義
に直接渡されます。
例えば、以下のフィールド定義が DDL 文にあるとします。
CREATE TABLE TestTable ( Field1 %String, Field2 %String(MAXLEN=45) )
上記の定義では、%String、%String(MAXLEN=%1)、または %String(MAXLEN=45) のマッピ
ングが、[ユーザ DDL データ型マッピング] と [システム DDL データ型マッピング]に見つからない場
合、%String と %String(MAXLEN=45) 型が適切なクラス定義に直接渡されます。
386 Caché SQL リファレンス
SQL の概念
データ型の変換
特定の型から別の型にデータ型を変換するには、CAST または CONVERT 関数を使用します。
CAST は、一部の文字列データ型と数値データ型に加えて、DATE、TIME、および TIMESTAMP
への変換をサポートします。
CONVERTには、2通りの構文形式があります。両方の形式が、DATE、TIME、およびTIMESTAMP
データ型との相互変換、およびその他のデータ型間での変換をサポートします。
関連項目
• CAST CONVERT
• TO_CHAR TO_DATE TO_NUMBER
日付/時刻文
日付、時刻、またはタイムスタンプとして文字列をフォーマットします。
{d 'yyyy-mm-dd'}{t 'hh:mm:ss'}{ts 'yyyy-mm-dd hh:mm:ss.fff'}
概要この文は ODBC 日付形式の文字列を受け取り、それを対応する $HOROLOG 内部日付、時刻、
またはタイムスタンプに変換します。この文は、データ形式の決定と、値および範囲のチェックを行
います。
これらの関数にタイムスタンプ文字列を指定すると、以下のように処理されます。
• {d 'string'} 日付文は、時刻コンポーネントを無視します。これは日付コンポーネントを検証およ
び表示します。検証に失敗した日付値は、内部値のゼロ (0) に設定されます。日付値の表示
時、この 0 は '12/31/1840' として表示されます。
• {t 'string'} 時刻文は、日付/時刻文字列が指定されると、処理に失敗し、すべてゼロの値
(00:00:00) を返します。時刻文字列が指定されると、時刻値を検証および表示します。その際、
秒の小数部は切り捨てられます (丸めるのではなく)。検証に失敗した時刻値は、内部値のゼロ
(0) に設定され、00:00:00 として表示されます。
• {ts 'string'} タイムスタンプ文は、日付/時刻文字列をフォーマットして返します。これには秒の
小数部を含めることもできます。日付文字列のみが指定されると、その日付値を検証および表
示し、時刻はゼロ値 (00:00:00) を返します。時刻値または無効な日付値が指定されると、指定
された文字列をそのまま返します。
Caché SQL リファレンス 387
日付/時刻文
詳細は、"Caché ObjectScript リファレンス" の "$HOROLOG" 特殊変数を参照してください。
例以下の例は、これらの日付/時刻文を使用して、4つの値を検証および表示します。LeapDateフィー
ルドでは検証に成功し、'02/29/2004' として表示されます。NonLeapDate の値はうるう年検証に失
敗するため有効値とならず、そのフィールドは既定でゼロ値になります。このゼロ日付は、'12/31/1840'
として表示されます。TimeStamp 文は検証を行い、TSGoodDate の完全なタイムスタンプを ODBC
タイムスタンプ形式で '2003–02–28 00:00:00' として返します。TimeStamp 文は、検証に失敗する
と、指定された文字列のリテラルを返します。TSBadDate の表示値は '2003–02–29' です。
SELECT DISTINCT {d '2004-02-29'} AS LeapDate,{d '2003-02-29'} AS NonLeapDate,{ts '2003-02-28'} AS TSGoodDate,{ts '2003-02-29'} AS TSBadDateFROM Sample.Person
DDL
データ定義言語 (DDL) の仕様です。
概要データ定義言語 (DDL)は SQLの一部で、さまざまな構成要素を作成、操作および破棄します。構
成要素には、テーブル、ビュー、インデックス、ユーザ・アカウント、ロールが含まれます。
関連項目ALTER TABLE ALTER USER ALTER VIEW CREATE INDEX CREATE ROLE CREATE TABLE
CREATE USER CREATE VIEW DROP INDEX DROP ROLE DROP TABLE DROP USER DROP
VIEW
既定の仕様
既定のフィールド値を設定します。
NULL | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP |USER | CURRENT_USER | SESSION_USER | SYSTEM_USER |OBJECTSCRIPT literal | literal
概要既定の仕様は、テーブルのフィールドに既定値を設定します。
また、OBJECTSCRIPT literal の既定を使用すると、以下の例に示すように、Caché ObjectScript
コードを含む引用符付き文字列を指定することで既定値を生成できます。
388 Caché SQL リファレンス
SQL の概念
CREATE TABLE mytest(ID NUMBER(12,0) NOT NULL,CREATE_DATE DATE DEFAULT OBJECTSCRIPT '+$HOROLOG' NOT NULL,LOGNUM NUMBER(12,0) DEFAULT OBJECTSCRIPT '$INCREMENT(^LogNumber)')
詳細は、"Caché ObjectScript リファレンス" を参照してください。
既定のユーザ名とパスワード
既定のログイン識別を提供します。
概要Cachéに対する、既定のユーザ名やパスワードは、データベースへの基本的なログイン方法と開始
方法を提供します。既定のユーザ名は "_SYSTEM" (大文字) で、"SYS" がパスワードです。
エラー・コード
SQL エラー・コードとメッセージのリストです (注意:実際のエラー・メッセージは英文のみが表示さ
れます)。
概要以下の表は、SQL の エラー・コードと状態コードの一覧です。これらのコードは、SQLCODE 変数
の値として返されます。
SQLCODE メッセージ・テキスト
SQLCODE 数値コードの意味を確認するには、以下の Caché ObjectScript 文を使用します。
WRITE "SQLCODE=",SQLCODE," -- ",$SYSTEM.SQL.SQLCODE(SQLCODE)
このメソッドは、ODBC または JDBCからストアド・プロシージャ %SYSTEM.SQL_SQLCODE(-nnn) と
して呼び出すこともできます。
SQLCODE 0 と 100
この 2 つの SQLCODE は、SQL エラーを表すものではありません。
• SQLCODE=0は、SQL処理が正常に終了したことを示します。SELECT文の場合、通常、これ
はテーブルからのデータの取得に成功したことを意味します。ただし、SELECT で集約関数
(SELECT SUM(myfield) など) を実行する場合、myfield にデータがなくても集約演算は成
功し、SQLCODE=0 が発行されます。この場合、SUM は NULL を返し、%ROWCOUNT=1 とな
ります。
Caché SQL リファレンス 389
既定のユーザ名とパスワード
• SQLCODE=100は、SQL操作は成功したが処理するデータが見つからないことを意味します。
これは、さまざまな理由で発生します。SELECT の場合、指定したテーブルにデータがない、
テーブルにクエリの条件を満たすデータがない、行の検索がテーブルの最終行に達した、など
の理由があります。UPDATEまたはDELETEの場合、指定したテーブルにデータがない、テー
ブルに WHERE 節の条件を満たすデータの行がない、などの理由があります。このような場
合、%ROWCOUNT=0 となります。
SQLCODE エラー・コード
390 Caché SQL リファレンス
SQL の概念
SQL エラー・コードおよびエラー・メッセージ・テキスト
意味SQLCODE エ
ラー・コード
WinSock:特権のないホストが見つかりません-11002
WinSock:ホストが見つかりません-11001
WinSock:WSASTARTUP がまだ正常に実行されていません-10093
WinSock:WINSOCK DLL のバージョンが適用範囲外です-10092
WinSock:ネットワークサブシステムが利用できません-10091
WinSock:不当な NFS ファイルハンドルです-10070
WinSock:ホストへのルートがありません-10065
WinSock:ホストがダウンしています-10064
WinSock:接続が拒否されました-10061
WinSock:接続のタイムアウトです-10060
WinSock:ソケットのシャットダウン後は送信できません-10058
WinSock:ソケットは接続されていません-10057
WinSock:ソケットはすでに接続されています-10056
WinSock:利用できるバッファスペースがありません-10055
WinSock:(タイムアウトまたは再起動のため) ピアにより接続をリセットし
ました
-10054
WinSock:ネットが接続を切断またはリセットしました-10052
WinSock:ネットワークに接続できません-10051
WinSock:ネットワークがダウンしました-10050
フェッチの行カウントの制限に達しました-500
カーソル名が重複しています-471
オプションの値が変更されています-470
ドライバが使用できません-469
フェッチタイプが適用範囲外です-468
列タイプが適用範囲外です-467
無効なパラメータ番号です-466
Caché SQL リファレンス 391
エラー・コード
意味SQLCODE エ
ラー・コード
無効な文字列またはバッファの長さです-465
関数シーケンスのエラーです-464
無効な列番号です-463
メモリの割り当てに失敗しました-462
通信リンクに失敗しました-461
一般的なエラーです-460
Kerberos 認証に失敗しました-459
ユーザ初期設定コードのエラーです-453
メッセージ・シーケンス・エラーです-452
サーバ・メッセージを受信できません-451
ユーザのタイムアウトのため要求がタイムアウトしました-450
ストアド・プロシージャのパラメータのタイプが一致しません-431
プロシージャ・コンテキストを初期化できません-430
ストアド・プロシージャの入出力パラメータ数が正しくありません-429
ストアド・プロシージャが見つかりません-428
無効なストアド・プロシージャ名です-427
ストアド・プロシージャの作成エラーです-426
ストアド・プロシージャの要求処理のエラーです-425
ODBC、JDBC、またはダイナミック SQL経由で処理されたSELECT要求
は INTO 節を含むことはできません
-422
警告:UPDATE 文および DELETE 文は、WHERE 節を含みません-421
Caché セキュリティのエラーです-417
SQL ファイラ内で致命的なエラーが発生しました-415
一般的なストリームエラーです-412
フィールドにストリーム・オブジェクトが定義されていません-411
無効なディレクトリです-410
無効なサーバの機能です-409
392 Caché SQL リファレンス
SQL の概念
意味SQLCODE エ
ラー・コード
サーバを起動できません-408
サーバ・マスタに書き込みできません-407
サーバに書き込みできません-406
通信デバイスから読み取りできません-405
無効なユーザ名/パスワードです-402
致命的な接続エラーです-401
致命的なエラーが発生しました-400
確立されていないセーブポイントに ROLLBACK できません-375
テーブルにデータが存在する場合、ストリーム・タイプから/ストリーム・タ
イプへのフィールド・データタイプを変換できません
-374
外部関数呼び出しが % ルーチンを呼び出していません-373
外部関数呼び出しがサポートされていません-372
:HVar = CALL ...値を返さないプロシージャを指定しています-371
埋め込み SQL CALL 文は、メソッド・プロシージャでのみ使用できます-370
トリガ名とテーブル名のスキーマ名が異なります-366
トリガ名が一意ではありません-365
同じ EVENT、TIME、ORDER を持つトリガがすでに定義されています-364
トリガが見つかりません-363
指定されたクエリまたはストアド・プロシージャが見つかりません-362
仕様と一致する複数のクエリまたはストアド・プロシージャが見つかりまし
た
-361
SQL 関数名 (ストアド・プロシージャ関数) が見つかりません-359
SQL 関数名 (ストアド・プロシージャ関数) が一意ではありません-358
SQL 関数 (ストアド・プロシージャ関数) が関数プロシージャとして定義さ
れていません
-357
SQL 関数 (ストアド・プロシージャ関数) が値を返すように定義されていま
せん
-356
インデックスが定義されていません-333
Caché SQL リファレンス 393
エラー・コード
意味SQLCODE エ
ラー・コード
IDKEYインデックスでありテーブルにデータが存在するため、インデックス
を切断できません
-325
この名前のインデックスは、このテーブルにすでに定義されています-324
ビューを DROP できません — 1 つ以上のビューがこのビューを参照して
います
-321
テーブルを DROP できません — 1 つまたは複数の外部キー制約がこの
テーブルを参照しています
-320
参照されたテーブルは主キーが定義されていません-319
制約を DROP できません — 1 つまたは複数の外部キー制約がこの一意
の制約を参照しています
-317
外部キーが参照しているキー/列の集合は存在しません-316
制約またはキーが見つかりません-315
外部キーが参照しているキー/列の集合が一意ではありません-314
同じ名前の外部キーがこのテーブルにすでに定義されています-311
外部キーが参照しているテーブルが存在しません-310
このテーブルにすでに ID 列が定義されています-308
主キーは、このテーブルにすでに定義されています-307
この名前の列はすでに存在します-306
テーブルの行が NULL の列値を持つ場合に必要となるフィールドを作成
しようとしました
-305
既定値のない NOT NULL フィールドを、データを持つテーブルに追加し
ようとしました
-304
このテーブルの定義では DDL を使用できません-300
テーブルまたはビューの名前が一意ではありません-201
View-Columun リストとビュー・クエリの SELECT 節の要素数が一致して
いません
-142
読み取り専用フィールドに値を INSERT および UPDATE できません-138
ビューの WITH CHECK OPTION 検証が UPDATE に失敗しました-137
ビューの WITH CHECK OPTION 検証が INSERT に失敗しました-136
394 Caché SQL リファレンス
SQL の概念
意味SQLCODE エ
ラー・コード
Delete トリガの後に失敗しました-135
Delete トリガの前に失敗しました-134
Update トリガの後に失敗しました-133
Update トリガの前に失敗しました-132
Insert トリガの後に失敗しました-131
Insert トリガの前に失敗しました-130
SET OPTION のロケール・プロパティの値が不正です-129
FOREIGN KEY 制約が、制約条件の生成で参照一貫性チェックに失敗し
ました
-127
UNIQUEあるいはPRIMARYKEY制約が、制約条件の生成で一意性チェッ
クに失敗しました
-125
FOREIGN KEY 制約は、参照元テーブルで行の DELETE の参照チェック
に失敗しました
-124
FOREIGN KEY 制約は、参照元テーブルで行の UPDATE の参照チェック
に失敗しました
-123
FOREIGN KEY 制約は、参照テーブルで行の UPDATE の参照先チェック
に失敗しました
-122
FOREIGN KEY 制約は、参照テーブルで行の INSERT の参照先チェック
に失敗しました
-121
UNIQUE あるいは PRIMARY KEY 制約が UPDATE の一意性チェックに
失敗しました
-120
UNIQUE あるいは PRIMARY KEY 制約が INSERT の一意性チェックに失
敗しました
-119
不明なあるいは一意でないユーザもしくはロールです-118
読み取り専用のテーブルでは、INSERT、UPDATE、DELETE できません-115
一致する行がすでに別のユーザにロックされています-114
%THRESHOLD 違反です-113
アクセス違反です-112
"既定値のみ" の RowID またはフィールドに基づく RowID に INSERT で
きません
-111
Caché SQL リファレンス 395
エラー・コード
意味SQLCODE エ
ラー・コード
ファイルのロックが競合しています-110
UPDATE に指定された行が見つかりません-109
必要なフィールドが見つかりません。INSERT または UPDATE を実行で
きません
-108
RowID またはフィールドに基づく RowID を UPDATE できません-107
DELETE する行が見つかりません-106
UPDATE でフィールドの確認に失敗しました-105
INSERT でフィールドの確認に失敗しました-104
UPDATE またはDELETE を実行しようとしましたが、カーソルはどの行に
もありません
-103
オープンされていないカーソルで (FETCH/CLOSE/UPDATE/DELETE/...)
という操作を実行しようとしました
-102
すでにオープンしているカーソルをオープンしようとしています-101
特権の違反です-99
重複している select-list の名前が見つかりました-97
指定された level of isolation はサポートされていません-96
オペレーション・テーブルによって操作は不許可にされています-95
複合条件の OUTER JOIN はサポートされていません-94
DIAGNOSTICS SIZE の number of conditions は数値でなければなりませ
ん
-93
READ WRITE が指定されている場合、level of isolation を READ
UNCOMMITTED にすることはできません
-92
transaction mode の指定は 1 度のみ可能です-91
無効なビュー名です-90
無効なインデックス名です-89
無効なフィールド名です-88
無効なテーブル名です-87
無効なフィールド定義で、データタイプが定義されていません-86
396 Caché SQL リファレンス
SQL の概念
意味SQLCODE エ
ラー・コード
複数のテーブルの %ROUTINE 定義が見つかりました-85
複数のテーブルの %NUMROWS 定義が見つかりました-84
複数のテーブルの %FILE 定義が見つかりました-83
複数のテーブルの %DESCRIPTION 定義が見つかりました-82
列の制約が必要です-81
整数が必要です-80
参照するキーと参照されるキーは、同じサイズでなければなりません-79
無効なトランザクション状態です-78
この JOIN コンテキストでは条件付きの列参照ができません-77
SELECT リストと INTO リストの要素数が一致していません-76
TRIM 関数では、FROM の前に trim spec および/または trim char が必
要です
-75
重複する select-list エイリアス名が見つかりました-74
集約関数が ORDER BY 節でサポートされていません-73
Multi-Line フィールドが ORDER BY 節で無効です-72
Multi-Line フィールドは比較の左側オペランドでなければなりません-71
Multi-Line フィールドは LIKE、包含 ([)、または NULL 比較でのみ有効で
す
-70
SET <field> = <value expression> を WHERE CURRENT OF <cursor> で
使用できません
-69
正の整数の定数または変数が必要です-65
互換性のない SELECT リストが INSERT で使用されています-64
データの例外 - 無効なエスケープ文字です-63
INSERT/UPDATE に新しい値を追加する必要があります-62
カーソルを更新できません-61
%ALTER、SELECT、UPDATE などの動作が必要です-60
複数のフィールドを持つことはできません-59
重複フィールドが、トリガの UPDATE OF <fieldlist> 節に見つかりました-58
Caché SQL リファレンス 397
エラー・コード
意味SQLCODE エ
ラー・コード
トリガを起動する言語が SQL 以外の場合、トリガは WHEN 節を指定しま
す
-57
この型のオブジェクトに対応していない動作です-56
無効な GRANT role TO または REVOKE role FROM です-55
VALUES の後に (最後の添え字が省略された) 配列識別子が必要です-54
新しい値として定数または変数が必要です-53
カーソルはすでに DECLARE されています/DECLARE されていません-52
SQL 文が必要です-51
トリガを起動する言語がSQL以外の場合、トリガはUPDATEOF <fieldlist>
節を指定します
-50
トリガを起動する言語が SQL 以外の場合、トリガ REFERENCING 節を指
定できません
-49
トリガイベントの無効なトリガ REFERENCING 節です-48
このタイプの生成処理には不正な特性キーワードです-47
EXECUTE または FETCH が見つかりません-46
同じ文の中に重複したクエリ・メソッドがあります-45
クエリ、メソッド、またはプロシージャを生成する際に、重複した特性があ
ります
-44
パターン・マッチの後ろに続く引用を閉じる ("") が見つかりません-42
外部関数の呼び出しは、'$$tag^routine(...)' の形式になる必要があります-41
テーブルに RowID フィールドがありません-39
テーブルにマスタ・マップがありません-38
SQL スカラ/集約/単項関数はストリーム・フィールドでサポートされてい
ません
-37
WITH CHECK OPTION (CHECKOPTION クラス・パラメータ) は更新でき
ないビューを許可していません
-36
INSERT/UPDATE/DELETE は更新できないビューを許可していません-35
%INORDER: FROM の順序が外部結合順序に一致しません-34
テーブルにフィールドが見つかりません-33
398 Caché SQL リファレンス
SQL の概念
意味SQLCODE エ
ラー・コード
外部結合記号 ( =* または *= ) が 2 つのフィールド間に必要です-32
テーブル内にフィールドが (見つかりません/マップされていません/一意
ではありません)
-31
テーブルまたはビューが見つかりません-30
フィールドが不明確です/見つかりません-29
ホストの変数名は % か文字のいずれかで始まる必要があります-28
フィールドに不明確なラベルがあります-27
FROM 節が見つかりません-26
クエリの終了後に入力が検出されました-25
テーブルまたはビューが見つかりません-24
ラベルが FROM に記載されていません-23
'SELECT *' の後に続ける場合、ORDER には番号ではなく列名を指定す
る必要があります
-22
FROM リストのラベルで名前が競合しています-20
集約関数は WHERE 節で使用できません-19
IS (あるいは IS NOT) NULL 述語はフィールドにのみ適用できます-18
for 文では、( の後に for の条件が必要です-17
for 文の FOR の後には、修飾子 SOME や ALL が必要です-16
NOT の後には条件が必要です-15
ここでは比較演算子が必要です-14
ここではサブクエリ以外の式が必要です-13
以下のうちの1つで始まる単語がきます:identifier、constant、aggregate、
$$、:、(、+、-、%ALPHAUP、%UPPER、%STRING、%EXACT
-12
条件式ではなく、スカラ式が必要です-11
サブクエリの SELECT リストは必ず 1 つの項目を持たなければなりませ
ん
-10
互換性のない SELECT リストが UNION で使用されています-9
Caché SQL リファレンス 399
エラー・コード
意味SQLCODE エ
ラー・コード
DATEPART()、DATENAME()、DATEADD()、DATEDIFF() の無効な
DATEPART コードです
-8
ORDER 列が SELECT リストにありません-7
UNION の後に続ける場合、ORDER には名前ではなく列番号を指定しな
ければなりません
-6
ORDER に指定された列番号が SELECT リストに一致しません-5
以下のうちの 1 つで始まる単語がきます:identifier、constant、
aggregate、%ALPHAUP、%UPPER、%STRING、%EXACT、$$、:、+、-、(、
NOT、EXISTS、FOR
-4
引用文を閉じる (") が見つかりません-3
'E' の後に指数を表す数字が見つかりません-2
無効な SQL 文です-1
正常に処理が完了しました0
(これ以上) データがありません100
フィールド制約
フィールド内容の規則を指定します。
概要フィールド制約は、フィールドに指定可能なデータ値を規定する規則を指定します。フィールドには
以下の制約を指定できます。
• NOT NULL : このフィールドにはすべてのレコードで値を指定する必要があります (空文字列
も指定可能)。
• UNIQUE : レコードでこのフィールドに値を指定する場合は、一意の値である必要があります
(1 つの空文字列も指定可能)。ただし、このフィールドに値を持たない (NULL) レコードは複数
作成できます。
• DEFAULT:このフィールドには、すべてのレコードで必ず値を指定する必要があり、指定がな
ければCachéで既定値が指定されます(空文字列も指定可能)。既定値は、NULL、空文字列、
またはそのデータ型に適切なその他の任意の値にできます。
• UNIQUE NOT NULL : このフィールドにはすべてのレコードで一意の値を指定する必要があ
ります (1 つの空文字列も指定可能)。主キーとして使用できます。
400 Caché SQL リファレンス
SQL の概念
• DEFAULT NOT NULL : このフィールドには、すべてのレコードで必ず値を指定する必要があ
り、指定がなければ Caché で既定値が指定されます (空文字列も指定可能)。
• UNIQUE DEFAULT : 非推奨 — このフィールドには、すべてのレコードで必ず一意の値を指
定する必要があり、指定がなければ Caché で既定値が指定されます (1 つの空文字列も指定
可能)。既定値は、NULL、空文字列、またはそのデータ型に適切なその他の任意の値にできま
す。既定値が一意に生成される値 (CURRENT_TIMESTAMP など) であるか、一度しか使用さ
れないことがわかっている場合にのみ使用してください。
• UNIQUE DEFAULT NOT NULL : 非推奨 — このフィールドには、すべてのレコードで必ず一
意の値を指定する必要があり、指定がなければ Caché で既定値が指定されます (1 つの空文
字列も指定可能)。既定値は、空文字列、またはそのデータ型に適切なその他の任意の値にで
きます。NULLにすることはできません。既定値が一意に生成される値(CURRENT_TIMESTAMP
など)であるか、一度しか使用されないことがわかっている場合にのみ使用してください。主キー
として使用できます。
• IDENTITY : このフィールドにはすべてのレコードで、システム生成され変更できない一意の整
数値が Caché によって指定されます。その他のフィールド制約キーワードは無視されます。主
キーとして使用できます。
データ値はフィールドのデータ型に適切なものである必要があります。空文字列は数値フィールド
では指定できない値です。
これらのフィールド制約の詳細は、"CREATE TABLE" コマンドのページで説明されています。
ホスト変数
SQL が動作する言語の要素を参照します。
概要ホスト変数、またはホスト参照は、SQL が動作する言語の要素を参照します。通常、ホスト変数は、
Caché ObjectScript でローカル変数として設定された値を、埋め込み SQL コードに渡したり (INTO
節を使用)、埋め込み SQL からクエリの値を Caché ObjectScript にローカル変数として渡すために
使用されます。
注釈: ホスト変数は、埋め込み SQL で使用されます。埋め込み SQLは、Caché ObjectScript プ
ログラム内に埋め込まれた SQL コードのブロックです。ホスト変数は、ダイナミック SQL で
は使用されません。ダイナミック SQL では、これと同様の機能が、入力変数の場合は "?"
演算子で、出力変数の場合は %Library.ResultSet の %Row パラメータで実現されます。
Caché Basic は埋め込み SQL をサポートしません。ダイナミック SQL を使用して Caché
Basic から SQL 操作を実行するか、Caché Basic から埋め込み SQL を含む Caché
ObjectScript ルーチンを呼び出してください。
Caché SQL リファレンス 401
ホスト変数
入力ホスト変数は、SELECT文内の任意の場所で使用できます。出力ホスト変数は、SELECT文の
INTO 節で使用されます。
ホスト変数は、Caché ObjectScript プロシージャの PUBLIC 変数リストにリストされ、NEW コマンドを
使用して再初期化されます。また、埋め込み SQL で使用されるすべてのホスト変数をコメント文内
にもリストするようにCaché を構成することができます。これについては、このドキュメントの"コメント"
のページで説明されています。
埋め込み Caché SQL 内のホスト変数は、コロン (':') とそれに続く以下のいずれかの要素で構成さ
れます。
• Caché ObjectScript のローカル変数。このローカル変数は整形可能で、添え字を含めることが
できます。
• oref.Propなどのオブジェクト参照。オブジェクト参照は単純なプロパティでも多次元配列プロパ
ティでもかまいません。
オブジェクト参照ホスト変数には、Person.Home.City のような任意のレベル数のドット構文を含
めることができます。
oref.Prop がプロシージャ・ブロック・メソッドの中でホスト変数として使用される場合、Caché は
oref.Prop 参照全体ではなく oref 変数を自動的に PUBLIC リストに追加し、NEW を実行しま
す。
埋め込み SQL を入力する前に SQLCODE エラー・コード変数を NEW することと、埋め込み SQL
の終了直後に SQLCODE 値をチェックすることは、プログラミングのよい実践方法です。出力ホスト
変数値は、SQLCODE=0 のときのみ使用してください。
以下の Caché ObjectScript 例は、埋め込み SQL を含みます。
NEW SQLCODE &sql(SELECT Name,Home_State INTO :CName,:CAddr FROM Sample.Person) IF SQLCODE=0 { WRITE !,"Name is: ",CName WRITE !,"State is: ",CAddr } ELSE { WRITE !,"SQL error ",SQLCODE }
この埋め込み SQL では、ホスト変数 :CName と :CAddr を使用して、選択された顧客の名前と州
名をそれぞれローカル変数 CName と CAddr に返しています。
以下の例では、添え字付きのローカル変数を使用して同じ操作を実行します。
402 Caché SQL リファレンス
SQL の概念
NEW SQLCODE &sql(SELECT Name,Home_State INTO :CInfo(1),:CInfo(2) FROM Sample.Person) IF SQLCODE=0 { WRITE !,"Name is: ",CInfo(1) WRITE !,"State is: ",CInfo(2) } ELSE { WRITE !,"SQL error ",SQLCODE }
未定義のホスト変数
定義されていない入力ホスト変数を指定した場合、埋め込み SQL はその値を NULL として処理し
ます。
NEW x &sql(SELECT :x,NULL INTO :a,:b FROM Sample.Person) WRITE !,"The SQL error code is: ",SQLCODE WRITE !,"The length of x is: ",$LENGTH(a) WRITE !,"The length of NULL is: ",$LENGTH(b)
ホスト変数の有効性
• 入力ホスト変数は、埋め込み SQL で変更されることはありません。
• 出力ホスト変数は、SQLCODE = 0のときに埋め込みSQLの後でのみ有効性が保証されます。
例えば、OutVal の以下の使用は、有効性が保証されません。
InvalidExample SET InVal = "1234" SET OutVal = "?" &sql(SELECT Name INTO :OutVal FROM Sample.Person WHERE ID=:InVal) IF OutVal="?" { ; Improper Use WRITE !,"No data returned" WRITE !,"SQL error code ",SQLCODE } ELSE { WRITE !,"Name is: ",OutVal }
埋め込み SQL の実行前に設定された OutVal の値は、埋め込み SQL から返された後に IF コマ
ンドで参照できません。
代わりに、この例は SQLCODE 変数を使用して、以下のようなコードにします。
Caché SQL リファレンス 403
ホスト変数
ValidExample NEW SQLCODE SET InVal = "1234" &sql(SELECT Name INTO :OutVal FROM Sample.Person WHERE ID=:InVal) IF SQLCODE'=0 { SET OutVal="?" IF OutVal="?" { WRITE !,"No data returned" WRITE !,"SQL error code ",SQLCODE } } ELSE { WRITE !,"Name is: ",OutVal }
埋め込み SQL では、出力行が正常に取得されたことを示す場合に SQLCODE 変数に 0 が設定
されます。SQLCODE 値の 100 は、SELECT 条件に一致する行が見つからないことを示します。
SQLCODE の負の数値は、SQL エラーの状態を示します。
関連項目
• SELECT INTO 節
• 埋め込み SQL
識別子
テーブル、列、またはその他の構成要素にラベルを付けます。
simple-identifier ::=identifier-start { identifier-part }
identifier-start ::=letter | % | _
identifier-part ::=letter | number | _ | @ | # | $
delimited-identifier ::=" delimited-identifier-part { delimited-identifier-part } "
delimited-identifier-part ::=non-double-quote-character | double-quote-symbol
double-quote-symbol ::=""
概要識別子はエンティティの名前で、テーブル名や列の名前、インデックス名、カーソル名やその他の
エンティティなどです。識別子の長さは最長 40文字です。Caché は、Unicode システムでテーブル
404 Caché SQL リファレンス
SQL の概念
名やフィールド名の 16 ビット (ワイド) 文字をサポートします。ワイド名の長さは最長 40 文字です。
識別子に SQL 予約語を使用することはできません。
識別子は単純な識別子か、もしくは区切り文字付き識別子のいずれかです。SQLは既定で単純な
識別子と区切り文字付き識別子の両方をサポートします。
単純な識別子単純な識別子は一意の名前であり、SQL キーワードではありません。単純な識別子の名前付け規
約は、以下のとおりです。
• 最初の文字は、非数字文字、アンダースコア (_)、またはパーセント記号 (%) です。
• 次に続く文字は、非数字文字、数字、アンダースコア (_)、アットマーク (@)、ポンド記号 (#)、ま
たはドル記号 ($) です。
注釈: 句読点と数字のみからなる識別子は無効となる場合があるため、通常は使用しないでくだ
さい。例えば、テーブル名とフィールド名は対応するクラス名とプロパティ名を生成します
が、これらの名前には数字以外の文字が最低でも1文字必要です。さらには、2つのアン
ダースコア文字で始まる識別子 (__name) または連続する 2 つのポンド記号を含む識別
子 (nn##nn) は、絶対に作成しないでください。
非数字文字とは、Caché ObjectScript $ZNAME関数の検証に合格する任意の文字であると定義さ
れます。既定では、Aから Z までの大文字 (ASCII 65–90)、a から z までの小文字 (ASCII 97–122)、
およびアクセント記号付きの文字 (ASCII 215 と 247 を除く ASCII 192–255) です。単純な識別子
は、大文字と小文字を区別しません。規約により、最初は大文字で表示されます。
数字文字は、0 から 9 までの数字で定義されます。
句読記号は、演算子としても使用されます。SQL では、# 記号はモジュロ演算子として使用されま
す。Caché ObjectScript では、アンダースコア文字は 2 つの文字列の連結に使用されます。句読
記号の演算子としての解析のあいまいさは、演算子の前後にスペースを配置することで解決できま
す。
単純な識別子は、空白や上記で指定されている以外の句読点文字を含むことができません。イン
ターシステムズの SQL インポート・ツールは、インポートされたテーブル名から空白を削除します。
Cachéは、文字列が有効な識別子であるかどうかをテストするクラス・メソッドを提供しています。この
メソッドは、文字の使用と予約語の両方に対してテストします。また、最大200文字の長さテストも実
行します。以下の Caché ObjectScript 例は、このメソッドを使用しています。
WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("Fred") WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("%Fred#123") WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("%#$@_Fred") WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("1Fred") WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("Fr ed") WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("%alphaup")
Caché SQL リファレンス 405
識別子
最初の 3 つのメソッドは 1 を返し、有効な識別子であることを示し、最後の 3 つのメソッドは 0 を返
し、有効な識別子でないことを示します。最後の 3つのメソッドのうち 2 つが無効なのは、数字で始
まっているのと、スペースが含まれているという点で文字規則に違反しているためです。最終のメソッ
ド呼び出しが 0 を返すのは、指定された文字列が予約語であるためです。これらの規則テストは最
小要件で、あらゆる SQL 使用で有効な識別子として検証されているわけではないことに注意してく
ださい。
このメソッドは、ODBCまたは JDBCからストアド・プロシージャ %SYSTEM.SQL_IsValidRegularIden-
tifier("nnnn") として呼び出すこともできます。
区切り文字付き識別子区切り文字付き識別子は、区切り文字で囲まれた名前です。Caché SQLは、区切り文字として二重
引用符 (") をサポートします。
リテラル値を区切るには、Caché SQL は一重引用符 (') を使用します。これにより、区切り文字付き
識別子は二重引用符 (") で、リテラル値は一重引用符 (') で指定されなければなりません。
区切り文字付き識別子は、一意の名前でなければなりません。これには、空白も含めた印刷可能文
字を含むことができます。お勧めできませんが、SQL キーワードも含まれます。最初はどのような文
字でもかまいません。区切り文字付き識別子は大文字と小文字を区別しません。規約により、識別
子の最初の文字は大文字で表示されます。
大文字と小文字を区別しない識別子Caché SQL 識別子は、既定で大文字と小文字を区別します。現在 Caché SQL は、大文字と小文
字を区別しないで実行しますが、まず識別子をすべて大文字に変換してから比較します。これは、
使用されている名前の実際の文字には何の影響もありません (他の SQL の実装では、区切り文字
付き識別子の大文字と小文字の区別を個別に処理する場合もあります。したがって、大文字と小文
字を意識した識別子の使用を避けることをお勧めします)。
Caché SQL のパスワードでは大文字と小文字が区別されることに注意してください。
識別子サポートの構成既定では、Cachéは単純な識別子と区切り文字付き識別子の両方をサポートします。現在のプロセ
スの区切り文字付き識別子のサポートは、SETOPTIONコマンドにSUPPORT_DELIMITED_IDEN-
TIFIERSキーワードを指定することで設定できます。区切り文字付き識別子のサポートは、以下のよ
うにしてシステム全体に設定できます。
• ObjectScript $SYSTEM.SQL.SetDelimitedIdentifiers(boolean) 関数を呼び出します。この関数
は現在のシステム全体の値と構成ファイルの設定の両方を変更します。現在の設定を確認す
るには、$SYSTEM.SQL.CurrentSettings() を呼び出します。
• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス
トで [SQL] を選択します。[Support Delimited Identifiers] の現在の設定を表示および編集しま
す。
406 Caché SQL リファレンス
SQL の概念
Caché 5.1 での既定値は “真” (1) で、Caché は単純な識別子と区切り文字付き識別子の両方を
システム全体でサポートします (以前のバージョンのCachéは既定では区切り文字付き識別子をサ
ポートしていません)。このオプションを “偽” (0) に設定すると、Caché はテーブル名、フィールド
名、その他のエンティティに対して単純な識別子のみをサポートするように指定されます。
識別子変換SQL識別子内の特定の文字を対応するオブジェクト識別子内で他の文字に変換するように構成す
ることができます。これにより、識別子で指定可能な文字の規則が異なる環境間での識別子の使用
が容易になります。
[システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストで
[SQL] を選択します。[Identifier Translation — From] と [Identifier Translation — To] の現在の設定
を表示および編集します。DDL実行時にSQL識別子をオブジェクト識別子に変換する場合、"From"
文字列の文字は、"To" 文字列の文字に変換されます。
また、ObjectScript $SYSTEM.SQL.SetDDLIdentifierTranslations() 関数を使用することもできます。
関連項目リテラル 予約語 SET OPTION
Caché SQL リファレンス 407
識別子
リテラル
実際の文字の値を表します。
literal ::=number | string-literal
number ::={digit}[.]digit{digit}[E[+|-]digit{digit}]
digit ::=0..9
string-literal ::=std-string-literal | ObjectScript-empty-string
std-string-literal ::=' {std-character-representation} '
std-character-representation ::=nonquote-character | quote-symbol
quote-symbol ::=''
ObjectScript-empty-string ::=""
概要リテラルは、実際の値を表す文字列です。数値または文字列のいずれかになります。
• 数値は、区切り文字を必要としません。0 ~ 9 の数字、小数点文字、指数記号、正符号、負符
号で構成できます。1 つの数値には 1 つの小数点文字しか使用できません。小数点文字は、
数値の基数部分にのみ使用でき、指数部分には使用できません。小数点の後に数字を続ける
必要はありません。先頭および末尾のゼロは使用可能です。指数記号は文字 E になります。
大文字および小文字のどちらのEも使用可能ですが、大文字Eが優先して使われます。正符
号あるいは負符号を、基数または指数の前に置くことができます。また、複数の正符号および
負符号を、基数の前に置くことができます。SQLは、これらの符号を演算子として扱います。単
一の正符号および負符号のみを指数の前に置くことができます。SQL は、この符号をリテラル
の一部として扱います。コンマまたは空白は、数値内で使用できません。
• 文字列リテラルは、あらゆる種類の文字の文字列を囲む一組の区切り文字で構成されます。優
先的に使用される区切り文字は、一重引用符 (以下を参照) です。文字列内で区切り文字をリ
テラルとして指定するには、'Mary''s office' のように、その文字を重複して使用します。埋め込
み SQL に対しては、文字列リテラル内に 2 つのシーケンシャル # 文字を指定できません。こ
の制約は、SQL の他の呼び出しには適用されません。
NULL 文字列は、2 つの一重引用符 ('') またはキーワード NULL で表されます。
408 Caché SQL リファレンス
SQL の概念
文字列の区切り文字
文字列の区切り文字として、一重引用符 (') または二重引用符 (") のいずれかを使用できます。一
重引用符 (') は、好ましい区切り文字です。二重引用符 (") の使用は、SQL 互換性に対してはサ
ポートされますが、区切り文字付き識別子の標準と競合するためお勧めできません。
文字列内のリテラル文字である区切り文字として使用する文字を指定するには、これらの一組の文
字を指定します。
連結
二重の垂直バー (||) は、好ましい SQL 連結演算子です。2 つの数値、2 つの文字列、または 1 つ
の数値と 1 つの文字列を連結するために使用できます。
アンダースコア文字 (_) は、Caché ObjectScript の互換性のために SQL 連結演算子として指定さ
れます。連結演算子は、2 つの文字列を連結するためにのみ使用できます。
関連項目識別子
NULL
NULL と空文字列のデータ値。
NULL -- null value
'' -- empty string value
概要値が意図的に指定されていないことを示すには、NULL キーワードを使用します。NULL は、デー
タ値が存在しないこをと示す、SQL で優先的な方法です。
空文字列 ('') は NULL と同じではありません。空文字列は、指定された文字列です。文字を含まな
い、可能な最短の文字列です。空文字列は、非表示文字 $CHAR(0) により内部的に表示されま
す。NULL と空文字列は、多くのインスタンスでこれらを使用した結果が同じであっても、本質的に
異なります。空文字列は、SQL コーディングでは回避すべきです。しかし、多くの SQL 処理では末
尾の空白スペースが削除されるため、空白文字 (スペースおよびタブ)のみを含むデータ値が空文
字列として処理される場合があります。列の既定値として空文字列が明示的に指定されている場合、
この値は非表示文字 $CHAR(0) で表されます。
また、SQL 空文字列はすべての SQL 文字列と同様に、二重引用符 ("") で表現できますが、SQL
区切り文字付き識別子と競合する可能性があるため、この使用方法は回避すべきです。
以下の例に示すように、ASCII 関数を使用して、空文字列を NULL に変換できます。
Caché SQL リファレンス 409
NULL
SELECT DISTINCT NULL AS NullVal,{fn ASCII('')} AS EmpStrValFROM Sample.Person
NULL の処理
NOT NULL データ制約は、1 つのフィールドが 1 つのデータ値を取得することを必要とします。値
ではなく NULL を指定することはできません。この制約は、空文字列値の使用を妨げません。詳細
は、"CREATE TABLE" コマンドを参照してください。
SELECT 文の WHERE 節または HAVING 節内の NULL 述語は、NULL 値を選択します。空文字
列値は選択しません。
IFNULL 関数は NULL 値を選択します。空文字列値を選択しません。
COALESCE 関数は、指定されたデータから最初の NULL でない値を選択します。空文字列は、
NULL でない値として処理されます。
CONCAT関数または連結演算子 (||) が 1つの文字列と 1つのNULLを連結すると、結果はNULL
になります。詳細は、以下の例を参照してください。
SELECT DISTINCT {fn CONCAT('fred',NULL)} AS FuncCat,'fred'||NULL AS OpCatFROM Sample.Person
AVG、COUNT、MAX、MIN、およびSUM集約関数は、処理を実行するときにNULL値を無視しま
す (すべてのフィールドに NULL値を持つレコードは存在できないため、COUNT * はすべての行
をカウントします)。SELECT 文の DISTINCT キーワードは、その処理に NULL を含みます。指定し
たフィールドに NULL 値が存在する場合、DISTINCT は NULL 行を返します。
AVG、COUNT、および MIN 集約関数は、空文字列値の影響を受けます。MIN 関数は、ゼロ値を
持つ行がある場合でも、空文字列を最小値と判断します。MAX および SUM 集約関数は、空文字
列値の影響を受けません。
NULL 算術演算
NULL をオペランドとして持つ任意の SQL 算術演算は、NULL 値を返します。したがって、
7+NULL=NULL となります。これには、二項演算子の加算 (+)、減算 (-)、乗算 (*)、除算 (/)、整数
除算 (\)、モジュロ (#)、および単項演算子符号のプラス (+) およびマイナス (-) が含まれます。
算術演算で指定された空文字列は、0 (ゼロ) 値として処理されます。
NULL の長さ
SQL 内では、NULL の長さは未定義です (<null> を返します)。しかし、空文字列の長さは、以下の
例に示すように、長さゼロとして定義されています。
SELECT DISTINCT CHAR_LENGTH(NULL) AS NullLen,CHAR_LENGTH('') AS EmpStrLenFROM Sample.Person
410 Caché SQL リファレンス
SQL の概念
ただし、標準 SQL に対する特定の Caché の拡張は、NULL と空文字列のそれぞれの長さを処理
します。$LENGTH関数は、NULLに対して長さ 0 を、空文字列値に対して長さ 1 を返します。この
機能は、Caché ObjectScript と互換性があります。
SELECT DISTINCT $LENGTH(NULL) AS NullLen,$LENGTH('') AS EmpStrLenFROM Sample.Person
これらの値の内部表現が有効な別の場所は、%STRING、%SQLSTRING、および%SQLUPPER関数
内です。これらの関数は、空白スペースを値に追加します。NULL は実際には値を持たないため、
それに空白を追加すると、長さが1の文字列が作成されます。しかし、空文字列は文字値を持つた
め、それに空白を追加すると、長さが 2 の文字列が作成されます。詳細は、以下の例を参照してく
ださい。
SELECT DISTINCT CHAR_LENGTH(%STRING(NULL)) AS NullLen,CHAR_LENGTH(%STRING('')) AS EmpStrLenFROM Sample.Person
Caché ObjectScript と SQL
埋め込み SQL から NULL または空文字列値を渡すと、NULL は長さ 0 の文字列に変換され、空
文字列は長さ 1 の文字列に変換されます。詳細は、以下の例を参照してください。
&sql(SELECT NULL, '' INTO :a,:b FROM Sample.Person) WRITE !,"The length of NULL is: ",$LENGTH(a) WRITE !,"The length of empty string is: ",$LENGTH(b)
Caché ObjectScript では、値の存在の有無は、通常、空文字列 ("") で示されます。この値が埋め
込み SQL に渡される場合は、以下の例に示すように、NULL 値として処理されます。
SET x="" &sql(SELECT %SQLUPPER(NULL), %SQLUPPER(:x) INTO :a,:b FROM Sample.Person) WRITE !,"NULL length: ",$LENGTH(a) WRITE !,"ObjectScript empty string length: ",$LENGTH(b)
ここでは、%SQLUPPER が空白スペースを各 NULL 値に追加し、結果の長さは、どちらの場合も 1
になります。
定義されていない入力ホスト変数を指定した場合、埋め込み SQL はその値を NULL として処理し
ます。
以下の例では、空白を追加された SQL 空文字列は、文字列長 2 として渡されます。
&sql(SELECT %SQLUPPER('') INTO :y FROM Sample.Person) WRITE !,"SQL empty string length: ",$LENGTH(y)
Caché SQL リファレンス 411
NULL
関連項目リテラル 値
クエリ
SELECT 文を使用して、データを検索します。
query_term {UNION [ALL] query_term}
where query_term can be a SELECT statement or another query enclosedin parentheses.
引数
データベースからデータを検索するSELECT文、また
は括弧で囲まれた他のクエリ。
query_term
オプション — 2 つのクエリを組み合わせる節。複数の
UNION 節を指定できます。
UNION query_term
UNION ALL query_term
概要クエリは、1 つ以上の SELECT 文を使用してデータを取得する文です。UNION 節を使用して、複
数の SELECT 文を組み合わせることが可能です。クエリ名を括弧で囲むことにより、SELECT では
なく既存のクエリを指定できます。クエリは、上位レベルのクエリの後に続く、単独の ORDER BY 節
を持つことができます。ORDER BY 節を使用して、クエリが検索するデータを構築できます。
クエリを作成するには、CREATE QUERY文を使用します。また、ストアド・プロシージャであるクエリ
にはCREATE PROCEDURE文を使用することも可能です。クエリを削除するには、DROP QUERY
文を使用します。
例以下の例は、SELECT文を使用した基本クエリです。テーブルのレコードすべてに対して2つの指
定されたフィールドでデータを取得します。
SELECT Name,Age FROM Sample.Person
以下の例は、(クラス User.queryPersonState 内に既定で格納されている) 'PersonState' という名前
のクエリを作成します。今後のこのクエリの呼び出しは、SELECT 文で指定せずに、括弧で囲まれ
たクエリ名で実行できます。
CREATE QUERY PersonState() BEGIN SELECT Name,Home_State FROM Sample.Person ; END
412 Caché SQL リファレンス
SQL の概念
以下は、UNION および patient_history という名の既存クエリを使用したクエリです。
SELECT p.name,p.sex,p.dob FROM MyTable p UNION (patient_history)
関連項目
• SELECT UNION
• CREATE QUERY DROP QUERY
Caché SQL リファレンス 413
クエリ
予約語
SQL 予約語のリストです。
%AFTERHAVING | %ALPHAUP | %ALTER | %ALTER_USER | %BEGTRANS |%CHECKPRIV | %CREATE_ROLE | %CREATE_USER | %DBUGFULL |%DELDATA | %DESCRIPTION | %DROP_ANY_ROLE | %DROP_USER |%EXACT | %EXTERNAL | %FILE | %FOREACH | %FULL |%GRANT_ANY_PRIVILEGE | %GRANT_ANY_ROLE | %INORDER |%INTERNAL | %INTEXT | %INTRANS | %INTRANSACTION | %MCODE |%NOCHECK | %NODELDATA | %NOINDEX | %NOLOCK | %NOTRIGGER |%NUMROWS | %ODBCOUT | %ROUTINE | %ROWCOUNT | %STARTSWITH |%STRING | %THRESHOLD | %UPPER |ABSOLUTE | ACTION | ADD | ALL | ALLOCATE | ALTER | AND |ANY | ARE | AS | ASC | ASSERTION | AT | AUTHORIZATION | AVG |BEGIN | BETWEEN | BIT | BIT_LENGTH | BOTH | BY | CASCADE |CASE | CAST | CATALOG | CHAR | CHARACTER | CHARACTER_LENGTH |CHAR_LENGTH | CHECK | CLOSE | COALESCE | COBOL | COLLATE |COLLATION | COLUMN | COMMIT | CONNECT | CONNECTION |CONSTRAINT | CONSTRAINTS | CONTINUE | CONVERT |CORRESPONDING | COUNT | CREATE | CROSS | CURRENT |CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP |CURRENT_USER | CURSOR | DATE | DAY | DEALLOCATE | DEC |DECIMAL | DECLARE | DEFAULT | DEFERRABLE | DEFERRED |DELETE | DESC | DESCRIBE | DESCRIPTOR | DIAGNOSTICS |DISCONNECT | DISTINCT | DOMAIN | DOUBLE | DROP | ELSE |END | ENDEXEC | ESCAPE | EXCEPT | EXCEPTION | EXEC |EXECUTE | EXISTS | EXTERNAL | EXTRACT | FALSE | FETCH |FILE | FIRST | FLOAT | FOR | FOREIGN | FORTRAN | FOUND |FROM | FULL | GET | GLOBAL | GO | GOTO | GRANT | GROUP |HAVING | HOUR | IDENTITY | IMMEDIATE | IN | INDICATOR |INITIALLY | INNER | INPUT | INSENSITIVE | INSERT | INT |INTEGER | INTERSECT | INTERVAL | INTO | IS | ISOLATION |JOIN | KEY | LANGUAGE | LAST | LEADING | LEFT | LEVEL |LIKE | LOCAL | LOWER | MATCH | MAX | MIN | MINUTE |MODULE | MONTH | NAMES | NATIONAL | NATURAL | NCHAR |NEXT | NO | NOT | NULL | NULLIF | NUMERIC | OCTET_LENGTH |OF | ON | ONLY | OPEN | OPTION | OR | ORDER | OUTER |OUTPUT | OVERLAPS | PAD | PARTIAL | PASCAL | PLI |POSITION | PRECISION | PREPARE | PRESERVE | PRIMARY |PRIOR | PRIVILEGES | PROCEDURE | PUBLIC | READ | REAL |REFERENCES | RELATIVE | RESTRICT | REVOKE | RIGHT | ROLE |ROLLBACK | ROWS | SCHEMA | SCROLL | SECOND | SECTION |SELECT | SESSION_USER | SET | SIZE | SMALLINT | SOME |SPACE | SQL | SQLCODE | SQLERROR | SQLSTATE | SUBSTRING |SUM | SYSTEM_USER | TABLE | TEMPORARY | THEN | TIME |TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE | TO |TRAILING | TRANSACTION | TRANSLATE | TRANSLATION | TRIM |TRUE | UNION | UNIQUE | UNKNOWN | UPDATE | UPPER | USAGE |USER | USING | VALUE | VALUES | VARCHAR | VARYING | VIEW |WHEN | WHENEVER | WHERE | WITH | WORK | WRITE | YEAR |ZONE
概要
414 Caché SQL リファレンス
SQL の概念
SQL 内では、特定の文字が予約されています。SQL 予約語は、以下の場合を除いて、SQL 識別
子 (テーブル名、列名、変数名や、その他のエンティティ名など) としては使用できません。
• 単語が二重引用符で区切られており ("word")、かつ
• 区切り文字付き識別子がサポートされている。詳細は、"SQL の概念" の "識別子" ページを
参照してください。
以下のリストは、このように予約された単語のみを含みます。すべての SQL キーワードを含むわけ
ではありません。
単語がSQL予約語であるかどうかを調べるには、以下の例に示すように、$SYSTEM.SQLクラス・メ
ソッドを呼び出します。予約語は文字列に引用符を付けて指定します。予約語は大文字と小文字を
区別しません。$SYSTEM.SQL.IsReservedWord は、ブーリアン値を返します。
WRITE !,"Reserved?: ",$SYSTEM.SQL.IsReservedWord("VARCHAR") WRITE !,"Reserved?: ",$SYSTEM.SQL.IsReservedWord("varchar") WRITE !,"Reserved?: ",$SYSTEM.SQL.IsReservedWord("VarChar") WRITE !,"Reserved?: ",$SYSTEM.SQL.IsReservedWord("FRED")
このメソッドは、ODBC または JDBC からストアド・プロシージャ %SYSTEM.SQL_IsReserved-
Word("nnnn") として呼び出すこともできます。
Caché SQL リファレンス 415
予約語
スカラ式
スカラ値を説明する数式です。
scalar-expression ::=term {scalar-operator term}
scalar-operator ::=+ | - | * | / | \ | # | "||"
term ::=literal |CURRENT_DATE |scalar function |agg |unary |column |host-variable |extended function |NULL |case |odbc escape |scalar-expression
scalar function ::=ABS |CAST |CHAR_LENGTH |CHARACTER_LENGTH |CURRENT_TIME |CURRENT_TIMESTAMP |DECODE |ISNULL |LOWER |NVL |POSITION |SIGN |SUBSTR |SUBSTRING |TODATE |TONUMBER |TRIM
概要スカラ式は、スカラ値を記述する数式を指定します。
スカラ演算子内では優先順位は左から右です。
scalar-operator 記号は、加算 (+)、減算 (-)、乗算 (*)、除算 (/)、整数除算 (\)、モジュロ (#)、連結
(||) です。
416 Caché SQL リファレンス
SQL の概念
ストアド・プロシージャ
名前を付けて保存され、その名前で呼び出される SQL 文を指定します。
概要ストアド・プロシージャは、データベースに保存され、サーバで起動される呼び出し可能なルーチン
を提供します。Caché ObjectScript では、ストアド・プロシージャを作成することができます。
ストアド・プロシージャは、メソッドやクエリのいずれかとして実装されます。結果セットやデータの行
を返すものは、オブジェクト・クエリ (クエリを含むように特別に設計されたオブジェクトの一部) として
実装され、データベースを更新するものは、メソッドとして実装されなければなりません。
データベースからデータを返す多くのストアド・プロシージャは、標準クエリ・インタフェースで実装さ
れます。この方法は、プロシージャが埋め込み SQL で記述されている限りうまくいきます。
クエリをストアド・プロシージャとして公開するには、Caché スタジオのインスペクタにクエリを入力し
て、SQLProc フィールドの値を真に変更するか、または、以下の “[ SqlProc ]” 文字列をクエリ定
義に追加します。
Query QueryName() As %SQLQuery( ... query definition ... ) [ SqlProc ]
単純な SQL 文としてクエリを記述し、それをクエリ・ウィザードで作成することが可能な場合、クエリ
を実装する基本的なメソッドに関する知識は必要ありません。
内部で、各クエリに対して、クラス・コンパイラはストアド・プロシージャの名前を基にしてメソッドを生
成します。以下のものが含まれます。
• stored-procedure-nameExecute
• stored-procedure-nameFetch
• stored-procedure-nameFetchRows
• stored-procedure-nameGetInfo
• stored-procedure-nameClose
クエリが %SQLQuery タイプである場合、クラス・コンパイラは自動的に複数の埋め込みSQLを生成
されたメソッドに挿入します。Executeは SQLのためにストアド・カーソルを宣言し、開きます。Fetch
は、空白の行 (SET Row="") を返すまで、繰り返し呼び出されます。オプションで、Fetchを AtEnd=1
のブーリアン・フラグを返すようにすることもできます。これは、現在の Fetch が最後の行を取り、次
のFetchで空白の行を返すようにすることを示します。ただし、空白行は必ず結果セットの終了を判
断するためのテスト用として使用する必要があります。FetchRows は、論理的に Fetch への繰り返
しの呼び出しと同じです。GetInfoは、ストアド・プロシージャに対する署名の詳細を返すために呼び
出されます。Close はカーソルをクローズします。
Caché SQL リファレンス 417
ストアド・プロシージャ
これらすべてのメソッドは、クライアントからストアド・プロシージャが呼び出されるたびに自動的に呼
び出されますが、論理的には、サーバで起動している ObjectScript から直接呼び出されることもあ
ります。
オブジェクトを Execute から Fetch に渡すために、また Fetch から次の Fetch の呼び出しに渡す
ために、クエリ・ハンドラをそのオブジェクトのオブジェクト参照 (oref) に設定することができます。複
数のオブジェクトを渡す場合、qHandle を配列として設定できます。
SET qHandle(1)=oref1,qHandle(2)=oref2
カスタマイズされたクエリクエリ・モデルに一致しない複雑なクエリやストアド・プロシージャに対しては、多くの場合で、そのメ
ソッドの一部、またはすべてを置き換えることでクエリをカスタマイズする必要があります。
%SQLQuery タイプの代わりに %Query タイプを選択する方が、クエリを実装するのに容易な場合も
あります。これによって、同じ 5 つのメソッドが生成されますが、FetchRows は単純に Fetch の呼び
出しを繰り返します (%SQLQueryには動作を引き起こすいくつかの最適化機能があります)。GetInfo
は単純に署名から情報を得るので、コードが変更される必要はありません。これによって、他の3つ
のメソッドそれぞれに対し、クラス・メソッドを作成する上での問題が削減されます。クラスがコンパイ
ルされるとき、コンパイラはこれらのメソッドの存在を検出します。上書きすることはありません。
メソッドは特定の署名を必要とします。それらはすべて %Binary タイプの Qhandle (クエリ・ハンドラ)
を使用します。これは、クエリの特性と現状を維持する構造に対するポインタです。Execute と Fetch
に対する参照と、Close に対する値によって渡されます。
ClassMethod SP1Close(qHandle As %Binary) As %Status]{ // ... }
ClassMethod SP1Execute(ByRef qHandle As %Binary, p1 As %String) As %Status{ // ...}
ClassMethod SP1Fetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer=0) As %Status{ // ...}
Query SP1(p1 As %String) As %%Query(CONTAINID=0,ROWSPEC="lastname:%String") [sqlproc ]{}
コードは通常、宣言を含み、SQL カーソルを使用します。%SQLQuery タイプのクエリから生成され
たカーソルは、自動的に Q14 などの名前を持ちます。クエリに個別の名前が与えられていることを
確認してください。
418 Caché SQL リファレンス
SQL の概念
クラス・コンパイラは、カーソルを使用する前に、カーソル宣言を見つける必要があります。したがっ
て、DECLARE 文 (通常は Execute 内) は、Close や Fetch と同じ MAC ルーチン内にあるべきで、
Close や Fetch よりも先に来る必要があります。CDL を直接編集するには、カーソル宣言が先に来
るように Close 定義と Fetch 定義の両方で PLACEAFTER メソッド・キーワードを使用します。
エラー・メッセージは、通常、桁を1桁余分に持っている内部カーソル名を参照します。したがって、
カーソル Q140 に対するエラー・メッセージは、おそらく Q14 を参照しています。
メソッドクラス・メソッドはストアド・プロシージャとして公開されます。このようなメソッドは、値を計算して、それ
を返さずにデータベースに保存するストアド・プロシージャのような動作に対して理想的です。
メソッドは %SQLProcContext タイプのパラメータを持ちます。このパラメータは参照によって渡され
ますが、ストアド・プロシージャに値によって渡されるパラメータすべてがその後に続きます。
%SQLProcContext は、SQL のステータスと RowCount から成り立っています。これらの値に関して
は何も行う必要はありませんが、クライアントによって解読されます。
メソッドは値を返しません。
例えば、CalcAvgScore メソッドがあるとします。
ClassMethod CalcAvgScore(pHandle As %SQLProcContext, firstname As %String,lastname As %String) [sqlproc]{ New SQLCODE,%ROWID &sql(UPDATE students SET avgscore = (SELECT AVG(sc.score) FROM scores sc, students st WHERE sc.student_id=st.student_id AND st.lastname=:lastname AND st.firstname=:firstname) WHERE students.lastname=:lastname AND students.firstname=:firstname)
IF ($g(pHandle)'=$$$NULLOREF) { SET pHandle.SQLCode = SQLCODE SET pHandle.RowCount = %ROWCOUNT } QUIT}
関連項目
• SQL : CALL CREATE FUNCTION CREATE PROCEDURE CREATE QUERY CREATE
METHOD
• "Caché SQL の使用法" の "ストアド・プロシージャ" の章
• Caché ObjectScript : DO コマンド
Caché SQL リファレンス 419
ストアド・プロシージャ
テーブル参照
一連のデータの参照を提供します。
identifier{.identifier} [[AS] alias]{join_expression}
(query) [[AS] alias]{join_expression}
"{" oj identifier{.identifier} [[AS] alias]{join_expression} "}"
"{" oj (query) [[AS] alias]{join_expression} "}"
引数
テーブル名を構成する識別子。修飾されているテーブル名では、最初の
identifier はスキーマ名で、2 番目の identifier がテーブル名です。
identifier
オプション — テーブルを参照するために使用される識別子。通常、フィー
ルドのテーブルを識別するためにフィールド名に追加された略名になりま
す。
alias
オプション—既存の2つのテーブル内でデータを結合して生成されたテー
ブルを定義する構文。利用可能なさまざまな結合があります。"JOIN" を
参照してください。
join_expression
概要テーブルは、行 (レコード) や列 (フィールド) に存在するデータの参照方法を提供します。
テーブルの名前付け規約
テーブル名は、修飾、未修飾のどちらでもかまいません。未修飾のテーブル名は、単純な識別子で
す (MyTable)。修飾されたテーブル名は、2 つの単純な識別子であるスキーマ名とテーブル名で
構成され、ピリオドで区切られています (MySchema.MyTable)。Caché は、テーブル名またはス
キーマ名に対して区切り文字付き識別子をサポートしません。
スキーマ名とテーブル名は、大文字と小文字を区別しません。有効なスキーマ名には、文字、数字、
およびアンダースコア文字 (_) 以外を含めることはできません。
未修飾のテーブル名には、(#import 文が指定されている場合を除き) システム既定の SQL スキー
マ名が割り当てられます。このデフォルト SQL スキーマ名は、SQLUser です。以下の方法により、
この既定をシステム全体で変更できます。
• ObjectScript $SYSTEM.SQL.SetDefaultSchema() 関数呼び出し。
420 Caché SQL リファレンス
SQL の概念
• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [SQL]
を選択します。[Default SQL Schema Name] の現在の設定を表示および編集します。
デフォルト SQL スキーマ名を _CURRENT_USER に設定する場合、既定スキーマは SQL にログイ
ンするために使用される処理のユーザ名となります。その処理がSQLにログインしない場合、SQLUser
が既定スキーマです。デフォルト SQL スキーマ名を _CURRENT_USER/Nameに設定する場合、既
定スキーマは SQL にログインするために使用される処理のユーザ名となります。その処理が SQL
にログインしない場合、Name が既定スキーマです。
注釈: デフォルト SQL スキーマ名を変更する場合、システム上のすべてのネームスペース内で
すべてのクエリ・キャッシュを手動で削除する必要があります。既定スキーマ名を変更する
と、未修飾のテーブル名を含むすべてのクエリの意味が変更されることになります。デフォ
ルト SQL スキーマ名は、Caché のインストール時に設定されたものをその後に修正しない
ことを強くお勧めします。
Caché は、スキーマ名を使用して、対応するパッケージ名を生成します。Caché はテーブル名を使
用して、対応するクラス名を生成します。スキーマ名またはテーブル名には長さの制限はありません
が、対応するパッケージ名やクラス名はそれぞれ 25 文字に切り捨てられます。
スキーマ名の最初の文字がアンダースコア文字である場合、この文字は対応するパッケージ名内
で小文字の "u" に置き換えられます。例えば、スキーマ名 _SYSTEM は、パッケージ名 uSYSTEM
を生成します。スキーマ名の最初の文字以外の任意の文字がアンダースコア文字である場合、この
文字は対応するパッケージ名内でピリオド (.) に置き換えられます。
関連項目ALTER TABLE 列 CREATE TABLE DROP TABLE INSERT JOIN ORDER BY SELECT UNION
UPDATE
トランザクション
ユニットを形成するオペレーションのセットを指定します。
概要トランザクションは、作業のユニットを構成する一連のデータ変更文です。
SET TRANSACTIONコマンドを使用して、現在のプロセスのトランザクション・パラメータを設定する
ことができます。START TRANSACTION コマンドを使用しても、同じパラメータを設定することがで
きます。これらのトランザクション・パラメータは、明示的に変更されるまで複数のトランザクションにわ
たり有効です。
START TRANSACTIONコマンドで、明示的にトランザクションを開始します。このコマンドはオプショ
ンです。トランザクション処理が設定されていると、トランザクションは最初のデータベース変更処理
で暗黙的に開始されます。
Caché SQL リファレンス 421
トランザクション
トランザクションが成功したら、COMMIT 文を使用して、そのデータ変更をデータベースに永久的
に追加して、リソースを解放することができます。
トランザクションが失敗した場合、そのデータ修正を元に戻す ROLLBACK 文を使用して、データ
ベースに反映されないようにします。
トランザクションは、ロックを使用して一意のデータ値を保護します。例えば、処理が一意のデータ値
を削除した場合、この値はこのトランザクションの有効期間内はロックされます。したがって、最初の
トランザクションが終了するまで、別の処理でこの同じ一意のデータ値を使用して行を挿入すること
はできません。これは、一意性制約を持つフィールドに結果的に重複値を持たせるロールバックを
防ぎます。これらのロックは、INSERT 文、UPDATE 文、および DELETE 文に %NOLOCK 制限引
数が含まれる場合を除いて、これらの文によって自動的に適用されます。
Caché SQL トランザクションには、クエリ・キャッシュの作成、変更、または削除は含まれません。した
がって、クエリ・キャッシュがトランザクション中に削除された場合、そのトランザクションはロールバッ
クし、クエリ・キャッシュは削除されたままの状態で (リストアされずに) ロールバック・オペレーション
になります。
トランザクションとセーブポイント
Caché SQL では、完全トランザクション処理とセーブポイントを使用したトランザクション処理の 2 種
類のトランザクション処理を実行できます。完全トランザクション処理の場合、トランザクションはSTART
TRANSACTION 文で (明示的または暗黙的に) 開始され、COMMIT 文でトランザクションを完了し
て実行されたすべての処理をコミットするか、ROLLBACK文でトランザクション中に実行されたすべ
ての処理を戻すまで、続きます。
セーブポイントを使用する場合、Caché SQLはトランザクション内でレベルをサポートします。START
TRANSACTION 文で、(明示的にまたは暗黙的に) トランザクションを開始します。トランザクション
内で 1 つ以上の SAVEPOINT 文を指定します。SAVEPOINT の指定により、その後の COMMIT
および ROLLBACK 文の動作が変わります。
• COMMIT により、直前のSAVEPOINT から実行されたすべての処理をコミットし、内部トランザ
クション・レベル・カウンタをディクリメントします。このトランザクション・レベル・カウンタが 0 に
なった場合のみ、COMMIT の実行によってトランザクションが終了します。このようにセーブポ
イントを含むトランザクションを完全にコミットするには、複数の COMMIT 文が必要です。
• ROLLBACK により、直前の SAVEPOINT から実行されたすべての処理をロールバックし、内
部トランザクション・レベル・カウンタをディクリメントします。このトランザクション・レベル・カウンタ
が 0 になった場合のみ、ROLLBACK の実行によってトランザクションが完全に戻ります。この
ように、セーブポイントを含むトランザクションを完全に戻すには、複数の ROLLBACK 文が必
要です。
• ROLLBACK saveptname により、saveptname で指定された SAVEPOINT から実行されたすべ
ての処理をロールバックし、内部トランザクション・レベル・カウンタを当該のセーブポイント・レベ
ル数だけディクリメントします。例えば、svpt1 と svpt2 という 2 つのセーブポイントを設定して、
svpt1 にロールバックする場合、ROLLBACK により svpt1 から実行された処理を戻し、この場
合は、トランザクション・レベル・カウンタを 2 つディクリメントします。
422 Caché SQL リファレンス
SQL の概念
COMMIT、ROLLBACK、およびROLLBACK saveptname コマンドを任意に組み合わせて使用し、
SAVEPOINT 文で区分けしたトランザクションを部分的にコミットしたり元に戻したりすることができま
す。
トランザクション・サイズの制限
ジャーナル・ファイルに利用できるスペースのほかには、トランザクションで指定できる処理数に制限
はありません。Cachéには自動ロック制御があるため、通常、ロック・テーブルのサイズが制限を課す
ことはありません。
既定では、テーブルごとに 1000 ロックのロックしきい値があります。1 つのテーブルは、現在のトラ
ンザクションに対して 1000個の一意データ値ロックを持つことが可能です。1001番目のロック処理
は、トランザクションの有効期間内はロック・テーブルに対してそのテーブル用のロックをエスカレー
トします。ロック制御のしきい値のサイズは、$SYSTEM.SQL.SetLockThreshold(integer) 関数呼び出
しを使用して、設定できます。この関数は現在のシステム全体の値と構成ファイルの設定の両方を
変更します。現在のロック制御のしきい値を確認するには、$SYSTEM.SQL.CurrentSettings() 関数
を使用します。
ノード削除処理の結果として削除できるサブノード (子テーブル) 数には制限があります。この制限
の既定値は、1000サブノードの削除です。この制限を超えたサブノード削除はジャーナルされず、
したがって、ロールバックできません。この既定の制限は、以下のように変更できます。
[システム管理ポータル] で [構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストで [Journal]
を選択します。[KillRollbackLimit] の現在の設定を表示および編集します。このオプションを 1000
から 65535 の間のすべての値に設定できます。
コミットされていないデータの表示
既定では、コミットされていないデータへの更新は、その他のユーザから読み取りアクセスで見るこ
とができます。これは、ISOLATIONLEVELREADUNCOMMITTEDと同じです。SETTRANSACTION
または START TRANSACTION で ISOLATION LEVEL READ COMMITTED を指定する場合、コ
ミットされていない更新は見ることができません。その代わり、コミットされていないデータを読み込も
うとした場合、ロック待ちになるかタイムアウトになることがあります。
関連項目COMMIT ROLLBACK SAVEPOINT SET TRANSACTION START TRANSACTION
Caché SQL リファレンス 423
トランザクション
トリガ動作
指定した作業を指定した方法で実行します。
ON UPDATE ref-action [ON DELETE ref-action] |ON DELETE ref-action [ON UPDATE ref-action]
引数
引き出された際にトリガが実行する方法。利用可能な値には、NOACTION
(何も実行しません)、CASCADE (変更内容を広めます)、SET NULL (値を
NULL に設定します)、および SET DEFAULT (指定した既定値を設定しま
す) があります。
ref-action
概要トリガ動作は、削除や更新など、指定したデータ処理イベントで実行されます。
トリガが実行されると、処理中の行に対する列の値を更新できません。例えば、処理中の行にある現
在のタイムスタンプに LastModified フィールドを設定できません。
関連項目CREATE TRIGGER DROP TRIGGER
ユーザ
システム上のユーザ・アカウントを指定します。
概要Caché では、CREATE USER コマンド、ALTER USER コマンド、DROP USER コマンドを使用して、
ユーザ定義を作成、変更、削除することができます。これらの文は、ODBCを経由して使用すること
ができます。
ユーザ定義を生成するには、以下のコマンドを使用します。
CREATE USER username IDENTIFY BY password
この文は、username という名前の新規のユーザ定義を作成します。パスワードは password で、
username と password は、両方とも識別子です。usernameの最大長は30文字です。usernameは、
大文字と小文字を区別しません。password は区別します。
424 Caché SQL リファレンス
SQL の概念
ユーザのパスワードを変更するコマンドは、以下のとおりです。
ALTER USER username IDENTIFY BY password
これによって、ユーザ username のパスワードを password に変更します。
ユーザ定義を削除するには、以下のコマンドを使用します。
DROP USER username
これによって、username という名前のユーザ定義が削除されます。
これらの操作を実行するには、システムのセキュリティ特権が必要です。
関連項目ALTER USER CREATE USER DROP USER
変数
埋め込み SQL で使用される変数です。
%MSG%OK%ROWCOUNT%ROWIDSQLCODE
概要以下の変数には、埋め込み SQL で特殊な使用方法があります。
%MSG
ユーザ定義のメッセージ文字列を受理する変数。これは、一般的には、SQL エラーまたはトリガ・
コードにより %OK=0 が設定されたときに特定のメッセージを発行して、トリガを中止するために使用
されます。
%OK
トリガ・コードで使用する変数。%OK が 0 (ゼロ) に設定されると、トリガ・コードを中止し、ロールバッ
クされます。トリガ・コードで明示的に %OK を 0 に設定することも、Caché で暗黙的に行うこともでき
ます。トリガ実行時に SQLCODE が発行されると、%OK は 0 に設定されます。
%ROWCOUNT
それぞれの FETCH を正常に実行した後、Caché SQL で設定された行カウンタの変数。CLOSE
時、または FETCH が SQLCODE 100 (データがない、またはこれ以上データがない) を返す
Caché SQL リファレンス 425
変数
と、%ROWCOUNT は検出された行数の合計に設定されます。また、INSERT コマンド、UPDATE コ
マンド、および DELETE コマンドも、%ROWCOUNT を、影響を受けた行数に設定します (0 または
1)。%ROWCOUNT は、メソッドまたはプロシージャの開始時に、自動的に NEW で処理されます。
SET name="LastName,FirstName",state="##" &sql(DECLARE EmpCursor CURSOR FOR SELECT Name, Home_State INTO :name,:state FROM Sample.Person) WRITE !,"BEFORE: Name=",name," State=",state &sql(OPEN EmpCursor) FOR { &sql(FETCH EmpCursor) QUIT:SQLCODE WRITE !,"Row fetched: ",%ROWCOUNT WRITE " Name=",name," State=",state } &sql(CLOSE EmpCursor) WRITE !,"AFTER: Name=",name," State=",state WRITE !,"Total rows fetched: ",%ROWCOUNT
%ROWID
直前の INSERT、UPDATE、または DELETE 処理で変更された行の行 ID。%ROWID は、メソッドま
たはプロシージャの開始時に、自動的に NEW で処理されます。
SQLCODE
SQLCODE 変数は、埋め込み SQL から返されると Caché SQL エラー・コード値を返します。詳細
は、このドキュメントの "SQL エラー・コード" を参照してください。SQLCODE は、メソッドまたはプロ
シージャの開始時に、自動的に NEW で処理されます。トリガ・コードで、SQLCODEを 0 以外の値
に設定すると、自動的に %OK が 0 に設定されます。
$USERNAME
SQL ユーザ名は、Caché ユーザ名と同じで、Caché ObjectScript の $USERNAME 特殊変数に格
納されています。
既定の SQL スキーマが _CURRENT_USER となるようにプロセスが構成されている場合、既定のス
キーマの名前は$USERNAME特殊変数の最初の部分になります。$USERNAMEには完全に修飾
されたスキーマ名が含まれます (例 : [email protected])。SQLは、既定のスキーマとして、
ユーザ名の部分(Deborah) を使用します。同じユーザ名の部分を持つ2つの異なる$USERNAME
変数は、同じ既定のスキーマ名を持ちます。
ビュー
単独または複数のテーブルから検索したデータに基づく仮想テーブルです。
概要ビューはディスク上に存在しない仮想テーブルで、SELECT文、または複数のSELECT文のUNION
で構成されるクエリに基づいた単独または複数のテーブルからのデータで構成されています。
426 Caché SQL リファレンス
SQL の概念
ライフ・サイクル内で操作できる関連コマンドは、以下のとおりです。
• CREATE VIEW — クエリに基づいたビューを作成します。
• ALTER VIEW — ALTER TABLE と似た方法でビューを変更します。
• DROP VIEW — ビューを削除します。
関連項目ALTER VIEW CREATE VIEW DROP VIEW
Caché SQL リファレンス 427
ビュー