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?

識別子

識別子は、テーブル、ビュー、列 (フィールド)、スキーマ、テーブル・エイリアス、列のエイリアス、インデックス、ストアド・プロシージャ、トリガなどの SQL エンティティの名前です。識別子は、そのコンテキスト内で一意であることが必要です。例えば、同じスキーマ内の 2 つのテーブル、または同じテーブル内の 2 つのフィールドは、同じ名前を持つことはできません。ただし、異なるスキーマ内の 2 つのテーブル、または異なるテーブル内の 2 つのフィールドには同じ名前を指定できます。ほとんどの場合、異なるタイプの SQL エンティティに同じ識別子名を使用できます。例えば、スキーマ、そのスキーマ内のテーブル、およびそのテーブル内のフィールドには、すべて同じ名前を使用でき、競合が発生することはありません。ただし、同じスキーマ内のテーブルおよびビューには、同じ名前を指定できません。

識別子は、一連の名前付け規約に従います。識別子の使用方法によっては制約が厳しくなる場合があります。識別子は大文字と小文字を区別しません。

識別子は単純な識別子区切り識別子のいずれかです。Caché SQL は既定で単純な識別子と区切り識別子の両方をサポートします。

単純な識別子

単純な識別子の構文は以下のとおりです。

simple-identifier ::= identifier-start { identifier-part }  
   identifier-start ::= letter | % | _  
   identifier-part ::=  letter | number | _ | @ | # | $

名前付け規約

identifier-start は、SQL 識別子の最初の文字です。これは以下のいずれかである必要があります。

  • 大文字または小文字。非数字文字とは、ObjectScript $ZNAME 関数の検証に合格する任意の文字であると定義されます。既定では、A から Z までの大文字 (ASCII 65–90)、a から z までの小文字 (ASCII 97–122)、およびアクセント記号付きの文字 (ASCII 215 と 247 を除く ASCII 192–255) です。Caché の Unicode バージョンをインストールしている場合は、SQL 識別子の中に有効な Unicode 文字 (16 ビット) を使用できます。単純な識別子は、大文字と小文字を区別しません (ただし、下記を参照してください)。規約により、最初は大文字で表示されます。

    日本のロケールでは、アクセント記号付きのラテン文字を識別子でサポートしていません。日本の識別子には、日本語の文字に加え、ラテン文字 A-Z と a-z (65–90 と 97–122) とギリシャ語の大文字 (913–929 および 931–937) を使用できます。

  • アンダースコア (_)

  • パーセント記号 (%)。% 文字で始まる Caché 名 (%Z または %z で始まるものは除く) は、システム要素として予約されていますので、識別子に使用しないでください。詳細は、"Caché プログラミング入門ガイド" の “識別子のルールとガイドライン” の章を参照してください。

identifier-part は、SQL 識別子の後続文字です。これら残りの部分は、以下に示した 0 個以上の文字で構成されます。

  • 文字 (Unicode 文字を含む)

  • 数字。数字文字は、0 から 9 までの数字で定義されます。

  • アンダースコア (_)

  • アット記号 (@)

  • ポンド記号 (#)

  • ドル記号 ($)

一部の記号文字は、演算子としても使用されます。SQL では、# 記号はモジュロ演算子として使用されます。SQL では、アンダースコア文字は 2 つの文字列の連結に使用できます。この使用法は ObjectScript との互換性のために用意されており、推奨される SQL 連結演算子は || です。識別子文字としての記号の解釈は、必ず演算子としてのその解釈より優先されます。記号文字の演算子としての解析のあいまいさは、演算子の前後にスペースを配置することで解決できます。

単純な識別子は、空白や上記で指定されている記号文字以外の非英数文字を含むことができません。インターシステムズの SQL インポート・ツールは、インポートされたテーブル名から空白を削除します。

Note:

SQL カーソル名は、識別子の名前付け規約に従いません。カーソルの名前付け規約の詳細は、"DECLARE 文" を参照してください。

Caché SQL には、単純な識別子として使用できない予約語があります。それらの予約語のリストについては、"Caché SQL リファレンス" の “予約語” セクションを参照してください。ある単語が予約語かどうかをテストするには、$SYSTEM.SQL.IsReservedWord()Opens in a new tab メソッドを使用します。ただし、区切り識別子は、SQL 予約語と同じであってもかまいません。

これらの名前付け規約に反する識別子は、SQL 文の中で区切り識別子として表示する必要があります。

文字の大文字小文字

Caché SQL 識別子は、既定では大文字と小文字を区別しません。Caché SQL は、最初に識別子をすべて大文字に変換してから識別子を比較することで、大文字と小文字の無区別を実装しています。これは、使用されている名前の実際の文字には何の影響もありません (他の SQL の実装では、識別子の大文字と小文字の区別が異なる方法で処理される場合があります。したがって、大文字と小文字を意識した識別子の使用を避けることをお勧めします)。

Caché SQL のカーソル名とパスワードでは大文字と小文字が区別されることに注意してください。

有効な識別子のテスト

Caché は、文字列が有効な識別子であるかどうかをテストする、%SYSTEM.SQLOpens in a new tab クラスの IsValidRegularIdentifier()Opens in a new tab メソッドを提供しています。このメソッドは、文字の使用と予約語の両方に対してテストします。また、最大 200 文字の長さテストも実行します (これは、間違った入力を防止するために使用する任意の長さで、識別子の検証ではありません)。以下の 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("%#$")

   WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("1Fred")
   WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("Fr ed")
   WRITE !,$SYSTEM.SQL.IsValidRegularIdentifier("%alphaup")

最初の 3 つのメソッド呼び出しは 1 を返します。これは有効な識別子であることを示しています。4 番目と 5 番目のメソッド呼び出しも 1 を返します。これらは、有効な識別子です。ただし、テーブル名またはフィールド名として使用する場合は有効ではありません。最後の 3 つのメソッド呼び出しは、0 を返します。これは無効な識別子であることを示しています。最後の 3 つのメソッドのうち 2 つが無効なのは、数字で始まっているのと、スペースが含まれているという点で文字規則に違反しているためです。最終のメソッド呼び出しが 0 を返すのは、指定された文字列が予約語であるためです。これらの規則テストは最小要件で、あらゆる SQL 使用で有効な識別子として検証されているわけではないことに注意してください。

このメソッドは、ODBC または JDBC からストアド・プロシージャ %SYSTEM.SQL_IsValidRegularIdentifier("nnnn") として呼び出すこともできます。

識別子とクラスのエンティティ

テーブル名、ビュー名、フィールド名、およびインデックス名は、英数字以外の記号文字を削除することによって、対応するクラス、プロパティ、およびインデックスの生成に使用されます。これらの SQL エンティティの名前に記号文字を使用する場合は、以下のような追加の制約があります。

  • 記号文字が含まれている点だけが異なる識別子は有効です。Caché は、最後の英数字を整数の接尾語で置き換えることによって、対応する一意の名前を生成します。例えば、myname および my_name は、myname および mynam0 を生成し、my#nam0@ を追加すると mynam1 が生成されます。整数で終了する名前を既に定義している場合、Caché は次の未使用の整数にインクリメントすることによって固有の名前を生成します。詳細は、"CREATE TABLE 文" の "フィールド名" のセクションを参照してください。

  • 最初の文字が句読点で、2 番目の文字が数字である識別子は、スキーマ、テーブル、ビュー、およびフィールドの名前としては無効です。インデックス名としては有効です。詳細は、"CREATE INDEX" を参照してください。

  • 句読点文字のみで構成された識別子、2 つのアンダースコア文字で始まる識別子 (__name)、または連続する 2 つのポンド記号を含む識別子 (nn##nn) は、通常、SQL エンティティ名としては無効です。すべてのコンテキストで使用を避ける必要があります。

  • スキーマおよびテーブル名での記号文字の使用については、さらなる考慮事項と制限があります。このドキュメントの“テーブルの定義” の章の "テーブル名とスキーマ名" を参照してください。

既定では、(英数字以外の文字を削除した場合の) SQL エンティティの名前は、対応するクラス定義のエンティティ名と同じです。異なる SQL 名を付ける場合は、使用しているクラス定義内で SQL エイリアスを指定します。以下はその例です。

Property Insert As %String [SqlFieldName = "X_Insert"];

SQL 識別子内の特定の文字を対応するオブジェクト識別子内で他の文字に変換するように構成することができます。これにより、識別子で指定可能な文字の規則が異なる環境間での識別子の使用が容易になります。

管理ポータルに移動します。[システム管理] から、[構成][SQL およびオブジェクトの設定][一般SQL設定] (システム, 構成, 一般SQL設定) を選択します。この画面では、[識別子変換 — 変換元][識別子変換 — 変換先] の現在の設定を表示および編集できます。DDL 実行時に SQL 識別子をオブジェクト識別子に変換する場合、“変換元“ 文字列の文字は、“変換先“ 文字列の文字に変換されます。

%SYSTEM.SQLOpens in a new tab クラスの SetDDLIdentifierTranslations()Opens in a new tab メソッドも使用できます。

識別子の長さの考慮事項

SQL 識別子の最大長は 128 文字です。Caché は、SQL 識別子を対応するオブジェクトのエンティティにマップするときに、そのエンティティに対応する最大 96 文字のプロパティ、メソッド、クエリ、またはインデックス名を作成します。2 つの SQL 識別子の最初の 96 文字が同一の場合、Caché は、それに対応するオブジェクト名の 96 番目の文字を 0 から始まる整数に置き換えて一意の名前を作成します。

スキーマおよびテーブル名の最大長については、さらなる考慮事項と制限があります。このドキュメントの “テーブルの定義” の章の "テーブル名とスキーマ名" を参照してください。

区切り識別子

区切り識別子の構文は以下のとおりです。

delimited-identifier ::= " delimited-identifier-part { delimited-identifier-part } "
   delimited-identifier-part ::= non-double-quote-character | double-quote-symbol  
   double-quote-symbol ::= ""

区切り識別子は、区切り文字で囲まれた一意の識別子です。Caché SQL は、区切り文字として二重引用符 (") をサポートします。区切り識別子は通常、単純な識別子の名前付けの制約を回避するために使用します。

リテラル値を区切るには、Caché SQL は一重引用符 (') を使用します。これにより、区切り識別子は二重引用符 (") で、リテラル値は一重引用符 (') で指定されなければなりません。例えば、'7' は数値リテラルの 7 ですが、"7" は区切り識別子です。

区切り識別子は、一意の名前でなければなりません。区切り識別子は大文字と小文字を区別しません。規約により、識別子の最初の文字は大文字で表示されます。

区切り識別子は、SQL 予約語と同じであってもかまいません。区切り識別子は、通常、SQL 予約語との名前の競合の問題を避けるために使用されます。

区切り識別子には、空白も含めた、ほぼすべての印刷可能文字を含むことができます。区切り識別子の名前には、コンマ (,)、ピリオド (.)、キャレット (^)、および 2 文字の矢印のシーケンス (->) の使用は避けてください。この名前の先頭の文字には、アスタリスク (*) を除く任意の有効な文字を使用できます。%vid は、区切り識別子に使用しないでください。

以下の例で示しているクエリは、列とテーブルの両方の名前に区切り識別子を使用します。

SELECT "My Field" FROM "My Table" WHERE "My Field" LIKE 'A%'

区切り識別子は二重引用符で区切られ、文字列リテラル A% は一重引用符で区切られることに注意してください。

区切り識別子をテーブル名に指定する場合は、テーブル名とスキーマ名を別々に区切る必要があります。したがって、"schema"."tablename" または schema."tablename" は、有効な識別子ですが、"schema.tablename" は有効な識別子ではありません。

区切り識別子のサポートの構成

Caché SQL では、区切り識別子に対するサポートはオプションです。既定では、単純な識別子と区切り識別子の両方がサポートされます (Caché 5.1 以前のバージョンでは、区切り識別子は既定で無効になっています)。

区切り識別子が無効の場合は、二重引用符の中の文字は、文字リテラルとして処理されます。

現在のプロセスの区切り識別子のサポートは、SET OPTION コマンドに SUPPORT_DELIMITED_IDENTIFIERS キーワードを指定することで設定できます。区切り識別子のサポートは、以下のいずれかの方法でシステム全体に設定できます。

  • %SYSTEM.SQLOpens in a new tab クラスの SetDelimitedIdentifiers()Opens in a new tab メソッド。このメソッドは、現在のシステム全体の値と構成ファイルの設定の両方を変更します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。

  • 管理ポータルに移動します。[システム管理] から、[構成][SQL およびオブジェクトの設定][一般SQL設定] (システム, 構成, 一般SQL設定) を選択します。この画面で、[区切り識別子をサポート] の現在の設定を表示および編集できます。

既定値は “はい” で、Caché は単純な識別子と区切り識別子の両方をシステム全体でサポートします。このオプションを “いいえ” に設定すると、Caché はテーブル名、フィールド名、その他のエンティティに対して単純な識別子のみをサポートするように指定されます。

SQL 予約語

SQL には、識別子として使用できない予約語が多数あります。これらの予約語のリストは、"Caché SQL リファレンス" の “予約語” のセクションを参照してください。

FeedbackOpens in a new tab