ターミナル・セッション内で発行したSQL文を変更できるエディタをコールします。SQLでは、次のような各種エディタをサポートしています。
- EDT
- OpenVMSのDEC Text Processing Utility(DECTPU)エディタ(EVEなど)
- DECTPUに基づき、構文的に正しい文を入力するためのテンプレートを装備えているOpenVMSのLanguage-Sensitive Editor(LSE)
デフォルト以外のエディタを起動するには、SQL$EDIT論理名を定義する必要があります。詳細は「使用方法」を参照してください。
通常の初期化ファイルで選択したエディタを使用して、以前のSQL文の変更、次の文や文の集合の作成、または他の文のあるファイルの組込みが可能です。
EDIT文は、対話型SQLでのみ発行できます。
*(アスタリスク)
ワイルドカード文字を指定します。*(アスタリスク)ワイルドカード文字を使用すると、SQLでは、直前のSET EDIT KEEP文で指定した一連の文が編集バッファに組み込まれます。SET EDIT KEEP文を使用していない場合、EDIT *によって直前の20の文が編集バッファに入れられます。*(アスタリスク)ワイルドカード文字を省略すると、SQLでは、直前の一文が編集バッファに組み込まれます。number
編集する以前の文の数を、最大で直前のSET EDIT KEEP文で指定した数まで指定します。数としてゼロを指定すると、SQLでは編集バッファに文が組み込まれません。数の引数を省略すると、SQLでは、直前の一文が編集バッファに組み込まれます。
- EDIT文は、次の順序で使用します。
- SQLでは、SQL$EDIT論理名で指定したエディタが起動され、そのエディタの初期化ファイル(ある場合)に基づいてエディタが初期化されます。初期化ファイルがない場合、SQLでデフォルトのエディタが使用されます。
- 要求された文が編集バッファに配置されます。
EDT、DECTPUまたはLSE以外のエディタを使用している場合、SQLでは一時ファイルに文が配置され、サブプロセスが生成され、SQL$EDIT論理名で指定したコマンドが実行されます。- SQLプロンプト(SQL>)が非表示になり、通常のエディタ用の表示に切り換えられます。
- この時点でSQL文を編集できます。
EDT、DECTPUまたはLSEの各エディタを使用している場合にエディタを終了すると、SQLでは、自動的にMAIN編集バッファにあるすべての文が実行されます。EDT、DECTPUまたはLSE以外のエディタを使用している場合は、エディタの終了時にMAIN編集バッファにあるコマンドラインを実行するかどうかを尋ねるプロンプトが表示されます。このプロンプトを無視して他のエディタで自動的にコマンドラインを実行する方法については、後述の「使用方法」を参照してください。
エディタを終了すると、SQLはコマンド・レベルに戻り、文を実行せずにSQLプロンプト(SQL>)が表示されます。
- EDTはOpenVMSシステムのデフォルト・エディタであるため、対話型SQL内で使用するエディタとして指定するための処理は必要ありません。DECTPUを使用するには、システムにインストールし、論理名SQL$EDITを定義する必要があります。LSEを使用するには、システムにインストールし、論理名SQL$EDITおよびLSE$ENVIRONMENTを定義する必要があります。
$ ! To specify DECTPU as your editor in interactive SQL: $ DEFINE SQL$EDIT TPU $ ! $ ! To specify LSE as your editor in interactive SQL: $ DEFINE SQL$EDIT LSE $ DEFINE LSE$ENVIRONMENT - _$ SYS$COMMON:[SYSLIB]LSE$SYSTEM_ENVIRONMENT.ENV
次にSQLセッションでEDITを入力すると、論理名SQL$EDITに指定されたエディタがコールされます。SQL$EDITが定義されていないか、TPUやLSE以外のものに定義されている場合は、EDITコマンドを発行するとEDTエディタが起動されます。TPUとLSEで共有可能なイメージが検出されない場合は、EDTが起動されます。- 対話型SQLで使用するためDECTPUに基づくエディタを(論理名SQL$EDITを介して)指定した場合、対話型SQLのEDIT文を発行したときに、常に作成した編集バッファとの間でファイルの読取り/込みが可能になるとはかぎりません。
- EVEエディタでは、デフォルトの編集バッファにファイルを読み込むINCLUDEコマンドは失敗します。この問題を解決するには、GET FILEコマンドを使用して別のバッファにファイルを配置し、エディタからの終了時にSQLで実行されるMAINバッファにそのバッファをコピーする必要があります。
- DECTPUに基づくすべてのバッファでは、デフォルトの編集バッファに書き込むDECTPU WRITE_FILEコマンド(EVEでのWRITE)は失敗します。別のバッファにデフォルトのバッファをコピーし、ファイルにそのバッファを書き込む必要があります。
- SQL文を実行してからHELP文を実行してヘルプ・テキストを読み取る場合、EDIT文では編集バッファに元のSQL文のみが置かれ、HELP文は置かれません。
- 対話型SQLユーザーは、上下の矢印キーを使用して、または[Ctrl]キーを押しながら[B]キーを押して、最新の20のコマンドラインをリコールできます。
- 上向きの矢印キーは、新しいものから順番にコマンドラインをリコールします。
- [Ctrl]キーを押しながら[B]キーを押しても、新しいものから順番にコマンドラインをリコールします。
- 以前のコマンドラインをリコールした後、下向きの矢印キーで直近に入力したコマンドラインをリコールできます。
- EDIT文では、オペレーティング・システム起動文や実行可能文が編集対象の文のバッファに保存されません。
- EDT、DECTPUまたはLSE以外のエディタを使用している場合は、エディタの終了時にMAIN編集バッファにあるコマンドラインを実行するかどうかを尋ねるプロンプトが表示されます。論理名SQL$EDIT_TWOを設定すると、このプロンプトを無視できます。
出力ファイルに続いて入力ファイルがエディタで受け入れられるように、論理名SQL$EDIT_TWOをTRUEに設定します。エディタによって出力ファイルが編集され、入力ファイルの内容が挿入されます。出力ファイルへの書込みにより、SQLへコマンドラインを実行するよう通知されます。論理名SQL$EDIT_TWOを使用可能にするため、論理名SQL$EDITも設定する必要があります。
論理名SQL$EDIT_TWOをTRUEに設定しない場合、エディタはファイル仕様を1つのみ使用して起動されるため、エディタの終了時にMAIN編集バッファにあるコマンドラインを実行するかどうかを尋ねるプロンプトが表示されます。
例1: スペルの誤った文の修正
- 次のように誤ったとします。
SQL> SELECT JOB_TITLE FROM JOSB; %SQL-F-RELNOTDEF, Table JOSB is not defined in schema SQL>
- エディタを起動します。
SQL> EDIT
- エディタでの作業中に、JOSBをJOBSに変更します。編集手順の詳細は、使用しているエディタのマニュアルを参照してください。
- エディタを終了します。SQLでは編集バッファの内容が自動的に実行されます。
* EXIT SELECT JOB_TITLE FROM JOBS; Associate Programmer Clerk Assistant Clerk Department Manager Dept. Supervisor . . .
プリコンパイルされたプログラムにおけるホスト言語変数の宣言部の終了位置を区切ります。
END DECLARE文は、プリコンパイル対象のホスト言語プログラムに埋め込んで使用できます。
BEGIN DECLARE SECTION
ホスト言語変数宣言の開始位置を区切ります。END DECLARE SECTION
ホスト言語変数宣言の終了位置を区切ります。;(セミコロン)
BEGIN DECLARE文およびEND DECLARE文の終端を表します。どの終端文字を使用するかは、ホスト言語変数を埋め込む言語によって異なります。次の表では、使用する終端文字を示しています。
必要なSQL終端文字 ホスト言語 BEGIN DECLARE文 END DECLARE文 COBOL END-EXEC END-EXEC FORTRAN 必要なし 必要なし Ada、C、Pascal、またはPL/I ;(セミコロン) ;(セミコロン) host language variable declaration
プログラムに埋め込まれる変数の宣言を指定します。ホスト言語変数定義の詳細は、第2.2.13項を参照してください。
- ANSI/ISO SQL規格で、埋込みSQL文で使用されるホスト言語変数は、埋め込まれたSQL BEGIN DECLARE...END DECLARE文のペアの内部で宣言する必要があると指定されています。アプリケーションでANSI/ISOに準拠することが重要な場合は、埋込みSQL文で使用するホスト言語変数宣言をすべてBEGIN DECLARE...END DECLAREブロック内に含める必要があります。
- SQLでは、ホスト言語変数をBEGIN DECLARE文とEND DECLAREで囲む必要はありません。ただし、次の2つの状況が存在する場合は、SQLにより警告メッセージが発行されます。
- BEGIN DECLARE文とEND DECLARE文で区切られたセクションがプログラムに組み込まれています。
- 参照するホスト言語変数がBEGIN DECLARE...END DECLAREセクションの外部で宣言されています。
- ホスト言語変数宣言のみでなく、その他のホスト言語文もBEGIN DECLARE...END DECLAREセクション内に含めることができます。詳細は、第2.2.13項および「BEGIN DECLARE文」を参照してください。
例1: BEGIN...END DECLAREブロック内のホスト言語変数宣言
次の例は、PL/Iプログラムの一部を示しています。この例の前半部分では、BEGIN DECLARE文とEND DECLARE文の間にホスト言語変数LNAMEが宣言されています。言語にはPL/Iを使用しているため、終端文字としてセミコロンが必要です。
この例の後半部分は、1行の結果表を指定したシングルトンSELECT文です。この文により、すでに宣言されているホスト言語変数LNAMEに行内の値が割り当てられます。
EXEC SQL BEGIN DECLARE SECTION; DECLARE LNAME char(20); EXEC SQL END DECLARE SECTION; . . . EXEC SQL SELECT FIRST_NAME INTO :LNAME FROM EMPLOYEES WHERE EMPLOYEE_ID = "00164";
SQLでは単価記号(@)は実行を表します。@と間接コマンド・ファイル名を入力すると、SQLでは、SQLプロンプト(SQL>)に1つずつ入力されたと同様にそのファイルの文が実行されます。コマンド・ファイルは、SQL文を含むテキスト・ファイルである必要があります。間接コマンド・ファイルのデフォルト・ファイル拡張子は.SQLです。
SET VERIFYT文を使用して、実行時にファイルのコマンドを表示できます。
SQLではSQLINI.SQLと呼ばれる特殊なSQLコマンド・ファイルが認識されます。これには、SQLでSQLプロンプト(SQL>)を表示する前に発行されるSQL文が含まれています。このファイルが存在する場合、SQLではファイル内のコマンドが最初に実行され、その後、プロンプトが表示され、入力を受け入れます。論理名を定義して一般初期化ファイルを指し示す場合は、SQLではこのファイルが使用されます。それ以外の場合は、現行のデフォルト・ディレクトリでSQLINI.SQLが検索されます。
実行(@)文は、対話型SQLでのみ発行できます。
file-spec
間接コマンド・ファイルの名前を指定します。完全なファイル仕様、ファイル名またはOpenVMSの論理名を使用できます。ファイル名を使用すると、SQLでは現行のデフォルト・ディレクトリでその名前のファイルが調べられます。ファイルには有効なSQL文が含まれでいる必要があります。
対話型SQLでは、単価記号(@)で始まるコマンドラインをコマンド・ファイルの起動点として解釈します。単価記号が前の行の文字列リテラルの続きでも同様に解釈されるため、混乱を招く結果が生じる可能性があります。
SQL> INSERT INTO EMPLOYEES (CITY) VALUES ('AtSign - cont> @City') %SQL-F-FILEACCERR, Error parsing name of file City') -RMS-F-SYN, file specification syntax error SQL> -- SQL> -- You can avoid errors by breaking your statement line elsewhere: SQL> -- SQL> INSERT INTO EMPLOYEES (CITY) VALUES cont> ('AtSign - @City'); 1 row inserted
例1: 起動ファイルへの対話型SQL文の保存間接コマンド・ファイルを使用して、SQLターミナル・セッションの特性を指定できます。この例では、SQLINIがファイルsetup.sqlを指し示す論理名として定義されているものとします。ファイルには次のSQL文が含まれています。
SET VERIFY; SET EDIT KEEP 5; -- This line will be displayed on the terminal
対話型SQLを起動すると、SQLによりファイルが実行されます。
$ SQL$ SQL> SET EDIT KEEP 5; -- This line will be displayed on the terminal SQL>
実行されると、setup.sqlによって間接コマンド・ファイルが表示され、編集用にSQLで保存される文の数が5に制限されます。
例2: 使用頻度の高い問合せの実行
ファイルEMPADDR.SQLには次のSQL文が含まれています。
-- This command file generates information for a mailing list. -- ATTACH 'FILENAME personnel'; SET OUTPUT MAILLIST.DOC SELECT FIRST_NAME, MIDDLE_INITIAL, LAST_NAME, ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE, POSTAL_CODE FROM EMPLOYEES; -- -- Execute the file by using the following command: -- @EMPADDR
例3: 論理名を使用したコマンド・ファイルの実行
COUNTを論理名として定義した場合は、デフォルト・ディレクトリ以外のディレクトリにファイルがある場合でも、コマンド@COUNTを使用してファイル内の文を実行できます。ファイルCOUNT.SQLには次のSQL文が含まれています。
-- This command file counts the rows in -- each table of the personnel database. -- SET NOVERIFY; SELECT 'Count of Employees -------> ', COUNT (*) FROM EMPLOYEES; SELECT 'Count of Jobs ------------> ', COUNT (*) FROM JOBS; SELECT 'Count of Degrees ---------> ', COUNT (*) FROM DEGREES; SELECT 'Count of Salary_History --> ', COUNT (*) FROM SALARY_HISTORY; SELECT 'Count of Job_History -----> ', COUNT (*) FROM JOB_HISTORY; SELECT 'Count of Work_Status -----> ', COUNT (*) FROM WORK_STATUS; SELECT 'Count of Departments -----> ', COUNT (*) FROM DEPARTMENTS; SELECT 'Count of Colleges --------> ', COUNT (*) FROM COLLEGES;
次の例は、ファイルの実行方法とその出力を示しています。
$ SQL SQL> @COUNT; Count of Employees -------> 100 1 row selected Count of Jobs ------------> 15 1 row selected Count of Degrees ---------> 166 1 row selected . . .
事前に準備されている文を動的に実行します。EXECUTE文は動的SQL文です。動的SQLでは、プリコンパイルされたプログラムのソース・コードまたはSQLモジュール言語プロシージャの一部であるSQL文とは対照的に、プログラムは実行時にSQL文を受け入れたり生成できます。プリコンパイルされたSQLまたはSQLモジュール言語文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行中に生成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。
プログラムで繰り返し文を動的に実行する必要がある場合、最初にPREPARE文で文を作成し、その都度EXECUTE文で実行します。SQLでは、EXECUTE文で動的に実行するたびに、事前に準備された文を解析し、コンパイルすることはありません。
EXECUTE文は次の環境で使用できます。
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
INTO DESCRIPTOR descriptor-name
出力パラメータまたは変数を指定するアドレスとデータ型が組み込まれたSQLDA記述子を指定します。記述子は、ホスト言語プログラムでSQLDAとして宣言された構造体である必要があります。プログラムがプリコンパイルされ、埋込みSQL文INCLUDE SQLDAを使用している場合、構造体の名前は単純にSQLDAとなります。プログラムでは複数のSQLDAを使用できますが、SQLDA以外の名前で明示的に宣言する必要があります。
プログラムでは、SQLDAのSQLDフィールドの値が出力パラメータ・マーカーの数に対応していれば、文の文字列に出力パラメータ・マーカーが含まれるかどうかに関係なく、常にEXECUTE文のINTO DESCRIPTOR句を使用できます。SQLでは、文の文字列に対してDESCRIBE文を処理する際、正しい出力パラメータ・マーカーの数でSQLDフィールドが更新されます。
INTO parameter
INTO qualified-parameter
INTO variable
EXECUTE文の正常終了によって値が返される出力パラメータまたは変数を指定します。パラメータまたは変数のリストを指定する場合、リスト内のパラメータの数は、準備された文の文字列での出力パラメータ・マーカーの数と同じである必要があります。文の文字列に出力パラメータ・マーカーがないとSQLが判断した場合は、INTO句は使用できません。
statement-name
statement-id-parameter
準備された文の名前を指定します。パラメータまたはコンパイル時の文名を指定できます。パラメータを指定すると、SQLは実行時にプログラムの識別子を設定します。SQLが返した文識別子を含むには、整数パラメータを使用します。SQLに渡す文の名前を含むには、文字列パラメータを使用します。動的に実行される文に対するPREPARE文がパラメータを指定する場合、EXECUTE文で明示的な文名ではなく同じパラメータを使用します。
USING DESCRIPTOR descriptor-name
入力パラメータまたは変数のアドレスとデータ型が組み込まれたSQLDA記述子を指定します。記述子は、ホスト言語プログラムでSQLDAとして宣言された構造体である必要があります。プログラムがプリコンパイルされ、埋込みSQL文INCLUDE SQLDAを使用している場合、構造体の名前は単純にSQLDAとなります。プログラムでは複数のSQLDAを使用できますが、SQLDA以外の名前で明示的に宣言する必要があります。
プログラムでは、SQLDAのSQLDフィールドの値が入力パラメータ・マーカーの数に対応していれば、文の文字列に入力パラメータ・マーカーが含まれるかどうかに関係なく、常にEXECUTE文のUSING DESCRIPTOR句を使用できます。SQLでは、文の文字列に対してDESCRIBE文を処理する際、正しい入力パラメータ・マーカーの数でSQLDフィールドを更新します。
USING parameter
USING qualified-parameter
USING variable
準備された文の文字列のパラメータ・マーカーの置換のためにその値がSQLで使用される、入力パラメータまたは変数を指定します。パラメータまたは変数のリストを指定する場合、リスト内のパラメータの数は、準備された文の文字列での入力パラメータ・マーカーの数と同じである必要があります。文の文字列に入力パラメータ・マーカーがないとSQLが判断した場合は、USING句は使用できません。
- EXECUTE文では、USING句またはINTO句を1つ使用する必要があります。文にパラメータがない場合は、かわりにEXECUTE IMMEDIATE文を使用します。
- EXECUTE文内では、パラメータをDESCRIPTOR構造体と混在させることができます。つまり、INTO DESCRIPTORを使用して動的文の結果を保持できますが、パラメータ・リストとともにUSINGを使用すると入力値を指定できます。
- 事前に準備された文に対してEXECUTE文を発行するとき、SQLCODEステータス・パラメータで返される成功コードまたは失敗コード以外の情報取得を必要とする場合があります。たとえば、INSERT文、DELETE文、UPDATE文、FETCH文またはSELECT文の実行により影響を受けた行数を知る必要がある場合があります。SQLでは、SQLCAのSQLERRD[2]フィールドでこの情報を返します。
ただし、SQLCAパラメータを使用して文を準備する場合、その文の実行時にSQLCAパラメータを使用する必要もあります。たとえば、CによるSQLモジュール言語のコールを使用すると、コードが次のようになる場合があります。ここで、SQLCAパラメータは両方のプロシージャに渡されます。
static struct SQLCA sqlca; /* ... */ PREPARE_STMT(&sqlca, statement, &stmt_id); /* ... */ EXECUTE_STMT(&sqlca, &stmt_id);
SQLERRD[2]フィールドなどのSQLCAの詳細は、付録Cを参照してください。
例1: パラメータ・マーカーを持つINSERT文の実行このオンライン・サンプルCプログラムsql_dynamicの一部は、SQLモジュール・プロシージャのEXECUTE文による、動的に生成されたSQL文の実行を示します。
プログラムは端末からの有効なSQL文の入力を受け入れ、次のプログラムに示すようにサブユニットをコールします。
. . . /* **---------------------------------------------------------------------------- ** Begin Main routine **---------------------------------------------------------------------------- */ int sql_dynamic (psql_stmt, input_sqlda, output_sqlda, stmt_id, is_select) char *psql_stmt; sqlda *input_sqlda; sqlda *output_sqlda; long *stmt_id; int *is_select; { sqlda sqlda_in, sqlda_out; /* Declare the SQLDA structures. */ int rowcount, status; int param; /* Declare arrays for storage of original data types and allocate memory. */ mem_ptr output_save; mem_ptr input_save; /* * If a NULL SQLDA is passed, then a new statement is being prepared. */ if ((*input_sqlda == NULL) && (*output_sqlda == NULL)) { new_statement = TRUE; /* * Allocate separate SQLDAs for input parameter markers (SQLDA_IN) * and output list items (SQLDA_OUT). Assign the value of the constant * MAXPARMS to the SQLN field of both SQLDA structures. SQLN specifies to * SQL the maximum size of the SQLDA. */ if ((sqlda_in = (sqlda) calloc (1, sizeof (sqlda_rec))) == 0) { printf ("\n\n*** Error allocating memory for sqlda_in: Abort"); return (-1); } else /* set # of possible parameters */ sqlda_in->sqln = MAXPARAMS; if ((sqlda_out = (sqlda) calloc (1, sizeof (sqlda_rec))) == 0) { printf ("\n\n*** Error allocating memory for sqlda_out: Abort"); return (-1); } } else /* Set # of possible select list items. */ sqlda_out->sqln = MAXPARAMS; /* copy name SQLDA2 to identify the SQLDA */ strncpy(&sqlda_in->sqldaid[0],"SQLDA2 ",8); strncpy(&sqlda_out->sqldaid[0],"SQLDA2 ",8); /* * Call an SQL module language procedure, prepare_stmt and * describe_stmt that contains a PREPARE and DESCRIBE...OUTPUT * statement to prepare the dynamic statement and write information * about any select list items in it to SQLDA_OUT. */ *stmt_id = 0; /* If <> 0 the BADPREPARE error results in the PREPARE.*/ PREPARE_STMT (&SQLCA, stmt_id, psql_stmt); if (SQLCA.SQLCODE != sql_success) { printf ("\n\nDSQL-E-PREPARE, Error %d encountered in PREPARE", SQLCA.SQLCODE); display_error_message(); return (-1); } DESCRIBE_SELECT (&SQLCA, stmt_id, sqlda_out); if (SQLCA.SQLCODE != sql_success) { printf ("\n\nDSQL-E-PREPARE, Error %d encountered in PREPARE", SQLCA.SQLCODE); display_error_message(); return (-1); } /* * Call an SQL module language procedure, describe_parm, that contains a * DESCRIBE...INPUT statement to write information about any parameter * markers in the dynamic statement to sqlda_in. */ DESCRIBE_PARM (&SQLCA, stmt_id, sqlda_in); if (SQLCA.SQLCODE != sql_success) { printf ("\n\n*** Error %d returned from describe_parm: Abort", SQLCA.SQLCODE); display_error_message(); return (-1); } /* Save the value of the SQLCA.SQLERRD[1] field so that program can * determine if the statement is a SELECT statement or not. * If the value is 1, the statement is a SELECT statement.*/ *is_select = SQLCA.SQLERRD[1]; . . . /* * Check to see if the prepared dynamic statement contains any parameter * markers by looking at the SQLD field of sqlda_in. SQLD contains the * number of parameter markers in the prepared statement. If SQLD is * positive, the prepared statement contains parameter markers. The program * executes a local procedure, get_in_params, that prompts the user for * values, allocates storage for those values, and updates the SQLDATA field * of sqlda_in: */ if (sqlda_in->sqld > 0) if ((status = get_in_params(sqlda_in,input_save)) != 0) { printf ("\nError returned from GET_IN_PARAMS. Abort"); return (-1); } /* Check to see if the prepared dynamic statement is a SELECT by looking * at the value in is_select, which stores the value of the * SQLCA.SQLERRD[1] field. If that value is equal to 1, the prepared * statement is a SELECT statement. The program allocates storage for * rows for SQL module language procedures to open and fetch from a cursor, * and displays the rows on the terminal: */ if (*is_select) { if (new_statement == TRUE) /* Allocate buffers for output. */ { /* assign a unique name for the cursor */ sprintf(cursor_name,"%2d",++cursor_counter); if ((status = allocate_buffers(sqlda_out)) != 0) . . . /* * If the SQLCA.SQLERRD[1] field is not 1, then the prepared statement is not a * SELECT statement and only needs to be executed. Call an SQL module language * procedure to execute the statement, using information about parameter * markers stored in sqlda_in by the local procedure get_in_params: */ { EXECUTE_STMT (&SQLCA, stmt_id, sqlda_in); if (SQLCA.SQLCODE != sql_success) . . .