D データ型変換
PGAUツールを使用してTIPを生成するとき、およびPL/SQLとUTL_RAW
およびUTL_PG
関数を使用してカスタムTIPを開発するときは、データ型とデータの形式を正しく変換する必要があります。
TIPに関連するデータ型変換については、次のトピックを参照してください:
D.1 長さの確認
PGAUによって生成されたTIPは、送受信されるすべてのパラメータの最後に長さチェックを実行します。
「表D-1」は、PGAUによって生成された長さパラメータのリストを提供します:
表D-1長さのパラメータ
パラメータ | 説明 |
---|---|
TIPが生成されたときにPGAUによって計算されます。 |
|
変換された各フィールドのTIPで合計されます。 |
|
送信される送信データ長であり、送信パラメータの実際の長さと同じです。 |
|
送信された受信データの長さです。 |
送信されたパラメータの変換長が期待される長さと等しくない場合、例外が発生します。 これは、送信フィールドの変換が多すぎたり少なすぎたりする場合に発生します。
受信したパラメータの変換長が受信した長さと等しくない場合、例外が発生します。 これらの長さの例外は、変換が少なすぎたり多すぎたりした場合に発生します。
受信したパラメータの予想される長さが変換長または受信長と等しくなく、データ変換トレースが使用可能になっている場合に、警告が出されます。 これは、最大長レコードが予想されるが、短いレコードが送信され、正しく変換された場合に発生します。
D.1.1 長さ32Kを超えるパラメータ
PGAUは、32Kバイトを超える個々のデータ・パラメータの送信をサポートするTIPを生成します。
PGAU GENERATE
処理が32Kを超えるデータ・パラメータの最大長を検出すると、PGAUに自動的にこのサポートが組み込まれます。
このサポートは、PG DDに配置されたデータ定義によって実行され、ユーザーが選択することはできません。 サポートを含めるには、データ定義が実際にまたは32Kを超える可能性があります。 サポートを削除するには、パラメータの長さを32K未満に、REDEFINE
をデータに、GENERATE
をTIPにもう一度減らす必要があります。
このサポートは、そのような境界を横切るフィールドの変換の前後で32Kバッファ境界を横切るフィールド位置をテストします。 反復グループの場合、これは、反復グループの場合は多くのフィールド、単純な線形レコードの場合は少数のフィールドになります。
各テストおよび対応するバッファ管理ロジックによりオーバーヘッドが増加します。
注意:
REDEFINE
句のターゲットは、以前に処理されたバッファに存在することはできません。 そのようなREDEFINE
句を含むフィールドの実行時TIP処理は、予測できない結果をもたらします。
D.2 変換
D.2.1 USAGE(PASS)
PIC Xデータ型変換
PGAUのTIPは、COBOLのX
データ型を同じ文字長のPL/SQL CHAR
データ型に変換します。 グローバリゼーション・サポート文字セット変換も実行されます。
注意: COBOLには、可変長データ用に特別に指定されたデータ型がありません。 これは、PIC 9
長さフィールドとそれに続くPIC X
文字フィールドを含むサブグループとしてCOBOLで表されます。 次に例を示します。
10 NAME
1
5 LENGTH PIC S9(4)
。
15 LETTERS PIC X(30)
。
このコンテキストが与えられると、S9(4)
フィールドの後にX
フィールドが続くすべてのインスタンスが常に可変長データであることを保証することはできません。 上記のCOBOLグループNAME
をVARCHAR
に変換するPGAU TIPではなく、TIPは代わりに次のように入れ子になったPL/SQLレコードを作成します:
TYPE NAME_typ is RECORD ( LENGTH NUMBER(4,0), LETTERS CHAR(30));
TYPE ... is RECORD( ... NAME NAME_typ, ...
NAME.LETTERS
からNAME.LENGTH
文字を抽出し、その結果をVARCHAR
が必要な場合はPL/SQL VARCHAR
に割り当てるのは、クライアント・アプリケーションの責任です(リモート・ホスト・データの特定の知識に基づいています)。
文字セット変換は、1バイトのエンコードに対して実行されます:
-
リモート・ホスト文字データ。次のいずれかを使用します:
-
トランザクション全体の
DEFINE TRANSACTION NLS_LANGUAGE
文字セット、または -
単一のフィールドの
REDEFINE DATA REMOTE_LANGUAGE
文字セット(指定されている場合)。
-
-
ローカルのOracleキャラクタ・データ:
-
トランザクション全体の統合サーバーの
LANGUAGE
文字セット、または -
単一のフィールドの
REDEFINE DATA LOCAL_LANGUAGE
文字セット(指定されている場合)。
-
PIC Gデータ型変換
PGAUが生成したTIPは、COBOLのG
データ型を同じ長さのPL/SQL VARCHAR2
データ型に変換し、すべての文字位置に対して2バイトを許可します。
文字セット変換は、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' |
ブランク(USAGEに応じて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のTIPは、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は、 |
|
|
単一のPL/SQL変数宣言が 名前を変更したフィールドの長さは、元のフィールドによって長さが決まるため、パラメータ・データの長さ全体に影響を与えません。 |
|
' この拡張の目的は、ゲートウェイ管理者またはアプリケーション開発者が再定義が適用される基準を指定する手段を提供することです。 たとえば、レコード・タイプ・フィールドはレコード内に存在することが多く、処理されるレコード・タイプに応じて異なるレコード・フォーマットが適用されます。 どの型の値をどの再定義に適用するかの指定は、通常、データ定義ではなくトランザクション・プログラミング・ロジックに埋め込まれます。 TIPで再定義されたフォーマットで実行する変換を指定するために、 PGAUは、名前とデータ型が
これにより、リモート・ホストのコピーブックは、TIP内にこのようなバッファを定義することなく、または定義のための入力として使用されるコピーブックを変更することなく、他のトランザクション作業用ストレージ・バッファである |
|
これにより、数値フィールドは、リモート・ホスト環境、コンパイラ言語、およびデータ型によって決まる境界に整列されます。
|
これにより、TIP生成中に警告が出され、再配置は実行されません。 これはドキュメントとして扱われます。
|
D.2.4 PL/SQL命名アルゴリズム
デリミタ
レコード、グループ、およびエレメント名のCOBOL特殊文字は、PGAU DEFINE
が定義をPG DDに挿入するときに変換され、PG DDから定義が選択されるときにPGAU GENERATE
によって変換されます。 特殊文字は次のように変換されます:
-
ハイフンはアンダースコア(_)に変換されます。
-
期間は削除されます
修飾されたコンパウンド名
PL/SQL変数名は完全修飾されており、以下から構成されています:
-
PL/SQLレベル01または77のCOBOLレコード名に対応する左端の修飾子としてのレコード名。
-
PL/SQL COBOLグループ名に対応するネストされたレコード名。
-
PL/SQLデータ型のCOBOL要素に対応するネストされたフィールド:
-
CHAR
またはNUMBER
は、反復しないCOBOL要素に対応します。 -
OCCURS
またはOCCURS DEPENDING ON
グループに属するCOBOL要素に対応するTABLE
(COBOL反復フィールドは、TABLE
のPL/SQLネストされたRECORD
に対応します)。
-
呼び出し元アプリケーションからPL/SQL変数を参照する場合、TIPパッケージ名の先頭に修飾子を付ける必要があります。 したがって、以下に対応するPL/SQL変数への完全修飾参照:
-
SKILL
は次のとおりです:
tipname.EMPREC_Typ.SKILL(SKILL_Key)
-
HOME_ADDRESS
ZIP
は:
tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.FIRST_FIVE tipname.EMPREC_Typ.HOME_ADDRESS.ZIP.LAST_FOUR
切り詰められた名前と非一意の名前
名前が次の値を超えた場合、PGAUはフィールド名と対応するPL/SQL変数名を切り捨てます:
-
集約レコードまたはグループ内のフィールドの場合は26バイト
これは、各フィールドまたはPL/SQL変数名にサフィクスを付ける必要があるためです:
-
グループ名の"
_Typ
" -
繰り返しグループを持つ要素名の場合は"
_Tbl
"
または
-
-
任意の名前に対して30バイトのPL/SQL制限のために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関連付け内では暗黙的です。