ヘッダーをスキップ
Oracle® Database Oracleプリコンパイラのためのプログラマーズ・ガイド
11g リリース2(11.2)
B61344-01
  目次
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

D 構文およびセマンティックのチェック

この付録の項目は次のとおりです。

埋込み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には次の値を指定できます。

SEMANTICSFULLの値が等価であるのと同様に、SYNTAXLIMITEDも等価です。デフォルト値はSYNTAXです。

SQLCHECK=SEMANTICSの指定

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

ただし、プリコンパイラでチェックするのは、リモートのデータ操作文(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を指定する必要があります

セマンティック・チェックの有効化

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

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

  • 埋込みDECLARE TABLE文を使用

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文から必要な情報を取得する必要があります。

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