Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

識別子

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

InterSystems IRIS® データ・プラットフォームの SQL 識別子は、一連の名前付け規約に従います。識別子の使用方法によっては制約が厳しくなる場合があります。識別子は大文字と小文字を区別しません。

識別子は単純な識別子区切り識別子のいずれかです。InterSystems 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) です。InterSystems IRIS では、有効な Unicode (16 ビット) 文字を SQL 識別子内で使用できます。単純な識別子は、大文字と小文字を区別しません (ただし、下記を参照してください)。規約により、最初は大文字で表示されます。

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

  • アンダースコア (_)

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

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

  • 文字 (Unicode 文字を含む)

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

  • アンダースコア (_)

  • アット記号 (@)

  • ポンド記号 (#)

  • ドル記号 ($)

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

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

Note:

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

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

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

文字の大文字小文字

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

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

有効な識別子のテスト

InterSystems IRIS は、文字列が有効な識別子であるかどうかをテストする、%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("%sqlupper")

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

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

ネームスペース名

ネームスペース名 (データベース名とも呼ばれます) は識別子の名前付け規約に従います。また、句読点文字および最大長に関する追加の制限があります。詳細は、"CREATE DATABASE" コマンドを参照してください。

ネームスペース名には区切り識別子を指定でき、これは SQL 予約語と同じであってもかまいません。ただし、同じネームスペース名の句読点制限が、単純な識別子と区切り識別子の両方に適用されます。

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

SQL テーブル名、ビュー名、フィールド名、インデックス名、トリガ名、およびプロシージャ名は、英数字以外の文字を削除することによって、対応する永続クラス・エンティティの生成に使用されます。クラス・エンティティおよびグローバルに生成される名前は、これらの変換ルールに従います。

Note:

ネームスペース名と SQL スキーマ名および対応するパッケージ名は、これらの変換ルールには従いません

  • 句読点文字が含まれている点だけが異なる識別子は有効です。クラス・オブジェクト名に句読点文字を含めることはできないため、InterSystems IRIS ではすべての句読点文字を削除することによって、対応する一意のオブジェクト名が生成されます。識別子の句読点文字を削除することで、一意でないクラス・オブジェクト名が生成される場合は、最後の英数字をインクリメントされる文字接尾語と置き換えることによって、一意の名前が生成されます。

    テーブル、ビュー、フィールド、トリガ、およびプロシージャ・クラス・メソッド名の場合、これは 0 で始まる整数の接尾語です。例えば、myname および my_name は、myname および mynam0 を生成し、my#name を追加すると mynam1 が生成されます。生成される一意の名前の数が 10 を超えるときには (mynam9)、A で始まる大文字の接尾語に置き換えることで追加の名前が作成されます (mynamA)。テーブルとビューは同じネームスペースを共有するため、テーブルまたはビューに対して同じ接尾語カウンタがインクリメントされます。

    インデックス名の場合、この接尾語は A で始まる大文字です。例えば、myindex および my_indexmyindex および myindeA を生成します。

    接尾語で終了する名前を定義した場合 (my_name0my_indexA など)、InterSystems IRIS は次の未使用の接尾語にインクリメントすることによって一意の名前を生成します。

  • 最初の文字が句読点で、2 番目の文字が数字である識別子は、テーブル名、ビュー名、およびプロシージャ名としては無効です。フィールド名およびインデックス名としては有効です。SQL フィールド名またはインデックス名の最初の文字が句読点 (% または _) で、2 番目の文字が数字である場合、InterSystems IRIS は、対応するプロパティ名の最初の文字として小文字の “n” を追加します。

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

変換元/変換先の文字のペアのリストを作成して、SQL 識別子内の特定の文字を対応するオブジェクト識別子内で他の文字に変換するように構成することができます。DDL 実行時に SQL 識別子をオブジェクト識別子に変換する場合、“変換元” 文字列の文字は、“変換先” 文字列の対応する文字に変換されます。これらのシステム全体での文字変換により、識別子で指定可能な文字の規則が異なる環境間での識別子の使用が容易になります。$SYSTEM.SQL.Util.SetDDLIdentifierTranslations()Opens in a new tab メソッドを使用して、変換元/変換先の文字のペアを設定します。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。

クラス定義での SQL 名の指定

SQL エンティティを投影する永続クラスを定義する場合、各 SQL エンティティの名前は、対応する永続クラス定義要素の名前と同じです。別の SQL テーブル名、フィールド名、またはインデックス名を作成する場合は、SqlTableNameSqlFieldName、または SqlName (インデックスの場合) キーワードを使用して、クラス定義内で SQL 名を指定します。以下はその例です。

Property LName As %String [SqlFieldName = "Family#Name"];
Index NameIdx As %String [SqlName = "FullNameIndex"];

識別子の長さの考慮事項

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

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

区切り識別子

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

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

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

リテラル値を区切るには、InterSystems SQL は一重引用符 (') を使用します。これにより、区切り識別子は二重引用符 (") で、リテラル値は一重引用符 (') で指定されなければなりません。例えば、'7' は数値リテラルの 7 ですが、"7" は区切り識別子です。SQL 文を二重引用符で囲む場合 (ダイナミック SQL の場合など)、その文字列内の二重引用符文字を二重にする必要があります。

SQL の空文字列は、必ず一重引用符文字のペア '' として指定する必要があります。区切り識別子のサポートが有効な場合、二重引用符文字のペア "" は無効な区切り識別子として解析され、SQLCODE -1 エラーを生成します。

区切り識別子の有効な名前

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

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

区切り識別子には、空白も含めた、ほぼすべての印刷可能文字を含むことができます。ほとんどの区切り識別子の名前に、コンマ (,)、ピリオド (.)、キャレット (^)、および 2 文字の矢印シーケンス (->) を含めることはできませんが、区切り識別子のロール名およびユーザ名にこれらの文字を含めることはできます。区切り識別子のクラス名には、ピリオド (.) を含めることができます。いずれの区切り識別子でも、先頭にアスタリスク (*) を使用することはできません。%vid は、区切り識別子に使用できません。これらの名前付け規約に違反すると、SQLCODE -1 エラーが返されます。

テーブル名、スキーマ名、列名、またはインデックス名として使用される区切り識別子は、有効なクラス・エンティティ名に変換できる必要があります。このため、1 つ以上の英数字が含まれる必要があります。数字 (または句読点とそれに続く数字) で始まる区切り識別子は、“n” 接頭語を付けて対応するクラス・エンティティ名を生成します。

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

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

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

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

区切り識別子のサポートの無効化

既定で、区切り識別子のサポートは有効になっています。

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

SET OPTION コマンドに SUPPORT_DELIMITED_IDENTIFIERS キーワードを指定して、システム全体に区切り識別子のサポートを設定できます。

システム全体に区切り識別子のサポートを設定できますが、そのためには、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの DelimitedIdentifiers オプションを使用します。区切り識別子は既定でサポートされています。

現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。

SQL 予約語

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

FeedbackOpens in a new tab