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
を使用して既存のデータベース表を定義すると、プリコンパイラではその定義を使用し、データ・ディクショナリの定義は無視します。