caché sql リファレンス - intersystems...caché拡張のsql関数の最初の文字です。$...

438
Caché SQL リファレンス Version 5.1 2006-03-14 InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com

Upload: others

Post on 28-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

Caché SQL リファレンス

Version 5.12006-03-14

InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com

Page 2: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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:

[email protected]:

Page 3: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

目次

記号 .......................................................................................................................... 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

Page 4: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 リファレンス

Page 5: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 6: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 リファレンス

Page 7: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 8: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ユーザ .............................................................................................................. 424

変数 ................................................................................................................. 425

ビュー ............................................................................................................... 426

viii                                                                                                              Caché SQL リファレンス

Page 9: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

テーブル一覧

SQL 比較述語 ......................................................................................................... 183

LIKE ワイルドカード文字 ........................................................................................... 184

SQL 比較述語 ......................................................................................................... 356

LIKE ワイルドカード文字 ........................................................................................... 357

SQL エラー・コードおよびエラー・メッセージ・テキスト ...................................................... 391

Caché SQL リファレンス                                                                                                                ix

Page 10: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長
Page 11: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

記号

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

Page 12: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

名前と使用法記号

アンド記号 (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 リファレンス

記号

Page 13: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

名前と使用法記号

二重ハイフン : 単一の行のコメント文字。– –

ハイフン、より大きい (矢印) : 暗黙結合文字。– >

ピリオド (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 で使用する記号

Page 14: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

名前と使用法記号

角括弧 (開始) (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 リファレンス

記号

Page 15: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 16: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これは、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 関数

Page 17: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 18: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%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 関数

Page 19: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

他の例として、以下の検索クエリがあります。

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

Page 20: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 21: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

変更するテーブルの名前。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

Page 22: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• この文で、列に 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 関数

Page 23: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 24: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 25: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 26: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

使用できるパスワードは、文字 (大文字/小文字) あるいは % (パーセント記号) から始まるパスワー

ドです。その後ろに、任意の文字、任意の数字、_ (アンダースコア)、& (アンパサンド)、$ (ドル記号)、

@ (アットマーク) を自由に組み合わせて使用できます。パスワードは大文字と小文字が区別されま

す。ユーザ名は、大文字と小文字が区別されません。

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 関数

Page 27: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 28: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 29: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下に例を示します。

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

Page 30: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 31: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これは、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

Page 32: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 33: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

現在のトランザクションで発生する変更すべての集約関数と同様に、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

Page 34: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 35: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 36: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 37: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

どちらの 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

Page 38: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 39: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 40: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

文字列のキャスト

文字列は他の文字データ型にキャストできます。得られる返り値は、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 関数

Page 41: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

日付を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

Page 42: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例では、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 関数

Page 43: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目

• データ型 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

Page 44: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これは、-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 関数

Page 45: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 46: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 47: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、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

Page 48: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 49: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

埋め込み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

Page 50: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 51: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 52: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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 関数

Page 53: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

トランザクションに 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

Page 54: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 55: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

注釈: これら 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

Page 56: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 57: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 58: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 59: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 60: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 61: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 62: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 63: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引数

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

Page 64: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

メソッドを生成するクラス名を指定します。そのクラスが存在しない

場合は新規作成します。関数名を認証することによりクラス名を指

定することもできます。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 関数

Page 65: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 66: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 67: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

大長は 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

Page 68: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 69: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

システム管理ポータルを使用して、特定のクラス(テーブル)のインデックスをすべて再構築すること

もできます。

詳細は、"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

Page 70: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 71: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引数

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

Page 72: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

メソッドを生成するクラス名を指定します。そのクラスが存在しない場合

は新規作成します。メソッド名を認証することによりクラス名を指定する

こともできます。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 関数

Page 73: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 74: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 75: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

プロシージャのプログラム・コード

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

Page 76: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• パラメータ・モードが 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 関数

Page 77: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味メソッド・キーワード

サブクラスによってメソッドがオーバーライドされないように指定

します。既定では、メソッドは最終ではありません。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

Page 78: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要クエリ・キーワード

データ・フィールドをクエリで返された順序で指定します。各

フィールドには、列名、データ型 (既定で属性に割り当てられ

た型と異なる場合)、そしてオプションで見出しを指定します。

これらフィールドの特性はコロンで区切ります。結果セット内

の異なるフィールドはコンマで区切ります。

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 関数

Page 79: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

るのは、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

Page 80: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 81: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 82: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 83: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 84: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

の場合、論理から表示への変換が適用され、表示形式値が返されます。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 関数

Page 85: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

システム管理ポータルで、[クラス]オプションを選択し、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

Page 86: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 87: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 88: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引数

作成するテーブルの名前。有効な識別子を指定し

ます。テーブル名は修飾 (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 関数

Page 89: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 90: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 生成されたクラス名には句読点が含まれないため、句読点のみが異なるテーブル名の作成は

可能ですが、お勧めできません。

• テーブル名は 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 関数

Page 91: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

既存のテーブル

既存のテーブルと同じ名前のテーブルを作成しようとしたときの反応は、構成設定により異なります。

既定では、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

Page 92: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 93: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

フィールド名

フィールド名は、識別子の規約に従い、テーブル名と同様の制約を受けます。フィールド名は 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

Page 94: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 95: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

フィールドのデータ制約データ制約によって、フィールドに許可される値、フィールドの既定値、およびデータ値に使用され

る照合タイプが規定されます。これらのデータ制約は、すべてオプションです。データ制約は、どの

ような順序でも指定できます。詳細は、"フィールド制約" を参照してください。

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

Page 96: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

また、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 関数

Page 97: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 98: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 99: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

外部キー定義は、以下の 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

Page 100: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下は、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 関数

Page 101: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

オプション — テーブルに、同じタイミングおよび

イベントに対して複数のトリガが存在する場合に

トリガを引き出す順番。順番の指定を省略したト

リガには、順番 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

Page 102: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引数

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 関数

Page 103: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 104: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これらのトリガは、(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 関数

Page 105: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 106: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 107: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 108: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 109: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目

• 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

Page 110: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 111: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

このオプションが “偽 (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

Page 112: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ビュー定義に使用する 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 関数

Page 113: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

に発行できます。ビュー経由の更新を許可するには、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

Page 114: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は、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 関数

Page 115: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 116: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 117: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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

Page 118: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

秒の小数部の精度

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 関数

Page 119: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 120: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

秒の小数部の精度

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 関数

Page 121: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 122: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

埋め込み 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 関数

Page 123: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 124: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

計算された日付は、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 関数

Page 125: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

有効な日付を返します。例えば、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

Page 126: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

範囲と値のチェック

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 関数

Page 127: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例も、元のタイムスタンプに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

Page 128: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 129: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

リテラルとして無効な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

Page 130: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 131: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例では、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

Page 132: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

返り値省略形日付部分

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 関数

Page 133: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 134: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 日付値または時刻値が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 関数

Page 135: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 136: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

返り値省略形日付部分

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 関数

Page 137: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 138: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 139: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例えば、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

Page 140: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 141: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

日部分が '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

Page 142: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目

• 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 関数

Page 143: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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

Page 144: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 145: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例では、年フィールドの値が両方とも省略されています。ただし、これらの例によって返され

る値は異なることに注意してください。最初の例は日付区切り文字で始まり、年値が無指定であるこ

とを示しています。この例では、無指定の年がうるう年でないと想定されるため、整数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

Page 146: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 147: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 148: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 149: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 150: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 151: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 152: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• [システム管理ポータル] で [システム構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リス

トで [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 関数

Page 153: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 154: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 155: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 156: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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 関数

Page 157: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 158: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 159: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 160: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 161: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

除されます。テーブル・ベースでデータの削除を指定するには、システム全体の既定の設定でテー

ブル・データを削除しないように設定して、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

Page 162: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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 関数

Page 163: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 164: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 165: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 166: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

他のビューから参照されるビュー

クエリで他のビューから参照されているビューを削除しようとすると、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 関数

Page 167: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

文字列に対する 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

Page 168: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 169: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、整数 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

Page 170: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 171: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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

Page 172: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 173: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 174: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 175: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 176: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 177: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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

Page 178: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例では、$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 関数

Page 179: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 180: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 181: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 182: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は、テーブル名のエイリアスの使用方法を示します。

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 関数

Page 183: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 184: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

現在の日付と時刻を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 関数

Page 185: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 186: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 187: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 188: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

するロールの付与や削除はできず、$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 関数

Page 189: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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

Page 190: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

特権の強制

特権の強制は、以下に示すような [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 関数

Page 191: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• ユーザ 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

Page 192: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 193: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 194: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 195: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 196: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の 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 関数

Page 197: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 198: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は、日付/時刻文字列の時刻部分が省略されているので、ゼロ時を返します。

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 関数

Page 199: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 200: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、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 関数

Page 201: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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

Page 202: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 203: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 各フィールドの値が有効な値である必要があります。無効なフィールド値を挿入すると、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

Page 204: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ストリーム・データの 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 関数

Page 205: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 206: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ここでの "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 関数

Page 207: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目%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

Page 208: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

包含するプログラムのホスト変数値の使用に関する重要な制限事項の詳細は、"ホスト変数"を参照

してください。

例以下の例は、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 関数

Page 209: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目

• 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

Page 210: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

返り値比較テスト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 関数

Page 211: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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

Page 212: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 213: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 214: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 215: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

等式のオペランドは任意の順序で指定できます。例えば、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

Page 216: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例えば、患者に関する情報を格納した 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 関数

Page 217: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 218: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下のテーブルを作成します。

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 関数

Page 219: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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

Page 220: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 221: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 222: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 223: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、文字列の長さ 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

Page 224: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

メモ

$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 関数

Page 225: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 226: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

年モデルメーカー名前

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 関数

Page 227: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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

Page 228: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 229: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 230: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 231: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 232: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 233: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要$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

Page 234: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 235: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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

Page 236: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 237: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

メモ

無効な引数値

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

Page 238: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

$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 関数

Page 239: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 240: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 241: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 242: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 243: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 244: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 245: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 246: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 247: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 248: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 249: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 250: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

データ値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 関数

Page 251: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 252: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は、日付/時刻文字列から時刻式が省略されているので、ゼロ分を返します。

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 関数

Page 253: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 254: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

月部分が '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 関数

Page 255: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目

• 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

Page 256: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、日付式 (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 関数

Page 257: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要単項演算子は、数値データ型カテゴリのすべてのデータ型の式の中でも、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

Page 258: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

現在の日付のみを返すには、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 関数

Page 259: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 260: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

返り値比較テスト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 関数

Page 261: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 262: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は、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 関数

Page 263: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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

Page 264: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 265: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 266: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 267: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これは、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

Page 268: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引数

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 関数

Page 269: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

または正の整数に評価される式でなければなりません。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

Page 270: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例は '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 関数

Page 271: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

最初の例では、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

Page 272: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 273: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

+ (正の数)

Page 274: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、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 関数

Page 275: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 276: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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 関数

Page 277: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 278: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 279: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ユーザがすでに存在する場合は、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

Page 280: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 281: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 282: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 283: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 284: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の埋め込み 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 関数

Page 285: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 286: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 287: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 288: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 289: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

検索する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

Page 290: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 291: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 292: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 293: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

- 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

Page 294: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

- 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 関数

Page 295: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

外部関数を使用して %ルーチン (%文字で始まる名前を持つルーチン)を呼び出せません。実

行しようとすると 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

Page 296: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の 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 関数

Page 297: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 298: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

サブクエリである 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 関数

Page 299: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 300: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 301: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

新、削除、および選択にロックをかける必要がある際に使用します。使用できる値は、正の整数で

す。タイムアウトの設定はプロセスごとに行います。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

Page 302: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 303: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

説明日付/時刻オプション・キーワード

正整数。既定値は 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

Page 304: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

説明日付/時刻オプション・キーワード

整数。既定値は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 関数

Page 305: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 306: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 307: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 308: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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 関数

Page 309: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 310: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 311: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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

Page 312: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 313: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

その他の大文字/小文字変換関数

%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

Page 314: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下のクエリは、文字列トランケーションを持つ %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 関数

Page 315: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 316: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

クションを開始します。トランザクションがすでに進行中の場合、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 関数

Page 317: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

変更されている値を返すため、任意の時点の集約値はその時点のトランザクションで発生している

正確な変更の状態を反映することができません。

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

Page 318: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 319: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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

Page 320: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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 関数

Page 321: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 322: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 323: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 324: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 325: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 326: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下のクエリは、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 関数

Page 327: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 328: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 329: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 秒の小数部を含めても省略してもかまいません。

範囲と値のチェック

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

Page 330: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

上記の例は 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 関数

Page 331: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

Page 332: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 日付値または時刻値が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 関数

Page 333: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 時刻整数をフォーマットされた時刻文字列に変換する。

• 数をフォーマットされた数値文字列に変換する。

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

Page 334: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味形式コード

下 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 関数

Page 335: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味形式コード

時間 (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

Page 336: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

最初の例は、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 関数

Page 337: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

説明例形式コー

先行するゼロを付けて戻します。

後のゼロを付けて戻します。

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

Page 338: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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 関数

Page 339: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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

Page 340: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

&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 関数

Page 341: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• フォーマットされた日付表示文字列を日付に変換する。

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

Page 342: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• その他すべての形式文字列は、英数字でない区切り文字(スペース、スラッシュ、ハイフンなど)

で要素を区切らなければなりません。区切り文字は、出力文字列にリテラルとして表示されま

す。

• 無効の形式要素の文字は、出力文字列にリテラルとして表示されます。

日付形式の要素

以下のテーブルは、整数を日付文字列に変換する際に 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 関数

Page 343: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

指定できます。その他すべての文字を取り込むと、文字 '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

Page 344: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 345: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下の例では、現在の日付を返し、指定した形式(または既定の形式)を使用してその結果をフォー

マットするさまざまな日付関数を使用しています。

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

Page 346: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 347: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目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

Page 348: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、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 関数

Page 349: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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

Page 350: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

次の例では、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 関数

Page 351: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

%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

Page 352: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 353: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 354: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 関数

Page 355: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

と、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

Page 356: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

てトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な更新を実行できま

す。このロックしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの

"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 関数

Page 357: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、名前の大文字フォームが "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

Page 358: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 359: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 360: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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 関数

Page 361: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

しかし、部分文字列を完全に省略するとエラー・コード -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

Page 362: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 363: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

合、その日曜日は 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

Page 364: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 365: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 366: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 367: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 368: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

等値比較

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 関数

Page 369: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 370: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 371: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 372: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

クエリは以下のとおりです。

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 関数

Page 373: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 374: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 375: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

指定された 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 はこの文字を対応するエンコード形式に変換します。

アンド記号 (&) は &amp; となります。

Caché SQL リファレンス                                                                                                             365

XMLELEMENT

Page 376: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

アポストロフィ (') は &apos; となります。

引用符 (") は &quot; となります。

左山括弧 (<) は &lt; となります。

右山括弧 (>) は &gt; となります。

入力文字列でアポストロフィを表すには、'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 関数

Page 377: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下のクエリは、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

Page 378: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

概要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 はこの文字を対応するエンコード形式に変換します。

アンド記号 (&) は &amp; となります。

アポストロフィ (') は &apos; となります。

368                                                                                                             Caché SQL リファレンス

SQL コマンドおよび SQL 関数

Page 379: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

引用符 (") は &quot; となります。

左山括弧 (<) は &lt; となります。

右山括弧 (>) は &gt; となります。

入力文字列でアポストロフィを表すには、'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

Page 380: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 関数

Page 381: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下のメソッド・コールを使用することで、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

Page 382: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長
Page 383: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

Page 384: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

算術式

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 の概念

Page 385: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

列の名前を指定します。

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

Page 386: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

指定したテーブルから、テーブル名のエイリアスを接頭語として指定した列を選択します。

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 の概念

Page 387: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

条件式

Page 388: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

比較条件には、> (より大きい)、>= (以上)、< (未満)、<= (以下)、= (等しい)、<> (等しくな

い)、%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 の概念

Page 389: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味記号

角括弧で囲まれた引数はオプションです。何も指定しないか、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

カーソル

Page 390: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

例以下の例は、埋め込み 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 の概念

Page 391: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

対応する 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

データ型

Page 392: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

対応する 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 の概念

Page 393: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

対応する 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

データ型

Page 394: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

対応する 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 の概念

Page 395: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 関数パラメータ — これは 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

データ型

Page 396: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

結果として、[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 の概念

Page 397: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

データ型の変換

特定の型から別の型にデータ型を変換するには、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

日付/時刻文

Page 398: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

詳細は、"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 の概念

Page 399: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

既定のユーザ名とパスワード

Page 400: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• SQLCODE=100は、SQL操作は成功したが処理するデータが見つからないことを意味します。

これは、さまざまな理由で発生します。SELECT の場合、指定したテーブルにデータがない、

テーブルにクエリの条件を満たすデータがない、行の検索がテーブルの最終行に達した、など

の理由があります。UPDATEまたはDELETEの場合、指定したテーブルにデータがない、テー

ブルに WHERE 節の条件を満たすデータの行がない、などの理由があります。このような場

合、%ROWCOUNT=0 となります。

SQLCODE エラー・コード

390                                                                                                             Caché SQL リファレンス

SQL の概念

Page 401: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

エラー・コード

Page 402: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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 の概念

Page 403: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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

エラー・コード

Page 404: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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 の概念

Page 405: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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

エラー・コード

Page 406: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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 の概念

Page 407: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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

エラー・コード

Page 408: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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 の概念

Page 409: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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

エラー・コード

Page 410: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

意味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 の概念

Page 411: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• 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

ホスト変数

Page 412: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

入力ホスト変数は、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 の概念

Page 413: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

ホスト変数

Page 414: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 の概念

Page 415: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

名やフィールド名の 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

識別子

Page 416: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

最初の 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 の概念

Page 417: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

識別子

Page 418: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

リテラル

実際の文字の値を表します。

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 の概念

Page 419: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

文字列の区切り文字

文字列の区切り文字として、一重引用符 (') または二重引用符 (") のいずれかを使用できます。一

重引用符 (') は、好ましい区切り文字です。二重引用符 (") の使用は、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

Page 420: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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 の概念

Page 421: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ただし、標準 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

Page 422: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

関連項目リテラル 値

クエリ

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 の概念

Page 423: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

以下は、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

クエリ

Page 424: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

予約語

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 の概念

Page 425: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

予約語

Page 426: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

スカラ式

スカラ値を説明する数式です。

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 の概念

Page 427: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ストアド・プロシージャ

名前を付けて保存され、その名前で呼び出される 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

ストアド・プロシージャ

Page 428: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

これらすべてのメソッドは、クライアントからストアド・プロシージャが呼び出されるたびに自動的に呼

び出されますが、論理的には、サーバで起動している 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 の概念

Page 429: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

クラス・コンパイラは、カーソルを使用する前に、カーソル宣言を見つける必要があります。したがっ

て、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

ストアド・プロシージャ

Page 430: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

テーブル参照

一連のデータの参照を提供します。

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 の概念

Page 431: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

• [システム管理ポータル]で [構成]→[詳細設定]を選択し、[カテゴリ]プルダウン・リストで [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

トランザクション

Page 432: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

トランザクションが成功したら、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 の概念

Page 433: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

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

トランザクション

Page 434: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

トリガ動作

指定した作業を指定した方法で実行します。

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 の概念

Page 435: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ユーザのパスワードを変更するコマンドは、以下のとおりです。

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

変数

Page 436: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

と、%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 の概念

Page 437: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長

ライフ・サイクル内で操作できる関連コマンドは、以下のとおりです。

• CREATE VIEW — クエリに基づいたビューを作成します。

• ALTER VIEW — ALTER TABLE と似た方法でビューを変更します。

• DROP VIEW — ビューを削除します。

関連項目ALTER VIEW CREATE VIEW DROP VIEW

Caché SQL リファレンス                                                                                                             427

ビュー

Page 438: Caché SQL リファレンス - InterSystems...Caché拡張のSQL関数の最初の文字です。$ $$ 二重ドル記号:CachéObjectScript外部関数の呼び出し。パーセント記号(37):有効な識別子名の最初の文字(最初の文字のみ)。ロール名の接頭語。(例)%All。データ型の最大長