D データ型の変換
PGAUツールを使用してTIPを生成する場合、および PL/SQL関数とUTL_RAW関数およびUTL_PG関数を使用してカスタムTIPを開発する場合は、データ型およびデータ形式を正しく変換する必要があります。
ヒントに関連するデータ型変換について学習するには、次のトピックを参照してください:
D.1 長さチェック
PGAUで生成されたTIPは、送受信されるすべてのパラメータの最後に長さチェックを実行します。
「表D-1」は、PGAUによって生成される長さパラメータのリストを提供します:
表D-1 長さパラメータ
| パラメータ | 説明 |
|---|---|
|
ヒントの生成時にPGAUによって計算されます。 |
|
|
変換された各フィールドのヒントによって合計されます。 |
|
|
送信された送信データの長さであり、送信パラメータの実際の長さにも等しくなります。 |
|
|
送信された受信データの長さです。 |
送信済パラメータの変換長が予期した長さと等しくない場合、例外が発生します。 これは、送信フィールド変換が多すぎるか少なすぎる場合に発生します。
受信したパラメータの変換長が受信した長さと一致しない場合、例外が発生します。 これらの長さの例外は、変換が少なすぎるか多すぎると発生します。
受信したパラメータの予期される長さが変換または受信した長さと等しくなく、データ変換トレースが有効な場合、警告が発行されます。 これは、最大長のレコードが想定されるが、短いレコードが転送され、正しく変換される場合に発生します。
D.1.1 長さ32Kを超えるパラメータ
PGAUは、32Kバイトを超える個々のデータ・パラメータの転送をサポートするTIPを生成します。
PGAUには、 PGAU GENERATE処理でデータ・パラメータの最大長が32Kを超えることが検出されると、このサポートが自動的に含まれます。
このサポートは、 PG DDに配置されたデータ定義によって駆動され、ユーザーが選択することはできません。 サポートを含めるには、データ定義が実際または32Kを超える可能性がある必要があります。 サポートを削除するには、パラメータの長さを32K未満に減らし、データをREDEFINEし、TIPを再度GENERATEする必要があります。
このサポートでは、このような境界を越えるフィールド変換の前後に、32Kバッファ境界を越えるフィールド位置をテストします。 繰返しグループの場合、これは多数のフィールド、繰返しグループの場合、または単純な線形レコードの場合、少数のフィールドです。
各テストおよび対応するバッファ管理ロジックにより、オーバーヘッドが増加します。
ノート:
REDEFINE句のターゲットは、以前に処理されたバッファに存在できません。 このようなREDEFINE句を含むフィールドの実行時TIP処理では、予測できない結果が得られます。
D.2 変換
D.2.1 USAGE(PASS)
PIC Xデータ型変換
PGAUヒントは、COBOL Xデータ型を同じ文字長のPL/SQL CHARデータ型に変換します。 グローバリゼーション・サポートの文字セット変換も実行されます。
ノート: COBOLには、可変長データ専用に指定されたデータ型がありません。 COBOLでは、PIC 9の長さフィールドを含むサブグループとして表され、その後にPIC X文字フィールドが続きます。 たとえば:
10 NAME.
15 LENGTH PIC S9(4).
15 LETTERS PIC X(30).
このコンテキストでは、S9(4)フィールドの後にXフィールドが続くすべてのインスタンスが常に可変長データであることは保証できません。 前述のCOBOLグループNAMEをVARCHARに変換するPGAUヒントではなく、TIPはネストされたPL/SQLレコードを次のように構成します:
TYPE NAME_typ is RECORD ( LENGTH NUMBER(4,0), LETTERS CHAR(30));
TYPE ... is RECORD( ... NAME NAME_typ, ...
VARCHARが必要な場合、NAME.LETTERS からNAME.LENGTH文字を抽出し、結果をPL/SQL VARCHARに割り当てることは、クライアント・アプリケーションの責任(リモート・ホスト・データの特定の知識に基づく)です。
文字セットの変換は、シングル・バイト・エンコードに対して実行されます:
-
リモート・ホスト文字データ。次のいずれかを使用します:
-
トランザクション全体の
DEFINE TRANSACTION NLS_LANGUAGE文字セット、または -
単一のフィールドの
REDEFINE DATA REMOTE_LANGUAGE文字セット(指定されている場合)。
-
-
ローカルOracle文字データ。次のいずれかを使用します:
-
トランザクション全体の統合サーバーの
LANGUAGE文字セット、または -
単一のフィールドの
REDEFINE DATA LOCAL_LANGUAGE文字セット(指定されている場合)。
-
PIC Gデータ型変換
PGAUで生成されたTIPは、COBOL Gデータ型を同じ長さのPL/SQL VARCHAR2データ型に変換し、文字位置ごとに2バイトを許可します。
文字セット変換は、ダブルバイトおよびマルチバイト・エンコードに対して実行されます:
-
リモート・ホスト文字データ。次のいずれかを使用します:
-
トランザクション全体の
DEFINE TRANSACTION REMOTE_MBCS文字セット、または -
単一のフィールドの
REDEFINE DATA REMOTE_LANGUAGE文字セット(指定されている場合)。
-
-
ローカルOracle文字データ。次のいずれかを使用します:
-
トランザクション全体の
DEFINE TRANSACTION LOCAL_MBCS文字セット、または -
単一のフィールドの
REDEFINE DATA LOCAL_LANGUAGE文字セット(指定されている場合)。
-
英数字およびDBCS編集フィールド位置
「表D-2」は、 PGAUが、シンボルの定義を提供することによって、データ型変換で COBOLシンボルをどのように解釈するかを示しています。
表D-2 COBOLシンボル定義
| COBOLシンボル | COBOL記号のOracle定義 - データ・コンテンツ |
|---|---|
|
'B' |
空白(使用状況に応じて1バイトのSBCSまたは2バイトのDBCS) |
|
'0' |
ゼロ(1バイトのSBCS) |
|
'/' |
スラッシュ(1バイトのSBCS) |
|
'G' |
ダブルバイト |
リモート・ホストから受信したCOBOL文データの編集位置は、フィールド全体とともにPGAUによって変換され、対応するPL/SQL VARCHAR2出力変数でクライアント・アプリケーションに渡されます。
編集シンボルが存在する場合、それらは、リモート・ホスト・フィールドに指定されたCOBOLデータ内容と長さが含まれていることを意味するように解釈されます。 編集位置はデータ・フィールドの長さに含まれますが、すべてのフィールド位置の変換はPGAUによって単一の文字列として処理され、編集されたバイト位置に対して特別なスキャンや変換は行われません。
リモート・ホストに送信されるCOBOL文データの編集位置は、クライアント・アプリケーションから渡されるPL/SQL VARCHAR2入力変数全体とともに、PGAUによって変換されます。
「表D-3」は、PGAUによるCOBOLデータ型の変換方法の例を示しています:
表D-3 COBOL-PGAU変換
| COBOLデータ型 | PGAUによる変換の説明 |
|---|---|
|
|
長さが7バイトの英数字フィールドであり、単一の |
|
|
DBCSフィールドの長さは12バイトで、単一の |
|
|
PGAUヒントは、COBOL 次の内容がサポートされています。
数値データ型変換の詳細は、「UTL_PGインタフェース」の「NUMBER_TO_RAWおよびRAW_TO_NUMBER引数値」を参照してください。
|
|
COBOL
|
フォーマット変換
「表D-4」は、フォーマット変換を示します:
表D-4 フォーマット変換の説明
| 項目 | 説明 |
|---|---|
|
|
これにより、 アプリケーションから渡される
|
|
これにより、TIPの生成中に警告が発行されます。 位置合せは実行されません。 これはドキュメントとして扱われます。 リモート・ホスト・トランザクション・データは、 |
|
|
これは、PG DDに格納されているデータ定義に対するOracle拡張機能です。 この拡張はPGAUコンテキストにのみ存在し、有効なCOBOL構文ではありません。 この拡張の目的は、TIP変換ロジックによって可変長文字データをより効率的に処理するための手段を提供することです。 これは、可変長のPIC Xフィールドを この構成の使用は、COBOLプログラムには影響しません。
|
|
|
|
これにより、一連の PL/SQL変数の' |
|
これにより、 PL/SQL変数のセットの' 範囲変換: PGAUで生成されたTIPでは、1から |
|
|
|
単一の PL/SQL変数宣言は、 名前が変更されたフィールドの長さは、元のフィールドによって長さが決まるため、パラメータ・データ全体の長さには影響しません。 |
|
|
' この拡張の目的は、ゲートウェイ管理者またはアプリケーション開発者が再定義を適用する基準を指定するための手段を提供することです。 たとえば、レコード・タイプ・フィールドは多くの場合レコードに存在し、処理されるレコード・タイプに応じて異なるレコード・フォーマットが適用されます。 再定義が適用されるタイプ値の指定は、通常、データ定義ではなくトランザクション・プログラミング・ロジックに組み込まれます。 TIPで再定義されたフォーマットに対して実行する変換を指定するには、 PGAUは、
これにより、リモート・ホスト・コピーブックに、TIPでそのようなバッファを定義したり、定義の入力として使用されるコピーブックを変更することなく、他のトランザクション作業ストレージ・バッファを |
|
|
これにより、数値フィールドは、リモート・ホスト環境、コンパイラ言語、およびデータ型の指示に従って境界に整列されます。 数値変換は、 |
|
これにより、TIPの生成中に警告が発行され、再編成は実行されません。 これはドキュメントとして扱われます。 数値変換は、 |
D.2.3 USAGE(SKIP)
PGAU DEFINE DATA文で USAGE(SKIP)が指定されている場合、データ交換は実行されません。 データは、存在しないかのようにスキップされます。 したがって、このようなフィールドは PG DDから選択されず、TIPロジックに反映されず、リモート・ホストと交換されるデータ・ストリームに存在しないものと想定されます。 "SKIP"の目的は、PG DDに定義があるが、アクティブではないことです。これは、リモート・ホストがフィールドを削除したか、まだフィールドを含んでいないためです。 SKIP では、一部のフィールドがリモート・ホストに存在しない場合でも、既存のデータ定義を使用できます。
D.2.4 PL/SQL命名アルゴリズム
デリミタ
レコード、グループおよび要素名のCOBOL特殊文字は、PGAU DEFINEがPG DDに定義を挿入するときに変換され、PG DDから定義が選択されている場合はPGAU GENERATEによって変換されます。 特殊文字は次のように変換されます:
-
ハイフンはアンダースコア(_)に変換されます
-
期間が削除されました
修飾複合名
-
PL/SQLレコード名は、レベル01または77 COBOLレコード名に対応する左端の修飾子です。
-
COBOLグループ名に対応するPL/SQLネストされたレコード名。
-
データ型のCOBOL要素に対応するPL/SQLネストされたフィールド:
-
非反復COBOL要素に対応する
CHARまたはNUMBER。 -
OCCURSまたはOCCURS DEPENDING ONグループに含まれるCOBOL要素に対応するTABLE(COBOL繰返しフィールドは、TABLEのPL/SQLネストされたRECORDに対応します)。
-
アプリケーションをコールして PL/SQL変数を参照する場合、TIPパッケージ名の先頭に左端の修飾子を付ける必要があります。 したがって、次に対応するPL/SQL変数への完全修飾参照です:
-
SKILLは次のとおりです:
tipname.EMPREC_Typ.SKILL(SKILL_Key)
-
HOME_ADDRESSZIPは次のとおりです:
tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.FIRST_FIVE tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.LAST_FOUR
切り捨てられた名前と一意でない名前
PGAUでは、名前が次の値を超えると、フィールド名と対応するPL/SQL変数名が切り捨てられます:
-
集計レコードまたはグループ内のフィールドには26バイト
これは、各フィールドまたはPL/SQL変数名にサフィクスを付ける必要があるためです:
-
"
_Typ"(グループ名) -
繰返しグループを持つ要素名の場合は"
_Tbl"
または
-
-
任意の名前のPL/SQL制限が30バイトであるため、30バイト
右端の4文字は切り捨てられます。 これにより、名前が
26文字に一意であるという制限が課されます。
名前が重複しています
COBOLではレコード内で同じグループ名またはエレメント名を繰り返し定義でき、上位レベルのグループのコンテキストによって名前が一意に修飾されます。 ただし、PGAUで生成されたTIPは、下位グループおよびフィールドのネストされたPL/SQLレコードを参照するPL/SQLレコード変数を宣言するため、ネストされたPL/SQLレコード・タイプの名前が重複する可能性があります。
次のCOBOL定義の場合、ZIPはCOBOLで一意に修飾されますが、対応するPL/SQL宣言にはZIPのネストされたレコード・タイプが重複していることに注意してください。
01 EMPREC.
05 HIREDATE PIC X(8).
05 BIRTHDATE PIC X(8).
05 SKILL PIC X(12) OCCURS 4.
05 EMPNO PIC 9(4).
05 EMPNAME.
10 FIRST-NAME PIC X(10).
10 LAST-NAME PIC X(15).
05 HOME-ADDRESS.
10 STREET PIC X(20).
10 CITY PIC X(15).
10 STATE PIC XX.
10 ZIP.
15 FIRST-FIVE PIC X(5).
15 LAST-FOUR PIC X(4).
05 DEPT PIC X(45).
05 OFFICE-ADDRESS.
10 STREET PIC X(20).
10 CITY PIC X(15).
10 STATE PIC XX.
10 ZIP.
15 FIRST-FIVE PIC X(5).
15 LAST-FOUR PIC X(4).
05 JOBTITLE PIC X(20).
PGAUは、重複するネストされたレコード・タイプの宣言を回避し、次のPL/SQLを生成します:
SKILL_Key BINARY_INTEGER;
TYPE SKILL_Tbl is TABLE of CHAR(12)
INDEX by BINARY_INTEGER;
TYPE EMPNAME_Typ is RECORD (
FIRST_NAME CHAR(10),
LAST_NAME CHAR(15));
TYPE ZIP_Typ is RECORD (
FIRST_FIVE CHAR(5),
LAST_FOUR CHAR(4));
TYPE HOME_ADDRESS_Typ is RECORD (
STREET CHAR(20),
CITY CHAR(15),
STATE CHAR(2),
ZIP ZIP_Typ);
TYPE OFFICE_ADDRESS_Typ is RECORD (
STREET CHAR(20),
CITY CHAR(15),
STATE CHAR(2),
ZIP ZIP_Typ);
TYPE EMPREC_Typ is RECORD (
HIREDATE CHAR(8),
BIRTHDATE CHAR(8),
SKILL SKILL_Tbl,
EMPNO NUMBER(4,0),
EMPNAME EMPNAME_Typ,
HOME_ADDRESS HOME_ADDRESS_Typ,
DEPT CHAR(45),
OFFICE_ADDRESS OFFICE_ADDRESS_Typ,
JOBTITLE CHAR(20));
ただし、複数のネストされたグループが同じ名前を持ち、異なるサブフィールドを持つ場合(次のZIPを参照):
05 HOME-ADDRESS.
10 STREET PIC X(20).
10 CITY PIC X(15).
10 STATE PIC XX.
10 ZIP.
15 LEFTMOST-FOUR PIC X(4).
15 RIGHMOST-FIVE PIC X(5).
05 DEPT PIC X(45).
05 OFFICE-ADDRESS.
10 STREET PIC X(20).
10 CITY PIC X(15).
10 STATE PIC XX.
10 ZIP.
15 FIRST-FIVE PIC X(5).
15 LAST-FOUR PIC X(4).
05 JOBTITLE PIC X(20).
PGAUは、名前、データ型またはオプションでサブフィールドが異なる宣言ごとに、PL/SQLネストされたレコード・タイプの名前を変更します。 2番目の宣言(ZIP_Typ02)に02が追加され、OFFICE_ADDRESSで参照されることに注意してください。
TYPE EMPNAME_Typ is RECORD (
FIRST_NAME CHAR(10),
LAST_NAME CHAR(15));
TYPE ZIP_Typ is RECORD (
LEFTMOST_FOUR CHAR(4),
RIGHTMOST_FIVE CHAR(5));
TYPE HOME_ADDRESS_Typ is RECORD (
STREET CHAR(20),
CITY CHAR(15),
STATE CHAR(2),
ZIP ZIP_Typ);
TYPE ZIP_Typ02 is RECORD (
FIRST_FIVE CHAR(5),
LAST_FOUR CHAR(4));
TYPE OFFICE_ADDRESS_Typ is RECORD (
STREET CHAR(20),
CITY CHAR(15),
STATE CHAR(2),
ZIP ZIP_Typ02);
TYPE EMPREC_Typ is RECORD (
HIREDATE CHAR(8),
BIRTHDATE CHAR(8),
SKILL SKILL_Tbl,
EMPNO NUMBER(4,0),
EMPNAME EMPNAME_Typ,
HOME_ADDRESS HOME_ADDRESS_Typ,
DEPT CHAR(45),
OFFICE_ADDRESS OFFICE_ADDRESS_Typ,
JOBTITLE CHAR(20));
また、次に対応するPL/SQL変数への完全修飾参照です:
-
HOME_ADDRESS.ZIPは次のとおりです:tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.LEFTMOST_FOUR tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.RIGHTMOST_FIVE
-
OFFICE_ADDRESS.ZIPは次のとおりです:tipname.EMPREC_Typ.OFFICE_ADDRESS.ZIP.FIRST_FIVE tipname.EMPREC_Typ.OFFICE_ADDRESS.ZIP.LAST_FOUR
ネストされたレコード・タイプ名ZIP_Typ02は、参照では使用されませんが、ネストされたレコードのPL/SQLの関連付けでは暗黙的です。