日本語PDF

D 構文および意味検査

この付録の内容は次のとおりです。

埋込みSQL文およびPL/SQLブロックの構文および意味を検査すると、Oracleプリコンパイラはコーディングの誤りをすみやかに発見し修正できるよう支援します。この付録では、SQLCHECKオプションを使用してチェックの種類と範囲を制御する方法を説明します。

D.1 構文検査と意味検査

構文規則は、言語要素を並べて正しい文を作成する基準を示します。つまり、構文検査はキーワード、オブジェクト名、演算子、デリミタなどが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言語リファレンス』を参照してください。

D.2 チェックの種類および範囲の制御について

チェックの種類と範囲は、コマンドラインでSQLCHECKオプションを指定することで制御します。SQLCHECKでは、チェックの種類に構文、セマンティック、あるいはその両方のいずれかを指定できます。検査の範囲には、DML文とPL/SQLブロックを含めることができます。ただし、動的SQL文は実行時まで完全に定義されないため、SQLCHECKではチェックできません。

SQLCHECKには次の値を指定できます。

  • SEMANTICS|FULL

  • SYNTAX|LIMITED|NONE

SEMANTICS値とFULL値は等価です。同様に、SYNTAX値とLIMITED値も等価ですデフォルト値SYNTAXです。

D.3 SQLCHECK=SEMANTICSの指定について

SQLCHECK=SEMANTICSを指定した場合、プリコンパイラでは次のものを対象とした構文およびセマンティックのチェックが行われます。

  • INSERTUPDATEなどのデータ操作文

  • 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を指定する必要があります

D.3.1 意味検査の使用許可について

SQLCHECK=SEMANTICSを指定すると、プリコンパイラではセマンティック・チェックに必要な情報を、次のいずれかの方法で取得できます。

  • Oracleに接続し、そのデータ・ディクショナリにアクセス

  • 埋込みDECLARE TABLE文を使用

D.3.2 Oracleへの接続について

セマンティック・チェックを行うために、プリコンパイラではホスト・プログラムで参照される表およびビューの定義が保存されている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文から必要な情報を取得する必要があります。

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