変換ユーティリティでは自動的に変換されない以下の項目に関しては、モジュー ルを開いて手動でPL/SQLの変更を行う必要があります。
6.5.1 パッケージ内での重複したプロシージャ(R1.x)
PL/SQL 1では、パッケージ内で同一の名前を持ち、同じパラメータを持つ2
つ以上のプロシージャを定義できます。このコード自体は、PL/SQLの文法上 正しくありませんが、コンパイラではエラーを発生させず、コンパイルされて しまいます。
PL/SQL 2からは、このようなパッケージを定義すると、以下のエラーが発生
します。
エラー: 305 'プロシージャ名' の以前の使用方法が、この使用方法と競合しま す。
このエラーを回避するには、重複したプロシージャを削除して下さい。
以下に変更例を示します。
変更前 PACKAGE BODY pk1 IS PROCEDURE foo IS BEGIN
NULL;
END;
PROCEDURE foo IS BEGIN
NULL;
END;
↓ ↓
変更後 PACKAGE BODY pk1 IS PROCEDURE foo IS BEGIN
NULL;
END;
END;
6.5.2 パ ッ ケ ー ジ 内 で の 同 一 名 の 変 数 お よ び プ ロ グ ラ ム 単 位
(R1.x)
PL/SQL 1では、同一パッケージ内で変数と同じ名前を持つプロシージャまた
は関数を作成できます。コンパイラはどちらを参照すべきか識別できないため、
実行時に予期せぬ結果が返される(変数の値を参照するつもりが、その変数と 同一名の関数の値が返されるなど)ことがあります。PL/SQL 2からは、同一 パッケージ内に同じ名前の変数とプログラム単位を含めることはできなくな りました。
パッケージ内で同一名の変数とプログラム単位が存在する場合、コンパイラで 次のエラー・メッセージが生成されます。
エラー: 305 '名称' の以前の使用方法が、この使用方法と競合します。
エラーを防ぐには、パッケージ内のすべての変数およびプロシージャが一意の 名前を持つようにします。 明示的に異なる名前を付けるか、または変数に接 頭辞を付けて下さい。
以下に例を示します。
変更前のコードでは、パッケージ内の変数名およびプロシージャ名として同じ
「v1」が指定されています。変更後は、変数名を「v_v1」とすることにより、
エラーを回避しています。
変更前 PACKAGE pk1 IS
v1 NUMBER;
PROCEDURE v1;
PROCEDURE p2 (x OUT NUMBER);
END;
PACKAGE BODY pk1 IS PROCEDURE v1 IS
BEGIN .…
END;
PROCEDURE p2 (x OUT NUMBER) IS BEGIN
x := pk1.v1;
END;
END;
↓ ↓
変更後 PACKAGE pk1 IS
v_v1 NUMBER;
PROCEDURE v1;
PROCEDURE p2 (x OUT NUMBER);
END;
PACKAGE BODY pk1 IS PROCEDURE v1 IS BEGIN
… END;
PROCEDURE p2 (x OUT NUMBER) IS BEGIN
x := pk1.v_v1;
END;
END;
6.5.3 パッケージからのビルトインのコール(R1.x)
1つのパッケージ内で、プロシージャまたは関数にOracle Developerビルトイ ンと同じ名前を付けることができます。例えばパッケージ P1 に Oracle
Developerビルトイン関数と同じ名前を持つFLOORを定義できます。
例:
PL/SQL 1 v := p1.FLOOR(X);
ここで、パッケージに関数FLOORが定義されていない場合、PL/SQL 1ではビ
PL/SQLのコード・エラーです。
PL/SQL 2.3からは、コンパイラはそのプログラム単位がビルトイン・パッケ
ージ内に存在するかどうかのチェックをせず、エラーが発生します。
エラー: 302 コンポーネント: 'FLOOR' を宣言して下さい。
このエラーを回避するためには、パッケージ名を削除し、ビルトイン・プログ ラムがコールされるように変更します。
つまり上の例では、以下のようにパッケージ名を削除します。
PL/SQL 8 v := FLOOR(X);
注意: PL/SQL 1では、Procedure Builderによってビルトイン・パッケージと同 じ名前のプログラム単位を作成できます。PL/SQL 2からは、これは許可され ません。Procedure Builderは、ビルトイン・パッケージと同じ名前を持つプロ グラム単位を検出すると、プログラム単位名の末尾に2個のドル記号「$$」を 追加することで、ロード時にプログラム単位の名前を変更します。例えば
「DEBUG」は、「DEBUG$$」に変更されます。
6.5.4 新規予約語(R1.x)
PL/SQL 2.3から、新しく以下の予約語が追加されています。これらの予約語
をコード内で変数名、プロシージャ名、関数名として使用している場合、これ らの名称の変換は手動で行う必要があります。
・ VARIANCE
・ VALUE
6.5.5 %ROWTYPE、%TYPE の必要性(R1.x、R2.x)
変数として表構造を持ったものや、列の型を持ったものを使用する場合、以下 の構文は、PL/SQL 2まではコンパイルされていました。PL/SQL 8では、これ らの間違った構文をコンパイルすると、エラーが発生します。
間違った構文例
PL/SQL 2 ・PROCEDURE <名前> (parameter IN <表名>)
・PROCEDURE <名前>
(parameter IN <表名>.<列名>)
・RETURN 変数の式
これらの構文は、コンパイラで次のエラー・メッセージが生成されます。
エラー: 488 変数宣言が無効です。オブジェクト'表名' は型またはサブタイプ でなければなりません。
エラーを防ぐには、表名に%ROWTYPEを追加する、列名に%TYPEを追加す る、または式のデータ型を使用するようにします。
PL/SQL8 ・PROCEDURE <名前> (parameter IN <表名>%ROWTYPE)
・PROCEDURE <名前>
(parameter IN <表名>.<列名>%TYPE)
・RETURN 変数のデータ型
以下に、変更の例を掲載します。
例1:表構造を指定する場合(%ROWTYPEを追加)
変更前 FUNCTION return_table RETURN dept IS …
↓
変更後 FUNCTION return_table RETURN dept%ROWTYPE IS …
例2:列を指定する場合(%TYPEを追加)
変更前 FUNCTION return_column RETURN dept.dname IS …
↓
変更後 FUNCTION return_column RETURN dept.dname%TYPE IS …
例3:%TYPEを使用できない場合(式のデータ型に変更)
変更前 FUNCTION return_parm (x IN NUMBER) RETURN x IS
…
↓
変更後 FUNCTION return_parm (x IN NUMBER) RETURN NUMBER IS
…
6.5.6 DBMS_* パッケージの使用(R1.x、R2.x)
R6i では、DBMS_ で始まるパッケージの使用はクライアント側PL/SQL コー ドではサポートされません。すべてのDBMS_* パッケージへのコールは、サ
ーバ側PL/SQLでみサポートされます。
クライアント側で DBMS_* パッケージをコールしている場合、R6i への移行 後コンパイルされないかまたは実行時エラーを引き起こす可能性があります。
DBMS_* パッケージをクライアント側PL/SQLコードで使用している場合は、
代わりにDBMS_* パッケージをコールするサーバー側ストアド・プログラム
単位を作成して下さい。
6.5.7 PARAMLIST への NULL の指定(R1.x)
R1.xでは、RUN_PRODUCTやOPEN_FORM等で指定するPARAMLISTの引数 にNULLを指定して実行することができましたが、R2.xからはこの指定がで きません。
例えば次の構文を使用すると、下のようなエラーが発生します。
RUN_PRODUCT(REPORTS, 'filename', synchronous, runtime, filesystem, null, null);
エラー: 307 このコールに一致する'RUN_PRODUCT'が複数宣言されていま す。
このエラーを回避するには、以下のように変更します。
DECLARE
plist PARAMLIST := NULL;
BEGIN
RUN_PRODUCT(REPORTS, 'filename', synchronous, runtime, filesystem, plist, null);
END;