SQL データベースのデータへのアクセス

このドキュメントでは、Natural で Entire Access を経由して SQL データベースを使用する方法について説明します。インストールおよび設定の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural と Entire Access」、および別冊の Entire Access ドキュメントを参照してください。

このドキュメントでは、次のトピックについて説明します。

注意:
原則として、『Adabas データベースのデータへのアクセス』ドキュメントに記載されている機能とその例は、Natural がサポートする SQL データベースにも該当します。相違点がある場合は、個別のデータベースアクセスステートメントに関するドキュメントの「データベース固有の考慮事項」(『ステートメント』ドキュメントを参照)または各 Natural パラメータに関するドキュメント(『パラメータリファレンス』を参照)に詳細が記載されています。また、Natural では SQL データベースにアクセスするための特別な一連のステートメントが提供されます。


Natural DDMs の生成

Entire Access は、Natural SQL ステートメントおよびほとんどの Natural DML ステートメントをサポートするアプリケーションプログラミングインターフェイス(API)です(『ステートメント』ドキュメントを参照)。

Natural DML ステートメントおよび Natural SQL ステートメントは、同じ Natural プログラムで使用することができます。コンパイル時に、NATCONF.CFG 内に定義されているデータソースの DDM が DBMS タイプ SQL で DML ステートメントによって参照されると、Natural はこの DML ステートメントを SQL ステートメントに変換します。

Natural は DML ステートメントおよび SQL ステートメントを Entire Access へのコールに変換します。Entire Access はこれらの要求を、ターゲット RDBMS で必要とされるデータフォーマットと SQL 方言に変換し、データベースドライバに渡します。

Natural プロファイルパラメータの設定

ETEOP パラメータ

このパラメータは Natural 管理者のみが設定可能です。

Natural プロファイルパラメータ ETEOP は、Natural セッション中のトランザクション処理を制御します。例えば、1 つの論理トランザクションを 2 つ以上の Natural プログラムにわたって処理する場合などに必要になります。この場合、Natural プログラムの終了時に、Natural で END TRANSACTION コマンドを発行しない、つまり "コミット" しないでください。

ETEOP パラメータを設定すると、次のように処理されます。

ON

Natural セッションが ET 状態でない場合は、Natural プログラムの終了時に Natural から END TRANSACTION ステートメントが発行されます。つまり、自動的に "コミット" されます。

OFF

Natural プログラムの終了時に、Natural から END TRANSACTION コマンドは発行されません(つまり、"コミット" されません)。したがって、このように設定すると、単一の論理トランザクションを複数の Natural プログラムにわたって処理することができます。

これがデフォルトです。

注意:
ETEOP パラメータは、Natural バージョン 6.1 以降に適用されます。Natural の以前のバージョンでは、Natural プロファイルパラメータ OPRBETEOP の代わりに使用する必要があります(ETEOP=ONOPRB=OFF に、ETEOP=OFFORPB=NOOPEN に相当します)。

Natural DML ステートメント

次の表は、Natural が行う DML ステートメントから SQL ステートメントへの変換を示しています。

DML ステートメント SQL ステートメント
BACKOUT TRANSACTION ROLLBACK
DELETE DELETE WHERE CURRENT OF cursor-name
END TRANSACTION COMMIT
EQUAL ... OR IN (...)
EQUAL ... THRU ... BETWEEN ... AND ...
FIND ALL SELECT
FIND NUMBER SELECT COUNT (*)
HISTOGRAM SELECT COUNT (*)
READ LOGICAL SELECT ... ORDER BY
READ PHYSICAL SELECT ... ORDER BY
SORTED BY ... [DESCENDING] ORDER BY ... [DESCENDING]
STORE INSERT
UPDATE UPDATE WHERE CURRENT of cursor-name
WITH WHERE

注意:
ブール演算子および関係演算子は、DML ステートメントと SQL ステートメントで同様に機能します。

Entire Access では、次に示す DML ステートメントおよびオプションはサポートされません。

  • CIPHER

  • COUPLED

  • FIND FIRST, FIND UNIQUE, FIND ... RETAIN AS

  • GET, GET SAME, GET TRANSACTION DATA, GET RECORD

  • PASSWORD

  • READ BY ISN

  • STORE USING/GIVING NUMBER

BACKOUT TRANSACTION

Natural は、BACKOUT TRANSACTION ステートメントを SQL ROLLBACK コマンドに変換します。このステートメントは、最後のリカバリユニットが完了した後に行われたすべてのデータベース更新を元に戻します。リカバリユニットはセッションの最初、あるいは最後の END TRANSACTIONCOMMIT)ステートメントまたは BACKOUT TRANSACTIONROLLBACK)ステートメントの後に開始できます。

注意:
作業の論理ユニットが終了すると、すべてのカーソルが閉じるため、BACKOUT TRANSACTION ステートメントをデータベースループの内部に配置しないでください。ループの外側、またはネストされたループの一番外側のループの後に配置してください。

DELETE

DELETE ステートメントは、先行する FINDREAD、または SELECT の各ステートメントによって読み込まれた行をデータベーステーブルから削除します。SQL ステートメントの DELETE WHERE CURRENT OF cursor-name に対応します。つまり、最後に読み込まれた行だけを削除できます。

例:

FIND EMPLOYEES WITH NAME = 'SMITH'
     AND FIRST_NAME = 'ROGER'
DELETE

Natural は、上述した Natural ステートメントを次の SQL ステートメントに変換し、カーソル名(例えば、CURSOR1)を割り当てます。SELECT ステートメントと DELETE ステートメントは同じカーソルを参照します。

SELECT FROM EMPLOYEES
 WHERE NAME = 'SMITH' AND FIRST_NAME = 'ROGER'
DELETE FROM EMPLOYEES
 WHERE CURRENT OF CURSOR1

Natural は、FIND ステートメントを SQL SELECT ステートメントに変換する方法で、DELETE ステートメントを SQL DELETE ステートメントに変換します。詳細については、後述の FIND ステートメントの説明を参照してください。

注意:
FIND SORTED BY ステートメントまたは READ LOGICAL ステートメントで読み込まれた行を削除することはできません。詳細については、後述の FIND ステートメントおよび READ ステートメントの説明を参照してください。

END TRANSACTION

Natural は、END TRANSACTION ステートメントを SQL COMMIT コマンドに変換します。END TRANSACTION ステートメントは、論理トランザクションの終わりを示し、データベースに対してすべての更新をコミットし、トランザクション中にロックされていたデータを解放します。

注意:

  1. 作業の論理ユニットが終了すると、すべてのカーソルが閉じるため、END TRANSACTION ステートメントをデータベースループの内部に配置しないでください。ループの外側、またはネストされたループの一番外側のループの後に配置してください。
  2. Entire Access とともに使用するときは、END TRANSACTION ステートメントでトランザクション(ET)データを保存することはできません。
  3. Entire Access では、Natural プログラムの終了時に COMMIT は自動的に発行されません。

FIND

Natural は、FIND ステートメントを SQL SELECT ステートメントに変換します。SELECT ステートメントは OPEN CURSOR コマンドによって実行され、その後に FETCH コマンドが続きます。FETCH コマンドは、すべてのレコードが読み込まれるか、またはプログラムが FIND 処理ループを終了するまで繰り返し実行されます。CLOSE CURSOR コマンドにより SELECT 処理が終了します。

例:

Natural ステートメント:

FIND EMPLOYEES WITH NAME = 'BLACKMORE'
   AND AGE EQ 20 THRU 40
OBTAIN PERSONNEL_ID NAME AGE

同等の SQL ステートメント:

SELECT PERSONNEL_ID, NAME, AGE
  FROM EMPLOYEES
    WHERE NAME = 'BLACKMORE'
      AND AGE BETWEEN 20 AND 40

検索条件の作成には、ディスクリプタとして指定されているテーブルの任意の列(フィールド)を使用できます。

Natural は FIND ステートメントの WITH 節を SQL SELECT ステートメントの WHERE 節に変換します。Natural は、WITH 節を使用して行が選択された後で、FIND ステートメントの WHERE 節を評価します。ビューフィールドは、ディスクリプタとして指定されている場合にのみ、WITH 節で使用できます。

Natural は、FIND NUMBER ステートメントを COUNT(*) 節が含まれる SQL SELECT ステートメントに変換します。特定の検索条件についてレコードが存在するかどうかを決定する場合は、IF NO RECORDS FOUND 節よりも FIND NUMBER ステートメントの方がパフォーマンスが優れています。

注意:
SORTED BY 節が含まれる FIND ステートメントで読み込まれた行を更新または削除することはできません。Natural は、FIND ステートメントの SORTED BY 節を SQL SELECT ステートメントの ORDER BY 節に変換します。これにより、読み取り専用の結果テーブルが作成されます。

HISTOGRAM

Natural は、HISTOGRAM ステートメントを SQL SELECT ステートメントに変換します。HISTOGRAM ステートメントによって、テーブル内の行のうち特定の列に同じ値を持つ行の数が返されます。行の数は、Natural システム変数 *NUMBER で返されます。

例:

Natural ステートメント:

HISTOGRAM EMPLOYEES FOR AGE
OBTAIN AGE

同等の SQL ステートメント:

SELECT AGE, COUNT(*) FROM EMPLOYEES
  GROUP BY AGE
  ORDER BY AGE

READ

Natural は、READ ステートメントを SQL SELECT ステートメントに変換します。READ PHYSICAL および READ LOGICAL の両ステートメントを使用できます。

READ LOGICAL ステートメントで読み込まれた行(例 1)を更新または削除することはできません。Natural は、READ LOGICAL ステートメントを SQL SELECT ステートメントの ORDER BY 節に変換します。これにより、読み取り専用の結果テーブルが作成されます。

READ PHYSICAL ステートメント(例 2)は更新または削除できます。Natural はこのステートメントを ORDER BY 節のない SELECT ステートメントに変換します。

例 1

Natural ステートメント:

READ PERSONNEL BY NAME
OBTAIN NAME FIRSTNAME DATEOFBIRTH

同等の SQL ステートメント:

SELECT NAME, FIRSTNAME, DATEOFBIRTH FROM PERSONNEL
  WHERE NAME >= ' '
    ORDER BY NAME

例 2:

Natural ステートメント:

READ PERSONNEL PHYSICAL
OBTAIN NAME

同等の SQL ステートメント:

SELECT NAME FROM PERSONNEL

READ ステートメントに WHERE 節が含まれる場合、Natural は検索条件に従って行が選択された後で WHERE 節を評価します。

STORE

STORE ステートメントはデータベーステーブルに行を追加します。SQL INSERT ステートメントに対応します。

例:

Natural ステートメント:

STORE RECORD IN EMPLOYEES
  WITH PERSONNEL_ID = '2112'
       NAME         = 'LIFESON'
       FIRST_NAME   = 'ALEX'

同等の SQL ステートメント:

INSERT INTO EMPLOYEES (PERSONNEL_ID, NAME, FIRST_NAME)
  VALUES ('2112', 'LIFESON', 'ALEX')

UPDATE

DML UPDATE ステートメントは、先行する FINDREAD、または SELECT の各ステートメントによって読み込まれたテーブルの行を更新します。Natural は、DML UPDATE ステートメントを SQL ステートメント UPDATE WHERE CURRENT OF cursor-name(位置決め UPDATE ステートメント)に変換します。つまり、読み込まれた最後の行のみを更新できます。ネストされたループでは、ネストされた各ループの最後の行を更新できます。

UPDATE の FIND/READ との使用

DML UPDATE ステートメントを Natural FIND ステートメントの後で使用すると、Natural は FIND ステートメントを FOR UPDATE OF 節のある SQL SELECT ステートメントに変換し、DML UPDATE ステートメントを UPDATE WHERE CURRENT OF cursor-name ステートメントに変換します。

例:

FIND EMPLOYEES WITH SALARY < 5000
  ASSIGN SALARY = 6000
  UPDATE

Natural は、上述した Natural ステートメントを次の SQL ステートメントに変換し、カーソル名(例えば、CURSOR1)を割り当てます。SELECT ステートメントと UPDATE ステートメントは同じカーソルを参照します。

SELECT SALARY FROM EMPLOYEES WHERE SALARY < 5000
  FOR UPDATE OF SALARY
UPDATE EMPLOYEES SET SALARY = 6000
  WHERE CURRENT OF CURSOR1

FIND SORTED BY ステートメントまたは READ LOGICAL ステートメントで読み込まれた行を更新することはできません。詳細については、上述の FIND ステートメントおよび READ ステートメントの説明を参照してください。

END TRANSACTION または BACKOUT TRANSACTION ステートメントは、UPDATE ステートメントによってロックされたデータを解放します。

UPDATE の SELECT との使用

DML UPDATE ステートメントを SELECT ステートメントの後で使用できるのは、次の形のみです。

SELECT *
  INTO VIEW view-name

Natural は、上記以外の形での SELECT ステートメントと DML UPDATE ステートメントの使用をすべて拒否します。Natural は、DML UPDATE ステートメントを非カーソルまたは "検索済み" SQL UPDATE ステートメントに変換します。つまり、Natural ビュー全体のみが更新可能であり、個々の列は更新できません。

また、DML UPDATE ステートメントを SELECT ステートメントの後で使用できるのは Natural ストラクチャードモードの場合のみです。構文は次のようになります。

UPDATE [RECORD] [IN] [STATEMENT] [(r)]

例:

DEFINE DATA LOCAL
01 PERS VIEW OF SQL-PERSONNEL
  02 NAME
  02 AGE
END-DEFINE
SELECT *
  INTO VIEW PERS
  FROM SQL-PERSONNEL
  WHERE NAME LIKE 'S%'
  OBTAIN NAME
    IF NAME = 'SMITH'
      ADD 1 TO AGE
    UPDATE
    END-IF
END-SELECT

他の点については、DML UPDATE ステートメントが SELECT ステートメントとともに機能する方法は、Natural FIND ステートメントとともに機能する場合と同じです(上述の「UPDATE の FIND/READ との使用」を参照してください)。

Natural SQL ステートメント

Natural プログラミング言語内で使用できる SQL ステートメントには、一般セットと拡張セットという 2 つの異なるステートメントのセットがあります。このプラットフォームでは、拡張セットのみが Natural でサポートされています。

一般セットは、Natural でサポートされる SQL 対応の各データベースシステムで操作できます。基本的には標準の SQL 構文定義に対応しています。Natural SQL ステートメントの一般セットの詳細については、『ステートメント』ドキュメントの「一般セットと拡張セット」を参照してください。

このセクションでは、Natural SQL ステートメントの一般セットを Entire Access で使用するときの考慮事項と制限事項について説明します。

DELETE

Natural SQL DELETE ステートメントは、カーソルを使わずにテーブルの行を削除します。

Natural は DML DELETE ステートメントを位置決め DELETE ステートメント、つまり SQL DELETE WHERE CURRENT OF cursor-name ステートメントに変換しますが、Natural SQL DELETE ステートメントは非カーソルまたは検索済みの DELETE ステートメントです。検索済み DELETE ステートメントとは、どの SELECT ステートメントとも無関係のスタンドアロンステートメントです。

INSERT

INSERT ステートメントはテーブルに行を追加します。Natural STORE ステートメントに対応します。

PROCESS SQL

PROCESS SQL ステートメントは、ddm-name で特定されるデータベースに対して SQL ステートメントを statement-string の形で発行します。

注意:
PROCESS SQL ステートメントを使用してデータベースループを実行することはできません。

パラメータ

Natural では INDICATOR 節と LINDICATOR 節がサポートされます。代わりに、statement-string にパラメータを含めることもできます。構文項目 parameter は、構文的には次のように定義されます。

:U

:
:G

host-variable は、SQL ステートメント内で参照される Natural プログラム変数です。

SET SQLOPTION option=value

Entire Access では、SET SQLOPTION option=valuestatement-string として指定することもできます。この方法は、SQL データベースにアクセスするためのさまざまなオプションの指定に使用できます。オプションは、PROCESS SQL ステートメントによって参照されるデータベースにのみ適用されます。

サポートされるオプションは、以下のとおりです。

DATEFORMAT

このオプションは、SQL DATE および DATETIME 情報をタイプ A の Natural フィールドに取り込むために使用するフォーマットを指定します。タイプ D または T の Natural フィールドが使用されている場合、このオプションは使用されなくなりました。次に示す Natural の日付および時刻の編集マスクのサブセットを使用できます。

YYYY 年(4 桁)
YY 年(2 桁)
MM
DD
HH
II
SS

日付フォーマットに空白が含まれる場合は、フォーマットをアポストロフィで囲む必要があります。

例:

ISO 日付フォーマットを使用する場合は、次のように指定します。

PROCESS SQL sql-ddm << SET SQLOPTION DATEFORMAT = YYYY-MM-DD >>

日付および時刻のコンポーネントを ISO フォーマットで取得するには、次のように指定します。

PROCESS SQL sql-ddm << SET SQLOPTION DATEFORMAT = 'YYYY-MM-DD HH:II:SS'    >>

DATEFORMAT は、データベースからデータが取得される場合にのみ評価されます。データがデータベースに渡される場合は、データベースシステムによって変換されます。したがって、DATEFORMAT で指定されるフォーマットは、基礎となるデータベースで有効な日付フォーマットである必要があります。

Natural フィールドに DATEFORMAT が指定されていない場合は、次のように処理されます。

  • デフォルトの日付フォーマットである DD-MON-YY が使用されます。MON は月の英語名の 3 文字の略記です。

  • 次に示すデフォルトの日付/時刻フォーマットが使用されます。

    Adabas D YYYYMMDDHHIISS
    DB2 YYYY-MM-DD-HH.II.SS
    INFORMIX YYYY-MM-DD HH:II:SS
    ODBC YYYY-MM-DD HH:II:SS
    ORACLE YYYYMMDDHHIISS
    SYBASE DBLIB YYYYMMDD HH:II:SS
    SYBASE CTLIB YYYYMMDD HH:II:SS
    Microsoft SQL Server YYYYMMDD HH:II:SS
    その他 DD-MON-YY

DBPROCESS

このオプションは、Sybase および Microsoft SQL Server データベースにのみ有効です。

このオプションは、Sybase および Microsoft SQL Server の DBPROCESS に対する SQL ステートメントの割り当てを制御するために使用します。 DBPROCESS は、Sybase および Microsoft SQL Server DBlib インターフェイスで提供されないデータベースカーソルをエミュレートするために、Entire Access で使用されます。

2 つの値を指定可能です。

MULTIPLE DBPROCESSMULTIPLE に設定すると、各 SELECT ステートメントではそれぞれ独自のセカンダリ DBPROCESS が使用されますが、その他すべての SQL ステートメントはプライマリ DBPROCESS 内で実行されます。したがって、値 MULTIPLE を指定すると、データベースループが開いている場合でも、アプリケーションでさらに SQL ステートメントを実行できます。ネストされたデータベースループも可能です。
SINGLE DBPROCESSSINGLE に設定すると、すべての SQL ステートメントが同じ DBPROCESS、つまりプライマリ DBPROCESS を使用します。したがって、データベースループがアクティブである間は、新しいデータベースステートメントを実行することができません。1 つの DBPROCESS は一度に 1 つの SQL バッチしか実行できないためです。ただし、すべてのステートメントが同じ(プライマリ)DBPROCESS で実行されるため、非共有一時テーブルからの SELECT 処理が可能になります。

注意:

  1. 指定値は、アクティブなデータベースループがない場合にのみ変更可能です。
  2. DBPROCESS オプションは Sybase および Microsoft SQL Server DBlib インターフェイスにしか適用されないため、アプリケーションでは一元的な CALLNAT ステートメントを使用して少なくとも SINGLE の値を変更し、Sybase クライアントライブラリがサポートされるようになった時点でこれらのコールを簡単に削除できるようにしておく必要があります。デフォルト設定である MULTIPLE を確立する一元的なエラー処理もアプリケーションで使用する必要があります。

TIMEOUT

このオプションは、Sybase および Microsoft SQL Server データベースにのみ有効です。

Sybase および Microsoft SQL Server とともに使用する場合、Entire Access はタイムアウトの手法を使ってデータベースアクセスのデッドロックを検出します。デフォルトのタイムアウト時間は 8 秒です。このオプションでは、タイムアウト時間を秒単位で変更できます。

例えば、タイムアウト時間を 30 秒に設定するには、次のように指定します。

PROCESS SQL sql-ddm << SET SQLOPTION TIMEOUT = 30 >>

TRANSACTION

このオプションは、Sybase および Microsoft SQL Server データベースにのみ有効です。

このオプションは、トランザクションモードを有効または無効にするために使用します。次の END TRANSACTION ステートメントまたは BACKOUT TRANSACTION ステートメントの後で有効になります。

トランザクションモードが有効(デフォルト)になると、Natural は必要なすべてのステートメントを自動的に発行してトランザクションを開始します。

例:

トランザクションモードを無効にするには、次のように指定します。

PROCESS SQL sql-ddm << SET SQLOPTION TRANSACTION = NO >>    
...    
END TRANSACTION

トランザクションモードを有効にするには、次のように指定します。

PROCESS SQL sql-ddm << SET SQLOPTION TRANSACTION = YES >>    
...    
END TRANSACTION

SQLDISCONNECT

Entire Access では、SQLDISCONNECTstatement-string として指定することもできます。このステートメントを次に示すSQLCONNECT ステートメントと組み合わせることによって、同じセッション内の 1 つのアプリケーションを使用して、または必要に応じて接続および切断するだけで、異なるデータベースにアクセスできます。

SQLDISCONNECT ステートメントが正常に実行されると、SQLCONNECT ステートメントによってそれまでに提供された情報がクリアされます。つまり、PROCESS SQL ステートメントで使用された DDM の DBID で決定された、現在接続中の SQL データベースからアプリケーションが切断されます。接続が 1 つも確立されていない場合、SQLDISCONNECT ステートメントは無視されます。トランザクションが開いている場合、このステートメントは失敗します。

注意:
SQLDISCONNECT ステートメントのエラーが Natural によって報告された場合、接続状態は変更されません。データベースによってエラーが報告された場合は、接続状態が定義されていません。

SQLCONNECT option=value

Entire Access では、SQLCONNECT option=valuestatement-string として指定することもできます。このステートメントは、PROCESS SQL ステートメントによってアドレス指定された DDM に指定された DBID に従って SQL データベースへの接続を確立するために使用できます。指定した接続がすでに確立されている場合、SQLCONNECT ステートメントは失敗します。

サポートされるオプションは、以下のとおりです。

注意:

  1. SQLCONNECT ステートメントが失敗した場合、接続状態は変更されません。
  2. 複数のオプションを指定する場合は、コンマで区切る必要があります。
  3. 指定する値には、リテラル文字またはフォーマット A の Natural 変数のいずれかを使用できます。
  4. データベースへの接続が失われていたなどの理由で、Natural が暗黙的な再接続を実行する場合は、SQLCONNECT ステートメントで指定された値が使用されます。

各オプションの評価は次のようになります。

USERID と PASSWORD

データベースログオンに USERIDPASSWORD を指定すると、デフォルトのログオンウィンドウの表示、および環境変数 SQL_DATABASE_USERSQL_DATABASE_PASSWORD の評価は行われません。

USERID のみを指定した場合は、PASSWORD が空白であるとみなされます。この逆も同様です。

USERIDPASSWORD も指定しなかった場合は、デフォルトのログオン処理が適用されます。

注意:
ユーザー ID やパスワードを必要としないデータベースシステムでは、ユーザー ID とパスワードを空白で指定して、デフォルトのログオン処理を抑制できます。

OS_USERID と OS_PASSWORD

オペレーティングシステムのログオンで OS_PASSWORDOS_USERID を指定すると、ログオンウィンドウの表示、および環境変数 SQL_OS_USERSQL_OS_PASSWORD の評価は行われません。

OS_USERID のみを指定した場合は、OS_PASSWORD が空白であるとみなされます。この逆も同様です。

OS_USERIDOS_PASSWORD も指定しなかった場合は、デフォルトのログオン処理が適用されます。

注意:
ユーザー ID やパスワードを必要としないオペレーティングシステムでは、ユーザー ID とパスワードを空白で指定して、デフォルトのログオン処理を抑制できます。

DBMS_PARAMETER

DBMS_PARAMETER をダイナミックに指定すると、Natural グローバルコンフィグレーションファイル内の DBMS 割り当てが上書きされます。

例:

PROCESS SQL sql-ddm << SQLCONNECT USERID = 'DBA', PASSWORD = 'SECRET'    >>

この例では、Natural グローバルコンフィグレーションファイルに指定されたデータベースに、ユーザー ID DBA とパスワード SECRET を使って接続します。

DEFINE DATA LOCAL
1 #UID (A20) 
1 #PWD (A20) 
END-DEFINE
INPUT 'Please enter ADABAS D user ID and password' / #UID / #PWD
PROCESS SQL sql-ddm << SQLCONNECT USERID = : #UID, 
                       PASSWORD          = : #PWD, 
                       DBMS_PARAMETER    = 'ADABASD:mydb' 
                    >>

この例では、Adabas D データベース mydb に、INPUT ステートメントから取得したユーザー ID とパスワードを使って接続します。

PROCESS SQL sql-ddm << SQLCONNECT USERID = ' ', PASSWORD = ' ',
                       DBMS_PARAMETER    = 'DB2:EXAMPLE' >>

この例では、DB2 データベース EXAMPLE に、ユーザー ID とパスワードを指定せずに接続します。オペレーティングシステムユーザー ID を使用する DB2 ではこれらは不要であるためです。

SELECT

SELECT ステートメントの INTO 節およびスカラ演算子は、RDBMS 固有で標準 SQL 構文に準拠しない(Natural 一般セット)か、または Entire Access で使用するときに制限があるかのいずれかです。

Entire Access では、INTO 節内の INDICATOR 節と LINDICATOR 節はサポートされません。そのため、Entire Access では INTO 節に対して次の構文が必要になります。

INTO

parameter, ...
VIEW {view-name},...

注意:
連結演算子(||)は一般セットに属していないため、Entire Access ではサポートされません。

SELECT SINGLE

SELECT SINGLE ステートメントは非カーソル SELECT 処理(単独 SELECT)、つまり、カーソルを使用せずに最大で 1 行を検索する SELECT ステートメントの機能を提供します。

このステートメントは、Natural の FIND UNIQUE ステートメントと同じです。ただし、Natural では返される行数が自動的にチェックされます。複数行が選択された場合は、Natural によってエラーメッセージが返されます。

使用する RDBMS で非カーソル SELECT 処理のダイナミックな実行がサポートされない場合、Natural SELECT SINGLE ステートメントはセットレベルの SELECT のように実行され、その結果カーソル操作が発生します。ただし、返される行数は引き続きチェックされ、複数行が選択された場合はエラーメッセージが発行されます。

UPDATE

Natural SQL UPDATE ステートメントは、カーソルを使わずにテーブルの行を更新します。

Natural は DML UPDATE ステートメントを位置決め UPDATE ステートメント、つまり SQL DELETE WHERE CURRENT OF cursor-name ステートメントに変換しますが、Natural SQL UPDATE ステートメントは非カーソルまたは検索済みの UPDATE ステートメントです。検索済み UPDATE ステートメントとは、どの SELECT ステートメントとも無関係のスタンドアロンステートメントです。

フレキシブル SQL

フレキシブル SQL を使用すると、任意の RDBMS 固有構文拡張を利用できます。フレキシブル SQL は、次の SQL 構文項目と置き換えて使用できます。

  • 原子

  • 列参照

  • スカラ式

  • 条件

Natural コンパイラはフレキシブル SQL で使用される SQL テキストを認識しません。SQL ステートメント内で参照される Natural プログラム変数であるホスト変数の値を置き換えてから、RDBMS に渡す SQL 文字列に SQL テキストをコピーするだけです。フレキシブル SQL テキストの構文エラーは、ランタイムに RDBMS がその文字列を実行するときに検出されます。

フレキシブル SQL の次のような特徴に注意してください。

  • << 文字と >> 文字に囲まれ、任意の SQL テキストとホスト変数を含めることができます。

  • ホスト変数にはコロン(:)を接頭辞として付ける必要があります。

  • SQL 文字列は複数のステートメント行に渡って指定でき、コメントも入力できます。

フレキシブル SQL は、選択式の節間でも使用できます。

SELECT selection
  << ... >>
  INTO ...
  FROM ...
  << ... >>
  WHERE ...
  << ... >>
  GROUP BY ...
  << ... >>
  HAVING ...
  << ... >>
  ORDER BY ...
  << ... >>

例:

SELECT NAME
FROM EMPLOYEES
WHERE << MONTH (BIRTH) >> = << MONTH (CURRENT_DATE) >>

SELECT NAME
FROM EMPLOYEES
WHERE << MONTH (BIRTH) = MONTH (CURRENT_DATE) >>

SELECT NAME
FROM EMPLOYEES
WHERE SALARY > 50000
<< INTERSECT
   SELECT NAME
   FROM EMPLOYEES
   WHERE DEPT = 'DEPT10'
>>

RDBMS 固有の要件および制限事項

このセクションでは、Entire Access で使用する Natural および一部の RDBMS に対する制限事項と特別な要件について説明します。

以下のトピックについて説明します。

大文字/小文字を区別するデータベースシステム

Natural プログラムで指定されたすべての名前が自動的に小文字に変換されるため、大文字/小文字を区別するデータベースシステムではテーブル名や列名に小文字を使用してください。

注意:
この制限は、フレキシブル SQL を使用するときには適用されません。

SYBASE および Microsoft SQL Server

SQL ステートメントを SYBASE や Microsoft SQL Server に対して実行するには、1 つ以上の DBPROCESS 構造を使用する必要があります。DBPROCESS は SQL コマンドバッチを実行できます。

コマンドバッチとは特定の順番に並べられた一連の SQL ステートメントです。各ステートメントは、コマンドバッチに定義されている順番で実行される必要があります。SELECT ステートメントなど、結果を返すステートメントがある場合は、そのステートメントを先に実行し、その後で行を 1 行ずつフェッチする必要があります。コマンドバッチの後に次のステートメントをいったん実行すると、前のクエリから行をフェッチできなくなります。

SYBASE や Microsoft SQL Server では、アプリケーションで複数の DBPROCESS 構造を使用できるため、クエリごとに別個の DBPROCESS を使用する場合は、クエリをネストすることができます。ただし、SYBASE や Microsoft SQL Server では各 DBPROCESS についてデータをロックするため、複数の DBPROCESS を使用するアプリケーション自体でデッドロックが発生する可能性があります。Natural はデッドロックが発生するとタイムアウトします。

以下では次のトピックについて説明します。

Natural ステートメントをデータベースコールに変換する方法

Natural ではオープンなクエリごとに DBPROCESS を 1 つずつ使用し、その他すべての SQL ステートメント(UPDATEDELETEINSERT など)に別の DBPROCESS を 1 つ使用します。)。

位置決め UPDATE または DELETE ステートメントにクエリが参照される場合、Natural では生成される SELECT ステートメントに自動的に FOR BROWSE 節が付加され、行の読み込み中の UPDATE 処理を可能にします。

位置決め UPDATE または DELETE ステートメントに対して、SYBASE の dbqual 機能を使用して次の検索条件が生成されます。

WHERE unique-index = value AND tsequal (timestamp,old-timestamp)

この検索条件は、クエリから現在の行を再選択するために使用できます。tsequal 機能は、別のユーザーによって行が更新されたかどうかをチェックします。

Natural で SYBASE および Microsoft SQL Server を使用する際の制限事項

Natural を SYBASE および Microsoft SQL Server とともに使用するときは、次の制限が適用されます。

大文字/小文字の区別

SYBASE および Microsoft SQL Server では大文字/小文字が区別されますが、Natural ではパラメータは小文字で渡されます。このため、SYBASE および Microsoft SQL Server のテーブルやフィールドが大文字のみまたは大文字が混在して定義されている場合は、データベース SYNONYM または Natural のフレキシブル SQL を使用する必要があります。

位置決め UPDATE/DELETE ステートメント

位置決め UPDATE/DELETE ステートメントをサポートするには、アクセス対象のテーブルに一意のインデックスとタイムスタンプ列が必要です。また、このタイプスタンプ列がクエリの選択リストに含まれてはなりません。

行のクエリ

SYBASE および Microsoft SQL Server ではページがロックされ、ロックされたページは DBPROCESS 構造の所有になります。

アクティブな DBPROCESS にロックされたページは、その後 END TRANSACTION ステートメントまたは BACKOUT TRANSACTION ステートメントでロックが解放されるまで、ロックした DBPROCESS でもそれ以外でも読み込むことはできません。

したがって、テーブルの行を更新、挿入、または削除した場合は次の点に注意してください。

  • 同じテーブルに対して新しい SELECTFINDREAD など)のループを開始しないでください。

  • SELECT ステートメントに FOR BROWSE 節がない場合は、同じテーブルを参照するクエリから追加の行をフェッチしないでください。

Natural は、位置決め UPDATE または DELETE ステートメントによってクエリが参照される場合に、FOR BROWSE 節を自動的に付加します。

トランザクション/非トランザクションモード

SYBASE および Microsoft SQL Server では、トランザクションモードと非トランザクションモードが区別されます。トランザクションモードでは、Natural がデータベースに接続して INSERTUPDATE、および DELETE を発行可能にするため、CREATE TABLE など非トランザクションモードで実行されるコマンドは発行できません。

ストアドプロシージャ

PROCESS SQL ステートメントを使用すると、SYBASE および Microsoft SQL Server でストアドプロシージャを使用できます。ただし、ストアドプロシージャに以下のものを含めないでください。

  • 非トランザクションモードでしか機能しないコマンド

  • 戻り値

データタイプ変換

Natural プログラムがリレーショナルデータベース内のデータにアクセスすると、Entire Access は RDBMS 固有のデータタイプを Natural データフォーマットに変換します。この逆も同様です。RDBMS データタイプとそれに対応する Natural データフォーマットについては、『エディタ』ドキュメントの「DDM サービス」セクションの「Adabas または RDBMS のデータ変換」を参照してください。

特定のデータベースに固有の DATE/TIME または DATETIME のフォーマットは、Natural フォーマットの D と T に変換できます。次を参照してください。

日付/時刻の変換

RDBMS 固有フォーマットである DATE/TIME または DATETIME は、Natural フォーマットの D と T に変換できます。

この変換を使うには、最初に Natural DDM を編集して、日付と時刻のフィールドフォーマットを A(英数字)から D(日付)と T(時刻)に変更しておく必要があります。SQLOPTION DATEFORMAT は、フォーマット D または T のフィールドには使用されなくなりました。

注意:
Natural D(日付)/T(時刻)フォーマットに変換した日付フィールドまたは時刻フィールドを、Natural A(英数字)フォーマットに変換したフィールドと混在させないでください。

  • 更新コマンドでは、Natural 日付/時刻フォーマットが、データベース依存表現である DATE/TIME/DATETIME に秒単位の精度レベルで変換されます。

  • 検索コマンドでは、返されたデータベース依存文字表現が Natural 内部の日付/時刻フォーマットに変換されます。後述する変換テーブルを参照してください。Natural 時刻の日付コンポーネントは無視されません。RDBMS の時刻フォーマットに日付コンポーネントが含まれていない場合は 0000-01-02YYYY-MM-DD)に初期化されます。

  • Natural 日付変数では、時刻部分が無視され、ゼロに初期化されます。

  • Natural 時刻変数では、1/10 秒台が無視され、ゼロに初期化されます。

変換テーブル

Adabas D

RDBMS フォーマット Natural 日付 Natural 時刻
DATE YYYYMMDD  
TIME   00HHIISS

DB2

RDBMS フォーマット Natural 日付 Natural 時刻
DATE YYYY-MM-DD  
TIME   HH.II.SS

INFORMIX

RDBMS フォーマット Natural 日付 Natural 時刻
(年~日) YYYY-MM-DD  
(年~秒。これ以外のフォーマットはサポートされません)   YYYY-MM-DD-HH:II:SS*

ODBC

RDBMS フォーマット Natural 日付 Natural 時刻
DATE YYYY-MM-DD  
TIME   HH:II:SS

ORACLE

RDBMS フォーマット Natural 日付 Natural 時刻
(ORACLE セッションパラメータ NLS_DATE_FORMATYYYYMMDDHH24MISS に設定されています) (ORACLE 時刻コンポーネントは、更新コマンドでは空値が設定され、検索コマンドでは無視されます) YYYYMMDDHHIISS *

SYBASE

RDBMS フォーマット Natural 日付 Natural 時刻
DATETIME YYYYMMDD YYYYMMDD HH:II:SS *

* 2 つの時刻値を比較するときは、日付コンポーネントの値が異なる可能性があることに注意してください。

Microsoft SQL Server

RDBMS フォーマット Natural 日付 Natural 時刻
DATETIME YYYYMMDD YYYYMMDD HH:II:SS *

データベースエラーに関する診断情報の取得

データベースへのアクセス中にエラーが返された場合は、Natural 以外のプログラムである CMOSQERR を呼び出し、次の構文を使用して、エラーに関する診断情報を取得できます。

CALL 'CMOSQERR' parm1parm2

パラメータは次のとおりです。

パラメータ フォーマット/長さ 説明
parm1 I4 データベースから返されたエラーの番号
parm2 A70 データベースから返されたエラーのテキスト

SQL 認証

Natural コンフィグレーションユーティリティを使用すると、SQL データベースに自動ログインするためのユーザー ID とパスワードの DBID 固有の設定を追加できます。現在のデータベースシステムに応じて、オペレーティングシステム認証とデータベース認証が区別されます。[SQL Authorization]テーブルの[Auto login]フラグが SQL DBID に設定されている場合、対話式ログインプロンプトは表示されません。ログオン値はこのテーブル行から取得されます。

SQL 認証テーブルの詳細については、『コンフィグレーションユーティリティ』ドキュメントの「SQL 割り当て」を参照してください。