例2: SQLCAサポートの効果の表示
#include <stdio.h> #include <sql_rdb_headers.h> exec sql declare alias filename 'db$:mf_personnel'; exec sql include SQLCA; char * s1 = "begin insert into work_status values (?, ?, ?);\ select count(*) into ? from work_status; end"; void main () { int i; SQLCA.SQLERRD[2] = SQLCA.SQLERRD[3] = 1; exec sql prepare stmt from :s1; if (SQLCA.SQLCODE != 0) sql_signal (); printf( "SQLCA:\n SQLCODE: %9d\n", SQLCA.SQLCODE); for (i = 0; i < 6; i++) printf( " SQLERRD[%d]: %9d\n", i, SQLCA.SQLERRD[i]); } |
次の結果は、3つの入力引数と1つの出力引数があることを示しています。
SQLCA: SQLCODE: 0 SQLERRD[0]: 0 SQLERRD[1]: 0 SQLERRD[2]: 1 SQLERRD[3]: 3 SQLERRD[4]: 0 SQLERRD[5]: 0 |
対話型SQLでメッセージを表示します。
PRINT文は、対話型SQLで使用できます。
AS name
出力文のヘッダーに表示される名前を変更します。デフォルトでは、リテラル値のヘッダー名は空白となり、変数ではその名前がヘッダーに使用されます。ヘッダーに空白または小文字を含める必要がある場合は、SET QUOTING RULESまたはSET DIALECTを使用してデリミタ付き識別子を有効にします。EDIT USING edit-string
EDIT USING domain-name
変数またはリテラル値の書式設定時に使用する編集文字列を割り当てます。ドメイン名を指定すると、そのドメインのEDIT STRINGが使用されます。この句は対話型SQLでのみ使用できます。
literal
コマンド・プロシージャの実行中にユーザーに表示する値を指定します。文字リテラルを一重引用符で囲みます。variable
指定した変数の内容を出力します。
- 複数のリテラルを区切るにはカンマを使用します。セパレータとして使用されるカンマは、コマンド・プロシージャの実行時にユーザーに表示されません。
- リテラルの一部としてカンマを表示するには、リテラルを囲む一重引用符の内側にカンマを含めます。
- SQLコマンド・プロシージャ内でPRINT文を実行すると、SQLはSYS$OUTPUTに結果を出力します。出力をファイルにリダイレクトするにはSET OUTPUT文を使用します。
- ドメインを使用して変数を宣言した場合は、そのドメインに定義されたEDIT STRINGが出力の書式設定のためにPRINT文で使用されます。
例1: コマンド・プロシージャのリテラルの表示コマンド・プロシージャ内の次のPRINT文は、コマンド・プロシージャの実行中に'Creating trigger definitions for the database'を表示します。
SQL> -- Trigger definition statements are next. SQL> PRINT 'Creating trigger definitions for the database'; SQL> CREATE TRIGGER EMPLOYEE_ID_CASCADE_DELETE . . .
例2: 変数の表示
次のPRINT文は変数の定義を表示します。
SQL> DECLARE :X CHAR(10); SQL> BEGIN cont> SET :X = 'Active'; cont> END; SQL> PRINT :X; X Active
対話型SQLセッションを停止し、変更内容をロールバックしてDCLプロンプトに戻ります。
QUIT文は、対話型SQLでのみ発行できます。
QUIT文およびEXIT文はともに対話型SQLセッションを終了します。QUIT文は、セッション中に加えた変更を自動的にロールバックします。EXIT文の場合、デフォルトではセッション中に加えた変更をコミットします。EXIT文では変更内容をロールバックできますが、QUIT文では変更内容をコミットできません。
準備された動的SQL文で使用されたリソースをすべて解放し、準備された文の再実行を防止できます。RELEASE文は動的SQL文です。動的SQLでは、プリコンパイルされたプログラムのソース・コードまたはSQLモジュール言語プロシージャの一部であるSQL文とは対照的に、プログラムは実行時にSQL文を受け入れたり生成できます。プリコンパイルされたSQLまたはSQLモジュール言語文とは異なり、動的に実行されるこのようなSQL文は、必ずしもプログラムのソース・コードの一部ではありませんが、プログラムの実行中に生成できます。動的SQLは、プログラムが処理する必要のあるSQL文のタイプを予測できない場合に便利です。
RELEASE文は次の環境で使用できます。
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
statement-name
statement-id-parameter
準備された文の名前またはPREPARE文で割り当てられた文の名前を指定します。1セットの動的SQL文(PREPARE、DESCRIBE、EXECUTE、動的DECLARE CURSOR)によって、任意の数の動的に実行される文を処理できます。
実行対象の文を識別するためにパラメータまたはコンパイル時の文名を指定できます。パラメータを指定すると、SQLは実行時にプログラムの識別子を設定します。SQLが返した文識別子を含むには、整数パラメータを使用します。SQLに渡す文の名前を含むには、文字列パラメータを使用します。パラメータを使用する場合は、準備された文を参照する文(DESCRIBE、EXECUTE、DECLARE CURSOR)でも、明示的な文名のかわりにこれらのパラメータを使用する必要があります。
- 動的実行のためにSQL文を準備すると、その文が直接的または間接的に参照しているスキーマ定義(制約、索引、表など)は、その文を解放するまで削除できません。
RELEASE文を使用すると、準備された文を明示的に解放できます。さらに、次の状況下では、SQLは動的SQL文を暗黙的に解放します。
- EXECUTE IMMEDIATE文の後
- 準備された文の名前をPREPARE文が参照している場合
- DISCONNECT文の後
PREPARE文の実行に失敗した文を解放する必要はありません。これらの文の解放はプログラミング・エラーです。- 準備された文が参照しているカーソルが、そのカーソルの文の解放によって破棄されている場合、準備された文を実行すると予期しない結果が生じます。次に例を示します。
DECLARE A CURSOR FOR A_STMT; PREPARE A_STMT FROM 'SELECT * FROM T'; PREPARE B_STMT FROM 'DELETE T WHERE CURRENT OF A'; OPEN A; FETCH A; EXECUTE B_STMT; CLOSE A; RELEASE A_STMT; EXECUTE B_STMT; <--- This produces unpredictable results.
例1: RELEASE文の使用COBOLプログラムの次の部分は、RELEASE文を使用して、準備されたSELECT文のリソースを解放する方法を示しています。
. . . FETCHES. DISPLAY "Here's the row we stored:" EXEC SQL PREPARE STMT FROM 'SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = "99999"' END-EXEC EXEC SQL DECLARE C CURSOR FOR STMT END-EXEC EXEC SQL OPEN C END-EXEC . . . EXEC SQL FETCH C INTO :EMP_ID:EMP_ID_IND, :LNAME:LNAME_IND, :FNAME:FNAME_IND, :MID_INIT:MID_INIT_IND, :ADDR_1:ADDR_1_IND, :ADDR_2:ADDR_2_IND, :CITY:CITY_IND, :STATE:STATE_IND, :P_CODE:P_CODE_IND, :SEX:SEX_IND, :BDATE:BDATE_IND, :S_CODE:S_CODE_IND END-EXEC DISPLAY EMP_ID," ", FNAME," ", MID_INIT," ", LNAME," ", ADDR_1," ", ADDR_2," ", CITY," ", STATE," ", P_CODE," ", SEX," ", BDATE," ", S_CODE. PERFORM CHECK EXEC SQL CLOSE C END-EXEC. PERFORM CHECK. EXEC SQL RELEASE STMT END-EXEC. PERFORM CHECK. . . .
データベース管理者によるデータベース・オブジェクトの名前の変更を可能にします。この新しい名前は、問合せやルーチンによる参照の他に、他のデータ定義文での参照にも使用できます。
注意
RENAME文を使用するには、データベースでシノニムが有効になっていることが必要な場合があります。ALTER文、CREATE文およびIMPORT DATABASE文のSYNONYMS ARE ENABLED句を参照してください。
RENAME文は次の環境で使用できます。
- 対話型SQL内
- ホスト言語プログラムに埋め込まれる場合
- SQLモジュールまたはその他の複合文のプロシージャの一部として
- 動的SQLで動的に実行される文として
newname
このオブジェクトの新しい名前です。このオブジェクト型のデータベースにすでに存在する名前およびシノニムの名前は使用できません。例外は、シノニムがoldnameオブジェクトを参照している場合です。詳細は、「使用方法」を参照してください。これがRENAME TABLE、RENAME VIEWまたはRENAME SEQUENCEの場合は、既存の表、順序またはビューの名前をnewnameにできません。
oldname
データベース内の既存のオブジェクトの名前です。オブジェクト型のキーワードが指定されている場合は、その型のオブジェクトが存在している必要があります。この名前には、指定された型のオブジェクトのシノニムも使用されます。
- DOMAINまたはOUTLINEの名前を変更するには、そのデータベースに対するALTER権限が必要です。
表、ビュー、順序、モジュール、ファンクションまたはプロシージャの名前を変更するには、各要素に対するALTER権限が必要です。プロシージャまたはファンクションがモジュールの一部である場合は、これらの要素を含むモジュールに対するALTER権限のみが必要です。
USER、ROLEまたはPROFILEの名前を変更するには、そのデータベースに対するSECURITY権限が必要です。
CONSTRAINTまたはTRIGGERの名前を変更するには、その参照表に対するALTER権限が必要です。- データベース・オブジェクトの名前は、Rdbシステム表に格納されます。この名前は、列値(RDB$SEQUENCE_NAMEなど)の他に、バイナリでエンコードされた定義(RDB$VIEW_RSEなど)および元のソース(RDB$VIEW_SOURCE)にも使用されます。
RENAME句は、新しい名前を参照するためにすべての列値を変更します。ただし、このコマンドでは、エンコードされた値と元のSQLソース・コードは変更されません。
これらのエンコードされた定義や事前にコンパイルされたアプリケーションをサポートするには、古い名前を使用して、オブジェクトの新しい名前を参照するシノニムを作成します。
RENAME文は、ドメイン、ファンクション、モジュール、プロシージャ、順序、表およびビューの古い名前に対するシノニムを作成します。使用しない場合、これらのシノニムは削除できます。
注意
OUTLINES、CONSTRAINTS、OUTLINES、PROFILES、ROLES、TRIGGERSまたはUSERSのシノニムは作成できません。したがって、RENAMEはこれらのオブジェクトのシノニムを作成しません。これらのオブジェクトの古い名前がモジュール定義またはアプリケーション・コードで使用されている場合は注意してください。
- シノニムがすでに存在し、同じオブジェクトを参照している場合、そのシノニムはRENAME文の一部として削除されます。たとえば、表の名前を変更して以前のoldnameに戻す場合、その名前を持つシノニムがすでに存在します。このシノニムは、名前変更の操作中に暗黙的に削除されます。
- オブジェクト型はオプションです。オブジェクト型のキーワードが指定されていない場合は、一致する名前が次の順序で検索されます。
- 表またはビュー
- ドメイン
- ファンクションまたはプロシージャ
- モジュール
- 順序
- トリガー
- 制約
- アウトライン
- ユーザー
- ロール
- プロファイル
- 表でIDENTITY列が作成されると、表と同じ名前の順序が暗黙的に作成されます。識別順序ではRENAME SEQUENCEを使用できません。表の名前およびその識別順序を変更するには、かわりにRENAME TABLEを使用します。
- RENAMEを使用してRdbのシステム表、ビューまたは順序の名前を変更することはできません。
- 次の表では、RENAME文を同義のALTER文と比較します。
表6-12 RENAME文とALTER文の比較 RENAME文 同義のALTER文 シノニムの作成 RENAME CONSTRAINT ALTER CONSTRAINT ...RENAME TO × RENAME DOMAIN ALTER DOMAIN ...RENAME TO ○ RENAME FUNCTION ALTER FUNCTION ...RENAME TO ○ RENAME MODULE ALTER MODULE ...RENAME TO ○ RENAME OUTLINE ALTER OUTLINE ...RENAME TO × RENAME PROCEDURE ALTER PROCEDURE ...RENAME TO ○ RENAME PROFILE ALTER PROFILE ...RENAME TO × RENAME ROLE ALTER ROLE ...RENAME TO × RENAME SEQUENCE ALTER SEQUENCE ...RENAME TO ○ RENAME TABLE ALTER TABLE ...RENAME TO ○ RENAME TRIGGER ALTER TRIGGER ...RENAME TO × RENAME USER ALTER USER ...RENAME TO × RENAME VIEW 同義のALTER文なし ○
例1: RENAME文のためのデータベースの準備
ほとんどのオブジェクトのRENAME文では、シノニムが有効である必要があります。この例は、シノニムを必要とするオブジェクトでRENAMEを試行した場合のエラー・レポートを示しています。
SQL> attach 'filename personnel_sql'; SQL> show table User tables in database with filename personnel_sql CANDIDATES COLLEGES CURRENT_INFO A view. CURRENT_JOB A view. CURRENT_SALARY A view. DEGREES DEPARTMENTS EMPLOYEES JOBS JOB_HISTORY RESUMES SALARY_HISTORY WORK_STATUS SQL> rename table EMPLOYEES to COMPANY_STAFF; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-E-UNSSYNONYM, this database does not have synonyms enabled SQL> disconnect all; SQL> alter database filename personnel_sql synonyms are enabled;
例2: PERSONNELデータベースの表の名前変更
この例では、EMPLOYEES表の名前を変更します。SHOW TABLE文は、表の古い名前によるシノニムと新しい名前を示します。
SQL> attach 'filename personnel_sql'; SQL> rename table EMPLOYEES to COMPANY_STAFF; SQL> show table User tables in database with filename personnel_sql CANDIDATES COLLEGES COMPANY_STAFF CURRENT_INFO A view. CURRENT_JOB A view. CURRENT_SALARY A view. DEGREES DEPARTMENTS JOBS JOB_HISTORY RESUMES SALARY_HISTORY WORK_STATUS EMPLOYEES A synonym for table COMPANY_STAFF SQL> select last_name from COMPANY_STAFF where employee_id = '00164'; LAST_NAME Toliver 1 row selected SQL>
例3: 元の名前への名前変更
この例は、元の名前への名前変更によってシノニムが新規に作成され、表の新規名と同じ名前の古いシノニムが削除されることを示します。
SQL> rename table COMPANY_STAFF to EMPLOYEES; SQL> show table User tables in database with filename personnel_sql CANDIDATES COLLEGES CURRENT_INFO A view. CURRENT_JOB A view. CURRENT_SALARY A view. DEGREES DEPARTMENTS EMPLOYEES JOBS JOB_HISTORY RESUMES SALARY_HISTORY WORK_STATUS COMPANY_STAFF A synonym for table EMPLOYEES SQL>
例4: 同じオブジェクト・クラスまたはシノニムで使用されている名前への変更不可
RENAMEコマンドでは、オブジェクトの同じクラスまたはシノニムによって使用されている名前を新しい名前に指定できません。特定の表、ビューおよび順序は、同じネームスペースを共有しています。
SQL> rename view CURRENT_INFO to CURRENT_SALARY; %SQL-F-REL_EXISTS, Table CURRENT_SALARY already exists in this database or schema SQL> create sequence CURRENT_INFORMATION; SQL> rename view CURRENT_INFO to CURRENT_INFORMATION; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-E-SEQEXTS, there is another sequence named "CURRENT_INFORMATION" in this database -RDMS-F-RELNOTCHG, relation CURRENT_INFO has not been changed
終了条件が満たされるまで、複合ループ内の1つ以上のSQL文を繰り返し実行します。
複数文プロシージャの複合文のREPEAT制御文は、次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
beginning-label:
名前をREPEAT文に割り当てます。LEAVE文とともに開始ラベルを使用することにより、繰返しループの終了を制御できます。名前付き繰返しループはラベル付き繰返しループ文と呼ばれます。開始ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。END REPEAT ending-label
制御ループの終了をマークします。オプションの終了ラベルを含める場合、その終了ラベルは対応する開始ラベルと正確に一致している必要があります。終了ラベルは、そのラベルが含まれているプロシージャ内で一意である必要があります。オプションのending-label引数により、特に複雑な複数文プロシージャ・ブロックの場合に、複数文プロシージャが読みやすくなります。
REPEAT compound-use-statement
UNTIL条件句で指定された終了条件が満たされるまで、SQL文のブロックを繰り返し実行します。UNTIL predicate
SQLのREPEAT ... UNTILブロック(SQLの複合文と総称される)内の埋込みSQL文を実行できる回数を制御する条件を指定します。複合文を1回実行すると、UNTIL条件が評価されます。条件がFALSEまたはNULL(不明)に評価され、エラー例外が発生していない場合、複合文が再度実行されます。検索条件がFALSEまたはNULLに評価されるたびに、REPEAT文により複合文が実行されます。UNTIL条件がTRUEに評価されると、複合文は無視され、END REPEAT文の後の文に制御が渡されます。
REPEAT文では、ループ本体が1回以上実行されます。
例1: REPEAT文を使用した現在のディレクトリのファイルの表示
SQL> SET VERIFY; SQL> ATTACH 'FILE SCRATCH'; SQL> CREATE DOMAIN file_name VARCHAR(255); SQL> CREATE PROCEDURE find_file cont> (IN :FILESPEC file_name BY DESCRIPTOR, cont> INOUT :RESULTANT_FILESPEC file_name BY DESCRIPTOR, cont> INOUT :CONTEXT INTEGER BY REFERENCE); cont> EXTERNAL NAME LIB$FIND_FILE cont> LOCATION 'SYS$LIBRARY:LIBRTL.EXE' cont> LANGUAGE GENERAL cont> PARAMETER STYLE GENERAL cont> COMMENT IS cont> 'DCL HELP: LIB$FIND_FILE ' cont> / 'The Find File routine is called with a wildcard file' cont> / 'specification for which it searches. LIB$FIND_FILE ' SQL> CREATE PROCEDURE Find_file_end cont> (IN :CONTEXT INTEGER BY REFERENCE); cont> EXTERNAL cont> NAME LIB$FIND_FILE_END cont> LOCATION 'SYS$LIBRARY:LIBRTL.EXE' cont> LANGUAGE GENERAL cont> PARAMETER STYLE GENERAL cont> COMMENT IS cont> 'DCL HELP: LIB$FIND_FILE_END ' cont> / 'The End of Find File routine is called once' cont> / 'after each sequence of ' cont> / 'calls to LIB$FIND_FILE. LIB$FIND_FILE_END deallocates' cont> / 'any saved Record Management Service (RMS) context and' cont> / 'deallocates the virtual memory used to hold the' cont> / 'allocated context block.'; SQL> SET FLAGS 'TRACE'; SQL> BEGIN cont> -- This procedure performs a call to an external cont> -- routine to list files located in the current cont> -- default directory cont> DECLARE :done, :context integer = 0; cont> DECLARE :search_string FILE_NAME = '*.SQL'; cont> DECLARE :file_spec FILE_NAME; cont> REPEAT cont> -- Ask the OpenVMS routine for the next name cont> CALL find_file (:search_string, :file_spec, :context); cont> IF POSITION ('*' in :file_spec) = 0 cont> AND POSITION ('%' in :file_spec) = 0 cont> AND POSITION ('...' in :file_spec) = 0 cont> THEN cont> -- Display the name (there are no wildcards) cont> TRACE :file_spec; cont> ELSE cont> SET :done = 1; cont> END IF; cont> -- Exit when we have no more file names cont> UNTIL :done = 1 cont> END REPEAT; cont> -- Clean up search context cont> CALL find_file_end (:context); cont> END; ~Xt: RDBVMS:[USER.V71]CREATE_ROLES.SQL;1 ~Xt: RDBVMS:[USER.V71]TEST.SQL;1 SQL>