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 シェル・インタフェースの使用法

SQL 文をテストする 1 つの方法として、SQL シェルを使用して Caché ターミナルから SQL 文を実行する方法があります。このインタラクティブな SQL シェルでは、SQL 文を動的に実行できます。SQL シェルは ダイナミック SQL を使用するので、実行時にクエリが作成および実行されます。また、リソースにアクセスして、現在のネームスペース内で操作を実行します。

特に明記のない限り、SQL シェル・コマンドと SQL コードでは、大文字と小文字は区別されません。

この章で説明する項目は以下のとおりです。

SQL を実行するその他の方法

$SYSTEM.SQL.Execute()Opens in a new tab メソッドを使用すると、SQL シェルを呼び出さずにターミナル・コマンド行から SQL コードを 1 行実行できます。以下の例では、ターミナル・プロンプトからこのメソッドを使用する方法を示します。

SAMPLES>SET result=$SYSTEM.SQL.Execute("SELECT TOP 5 name,dob,ssn FROM Sample.Person")

SAMPLES>DO result.%Display()
SAMPLES>SET result=$SYSTEM.SQL.Execute("CALL Sample.PersonSets('M','MA')")

SAMPLES>DO result.%Display()

SQL 文にエラーがある場合は、Execute() メソッドは正常に完了し、%Display() メソッドは以下のようなエラー情報を返します。

SAMPLES>DO result.%Display()

[SQLCODE: <-29>:<Field not found in the applicable tables>]
[%msg: < Field 'GAME' not found in the applicable tables^ SELECT TOP ? game ,>]
0 Rows Affected
SAMPLES>

Execute() メソッドは、オプションのパラメータ SelectModeDialect、および ObjectSelectMode も提供します。

Caché は、このドキュメントの他の章で説明するように、SQL コードを記述し実行する、他の多くの方法をサポートしています。これには、以下のものがあります。

SQL シェルの呼び出し

以下のように、$SYSTEM.SQL.Shell()Opens in a new tab メソッドを使用して、ターミナルのプロンプトから SQL シェルを呼び出すことができます。

  DO $SYSTEM.SQL.Shell()

または、以下のように、%SQL.ShellOpens in a new tab クラスを使用して、インスタンス化されたインスタンスとして SQL シェルを呼び出すこともできます。

  DO ##class(%SQL.Shell).%Go("Cache")

または

  SET sqlsh=##class(%SQL.Shell).%New()
  DO sqlsh.%Go("Cache")

呼び出し方法にかかわらず、SQL シェルは SQL シェル・プロンプト (nsp>>) を返します。nsp は、現在のネームスペースの名前を表します。このプロンプトでは、以下のシェル・モードのいずれも使用できます。

  • 単一行モード : プロンプトで、SQL コードを 1 行入力します。SQL 文を終了するには、Enter キーを押します。既定では、SQL コードが作成および実行されます (即時実行モードと呼ばれます)。クエリの結果セットは、ターミナル画面に表示されます。その他の SQL 文の場合、SQLCODE と行カウント値がターミナル画面に表示されます。

  • 複数行モード : プロンプトで、Enter キーを押します。これで、複数行モードになります。SQL コードを複数行入力できます。新しい行のプロンプトではそれぞれ、行番号が示されます (空白行によって行番号がインクリメントされることはありません)。複数行の SQL 文を終了させるには、「GO」と入力し、Enter キーを押します。既定では、いずれの場合も、SQL コードが作成および実行されます。クエリの結果セットは、ターミナル画面に表示されます。その他の SQL 文の場合、SQLCODE と行カウント値がターミナル画面に表示されます。

    複数行モードでは、以下のコマンドが用意されています。これらのコマンドを複数行プロンプトに入力し、Enter キーを押します。L または LIST は、これまでに入力されたすべての SQL コードをリストします。C または CLEAR は、これまでに入力されたすべての SQL コードを削除します。C n または CLEAR n (n は行番号を示す整数) は、SQL コードの特定の行を削除します。G または GO は、SQL コードを作成および実行し、単一行モードに戻ります。Q または QUIT は、これまでに入力されたすべての SQL コードを削除し、単一行モードに戻ります。これらのコマンドでは、大文字と小文字は区別されません。コマンドを発行しても、次の複数行プロンプトで行番号がインクリメントされることはありません。複数行プロンプトで「?」と入力すると、これらの複数行コマンドがリストされます。

SQL 文を作成する場合、SQL シェルでは最初に文が検証されます。この検証では、指定したテーブルが現在のネームスペースに存在しているか、および指定したフィールドがテーブル内に存在しているかどうかの確認が行われます。存在しない場合、適切な SQLCODE が表示されます。

SQL シェルでは SQL 特権の確認が行われるので、テーブルやフィールドなどにアクセスするときやこれらを変更するときは、適切な特権が必要です。詳細は、このドキュメントの “ユーザ、ロール、特権” の章を参照してください。

文が有効で適切な特権を持っている場合は、SQL シェルに SQL 文が表示され、連続番号が割り当てられます。この番号はターミナル・セッションが存続している限り、ネームスペースの変更や SQL シェルの終了と再開にかかわりなく連続的に割り当てられます。SQL 文に割り当てられた番号によって、以下のように、既存の SQL 文を呼び出すことができます。

SQL シェルは、ターミナル・プロンプトから DO Shell^%apiSQL を使用して呼び出すこともできます。

使用可能なすべての SQL シェル・コマンドのリストを表示するには、SQL プロンプトで ? を入力します。

SQL シェルのセッションを終了し、ターミナルのプロンプトに戻るには、SQL プロンプトに Q または QUIT コマンドか、E または EXIT コマンドを入力します。SQL シェル・コマンドでは、大文字と小文字が区別されません。

既定のパラメータ設定を使用した SQL シェルのセッションの例を以下に示します。

USER>ZNSPACE "SAMPLES"
SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
1. SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State

Name               Home_State
Djokovic,Josephine W.  AK
Klingman,Aviel P.      AK
Quine, Sam X.          AK
Xiang,Robert C.        AL
Roentgen,Alexandria Q. AR

5 Row(s) Affected
----------------------------------------------
SAMPLES>>SELECT GETDATE()
2. SELECT GETDATE()

Expression_1
2009-09-29 11:41:42

1 Row(s) Affected
----------------------------------------------
SAMPLES>>QUIT

SAMPLES>

既定のパラメータ設定を使用した、複数行の SQL シェルのセッションを以下に示します。

USER>ZNSPACE "SAMPLES"
SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>   << entering multiline statement mode >>
        1>>SELECT TOP 5
        2>>Name,Home_State
        3>>FROM Sample.Person
        4>>ORDER BY Home_State
        5>>GO

1. SELECT TOP 5
   Name,Home_State
   FROM Sample.Person
   ORDER BY Home_State

Name               Home_State
Djokovic,Josephine W.  AK
Klingman,Aviel P.      AK
Quine, Sam X.          AK
Xiang,Robert C.        AL
Roentgen,Alexandria Q. AR

5 Row(s) Affected
----------------------------------------------
SAMPLES>>

GO コマンド

SQL シェルの GO コマンドは、最後の SQL 文を実行します。単一行モードでは、GO は最後に実行した SQL 文を再実行します。複数行モードでは、GO コマンドは、複数の SQL 文を実行して複数行モードを終了するために使用されます。単一行モードでの後続の GO は、同じ SQL 文を再実行します。

入力パラメータ

SQL シェルでは、“?” 文字を使用した入力パラメータを SQL 文に使用できます。SQL 文を実行するたびに、それらの入力パラメータの値を指定するように求められます。それらの値は、SQL 文に各 “?” 文字が記述されているのと同じ順で指定する必要があります。最初のプロンプトは最初の “?” に値を渡し、2 番目のプロンプトは 2 番目の “?” に値を渡し、以下同様の対応となります。

入力パラメータの個数に制限はありません。入力パラメータを使用して、TOP 節および WHERE 節に値を渡したり、SELECT リストに式を渡したりできますが、SELECT リストに列名を渡すことはできません。

ホスト変数は、入力パラメータ値として指定できます。入力パラメータの入力を求められたら、コロン (:) で始まる値を指定します。この値には、パブリック変数、ObjectScript 特殊変数、数値リテラル、または式を指定できます。次に、“is this a literal (Y/N)?” というプロンプトが表示されます。このプロンプトで N (No) を指定すると (または、何も指定しないで Enter キーを押すと)、入力値はホスト変数と解析されます。例えば、:myval はローカル変数 myval の値、:^myval はグローバル変数 ^myval の値、:$HOROLOG は特殊変数 $HOROLOG の値、:3 は数字の 3、:10-3 は数字の 7 と解析されます。このプロンプトで Y (Yes) を指定すると、先頭のコロンを含む入力値が、リテラルとして入力パラメータに渡されます。

ObjectScript コマンドの実行

SQL シェル内では、ObjectScript コマンドを発行できます。例えば、ZNSPACE コマンドを使用して、Caché ネームスペースを、参照する SQL テーブルまたはストアド・プロシージャが含まれるネームスペースに変更する場合などです。以下の例のように、SQL シェルの COS コマンドを使用して、ObjectScript コマンドを発行することができます。

>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
USER>>COS ZNSPACE "SAMPLES"
 
SAMPLES>>

コマンド行で COS コマンドに続く残りの部分は、ObjectScript コードとして扱われます。以下の例のように、COS コマンドは、SQL シェル単一行モードまたは SQL シェル複数行モードで指定することができます。

USER>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
USER>>  << entering multiline statement mode >>
        1>>COS ZNSPACE "SAMPLES"

        1>>SELECT TOP 5 Name,Home_State
        2>>FROM Sample.Person
        3>>GO

COS 文が行カウントを進めることはありません。COS コマンドは常に、SQL 文の前に発行されます。したがって、以下の例は、機能的には前述の例と同じです。

USER>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
USER>>  << entering multiline statement mode >>
        1>>SELECT TOP 5 Name,Home_State
        2>>FROM Sample.Person
        3>>COS ZNSPACE "SAMPLES"

        3>>GO

CALL コマンド

SQL シェルを使用して、以下の例のように、SQL CALL 文を発行してSQL ストアド・プロシージャを呼び出すことができます。

SAMPLES>>CALL Sample.PersonSets('G','NY')

指定したストアド・プロシージャが現在のネームスペースに存在しない場合、SQL シェルは SQLCODE -428 エラーを発行します。

入力パラメータの指定がストアド・プロシージャで定義された数よりも多い場合、SQL シェルは SQLCODE -370 エラーを発行します。パラメータの値をストアド・プロシージャに指定するには、リテラル ('string')、ホスト変数 (:var)、および入力パラメータ (?) を任意に組み合わせて使用することができます。

  • 以下の例に示すように、CALL 文では ホスト変数 を使用することができます。

    SAMPLES>>COS SET a="G",b="NY"
    SAMPLES>>CALL Sample.PersonSets(:a,:b)
    
  • 以下の例に示すように、CALL 文では入力パラメータ (“?” 文字) を使用することができます。

    SAMPLES>>CALL Sample.PersonSets(?,?)
    

    CALL 文が実行される際には、SQL シェルによって、これらの各入力パラメータの値を指定するように求められます。

SQL スクリプト・ファイルの実行

SQL シェルの RUN コマンドは、SQL スクリプト・ファイルを実行します。スクリプト・ファイルのタイプは、DIALECT の設定によって決まります。DIALECT の既定は CACHE (Caché SQL) です。詳細は、この章で後述する "RUN コマンド" を参照してください。

SQL 文の格納と呼び出し

番号による呼び出し

SQL シェルでは自動的に、ターミナル・セッション中に正常に発行された各 SQL 文がローカル・キャッシュに格納され、それぞれに連続した番号が割り当てられます。この番号は、現在のターミナル・プロセスにおける既存の SQL 文の呼び出しに使用されます。SQL シェルでは、正常完了した SQL 文にのみ番号が割り当てられます。SQL 文の作成時にエラーが発生した場合、番号は割り当てられません。これらの番号の割り当ては、ネームスペースに固有ではありません。以下は、番号コマンドによる使用可能な呼び出しです。

  • ## を使用すると、キャッシュされた既存のすべての SQL 文とそれらに割り当てられている番号をリスト表示できます。

  • #n : 既存の SQL 文は、SQL シェル・プロンプトで #n を指定することで、呼び出して実行することができます。n は SQL シェルが文に割り当てた整数を表します。

  • #0 : 直前に作成された SQL 文は、SQL シェル・プロンプトで #0 コマンドを指定することで、呼び出して実行することができます。#0 は、直前に作成された SQL 文を呼び出しますが、それが最後に実行された SQL 文であるとは限りません。そのため、SQL 文の呼び出しと実行は、#0 によってどの SQL 文が呼び出されるかには影響しません。

番号を使用して SQL 文を呼び出す際は、その文に新しい番号は割り当てられません。SQL シェルでは、ターミナル・セッションの継続中に番号が連続的に割り当てられます。SQL シェルをいったん終了してから再開したり、ネームスペースを変更したりしても、番号の割り当てや既に割り当てられている番号の有効性には影響しません。

すべての番号割り当てを削除するには、#CLEAR を使用して、表示されたプロンプトでこのアクションを確認します。この操作により、それまでに割り当てられていたすべての番号割り当てが削除され、番号割り当てが 1 から再開されます。

名前による呼び出し

オプションとして、SQL 文に名前を割り当て、その名前で文を呼び出すことができます。この名前は、現在のユーザのすべてのターミナル・プロセスで発行された既存の SQL 文の呼び出しに使用されます。名前によって SQL 文の保存と呼び出しを行うには、以下の 2 つの方法があります。

  • SAVEGLOBAL を使用してグローバルに保存し、OPEN を使用してグローバルから呼び出す。

  • SAVE を使用してファイルに保存し、LOAD を使用してファイルから呼び出す。

グローバルへの保存

直前の SQL 文にグローバル名を割り当てるには、SQL シェル・コマンド SAVEGLOBAL name を使用します。このコマンドは、SG name と省略できます。この後は、SQL シェル・コマンド OPEN name を使用して、グローバルから SQL 文を呼び出すことができます。EXECUTEMODE が IMMEDIATE の場合、SQL シェルは文の呼び出しと実行の両方を行います。EXECUTEMODE が DEFERRED の場合、文は作成されますが、GO コマンドを指定するまで実行されません。

OPEN name を使用して SQL 文をグローバル名で呼び出すたびに、SQL シェルによって新しい番号が文に割り当てられます。番号による呼び出しでは、古い番号と新しい番号の両方が有効です。

name には、空白スペース文字以外のすべての表示可能文字を使用できます。name では、大文字と小文字が区別されます。name は、任意の長さにできます。name は現在のネームスペースに固有です。同一の SQL 文を別の名前で複数回保存できます。この場合、保存されたすべての名前が有効になります。既に割り当てられている名前を使用して SQL 文を保存しようとすると、SQL シェルによって、既存の名前を上書きして新しい SQL 文にその名前を再割り当てするかどうかの確認が求められます。

グローバル名は、現在のネームスペースに対して割り当てられます。SQL シェルの L (または LIST) コマンドを使用すると、現在のネームスペースに割り当てられているすべてのグローバル名をリスト表示できます。割り当てられた name は、現在のユーザのすべてのターミナル・プロセスで使用できます。割り当てられた name は、それを作成したターミナル・プロセスが終了しても存続します。name の割り当てがない場合、LIST は “No statements saved” というメッセージを返します。

グローバルの name の割り当てを削除するには、CLEAR name を使用します。現在のネームスペースのすべてのグローバルの name の割り当てを削除するには、CLEAR を使用し、表示されたプロンプトでこのアクションを確認します。

ファイルへの保存

直前の SQL 文にファイル名を割り当てるには、SQL シェル・コマンド SAVE name を使用します。この後は、SQL シェル・コマンド LOAD name を使用して、SQL 文を呼び出すことができます。EXECUTEMODE が IMMEDIATE の場合、SQL シェルは文の呼び出しと実行の両方を行います。LOAD name を使用して SQL 文をファイル名で呼び出すたびに、SQL シェルによって新しい番号が文に割り当てられます。番号による呼び出しでは、古い番号と新しい番号の両方が有効です。

name には、空白スペース文字以外のすべての表示可能文字を使用できます。name では、大文字と小文字が区別されます。name は、任意の長さにできます。name は現在のネームスペースに固有です。同一の SQL 文を別の名前で複数回保存できます。この場合、保存されたすべての名前が有効になります。既に割り当てられている名前を使用して SQL 文を保存しようとすると、SQL シェルによって、既存の名前を上書きして新しい SQL 文にその名前を再割り当てするかどうかの確認が求められます。

名前は、現在のネームスペースに対して定義されます。割り当てられた name は、現在のユーザのすべてのターミナル・プロセスで使用できます。割り当てられた name は、それを作成したターミナル・プロセスが終了しても存続します。

SQL シェルのパラメータ

SQL シェルには、以下の構成パラメータが用意されています。

  • Commandprefix : (TSQL) SQL シェル・コマンドの接頭語を指定します。

  • Dialect : (TSQL) 使用する SQL のバージョンを指定します。

  • Displayfile

  • Displaymode : クエリの出力の形式を指定します。

  • Displaypath

  • Displaytranslate[table]

  • Echo : 結果セット・データをターミナルにエコーする必要があるかどうかを指定します。

  • Executemode : SQL の実行を延期するかどうかを指定します。

  • Log : シェルのアクティビティのログをファイルに記録することを指定します。

  • Messages : エラー・メッセージまたはクエリ・メトリック、およびクエリ・キャッシュ名をターミナルに表示する必要があるかどうかを指定します。

  • Path : 未修飾のテーブル名へのスキーマ検索パスを設定します。

  • Selectmode : 論理モード、ODBC モード、表示モードのいずれでデータを表示するかを指定します。また、入力データを表示形式から論理格納形式に変換するかどうかを決定します。

ラベルの付いたパラメータ (TSQL) は主に、Transact-SQL コードである Sybase または MSSQL を SQL シェルから実行するために使用されます。これらについては、この章の最後の “Transact-SQL のサポート” セクションで説明します。

SQL シェルのパラメータの表示、設定、および保存

SQL シェルの構成パラメータは、現在のターミナル・プロセスにおける現在の SQL シェルの呼び出しに固有です。設定は複数のネームスペースにわたって適用されます。ただし、SQL シェルを終了すると、SQL シェルのパラメータはすべて既定値にリセットされます。Caché ではシステム既定値が用意されていますが、以下で説明するように、SET SAVE を使用して別の既定値を設けることができます。

SQL シェルの SET コマンド (引数なし) では、以下の例に示すように、現在のシェル構成パラメータが表示されます。この例では、SET によりシステム既定値が表示されますが、これらは SQL シェルを呼び出した場合に設定される値です。

USER>>SET
 
commandprefix = ""
dialect = CACHE
displayfile =
displaymode = currentdevice
displaypath =
displaytranslatetable =
echo = on
executemode = immediate
log = off
messages = on
path = SQLUser
selectmode = logical
USER>>

単一の構成パラメータの現在の設定を表示するには、SET param を指定します。例えば、SET SELECTMODE では、現在の selectmode 設定が返されます。

SQL シェルの SET コマンドを使用して、シェル構成パラメータを設定することができます。設定値は SQL シェルを呼び出している間維持されます。SQL シェルを呼び出すたびに、パラメータは既定値にリセットされます。SET では、以下の構文形式のうちのいずれかを使用できます。

SET param value
SET param = value

paramvalue のどちらも、大文字と小文字が区別されません。スペースは許可されていますが、等号の前後には不要です。

SQL シェルの SET SAVE コマンドでは、現在のシェル構成パラメータの設定がユーザの既定値として保存されます。これらの既定値は、現在のプロセスから後続の SQL シェルのすべての呼び出しに適用されます。また、これらは SQL シェルの既定値として、ユーザのあらゆるターミナル・プロセスでその後呼び出されるすべての SQL シェルにも適用されます。これは明確にリセットされるまで保持されます。SET SAVE を使用しても、現在実行中の SQL シェルの呼び出しには影響しません。

SQL シェルの SET CLEAR コマンドでは、現在のプロセスに対するシェル構成パラメータの現在の設定がクリアされます (システムの既定値にリセットされます)。Caché では、現在のプロセス、または現在のユーザによって呼び出されるすべての新しいターミナル・プロセスによる後続の SQL シェルの呼び出しに、この既定値へのリセットが適用されます。SET CLEAR は、現在実行中の SQL シェルの呼び出しには影響しません。

DISPLAYMODE および DISPLAYTRANSLATE の設定

以下の例に示すように、SET DISPLAYMODE を使用して、クエリ・データの表示に使用する形式を指定できます。

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SET DISPLAYMODE XML

displaymode = xml
SAMPLES>>

DISPLAYMODE の既定値は CURRENTDEVICE です。この既定値では、クエリ・データが TXT 形式でターミナルに表示されます。SET DISPLAYMODE = CUR を指定して、CURRENTDEVICE の既定値をリストアすることができます。

その他の使用可能なオプションは、TXT、HTML、PDF、XML、および CSV です。形式の選択によってファイル・タイプが決まります。Caché は、そのタイプのファイルを作成し、ファイルにクエリ・データを書き込み、可能であれば、そのクエリ・データ・ファイルを表示するための適切なプログラムを起動します。TXT 以外のすべてのオプションでは、結果セットのメッセージを記録するために 2 つ目のファイルが作成されます。既定では、SQL シェルにより、それらのファイルが Caché の mgr\Temp\ ディレクトリに作成され、ランダムに生成されたファイル名が適切なファイル・タイプの接尾語を伴って割り当てられます。生成されたメッセージ・ファイル名は、追加された文字列 “Messages” を除いて、データ・ファイルと同じ名前になります。HTML、PDF、および XML のオプションの場合、メッセージ・ファイルには、クエリ・データ・ファイルと同じファイル・タイプ接尾辞が付きます。CSV オプションの場合、メッセージ・ファイルには TXT のファイル・タイプ接尾辞が付きます。

以下は DISPLAYMODE = TXT の場合に生成されたファイルの例です。

C:\InterSystems\Cache\mgr\Temp\sGm7qLdVZn5VbA.txt
C:\InterSystems\Cache\mgr\Temp\sGm7qLdVZn5VbAMessages.txt

クエリを実行するたびに、SQL シェルではランダムに生成されたファイル名を持つファイルの新規ペアが作成されます。

DISPLAYMODE が TXT または CSV の場合は、形式変換の実行時に、適用する変換テーブルの名前を指定することもできます。SET DISPLAYTRANSLATE または SET DISPLAYTRANSLATETABLE のいずれかを指定できます。変換テーブル名の値では、大文字と小文字が区別されます。

DISPLAYMODE が CURRENTDEVICE 以外の値に設定された場合、制御文字を含むクエリ結果セットのデータがあると、警告メッセージが生成されます。一般的に、クエリ結果セットのデータに制御文字が出現するのは、論理モードの場合のみです。例えば、論理モードで表示された場合には、リスト構造のデータに制御文字が含まれます。このため、DISPLAYMODE を CURRENTDEVICE 以外の値に設定する場合は、SELECTMODE も DISPLAY または ODBC に設定することをお勧めします。

DISPLAYFILE および DISPLAYPATH の設定

DISPLAYMODE の値が CURRENTDEVICE 以外に設定されていると、DISPLAYFILE および DISPLAYPATH パラメータを使用してターゲット・ファイルの場所を指定することができます。

  • DISPLAYFILE の場合、このパラメータを接尾語なしの簡単なファイル名に設定します。例えば、SET DISPLAYFILE = myfile のようになります。また、このパラメータを部分修飾されたパスに設定することもできます。Caché は、これを DISPLAYPATH の値または既定のディレクトリに追加します (必要に応じてサブディレクトリを作成します)。例えば、SET DISPLAYFILE = mydir\myfile のようになります。DISPLAYPATH が設定されている場合、指定されたディレクトリにこのファイル名でファイルが作成されます。DISPLAYPATH が設定されていない場合、Caché の mgr\Temp\ ディレクトリにこのファイル名でファイルが作成されます。

  • DISPLAYPATH の場合、このパラメータを既存の完全修飾されたディレクトリ・パス構造に設定します。このディレクトリ・パス構造の末尾には、お使いのオペレーティング システム・プラットフォームに応じてスラッシュ (“/”) または円記号 (“\”) を付加する必要があります。DISPLAYFILE が設定されている場合、このディレクトリに DISPLAYFILE 名でファイルが作成されます。DISPLAYFILE が設定されていない場合、このディレクトリにランダムに生成された名前でファイルが作成されます。DISPLAYPATH ディレクトリが存在しない場合、Caché は DISPLAYPATH および DISPLAYFILE 設定を無視し、代わりに、既定のディレクトリと既定のランダムに生成されたファイル名を使用します。

必要に応じて、DISPLAYPATH 値の末尾にスラッシュ (または円記号) を自動的に付加したり、DISPLAYFILE 値の先頭からスラッシュ (または円記号) を自動的に削除して、有効な完全修飾のディレクトリ・パスが作成されます。

以下の例では、DISPLAYMODE、DISPLAYFILE、および DISPLAYPATH を設定します。

SAMPLES>>SET DISPLAYMODE XML

displaymode = xml
SAMPLES>>SET DISPLAYFILE = myfile

displayfile = myfile
SAMPLES>>SET DISPLAYPATH = C:\temp\mydir\

displaypath = C:\temp\mydir\
SAMPLES>> 

クエリを実行すると、SQL シェルにより以下のファイルが生成されます。最初のファイルにはクエリ・データが含まれます。2 番目のファイルにはクエリの実行により生じたあらゆるメッセージが含まれます。

C:\temp\mydir\myfile.xml
C:\temp\mydir\myfileMessages.xml

DISPLAYFILE も DISPLAYPATH も指定しない場合、Caché インストール先の Mgr\Temp\ ディレクトリ (C:\InterSystems\Cache\Mgr\Temp\ など) にランダム生成ファイル名でファイルが作成されます。

DISPLAYMODE が CURRENTDEVICE に設定されていない場合、DISPLAYFILE を設定してクエリを実行するたびに、命名されたファイルおよび関連メッセージ・ファイルのあらゆる既存データが新規のクエリ・データにより置換されます。DISPLAYFILE 未設定でクエリを実行するたびに、SQL シェルではランダムに生成されたファイル名で新規ファイルが作成され、かつ新規の関連メッセージ・ファイルも作成されます。

DISPLAYMODE が CURRENTDEVICE に設定される場合、DISPLAYFILE および DISPLAYPATH パラメータは影響を受けません。

EXECUTEMODE の設定

SQL シェルでは、SQL 文の即時実行と遅延実行がサポートされます。即時実行では、Enter キーを押すと、指定された SQL 文の作成と実行が行われます。遅延実行では、Enter キーを押したときに文の作成は行われますが、SQL プロンプトで GO を指定するまで実行されません。

使用可能なオプションは、SET EXECUTEMODE IMMEDIATE (既定)、SET EXECUTEMODE DEFERRED、および現在のモード設定を表示する SET EXECUTEMODE です。以下の例は、実行モードを設定します。

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SET EXECUTEMODE DEFERRED

Executemode = deferred
SAMPLES>>

遅延実行を使用すると、複数の SQL クエリを作成し、名前または番号で呼び出して実行できます。作成済みの SQL 文を実行するには、必要な文を (適切なネームスペースから) 呼び出して、GO を指定します。

以下の例は、遅延モードでの 3 つのクエリの作成を示しています。最初の 2 つは保存され、呼び出し名が割り当てられます。3 つ目には名前は割り当てられませんが、番号で呼び出すことができます。

SAMPLES>>SELECT TOP 5 Name,Home_State FROM Sample.Person
1. SELECT TOP 5 Name,Home_State FROM Sample.Person
SAMPLES>>SAVE 5sample
Query saved as: 5sample
SAMPLES>>SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
2. SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
SAMPLES>>SAVE 5ordered
Query saved as: 5ordered
SAMPLES>>SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
3. SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
SAMPLES>>

以下は、上記の例で定義された 2 つのクエリを遅延モードで実行する例です。この例では、クエリの 1 つは名前で呼び出され (呼び出し時に SQL シェルで新しい番号が割り当てられます)、もう 1 つは番号で呼び出されます。

SAMPLES>>OPEN 5ordered
SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
4. SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
----------------------------------------------
SAMPLES>>GO

Name               Home_State
Djokovic,Josephine W.  AK
Klingman,Aviel P.      AK
Quine, Sam X.          AK
Xiang,Robert C.        AL
Roentgen,Alexandria Q. AR

5 Row(s) Affected
----------------------------------------------
SAMPLES>>#3
SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
3. SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
----------------------------------------------
SAMPLES>>GO
.
.
.

ECHO の設定

SET ECHO を使用して、クエリ結果を SQL シェルにエコーするかどうかを指定できます。SET ECHO=OFF を指定した場合、クエリが作成されてクエリ・キャッシュが定義され、クエリが実行されます。クエリ結果はターミナルに表示されません。以下に例を示します。

[SQL]USER>>set echo=off
 
echo = off
[SQL]USER>>SELECT Name,Age FROM Sample.MyTest
4.      SELECT Name,Age FROM Sample.MyTest
 
 
statement prepare time(s)/globals/lines/disk: 0.0002s/5/155/0ms
          execute time(s)/globals/lines/disk: 0.0001s/0/105/0ms
                          cached query class: %sqlcq.USER.cls3
---------------------------------------------------------------------------
[SQL]USER>>

SET ECHO=ON (既定) を指定した場合、クエリ結果がターミナルに表示されます。以下に例を示します。

[SQL]USER>>set echo=on
 
echo = on
[SQL]USER>>SELECT Name,Age FROM Sample.MyTest
5.      SELECT Name,Age FROM Sample.MyTest
 
Name    Age
Fred Flintstone 41
Wilma Flintstone        38
Barney Rubble   40
Betty Rubble    42
 
4 Rows(s) Affected
statement prepare time(s)/globals/lines/disk: 0.0002s/5/155/0ms
          execute time(s)/globals/lines/disk: 0.0002s/5/719/0ms
                          cached query class: %sqlcq.USER.cls3
---------------------------------------------------------------------------
[SQL]USER>>

SET ECHO は、DISPLAYMODE=CURRENTDEVICE (既定) の場合にのみ有効です。

SET ECHO および SET MESSAGES は、ターミナルに表示する内容を指定するものであり、クエリの作成や実行には影響しません。SET MESSAGES=OFF と SET ECHO=OFF の両方を指定した場合、クエリが作成されてクエリ・キャッシュが作成され、クエリの実行によってクエリ結果セットが作成されますが、ターミナルには何も返されません。

MESSAGES の設定

SET MESSAGES を使用して、クエリのエラー・メッセージ (成功しなかった場合) またはクエリの実行情報 (成功した場合) を表示するかどうかを指定できます。

  • クエリの実行が成功しなかった場合 : SET MESSAGES=OFF を指定した場合、ターミナルには何も表示されません。SET MESSAGES=ON (既定) を指定した場合、「エラー #5540: SQLCODE: -30 メッセージ: テーブル 'SAMPLE.NOTABLE' は、見つかりません」のようなクエリ・エラー・メッセージが表示されます。

  • クエリの実行が成功した場合 : SET MESSAGES=OFF を指定した場合、クエリ結果と「影響を受けた行数 n」という行のみがターミナルに表示されます。SET MESSAGES=ON (既定) を指定した場合、クエリ結果と「影響を受けた行数 n」という行の後に、文の作成メトリック、文の実行メトリック、および生成されたクエリ・キャッシュの名前が続きます。

    作成および実行のメトリックは、経過時間 (秒の小数部単位)、グローバル参照の合計数、実行された行の合計数、およびディスク読み取り待ち時間 (ミリ秒単位) で測定されます。

DISPLAYMODE を設定しても、SET MESSAGES=ON の場合に表示される情報は変わりません。DISPLAYMODE のオプションによっては、クエリの結果セット・ファイルとメッセージ・ファイルの両方が作成されます。このメッセージ・ファイルには、SET MESSAGES=ON の場合にターミナルに表示されるクエリの作成および実行のメッセージではなく、結果セットのメッセージが記述されます。

SET MESSAGES および SET ECHO は、ターミナルに表示する内容を指定するものであり、クエリの作成や実行には影響しません。SET MESSAGES=OFF と SET ECHO=OFF の両方を指定した場合、成功したクエリが作成されてクエリ・キャッシュが作成され、クエリの実行によってクエリ結果セットが作成されますが、ターミナルには何も返されません。

LOG の設定

SET LOG を使用して、SQL シェルのアクティビティのログをファイルに記録するかどうかを指定できます。使用可能なオプションは以下のとおりです。

  • SET LOG OFF : 既定値です。Caché は、現在の SQL シェルのアクティビティのログを記録しません。

  • SET LOG ON : Caché は、SQL シェルのアクティビティのログを既定のログ・ファイルに記録します。

  • SET LOG pathname : Caché は、SQL シェルのアクティビティのログを、pathname で指定されたファイルに記録します。

SET LOG ON は、Cache\mgr\namespace にログ・ファイルを作成します (namespace は、プロセスの現在のネームスペースの名前を表します)。この既定のログ・ファイル名は xsqlnnnn.log です (nnnn は、現在のプロセスのプロセス ID (pid) 番号を表します)。

既定では、ログ・ファイルは、現在のプロセスおよび現在のネームスペースに固有です。SQL シェルのアクティビティのログを、複数のプロセスまたは複数のネームスペースから同じログに記録するには、プロセスまたはネームスペースごとに SET LOG pathname を指定する際に、同じ pathname を使用します。

ログ・ファイルは、一時停止したり再開したりすることができます。ログ・ファイルを作成したら、SET LOG OFF によって、そのログ・ファイルへの書き込みが一時停止されます。また、SET LOG ON によって、既定のログ・ファイルへの書き込みが再開されます。ログ記録の再開時に、Log restarted: date time がログ・ファイルに書き込まれます。SET LOG ON では常に、既定のログ・ファイルが有効になります。したがって、指定した pathname ログ・ファイルへの書き込みを一時停止した場合は、再開時に SET LOG pathname を指定する必要があります。

ログ・ファイルの有効化によって、ターミナルに表示される SQL シェルのアクティビティのコピーが作成されますが、SQL シェルのターミナル出力にはリダイレクトされません。SQL シェルのログには、SQL の実行に失敗した場合は SQL エラーが記録され、SQL の実行に成功した場合はその SQL コードと結果として得られる行数が記録されます。SQL シェルのログには、結果セットのデータは記録されません。

ログが既に有効な場合は、SET LOG ON を指定しても効果はありません。その場合は、SET LOG pathname を指定すると、現在のログが一時停止され、pathname で指定されたログが有効になります。

PATH の設定

SET PATH schema を使用すると、スキーマ検索パスを設定できます。SQL は、これを使用して未修飾のテーブル名に既定のスキーマ名を指定します。schema は、単一のスキーマ名でも、以下の例のようにコンマで区切られたスキーマ名のリストでもかまいません。

SAMPLES>>SET PATH cinema,sample,user

引数なしで SET PATH を使用すると、現在のスキーマ検索パスが削除され、システムの既定に戻ります。SET PATH schema の指定がない場合、または指定されたスキーマでテーブルが見つからない場合、SQL シェルでは現在のネームスペースのシステム既定スキーマが使用されます。スキーマ検索パスの詳細は、"Caché ObjectScript の使用法" の “ObjectScript マクロとマクロ・プリプロセッサ” の章にある "#SQLCompile Path" のマクロを参照してください。

SELECTMODE の設定

SET SELECTMODE を使用して、クエリ・データの表示に使用するモードを指定できます。

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SET SELECTMODE DISPLAY

selectmode = display
SAMPLES>>

使用可能なオプションは、DISPLAY、LOGICAL、および ODBC です。既定は LOGICAL です。現在のモードを決定するには、値なしで SET SELECTMODE を指定します。

SAMPLES>>SET SELECTMODE

selectmode = logical
SAMPLES>>

%List データは出力不能文字を使用してエンコードされます。そのため、selectmode=logical の場合、SQL シェル は %List データ値を $LISTBUILD 文として表示します。例えば、$lb("White","Green") のようになります。Time データ型は秒の小数部をサポートします。そのため、selectmode=odbc の場合、SQL シェルは秒の小数部を表示します。これは ODBC 標準に対応しません。実際の ODBC TIME データ型では小数部が切り捨てられます。

SelectMode オプションの詳細は、このドキュメントの “Caché SQL の基礎” の章にある “データ表示オプション” を参照してください。

また、SET SELECTMODE を使用して、入力データを表示形式から論理格納形式に変換するか指定します。このデータ変換を行うには、SQL コードが RUNTIME 選択モードを使用してコンパイルされている必要があります実行時には、SET SELECTMODE は LOGICAL (既定) に設定する必要があります。詳細については、"Caché SQL リファレンス" の "INSERT" もしくは "UPDATE" 文を参照してください。

SQL のメタデータおよびパフォーマンス・メトリック

メタデータの表示、プラン表示、および SHOW 文

SQL シェルでは、以下の追加コマンドがサポートされます。

  • M または METADATA は、現在のクエリに関するメタデータ情報を表示します。

  • SHOW PLANSHOW PL (または、単なる SHOW) は、現在のクエリに関するプラン表示情報を表示します。プラン表示は、クエリのデバッグおよびパフォーマンスの最適化に使用できます。クエリに対するインデックスやコスト値の使用など、クエリの実行方法を指定します。プラン表示は、SELECT、DECLARE、非カーソルの UPDATE や DELETE、および INSERT...SELECT の文で返すことができます。

  • SHOW STATEMENT または SHOW ST は、作成済みの SQL 文を表示します。この情報は、実装クラス、引数 (TOP 節や WHERE 節の引数値などの実際の引数のコンマ区切りのリスト) と、文のテキストで構成されます。

Caché SQL シェル・コマンドの詳細は、SQL プロンプトで ? を入力するか、"インターシステムズ・クラス・リファレンス" の %SYSTEM.SQL.Shell() を参照してください。

クエリ・プランの解釈の詳細は、"Caché SQL 最適化ガイド" の “SQL クエリ・プランの解釈” を参照してください。

SQL シェルのパフォーマンス

SQL 文が正常に実行された後に、SQL シェルには 4 つの文準備値 (times(s)/globals/lines/disk) と 4 つの文実行値 (times(s)/globals/lines/disk) が表示されます。

  • statement prepare time (文の準備時間) とは、ダイナミック文の準備にかかった時間です。これには、文の生成とコンパイルにかかった時間が含まれます。また、文のキャッシュで文を検索するためにかかった時間も含まれます。したがって、文が実行されてから、番号または名前で呼び出された場合、呼び出された文にかかった準備時間はほぼゼロになります。また、文が準備され実行されてから、GO コマンドの発行によって再実行された場合、再実行にかかった準備時間はゼロになります。

  • elapsed execute time (経過した実行時間) とは、%Execute() の呼び出しを起点として、%Display() から応答が返されるまでに経過した時間です。パラメータ値が入力されるまでの待機時間は含まれません。

文の globals はグローバル参照の数、lines は実行されたコード行の数、disk はディスク待ち時間 (ミリ秒単位) です。SQL シェルでは、準備操作と実行操作について別々の数が保持されます。

これらのパフォーマンス値が表示されるのは、DISPLAYMODE が currentdevice に設定され、MESSAGES が ON に設定されている場合のみです。これらは、SQL シェルの既定の設定です。

Transact-SQL のサポート

既定で、SQL シェルは Caché SQL コードを実行します。ただし、SQL シェルは Sybase コードまたは MSSQL コードの実行に使用できます。

DIALECT の設定

既定で、SQL シェルはコードを Caché SQL として解析します。SET DIALECT を使用して、Sybase コードまたは MSSQL コードを実行するように SQL シェルを構成することができます。現在の言語を変更するには、SET DIALECT で Sybase、MSSQL、または Cache に設定します。既定値は Dialect=Cache です。

以下は、SQL シェルから MSSQL プログラムを実行する例です。

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SET DIALECT MSSQL

dialect = MSSQL
SAMPLES>>SELECT TOP 5 name + '-' + ssn FROM Sample.Person
1.      SELECT TOP 5 name + '-' + ssn FROM Sample.Person
 
Expression_1
Zweifelhofer,Maria H.-559-20-7648
Vonnegut,Bill A.-552-41-2071
Clinton,Terry E.-757-30-8013
Bachman,Peter U.-775-59-3756
Avery,Emily N.-833-18-9563
 
5 Rows(s) Affected
statement prepare time: 0.2894s, elapsed execute time: 0.0467s.
---------------------------------------------------------------------------
SAMPLES>>

Sybase 言語および MSSQL 言語が言語内でサポートする SQL 文は限定されています。サポートされる文は、SELECTINSERTUPDATE、および DELETE です。また、CREATE TABLE 文は、永続的なテーブルに対してはサポートされますが、一時テーブルに対してはサポートされません。CREATE VIEW はサポートされます。CREATE TRIGGERDROP TRIGGER もサポートされます。ただし、この実装では、CREATE TRIGGER 文が部分的に成功してもクラス・コンパイルに対しては失敗する場合には、トランザクション・ロールバックはサポートされません。CREATE PROCEDURECREATE FUNCTION はサポートされます。

COMMANDPREFIX の設定

SET COMMANDPREFIX を使用して、後続の SQL シェル・コマンドに付加する必要のある接頭語 (通常は 1 文字) を指定することができます。この接頭語は、SQL シェル・プロンプトから発行された SQL 文には使用されません。この接頭語の目的は、SQL シェル・コマンドと SQL コード文をはっきりと区別することにあります。例えば、SET は SQL シェル・コマンドであり、Sybase および MSSQL における SQL コード文でもあります。

既定では、コマンド接頭語はありません。コマンド接頭語を設定するには、SET COMMANDPREFIX=prefix を使用します (prefix は引用符なしで指定してください)。また、コマンド接頭語がない状態に戻すには、SET COMMANDPREFIX="" を使用します。以下の例は、設定、使用、および元に戻されるコマンド接頭語の / (スラッシュ文字) の例を示しています。

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
 
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>SET COMMANDPREFIX=/
 
commandprefix = /
SAMPLES>>/SET LOG=ON
 
log = xsql4148.log
SAMPLES>>  << entering multiline statement mode >>
        1>>SELECT TOP 3 Name,Age
        2>>FROM Sample.Person
        3>>/GO
9.      SELECT TOP 3 Name,Age
        FROM Sample.Person
 
Name    Age
Frith,Jose M.   13
Finn,William D. 15
Ximines,Uma Y.  44
 
3 Rows(s) Affected
statement prepare time: 0.0010s, elapsed execute time: 0.0014s.
---------------------------------------------------------------------------
SAMPLES>>/SET COMMANDPREFIX
 
commandprefix = /
SAMPLES>>/SET COMMANDPREFIX=""
 
commandprefix = ""
SAMPLES>>SET COMMANDPREFIX
 
commandprefix =
SAMPLES>>

コマンド接頭語を設定する場合は、すべての SQL シェル・コマンドに使用する必要がありますが、?、#、および GO は例外です。これら 3 つの SQL シェル・コマンドは、コマンド接頭語があってもなくても発行することができます。

SQL シェルでは、SET コマンドまたは SET COMMANDPREFIX コマンドを発行すると、SQL シェルの初期化の一部として、また ? コマンドのオプション表示の最後に、現在のコマンド接頭語が表示されます。

RUN コマンド

SQL シェルの RUN コマンドは、SQL スクリプト・ファイルを実行します。RUN コマンドを発行する前に SET DIALECT を使用して、Caché SQL、Sybase TSQL、Microsoft SQL (MSSQL) のいずれかを指定する必要があります。既定の言語は Caché SQL です。RUN scriptname を呼び出すことも、単に RUN を呼び出してスクリプト・ファイル名の入力を求められるようにすることもできます。

RUN は、スクリプト・ファイルをロードし、ファイルに含まれるそれぞれの文を作成して実行します。スクリプト・ファイル内の文は、通常 GO 行またはセミコロン (;) で区切る必要があります。RUN コマンドによって、区切り文字を指定するように求められます。

SQL スクリプト・ファイルの結果は、現在のデバイスに表示されます。また、オプションでログ・ファイルに記録することもできます。必要に応じて、作成に失敗した文が格納されるファイルを生成することもできます。

RUN コマンドは、以下の例に示すように、これらのオプションを指定するように求めるプロンプトを返します。

USER>>SET DIALECT=Sybase

dialect = Sybase
USER>>RUN
 
Enter the name of the SQL script file to run: SybaseTest
 
Enter the file name that will contain a log of statements, results and errors (.log): SyTest.log
     SyTest.log
 
Many script files contain statements not supported by Cache' SQL.
Would you like to log the statements not supported to a file so they
can be dealt with manually, if applicable?   Y=> y
Enter the file name in which to record non-supported statements (_Unsupported.log): SyTest_Unsupported.log
 
Please enter the end-of-statement delimiter (Default is 'GO'):  GO=>
 
Pause how many seconds after error?   5 => 3
 
Sybase Conversion Utility (v3)
Reading source from file:
Statements, results and messages will be logged to: SyTest.log
.
.
.

TSQL の例

以下の SQL シェルの例は、AvgAge という Sybase プロシージャを作成します。そのプロシージャが、Sybase EXEC コマンドを使用して実行されます。その後、言語が Caché に変更され、Caché SQL の CALL コマンドを使用して同じプロシージャが実行されます。

SAMPLES>>SET DIALECT Sybase
 
dialect = Sybase
SAMPLES>>  << entering multiline statement mode >>
        1>>CREATE PROCEDURE AvgAge
        2>>AS SELECT AVG(Age) FROM Sample.Person
        3>>GO
12.     CREATE PROCEDURE AvgAge
        AS SELECT AVG(Age) FROM Sample.Person
 
 
statement prepare time: 0.1114s, elapsed execute time: 0.4364s.
---------------------------------------------------------------------------
SAMPLES>>EXEC AvgAge
13.     EXEC AvgAge
 
 
 
Dumping result #1
Aggregate_1
44.35
 
1 Rows(s) Affected
statement prepare time: 0.0956s, elapsed execute time: 1.1761s.
---------------------------------------------------------------------------

SAMPLES>>SET DIALECT=Cache
 
dialect = CACHE
SAMPLES>>CALL AvgAge()
14.     CALL AvgAge()
 
 
 
Dumping result #1
Aggregate_1
44.35
 
1 Rows(s) Affected
statement prepare time: 0.0418s, elapsed execute time: 0.0040s.
---------------------------------------------------------------------------
SAMPLES>>
FeedbackOpens in a new tab