このドキュメントでは、Natural で Entire Access を経由して SQL データベースを使用する方法について説明します。 インストールおよび設定の詳細については、『データベース管理システムインターフェイス』ドキュメントの「Natural と Entire Access」、および別冊の Entire Access ドキュメントを参照してください。
このドキュメントでは、次のトピックについて説明します。
注意:
原則として、『Adabas データベースのデータへのアクセス』ドキュメントに記載されている機能とその例は、Natural がサポートする SQL データベースにも該当します。 相違点がある場合は、個別のデータベースアクセスステートメントに関するドキュメントの「データベース固有の考慮事項」(『ステートメント』ドキュメントを参照)または各 Natural パラメータに関するドキュメント(『パラメータリファレンス』を参照)に詳細が記載されています。 また、Natural では SQL データベースにアクセスするための特別な一連のステートメントが提供されます。
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 管理者のみが設定可能です。
Natural プロファイルパラメータ ETEOP
は、Natural セッション中のトランザクション処理を制御します。 例えば、1 つの論理トランザクションを 2 つ以上の Natural プログラムにわたって処理する場合などに必要になります。 この場合、Natural プログラムの終了時に、Natural
で END TRANSACTION
コマンドを発行しない、つまり "コミット" しないでください。
ETEOP
パラメータを設定すると、次のように処理されます。
ON |
Natural セッションが ET 状態でない場合は、Natural プログラムの終了時に Natural から |
---|---|
OFF |
Natural プログラムの終了時に、Natural から これはデフォルトです。 |
注意:
ETEOP
パラメータは、Natural バージョン 6.1 以降に適用されます。 Natural の以前のバージョンでは、Natural プロファイルパラメータ OPRB
を ETEOP
の代わりに使用する必要があります。ETEOP=ON
が OPRB=OFF
に、ETEOP=OFF
が ORPB=NOOPEN
に相当します。
次の表は、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
Natural は、BACKOUT TRANSACTION
ステートメントを SQL ROLLBACK
コマンドに変換します。 このステートメントは、最後のリカバリユニットが完了した後に行われたすべてのデータベース更新を元に戻します。 リカバリユニットはセッションの最初、あるいは最後の END TRANSACTION
(COMMIT
)ステートメントまたは BACKOUT TRANSACTION
(ROLLBACK
)ステートメントの後に開始できます。
注意:
作業の論理ユニットが終了すると、すべてのカーソルが閉じるため、BACKOUT TRANSACTION
ステートメントをデータベースループの内部に配置しないでください。ループの外側、またはネストされたループの一番外側のループの後に配置してください。
DELETE
ステートメントは、先行する FIND
、READ
、または 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
ステートメントの説明を参照してください。
Natural は、END TRANSACTION
ステートメントを SQL COMMIT
コマンドに変換します。 END TRANSACTION
ステートメントは、論理トランザクションの終わりを示し、データベースに対してすべての更新をコミットし、トランザクション中にロックされていたデータを解放します。
注意:
END TRANSACTION
ステートメントをデータベースループの内部に配置しないでください。ループの外側、またはネストされたループの一番外側のループの後に配置してください。
END TRANSACTION
ステートメントでトランザクション(ET)データを保存することはできません。
COMMIT
は自動的に発行されません。
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
節に変換します。これにより、読み取り専用の結果テーブルが作成されます。
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
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
ステートメントに変換します。
Natural ステートメント:
READ PERSONNEL BY NAME OBTAIN NAME FIRSTNAME DATEOFBIRTH
同等の SQL ステートメント:
SELECT NAME, FIRSTNAME, DATEOFBIRTH FROM PERSONNEL WHERE NAME >= ' ' ORDER BY NAME
Natural ステートメント:
READ PERSONNEL PHYSICAL OBTAIN NAME
同等の SQL ステートメント:
SELECT NAME FROM PERSONNEL
READ
ステートメントに WHERE
節が含まれる場合、Natural は検索条件に従って行が選択された後で WHERE
節を評価します。
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')
DML UPDATE
ステートメントは、先行する FIND
、READ
、または SELECT
の各ステートメントによって読み込まれたテーブルの行を更新します。 Natural は、DML UPDATE
ステートメントを SQL UPDATE WHERE CURRENT OF cursor-name
ステートメント(位置決め UPDATE
ステートメント)に変換します。つまり、読み込まれた最後の行のみを更新できます。 ネストされたループでは、ネストされた各ループの最後の行を更新できます。
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
ステートメントによってロックされたデータを解放します。
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 ステートメントには、一般セットと拡張セットという 2 つの異なるステートメントのセットがあります。 このプラットフォームでは、拡張セットのみが Natural でサポートされています。
一般セットは、Natural でサポートされる SQL 対応の各データベースシステムで操作できます。 基本的には標準の SQL 構文定義に対応しています。 Natural SQL ステートメントの一般セットの詳細については、『ステートメント』ドキュメントの「一般セットと拡張セット」を参照してください。
このセクションでは、Natural SQL ステートメントの一般セットを Entire Access で使用するときの考慮事項と制限事項について説明します。
Natural SQL DELETE
ステートメントは、カーソルを使わずにテーブルの行を削除します。
Natural は DML DELETE
ステートメントを位置決め DELETE
ステートメント、つまり SQL DELETE WHERE CURRENT OF cursor-name
ステートメントに変換しますが、Natural SQL DELETE
ステートメントは非カーソルまたは検索済みの DELETE
ステートメントです。 検索済み DELETE
ステートメントとは、どの SELECT
ステートメントとも無関係のスタンドアロンステートメントです。
INSERT
ステートメントはテーブルに行を追加します。Natural STORE
ステートメントに対応します。
PROCESS SQL
ステートメントは、ddm-name で特定されるデータベースに対して SQL ステートメントを statement-string の形で発行します。
注意:
PROCESS SQL
ステートメントを使用してデータベースループを実行することはできません。
Natural では INDICATOR
節と LINDICATOR
節がサポートされます。 代わりに、statement-string にパラメータを含めることもできます。 構文項目 parameter は、構文的には次のように定義されます。
:U
|
:host-variable | ||
:G
|
host-variable は、SQL ステートメント内で参照される Natural プログラム変数です。
Entire Access では、SET SQLOPTION option=value
を statement-string のように指定することもできます。 この方法は、SQL データベースにアクセスするためのさまざまなオプションの指定に使用できます。 オプションは、PROCESS SQL
ステートメントによって参照されるデータベースにのみ適用されます。
サポートされるオプションは、以下のとおりです。
DBPROCESS
(Sybase のみ)
TIMEOUT
(Sybase のみ)
TRANSACTION
(Sybase のみ)
このオプションは、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 |
このオプションは、Sybase および Microsoft SQL Server データベースにのみ有効です。
このオプションは、Sybase および Microsoft SQL Server の DBPROCESS
に対する SQL ステートメントの割り当てに影響を与えるために使用します。 DBPROCESS
は、Sybase および Microsoft SQL Server DBlib インターフェイスで提供されないデータベースカーソルをエミュレートするために、Entire Access で使用されます。
2 つの値を指定可能です。
MULTIPLE | DBPROCESS を MULTIPLE に設定すると、各 SELECT ステートメントではそれぞれ独自のセカンダリ DBPROCESS が使用されますが、その他すべての SQL ステートメントはプライマリ DBPROCESS 内で実行されます。 したがって、値 MULTIPLE を指定すると、データベースループが開いている場合でも、アプリケーションでさらに SQL ステートメントを実行できます。 ネストされたデータベースループも可能です。
|
---|---|
SINGLE | DBPROCESS を SINGLE に設定すると、すべての SQL ステートメントが同じ DBPROCESS 、つまりプライマリ DBPROCESS を使用します。 したがって、データベースループがアクティブである間は、新しいデータベースステートメントを実行することができません。1 つの DBPROCESS は一度に 1 つの SQL バッチしか実行できないためです。 ただし、すべてのステートメントが同じ(プライマリ)DBPROCESS で実行されるため、非共有一時テーブルからの SELECT 処理が可能になります。
|
注意:
DBPROCESS
オプションは Sybase および Microsoft SQL Server DBlib インターフェイスにしか適用されないため、アプリケーションでは一元的な CALLNAT
ステートメントを使用して少なくとも SINGLE
の値を変更し、Sybase クライアントライブラリがサポートされるようになった時点でこれらのコールを簡単に削除できるようにしておく必要があります。 デフォルト設定である MULTIPLE
を確立する一元的なエラー処理もアプリケーションで使用する必要があります。
このオプションは、Sybase および Microsoft SQL Server データベースにのみ有効です。
Sybase および Microsoft SQL Server とともに使用する場合、Entire Access はタイムアウトの手法を使ってデータベースアクセスのデッドロックを検出します。 デフォルトのタイムアウト時間は 8 秒です。 このオプションでは、タイムアウト時間を秒単位で変更できます。
例えば、タイムアウト時間を 30 秒に設定するには、次のように指定します。
PROCESS SQL sql-ddm << SET SQLOPTION TIMEOUT = 30 >>
このオプションは、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
Entire Access では、SQLDISCONNECT
を statement-string として指定することもできます。 このステートメントを次に示す SQLCONNECT
ステートメントと組み合わせることによって、同じセッション内の 1 つのアプリケーションを使用して、または必要に応じて接続および切断するだけで、異なるデータベースにアクセスできます。
SQLDISCONNECT
ステートメントが正常に実行されると、SQLCONNECT
ステートメントによってそれまでに提供された情報がクリアされます。つまり、PROCESS SQL
ステートメントで使用された DDM の DBID で決定された、現在接続中の SQL データベースからアプリケーションが切断されます。 接続が 1 つも確立されていない場合、SQLDISCONNECT
ステートメントは無視されます。 トランザクションが開いている場合、このステートメントは失敗します。
注意:
SQLDISCONNECT
ステートメントのエラーが Natural によって報告された場合、接続状態は変更されません。 データベースによってエラーが報告された場合は、接続状態が定義されていません。
Entire Access では、SQLCONNECT option=value
を statement-string として指定することもできます。 このステートメントは、PROCESS SQL
ステートメントによってアドレス指定された DDM に指定された DBID に従って SQL データベースへの接続を確立するために使用できます。 指定した接続がすでに確立されている場合、SQLCONNECT
ステートメントは失敗します。
サポートされるオプションは、以下のとおりです。
注意:
SQLCONNECT
ステートメントが失敗した場合、接続状態は変更されません。
SQLCONNECT
ステートメントで指定された値が使用されます。
各オプションの評価は次のようになります。
データベースログオンに USERID
と PASSWORD
を指定すると、デフォルトのログオンウィンドウの表示、および環境変数 SQL_DATABASE_USER
と SQL_DATABASE_PASSWORD
の評価は行われません。
USERID
のみを指定した場合は、PASSWORD
が空白であるとみなされます。この逆も同様です。
USERID
も PASSWORD
も指定しなかった場合は、デフォルトのログオン処理が適用されます。
注意:
ユーザー ID やパスワードを必要としないデータベースシステムでは、ユーザー ID とパスワードを空白で指定して、デフォルトのログオン処理を抑制できます。
オペレーティングシステムのログオンで OS_PASSWORD
と OS_USERID
を指定すると、ログオンウィンドウの表示、および環境変数 SQL_OS_USER
と SQL_OS_PASSWORD
の評価は行われません。
OS_USERID
のみを指定した場合は、OS_PASSWORD
が空白であるとみなされます。この逆も同様です。
OS_USERID
も OS_PASSWORD
も指定しなかった場合は、デフォルトのログオン処理が適用されます。
注意:
ユーザー ID やパスワードを必要としないオペレーティングシステムでは、ユーザー ID とパスワードを空白で指定して、デフォルトのログオン処理を抑制できます。
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
ステートメントの INTO
節およびスカラ演算子は、RDBMS 固有で標準 SQL 構文に準拠しない(Natural 一般セット)か、または Entire Access で使用するときに制限があるかのいずれかです。
Entire Access では、INTO
節内の INDICATOR
節と LINDICATOR
節はサポートされません。 そのため、Entire Access では INTO
節に対して次の構文が必要になります。
INTO
|
parameter, ... | ||
VIEW {view-name},...
|
注意:
連結演算子(||)は一般セットに属していないため、Entire Access ではサポートされません。
SELECT SINGLE
ステートメントは非カーソル SELECT
処理(単独 SELECT
)、つまり、カーソルを使用せずに最大で 1 行を検索する SELECT
ステートメントの機能を提供します。
このステートメントは、Natural の FIND UNIQUE
ステートメントと同じです。 ただし、Natural では返される行数が自動的にチェックされます。 複数行が選択された場合は、Natural によってエラーメッセージが返されます。
使用する RDBMS で非カーソル SELECT
処理のダイナミックな実行がサポートされない場合、Natural SELECT SINGLE
ステートメントはセットレベルの SELECT
のように実行され、その結果カーソル操作が発生します。 ただし、返される行数は引き続きチェックされ、複数行が選択された場合はエラーメッセージが発行されます。
Natural SQL UPDATE
ステートメントは、カーソルを使わずにテーブルの行を更新します。
Natural は DML UPDATE
ステートメントを位置決め UPDATE
ステートメント、つまり SQL UPDATE WHERE CURRENT OFcursor-name
ステートメントに変換しますが、Natural SQL UPDATE
ステートメントは非カーソルまたは検索済みの UPDATE
ステートメントです。 検索済み UPDATE
ステートメントとは、どの SELECT
ステートメントとも無関係のスタンドアロンステートメントです。
フレキシブル 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' >>
このセクションでは、Entire Access で使用する Natural および一部の RDBMS に対する制限事項と特別な要件について説明します。
次のトピックについて説明します。
Natural プログラムで指定されたすべての名前が自動的に小文字に変換されるため、大文字/小文字を区別するデータベースシステムではテーブル名や列名に小文字を使用してください。
注意:
この制限は、フレキシブル SQL を使用するときには適用されません。
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 ではオープンな各クエリごとに DBPROCESS
を 1 つずつ使用し、その他すべての SQL ステートメント(UPDATE
、DELETE
、INSERT
など)に別の 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 とともに使用するときは、次の制限が適用されます。
SYBASE および Microsoft SQL Server では大文字/小文字が区別されますが、Natural ではパラメータは小文字で渡されます。 このため、SYBASE および Microsoft SQL Server のテーブルやフィールドが大文字のみまたは大文字が混在して定義されている場合は、データベース
SYNONYM
または Natural のフレキシブル SQL を使用する必要があります。
位置決め UPDATE
/DELETE
ステートメントをサポートするには、アクセス対象のテーブルに一意のインデックスとタイムスタンプ列が必要です。 また、このタイプスタンプ列がクエリの選択リストに含まれてはなりません。
SYBASE および Microsoft SQL Server ではページがロックされ、ロックされたページは DBPROCESS
構造の所有になります。
アクティブな DBPROCESS
にロックされたページは、その後 END TRANSACTION
ステートメントまたは BACKOUT TRANSACTION
ステートメントでロックが解放されるまで、ロックした DBPROCESS
でもそれ以外でも読み込むことはできません。
したがって、テーブルの行を更新、挿入、または削除した場合は次の点に注意してください。
同じテーブルに対して新しい SELECT
、FIND
、READ
などのループを開始しないでください。
SELECT
ステートメントに FOR BROWSE
節がない場合は、同じテーブルを参照するクエリから追加の行をフェッチしないでください。
Natural は、位置決め UPDATE
/DELETE
ステートメントによってクエリが参照される場合に、FOR BROWSE
節を自動的に付加します。
SYBASE および Microsoft SQL Server では、トランザクションモードと非トランザクションモードが区別されます。 トランザクションモードでは、Natural がデータベースに接続して INSERT
、UPDATE
、および 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-02(YYYY-MM-DD)に初期化されます。
Natural 日付変数では、時刻部分が無視され、ゼロに初期化されます。
Natural 時刻変数では、1/10 秒台が無視され、ゼロに初期化されます。
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATE | YYYYMMDD | |
TIME | 00HHIISS |
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATE | YYYY-MM-DD | |
TIME | HH.II.SS |
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATETIME(年~日) | YYYY-MM-DD | |
DATETIME(年~秒。これ以外のフォーマットはサポートされません) | YYYY-MM-DD-HH:II:SS* |
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATE | YYYY-MM-DD | |
TIME | HH:II:SS |
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATE(ORACLE セッションパラメータ NLS_DATE_FORMAT は YYYYMMDDHH24MISS に設定されます) | YYYYMMDD000000(ORACLE 時刻コンポーネントは、更新コマンドでは空値が設定され、検索コマンドでは無視されます) | YYYYMMDDHHIISS * |
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATETIME | YYYYMMDD | YYYYMMDD HH:II:SS * |
* 2 つの時刻値を比較するときは、日付コンポーネントの値が異なる可能性があることに注意してください。
RDBMS フォーマット | Natural 日付 | Natural 時刻 |
---|---|---|
DATETIME | YYYYMMDD | YYYYMMDD HH:II:SS * |
データベースへのアクセス中にエラーが返された場合は、Natural 以外のプログラムである CMOSQERR
を呼び出し、次の構文を使用して、エラーに関する診断情報を取得できます。
CALL 'CMOSQERR' parm1 parm2
|
パラメータは次のとおりです。
パラメータ | フォーマット/長さ | 説明 |
---|---|---|
parm1 | I4 | データベースから返されたエラーの番号 |
parm2 | A70 | データベースから返されたエラーのテキスト |
Natural コンフィグレーションユーティリティを使用すると、SQL データベースに自動ログインするためのユーザー ID とパスワードの DBID 固有の設定を追加できます。 現在のデータベースシステムに応じて、オペレーティングシステム認証とデータベース認証が区別されます。 [SQL 認証(SQL Authorization)]テーブルの[自動ログイン(Auto login)]フラグが SQL DBID に設定されている場合、対話式ログインプロンプトは表示されません。 ログオン値はこのテーブル行から取得されます。
SQL 認証テーブルの詳細については、『コンフィグレーションユーティリティ』ドキュメントの「SQL 割り当て」を参照してください。