Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

言語要素

Caché SQL は以下の言語要素をサポートします。

コマンドとキーワード

Caché SQL コマンド (SQL 文とも呼ばれる) は、キーワードで始まり、1 つ以上の引数が続きます。この引数のいくつかは、固有のキーワードで識別できる節または関数である場合があります。

  • Caché SQL コマンドには、空白の制約はありません。コマンド項目をスペースで区切る場合、少なくとも 1 つのスペースが必要です。コマンド項目をコンマで区切る場合、スペースは不要です。算術演算子の前後のスペースは不要です。スペースで区切られた項目間、引数のコンマ区切りリストの項目間、あるいは算術演算子の前後には、改行または複数のスペースを挿入してもかまいません。

  • Caché SQL コマンドには、コマンド・ターミネータはありません。ただし例外として、SQL プロシージャ・コードまたはトリガ・コードなどの特定のケースでは、SQL コマンドは単一のセミコロン (;) で終了します。それ以外の場合、Caché SQL コマンドは、セミコロンのコマンド・ターミネータを必要としないかまたは受け入れません。SQL コードを Caché SQL にインポートすると、セミコロンのコマンド・ターミネータは削除されます。

Caché SQL のキーワードには、コマンド名、関数名、述語条件名、データ・タイプ名、フィールド制約、最適化オプション、および特殊変数などがあります。また、AND、OR、および NOT 論理演算子、NULL 列値インジケータ、および ODBC 関数構文 ({d dateval} および {fn CONCAT(str1,str2)} など) があります。

  • キーワードでは、大文字と小文字は区別されません。慣例により、キーワードはこのドキュメントでは大文字で表されますが、Caché SQL では大文字/小文字の制限はありません。

  • 多数のキーワードが SQL 予約語となっています (すべてではありません)。Caché SQL では、明確に解析できないキーワードのみが予約されています。SQL 予約語は、区切り識別子として使用できます。

リテラル

Caché SQL リテラルの構文は、以下のとおりです。

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 は、この符号をリテラルの一部として扱います。コンマまたは空白は、数値内で使用できません。

  • 文字列リテラルは、あらゆる種類の文字の文字列を囲む 1 組みの区切り文字で構成されます。優先的に使用される区切り文字は、一重引用符 (以下を参照) です。文字列内で区切り文字をリテラルとして指定するには、'Mary''s office' のように、その文字を重複して使用します。

空文字列はリテラル文字列です。2 つの一重引用符 ('') で表されます。NULL はリテラル値ではありません。値が存在しないことを表します。詳細は、この章の "NULL および空文字列" を参照してください。

Note:

埋め込み SQL では、## で始まるいくつかの文字シーケンスは、文字列リテラル内での使用が許可されません。これについては、“埋め込み SQL の使用法” の章の "リテラル値" で説明しています。この制約は、ダイナミック SQL などの、他の SQL の呼び出しには適用されません。

文字列の区切り文字

文字列の区切り文字として、一重引用符 (') または二重引用符 (") のいずれかを使用できます。一重引用符 (') は、好ましい区切り文字です。二重引用符 (") の使用は、SQL 互換性に対してはサポートされますが、区切り識別子の標準と競合する可能性があるためお勧めできません。

文字列内のリテラル文字である区切り文字として使用する文字を指定するには、これらの 1 組みの文字を指定します。

連結

二重の垂直バー (||) は、好ましい SQL 連結演算子です。2 つの数値、2 つの文字列、または 1 つの数値と 1 つの文字列を連結するために使用できます。

アンダースコア文字 (_) は、ObjectScript の互換性のために SQL 連結演算子として指定されます。連結演算子は、2 つの文字列を連結するためにのみ使用できます。

2 つの演算子が両方とも文字列であり、両方の文字列の照合タイプが同じ場合、結果として得られる連結文字列には、その照合タイプが含まれます。その他の場合はいずれも、連結の結果の照合タイプは EXACT です。

NULL および空文字列

値を指定しないことを示すには、NULL キーワードを使用します。NULL は、何らかの理由でデータ値が指定されていないか存在しないことを示す、SQL で常に推奨されている方法です。

長さゼロの SQL 文字列 (空文字列) は、2 つの一重引用符で指定します。空文字列 ('') は NULL と同じではありません。空文字列は定義済みの値であり、文字を含まない文字列で、長さ 0 の文字列です。長さゼロの文字列は、非表示文字 $CHAR(0) により内部的に表されます。

Note:

長さゼロの SQL 文字列をフィールドの入力値またはフィールドの既定値として使用することはお勧めしません。データ値がないことを表すには、NULL を使用します。

長さゼロの SQL 文字列は、SQL コーディングでは使用しないでください。ただし、多くの SQL 処理では末尾の空白スペースが削除されるため、空白文字 (スペースおよびタブ) のみを含むデータ値が、長さゼロの SQL 文字列となる場合があります。

さまざまな SQL 長さ関数がそれぞれ異なる値を返すことに注意してください。LENGTHCHAR_LENGTH、および DATALENGTH は、SQL の長さを返します。$LENGTH は、ObjectScript 表現での長さを返します。後述の “NULL の長さ” を参照してください。LENGTH は末尾の空白スペースを数えません。他のすべての長さ関数は、末尾の空白スペースを数えます。

また、長さゼロの SQL 文字列は、すべての SQL 文字列と同様に二重引用符 ("") で表現できますが、この方法はSQL 区切り識別子と競合する可能性があるため使用しないでください。

NULL の処理

NOT NULL データ制約は、1 つのフィールドが 1 つのデータ値を取得することを必要とします。値ではなく NULL を指定することはできません。この制約は、空文字列値の使用を妨げません。詳細は、"CREATE TABLE" コマンドを参照してください。

SELECT 文の WHERE 節または HAVING 節内の IS NULL 述語は、NULL 値を選択します。空文字列値は選択しません。

IFNULL 関数は、フィールド値を評価し、フィールドが NULL に評価された場合、その 2 番目の引数で指定されている値を返します。空文字列値は、NULL でない値として処理されません。

COALESCE 関数は、指定されたデータから最初の NULL でない値を選択します。空文字列は、NULL でない値として処理されます。

CONCAT 関数または連結演算子 (||) が 1 つの文字列と 1 つの NULL を連結すると、結果は NULL になります。詳細は、以下の例を参照してください。

SELECT {fn CONCAT('fred',NULL)} AS FuncCat,   -- returns <null>
       'fred'||NULL AS OpCat                  -- returns <null>

AVGCOUNTMAXMIN、および SUM 集約関数は、処理を実行するときに NULL 値を無視します (すべてのフィールドに NULL 値 を持つレコードは存在できないため、COUNT * はすべての行をカウントします)。SELECT 文の DISTINCT キーワードは、その処理に NULL を含みます。指定したフィールドに NULL 値が存在する場合、DISTINCT は NULL 行を返します。

AVGCOUNT、および MIN 集約関数は、空文字列値の影響を受けます。MIN 関数は、ゼロ値を持つ行がある場合でも、空文字列を最小値と判断します。MAX および SUM 集約関数は、空文字列値の影響を受けません。

式の中の NULL

ほとんどの SQL 関数にオペランドとして NULL を指定すると、NULL が返されます。

NULL をオペランドとして持つ任意の SQL 算術演算は、NULL 値を返します。したがって、7+NULL=NULL となります。これには、二項演算子の加算 (+)、減算 (-)、乗算 (*)、除算 (/)、整数除算 (\)、モジュロ (#)、および単項演算子符号のプラス (+) およびマイナス (-) が含まれます。

算術演算で指定された空文字列は、0 (ゼロ) 値として処理されます。空文字列 (6/'') による除算 (/)、整数除算 (\)、またはモジュロ (#) は、<DIVIDE> エラーになります。

NULL の長さ

SQL 内では、NULL の長さは未定義です (<null> を返します)。しかし、空文字列の長さは、長さゼロとして定義されています。詳細は、以下の例を参照してください。

SELECT LENGTH(NULL) AS NullLen,   -- returns <null>
       LENGTH('') AS EmpStrLen    -- returns 0

この例で示すように、SQL LENGTH 関数は SQL の長さを返します。

以下の例に示すように、ASCII 関数を使用して、長さゼロの SQL 文字列を NULL に変換できます。

SELECT LENGTH(NULL) AS NullLen,                  -- returns <null> 
       LENGTH({fn ASCII('')}) AS AsciiEmpStrLen, -- returns <null>
       LENGTH('') AS EmpStrLen                   -- returns 0

ただし、標準 SQL に対する特定の Caché の拡張は、NULL と空文字列のそれぞれの長さを処理します。$LENGTH 関数は、これらの値の Caché 内部表現を返します。NULL は、長さゼロの定義済みの値として表され、SQL の空文字列は、長さ 0 の文字列として表されます。この機能は、ObjectScript と互換性があります。

SELECT $LENGTH(NULL) AS NullLen,    -- returns 0
$LENGTH('') AS EmpStrLen,           -- returns 0
$LENGTH('a') AS OneCharStrLen,      -- returns 1
$LENGTH(CHAR(0)) AS CharZero        -- returns 0 

これらの値の内部表現が有効な別の場所は、%STRING%SQLSTRING、および %SQLUPPER 関数内です。これらの関数は、空白スペースを値に追加します。NULL は実際には値を持たないため、それに空白を追加すると、長さが 1 の文字列が作成されます。一方、空文字列は文字値を持つため、それに空白を追加すると、長さが 2 の文字列が作成されます。以下の例を参照してください。

SELECT CHAR_LENGTH(%STRING(NULL)) AS NullLen,  -- returns 1
CHAR_LENGTH(%STRING('')) AS EmpStrLen          -- returns 2

この例では、LENGTH ではなく CHAR_LENGTH が使用されることに注意してください。LENGTH 関数は末尾の空白を削除するため、LENGTH(%STRING(NULL)) は長さ 0 を返します。LENGTH(%STRING('')) は、%STRING が末尾の空白ではなく先頭の空白を付加するため、長さ 2 を返します。

ObjectScript と SQL

SQL の NULL が ObjectScript へ出力されると、ObjectScript の空文字列 ("")、つまり長さゼロの文字列で表されます。

長さゼロの SQL 文字列データが ObjectScript に出力されると、長さ 1 の文字列である $CHAR(0) を含む文字列で表されます。

   &sql(SELECT NULL,''
        INTO :a,:b)
  WRITE !,"NULL length: ",$LENGTH(a)         // returns 0
  WRITE !,"empty string length: ",$LENGTH(b) // returns 1

ObjectScript では、通常、値が存在しないことを空文字列 ("") で示します。この値が埋め込み SQL に渡される場合は、以下の例に示すように、NULL 値として処理されます。

  SET x=""
  SET myquery="SELECT NULL As NoVal,:x As EmpStr"
  SET tStatement=##class(%SQL.Statement).%New()
  SET qStatus=tStatement.%Prepare(myquery)
  IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset=tStatement.%Execute()
  WHILE rset.%Next() {
    WRITE "NoVal:",rset.%Get("NoVal")," length ",$LENGTH(rset.%Get("NoVal")),!      // length 0
    WRITE "EmpStr:",rset.%Get("EmpStr")," length ",$LENGTH(rset.%Get("EmpStr")),!   // length 0
  }
  WRITE "End of data"

定義されていない入力ホスト変数を指定した場合、埋め込み SQL はその値を NULL として処理します。

NULL または空文字列値を埋め込み SQL から ObjectScript に渡すと、NULL は長さ 0 の文字列に変換され、空文字列は長さ 1 の文字列に変換されます。以下に例を示します。

   &sql(SELECT 
        NULL,
        ''
        INTO :a,:b)
  WRITE !,"The length of NULL is: ",$LENGTH(a)         // length 0
  WRITE !,"The length of empty string is: ",$LENGTH(b) // length 1

以下の例では、空白を追加された SQL 空文字列は、文字列長 2 として渡されます。

   &sql(SELECT %SQLUPPER('')
        INTO :y
        FROM Sample.Person)
  WRITE !,"SQL empty string length: ",$LENGTH(y)

算術演算子と算術関数

Caché SQL は以下の算術演算子をサポートします。

+ 加算演算子。例えば、17+7 は 24 に等しくなります。
減算演算子。例えば、17-7 は 10 に等しくなります。これらの文字のペアは、Caché SQL コメント指示子であることに注意してください。このため、複数の減算演算子つまりマイナス記号を指定するには、スペースまたは括弧を使用する必要があります。例えば、17- -7 または 17-(-7) は 24 と等しくなります。
* 乗算演算子。例えば、17*7 は 119 に等しくなります。
/ 除算演算子。例えば、17/7 は 2.428571428571428571 に等しくなります。
\ 整数除算演算子。例えば、17\7 は 2 に等しくなります。
# モジュロ演算子。例えば、17 # 7 は 3 に等しくなります。# 文字は有効な識別子文字でもあるため、これをモジュロ演算子として使用するには、前後にスペースを入れ、オペランドと区切って指定する必要があります。
E 指数 (科学的記数法) 演算子。大文字小文字のいずれでも使用できます。例えば、7E3 は 7000 に等しくなります。指数が大きすぎると、SQLCODE -7 “指数が範囲外です” というエラーが発生します。例えば、1E3097E308 の場合などです。
() グループ化演算子。算術演算子の入れ子に使用します。括弧を使用しないと、Caché SQL の算術演算子の実行順序は、厳密に左から右です。例えば、17+7*2 は 48 ですが、17+(7*2) は 31 となります。
|| 結合演算子。例えば、17||7 は 177 に等しくなります。

算術演算は、キャノニック形式の数字に対して実行されます。

どのデータ型の数値についても、加算 (+)、減算 (-)、乗算 (*)、除算 (/、\、または #) の演算結果のデータ型は通常は NUMERIC になりますが、一方または両方の引数のデータ型が DOUBLE の場合は、結果のデータ型は DOUBLE になります。例えば、INTEGER データ型の 2 つのフィールドを加算すると、NUMERIC データ型の値になります。任意のデータ型の 2 つの数値を連結すると、VARCHAR 文字列になります。

ダイナミック SQL では、SQL 列のメタデータを使用して、結果セット・フィールドのデータ型を確認できます。数値データ型の詳細は、SQL データ型を参照してください。

演算子の優先順位

SQL-92 標準は演算子の優先順位に関して不正確です。このことについての前提は SQL 実装間で異なります。

  • Caché SQL は、既定では算術演算子の優先順位を規定しません。既定では、Caché SQL には演算子の優先順位はなく、算術式は必ず左から右の順番で実行されます。これは、ObjectScript で使用される規則と同じです。したがって 3+3*5 は 30 になります。演算順位を指定するには、括弧を使用します。したがって 3+(3*5) は 18 に等しくなります。開発者は、注意深く括弧を使用して、意図を明示する必要があります。

  • Caché SQL は、算術演算子に関する ANSI の優先順位をサポートするように構成できます。これは、システム全体の構成設定です。ANSI の優先順位を構成した場合、演算子 "*"、"\"、"/"、および "#" は、演算子 "+"、"-"、および "||" よりも優先順位が高くなります。優先順位の高い演算子は、優先順位の低い演算子より先に実行されます。したがって 3+3*5 は 18 になります。この優先順位は、必要に応じて括弧を使用することでオーバーライドできます。したがって (3+3)*5 は 30 になります。

    優先順位の構成には、管理ポータルを使用できます。[一般SQL設定] で、[ANSI の演算子優先順位を適用する] チェック・ボックスにチェックを付けて、[保存] ボタンをクリックします。この SQL オプションの変更内容は、すぐにシステム全体で有効になります。このオプションを変更すると、すべてのクエリ・キャッシュがシステム全体で削除されます。

    優先順位は、$SYSTEM.SQL.SetANSIPrecedence()Opens in a new tab メソッドを使用して構成することもできます。

    SQL の優先順位を変更しても、ObjectScript には影響しません。ObjectScript は常に、厳密に左から右へ算術演算子を実行します。

精度と小数桁数

NUMERIC 結果の 精度 (数値内の最大桁数) は、以下のようになります。

  • 加算または減算は、resultprecision=max(scale1, scale2) + max(precision1–scale1, precision2–scale2)+1 というアルゴリズムによって決定されます。計算値 resultprecision が 36 より大きい場合、有効桁数の値は 36 に設定されます。

  • 乗算は、resultprecision=min(36, precision1+precision2+1) というアルゴリズムによって決定されます。

  • 除算 (value1 / value2) は、resultprecision=min(36, precision1–scale1+scale2+max(6, scale1+precision2+1)) というアルゴリズムによって決定されます。

NUMERIC 結果の スケール (小数部の最大桁数) は、以下のようになります。

  • 加算または減算は、resultscale=max(scale1, scale2) というアルゴリズムによって決定されます。

  • 乗算は、resultscale=min(17, scale1+scale2) というアルゴリズムによって決定されます。

  • 除算 (value1 / value2) は、resultscale=min(17, max(6, scale1+precision2+1)) というアルゴリズムによって決定されます。

データ型、有効桁数、および小数桁数の詳細は、SQL の "データ型" を参照してください。

算術関数と三角関数

Caché SQL は以下の算術関数をサポートします。

ABS 数値式の絶対値を返します。
CEILING 数値式以上の最も近い整数が返されます。
EXP 数値式の Log 指数値 (基数 e) の値を返します。
FLOOR 数値式以下の最大の整数が返されます。
GREATEST コンマ区切りの数値のリストから最大の数値を返します。
ISNUMERIC 式が有効な数値かどうかを示すブーリアン値コードを返します。
LEAST コンマ区切りの数値のリストから最小の数値を返します。
LOG 数値式の自然対数 (基数 e) 値を返します。
LOG10 数値式の基底 10 の対数値を返します。
MOD 除算演算の剰余値を返します。# 演算子と同じです。
PI 数値定数 pi を返します。
POWER 数値式の指定した累乗の値を返します。
ROUND 指定した桁数に丸めた (または切り捨てた) 数値式を返します。
SIGN 数値式の値が正、ゼロ、または負のいずれになるかを示す数値コードを返します。
SQRT 数値式の平方根の値を返します。
SQUARE 数値式の 2 乗の値を返します。
TRUNCATE 指定された桁数に切り捨てた数値式を返します。

Caché SQL は以下の三角関数をサポートします。

ACOS 数値式のアークコサインを返します。
ASIN 数値式のアークサインを返します。
ATAN 数値式のアークタンジェントを返します。
COS 数値式のコサインを返します。
COT 数値式のコタンジェントを返します。
SIN 数値式のサインを返します。
TAN 数値式のタンジェントを返します。
DEGREES ラジアンを角度に変換します。
RADIANS 角度をラジアンに変換します。

関係演算子

条件式からブーリアン値が求められます。条件式では以下の関係演算子を使用できます。

= 等値演算子

!=

<>

不等値演算子。2 つの構文形式は機能的に同じです。
< より小さい演算子
> より大きい演算子
<= 以下演算子
>= 以上演算子

これらの等値演算子は、テーブルのフィールド値を比較するときにはフィールドの既定の照合を使用します。Caché の既定では大文字と小文字が区別されません。2 つのリテラルを比較するときには、大文字と小文字が区別されます。

浮動小数点数の比較の際には、等値演算子 (等しい、等しくない) は避ける必要があります。浮動小数点数 (データ型 のクラス %Library.DecimalOpens in a new tab および %Library.DoubleOpens in a new tab) は固定有効桁数ではなく、バイナリ値として格納されます。変換の際に、丸め処理によって 2 つの浮動小数点数となり、正確には等しくない同等の数値となる場合があります。未満であるか、より大きいかのテストを使用して、2 つの浮動小数点数が所定の精度と “同等” であるかどうかを判断してください。

Caché SQL では、Contains 比較演算子と Follows 比較演算子もサポートされています。

[ 包含関係演算子。オペランドを含んでいる値をすべて返します (演算子と等しい値が含まれます)。この演算子は、EXACT (大文字と小文字を区別する) 照合を使用します。否定は NOT[ です。
] 後続関係演算子。照合シーケンスで演算子に続く値をすべて返します。オペランドの値自体は除かれます。この演算子は、フィールドの既定の照合を使用します。Caché の既定では大文字と小文字が区別されません。否定は NOT] です。

論理演算子

SQL 論理演算子は、True または False として評価する条件式で使用されます。これらの条件式は SELECT 文の WHERE 節と HAVING 節、CASE 文の WHERE 節、JOIN 文の ON 節、および CREATE TRIGGER 文の WHEN 節で使用されます。

単項否定演算子

単項否定論理演算子を使用して、論理的に逆の条件を指定します。以下に例を示します。

SELECT Name,Age FROM Sample.Person
WHERE NOT Age>21
ORDER BY Age
SELECT Name,Age FROM Sample.Person
WHERE NOT Name %STARTSWITH('A')
ORDER BY Name

NOT 演算子を条件の前に配置できます (上記のとおり)。または、NOT を単一文字演算子の直前に配置できます。例えば、NOT<NOT[ などです。NOT とそれによって否定する単一文字演算子の間には、スペースを入れてはなりません。

AND 演算子および OR 演算子

一連の複数条件で 2 つのオペランド間に AND 論理演算子および OR 論理演算子を使用できます。これらの論理演算子は、キーワードまたは記号で指定できます。

AND &
OR !

記号演算子とオペランドの間にスペースは必要ありません (ただし読みやすくするためにスペースを入れることをお勧めします)。キーワード演算子の前後にはスペースが必要です。

これらの論理演算子は、単項否定論理演算子と組み合わせることができます。WHERE Age<65 & NOT Age=21 のように使用します。

以下の 2 つの例では、論理演算子を使用して、年齢に基づいた課税をスケジュールします。年齢が 20 ~ 40 歳の人は 3 年ごとに、40 ~ 64 歳の人は 2 年ごとに、そして 65 歳以上の人は毎年課税します。以下の例では結果が同じになります。最初の例はキーワードを使用し、2 番目の例は記号を使用しています。

SELECT Name,Age FROM Sample.Person
WHERE Age>20
      AND Age<40 AND (Age # 3)=0 
      OR Age>=40 AND (Age # 2)=0 
      OR Age>=65
ORDER BY Age
SELECT Name,Age FROM Sample.Person
WHERE Age>20
      & Age<40 & (Age # 3)=0 
      ! Age>=40 & (Age # 2)=0 
      ! Age>=65
ORDER BY Age

括弧を使用すると論理演算子をグループにできます。これにより、グループ・レベルを設定できます。評価は、最下位のグループから最上位のグループの順で行われます。以下の最初の例では、AND 条件は 2 番目の OR 条件にのみ適用されます。MA からすべての年齢の人物を返し、NY から 25 才未満の人物を返します。

SELECT Name,Age,Home_State FROM Sample.Person
WHERE Home_State='MA' OR Home_State='NY' AND Age < 25
ORDER BY Age

グループ条件で括弧を使用すると、異なる結果になります。以下の例は、MA または NY から、年齢が 25 才未満の人物を返します。

SELECT Name,Age,Home_State FROM Sample.Person
WHERE (Home_State='MA' OR Home_State='NY') AND Age < 25
ORDER BY Age
  • SQL の実行は、簡易版のロジックを使用します。条件が偽になると、残りの AND 条件はテストされません。条件が真になると、残りの OR 条件はテストされません。

  • ただし、SQL は、WHERE 節の実行を最適化するため、同じグループ・レベルでの複数条件の実行順序は予測できず、有効ではありません。

コメント

Caché SQL は、1 行のコメントと複数行のコメントの両方をサポートします。コメント・テキストには、任意の文字や文字列を含めることができます。ただし当然ながら、コメントの末尾を示す文字は使用できません。

Note:

埋め込み SQL のマーカ構文 (&sql<marker>(...)<reversemarker>) を使用すると、SQL コメントの内容に制約が課されます。マーカ構文を使用する場合には、SQL コード内のコメントに文字シーケンス “)<reversemarker>” は使用できません。詳細は、このドキュメントの “埋め込み SQL の使用法” の章の "&sql 指示文" を参照してください。

1 行コメント

1 行のコメントを指定するには、行頭に 2 つのハイフンを記述します。コメントは独立した行として記述できるほか、SQL コードと同じ行に記述することもできます。SQL コードの後にコメントを続ける場合は、コードの末尾に空白を 1 つ以上置き、その後にハイフン 2 つのコメント演算子を記述します。コメントには、ハイフン、アスタリスク、スラッシュも含め、あらゆる文字を使用できます。その行の最後までがコメントです。

以下の例では、複数の 1 行コメントが記述されています。

-- This is a simple SQL query
-- containing -- (double hyphen) comments
SELECT TOP 10 Name,Age, -- Two columns selected
Home_State -- A third column
FROM Sample.Person -- Table name
-- Other clauses follow
WHERE Age > 20 AND -- Comment within a clause
Age < 40
ORDER BY Age,  -- Comment within a clause
Home_State
-- End of query

複数行コメント

複数行のコメントを指定するには、/* 開始区切り文字と */ 終了区切り文字を使用します。コメントは、1 行または複数の別々の行として記述することも、SQL コードと同じ行で開始または終了することもできます。少なくとも 1 つの空白を使用して、コメント区切り文字を SQL から区切る必要があります。コメントには、ハイフン、アスタリスク、スラッシュも含め、あらゆる文字を記述できます。ただし、*/ 文字の組み合わせは明らかに例外です。

以下の例では、複数の複数行コメントが記述されています。

/* This is 
   a simple 
   SQL query. */
SELECT TOP 10 Name,Age /* Two fields selected */
FROM Sample.Person  /* Other clauses 
could appear here */ ORDER BY Age
/* End of query */

埋め込み SQL コードをコメントアウトする場合、必ずコメントを &sql 指示文の前または括弧内で始めます。以下の例では、2 つの埋め込み SQL コード・ブロックが正しくコメントアウトされています。

   SET a="default name",b="default age"
   WRITE "(not) Invoking Embedded SQL",!
   /*&sql(SELECT Name INTO :a FROM Sample.Person) */
   WRITE "The name is ",a,!
   WRITE "Invoking Embedded SQL (as a no-op)",!
   &sql(/* SELECT Name INTO :b FROM Sample.Person */)
   WRITE "The age is ",b

コメントとして保持される SQL コード

埋め込み SQL 文は、ルーチンの .INT コード・バージョンのコメントとして保持することができます。そのためには以下のように、構成オプションを設定します。

  • $SYSTEM.SQL.SetRetainSQL()Opens in a new tab メソッドを呼び出します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[.INT コード内で SQL 文をコメントとして残す] の設定が表示されます。

  • 管理ポータルに移動します。[システム管理] から、[構成][SQL およびオブジェクトの設定][一般SQL設定] (システム, 構成, 一般SQL設定) を選択します。この画面で、[.INT コード内で SQL 文をコメントとして残す] の現在の設定を表示できます。既定は “はい” です。

このオプションを [はい] に設定すると、ルーチンの .INT コード・バージョンで SQL 文をコメントとして維持できます。また、“はい” に設定することで、コメントのテキストの中でその SQL 文によって使用されている非 % 変数をすべてリストにできます。このリストの変数を ObjectScript プロシージャの PUBLIC 変数リストにもリストし、NEW コマンドで再び初期化する必要があります。詳細は、このドキュメントの “埋め込み SQL” の章の "ホスト変数" を参照してください。

FeedbackOpens in a new tab