ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


EDIT文

ターミナル・セッション内で発行したSQL文を変更できるエディタをコールします。

SQLでは、次のような各種エディタをサポートしています。

デフォルト以外のエディタを起動するには、SQL$EDIT論理名を定義する必要があります。詳細は「使用方法」を参照してください。

通常の初期化ファイルで選択したエディタを使用して、以前のSQL文の変更、次の文や文の集合の作成、または他の文のあるファイルの組込みが可能です。


環境

EDIT文は、対話型SQLでのみ発行できます。

形式



引数

*(アスタリスク)

ワイルドカード文字を指定します。*(アスタリスク)ワイルドカード文字を使用すると、SQLでは、直前のSET EDIT KEEP文で指定した一連の文が編集バッファに組み込まれます。SET EDIT KEEP文を使用していない場合、EDIT *によって直前の20の文が編集バッファに入れられます。*(アスタリスク)ワイルドカード文字を省略すると、SQLでは、直前の一文が編集バッファに組み込まれます。

number

編集する以前の文の数を、最大で直前のSET EDIT KEEP文で指定した数まで指定します。数としてゼロを指定すると、SQLでは編集バッファに文が組み込まれません。数の引数を省略すると、SQLでは、直前の一文が編集バッファに組み込まれます。

使用方法


例1: スペルの誤った文の修正

  1. 次のように誤ったとします。


    SQL> SELECT JOB_TITLE FROM JOSB;
    %SQL-F-RELNOTDEF, Table JOSB is not defined in schema
    SQL>
    

  2. エディタを起動します。


    SQL> EDIT
    

  3. エディタでの作業中に、JOSBをJOBSに変更します。編集手順の詳細は、使用しているエディタのマニュアルを参照してください。

  4. エディタを終了します。SQLでは編集バッファの内容が自動的に実行されます。


    * EXIT
    SELECT JOB_TITLE FROM JOBS;
     Associate Programmer
     Clerk
     Assistant Clerk
     Department Manager
     Dept. Supervisor
           .
           .
           .
    
    
    
    


END DECLARE文

プリコンパイルされたプログラムにおけるホスト言語変数の宣言部の終了位置を区切ります。

環境

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項を参照してください。


使用方法


例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文

事前に準備されている文を動的に実行します。

EXECUTE文は動的SQL文です。動的SQLでは、プリコンパイルされたプログラムのソース・コードまたはSQLモジュール言語プロシージャの一部であるSQL文とは対照的に、プログラムは実行時にSQL文を受け入れたり生成できます。プリコンパイルされたSQLまたはSQLモジュール言語文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行中に生成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。

プログラムで繰り返し文を動的に実行する必要がある場合、最初にPREPARE文で文を作成し、その都度EXECUTE文で実行します。SQLでは、EXECUTE文で動的に実行するたびに、事前に準備された文を解析し、コンパイルすることはありません。


環境

EXECUTE文は次の環境で使用できます。


形式



引数

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句は使用できません。


使用方法


例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)
   .
   .
   .