この付録の項目は次のとおりです。
埋込みSQL文とPL/SQLブロックの構文およびセマンティックをチェックすることで、Oracleプリコンパイラではコーディングの誤りをすみやかに発見し修正できるように支援します。この付録では、SQLCHECK
オプションを使用してチェックの種類と範囲を制御する方法を説明します。
構文規則では、有効な文を作成するための言語要素の並べ方を指定しています。したがって、構文チェックは、キーワード、オブジェクト名、演算子、デリミタなどがSQL文で正しく配置されていることを検証します。たとえば、次の埋込みSQL文には構文上のエラーがあります。
-- misspelled keyword WHERE EXEC SQL DELETE FROM EMP WERE DEPTNO = 20; -- missing parentheses around column names COMM and SAL EXEC SQL INSERT INTO EMP COMM, SAL VALUES (NULL, 1500);
セマンティックの規則では、有効な外部参照を行う方法を指定しています。したがって、セマンティック・チェックでは、データベース・オブジェクトおよびホスト変数への参照が有効であることと、ホスト変数のデータ型が正しいことを検証します。たとえば、次の埋込みSQL文にはセマンティック・エラーがあります。
-- nonexistent table, EMPP EXEC SQL DELETE FROM EMPP WHERE DEPTNO = 20; -- undeclared host variable, emp_name EXEC SQL SELECT * FROM EMP WHERE ENAME = :emp_name;
SQLの構文およびセマンティックの定義は、『Oracle Database SQL言語リファレンス』を参照してください。
チェックの種類と範囲は、コマンドラインでSQLCHECK
オプションを指定することで制御します。SQLCHECK
では、チェックの種類に構文、セマンティック、あるいはその両方のいずれかを指定できます。チェックの範囲には、データ操作文およびPL/SQLブロックを含めることができます。ただし、動的SQL文は実行時まで完全に定義されないため、SQLCHECK
ではチェックできません。
SQLCHECK
には次の値を指定できます。
SEMANTICS|FULL
SYNTAX|LIMITED|NONE
SEMANTICS
とFULL
の値が等価であるのと同様に、SYNTAX
とLIMITED
も等価です。デフォルト値はSYNTAX
です。
SQLCHECK=SEMANTICS
を指定した場合、プリコンパイラでは次のものを対象とした構文およびセマンティックのチェックが行われます。
INSERT
やUPDATE
などのデータ操作文
PL/SQLブロック
ただし、プリコンパイラでチェックするのは、リモートのデータ操作文(AT
db_name
句を使用する文)のみです。
プリコンパイラでは、セマンティック・チェックに必要な情報を、埋め込まれたDECLARE
TABLE
文から取得します。USERID
オプションが指定されている場合は、Oracleに接続し、データ・ディクショナリにアクセスして取得します。データ操作文またはPL/SQLブロックで参照される表がすべてDECLARE
TABLE
文で定義されていれば、Oracleに接続する必要はありません。
Oracleに接続してもデータ・ディクショナリで見つからない情報がある場合は、DECLARE
TABLE
文を使用して、欠けている情報を提供する必要があります。DECLARE
TABLE
文の定義とデータ・ディクショナリの定義が矛盾する場合、前者が優先されます。
データ操作文のチェックの際、プリコンパイラでは『Oracle Database SQL言語リファレンス』に記載されているOracleデータベース・バージョン7の構文規則が使用されますが、セマンティック・チェックにはさらに厳密な規則が使用されます。その結果、SQLCHECK=SEMANTICS
のとき、Oracleの以前のバージョン用に作成した既存のアプリケーションを正常にプリコンパイルできない可能性があります。
新しいプログラムをプリコンパイルするときには、SQLCHECK=SEMANTICS
を指定してください。ホスト・プログラムにPL/SQLブロックを埋め込む場合は、SQLCHECK=SEMANTICS
を指定する必要があります。
セマンティック・チェックを行うために、プリコンパイラではホスト・プログラムで参照される表およびビューの定義が保存されているOracleデータベースに接続できます。Oracleに接続した後、プリコンパイラはデータ・ディクショナリにアクセスして必要な情報を探します。データ・ディクショナリには、表および列の名前、表および列の制約、列の長さ、列のデータ型などが格納されています。
必要な情報の一部がデータ・ディクショナリで見つからない場合(たとえば、プログラムがまだ作成されていない表を参照する場合など)、DECLARE TABLE
文を使用して足りない情報を指定する必要があります。
Oracleに接続するには、次の構文を使用して、コマンドラインでUSERID
オプションを指定します。
USERID=username
usernameは有効なOracleユーザーIDです。パスワードの入力が求められます。ユーザー名のかわりに、次のように指定したとします。
USERID=/
プリコンパイラでは、このユーザーIDを使用してOracleへの接続が自動的に試みられます。
<prefix><username>
prefixにはOracle初期化パラメータOS_AUTHENT_PREFIX
の値(デフォルト値はNULL)を指定し、usernameには使用しているオペレーティング・システムのユーザー名またはタスク名を指定します。
Oracleへの接続を試みて失敗した場合(たとえば、データベースが使用できない場合など)、プリコンパイラは処理を停止し、エラー・メッセージを発行します。USERID
オプションの指定を省略すると、プリコンパイラでは埋込みDECLARE
TABLE
文から必要な情報を取得する必要があります。
プリコンパイラでは、Oracleに接続しなくても、セマンティック・チェックを実行できます。チェックを実行するには、埋込みDECLARE TABLE
文から表やビューに関する情報を取得する必要があります。そのため、データ操作文やPL/SQLブロックで参照する表はすべてDECLARE TABLE
文で定義する必要があります。
DECLARE TABLE
文の構文は次のとおりです。
EXEC SQL DECLARE table_name TABLE (col_name col_datatype [DEFAULT expr] [NULL|NOT NULL], ...);
exprは、CREATE TABLE
文でデフォルトの列値として使用できる任意の式です。
DECLARE TABLE
を使用して既存のデータベース表を定義すると、プリコンパイラではその定義を使用し、データ・ディクショナリの定義は無視します。