TiberoとOracleの互換性の問題。 パート1.条件付きPL / SQLコンパイル







PL / SQLの条件付きコンパイルを使用すると、通常はバッチ定数の値に関連付けられている条件に応じて、ソースコードの一部を選択的にコンパイルできます。 これは、さまざまなバージョンのDBMSとアプリケーションの互換性を確保するためによく使用されます。

2017年12月、このような機会がTiberoに登場し、TiberoとOracleの間でさらに優れたアプリケーション互換性を確保できるようになりました。







例として、パッケージを使用して、例外を宣言し、システムエラーコードに関連付けます。 Tiberoでは、システムエラーコードはOracleとは異なります。







まず、NO_DATA_FOUNDなど、SYS.STANDARDパッケージの標準例外を使用する必要があります。 それらとの互換性の問題はありません。 アプリケーションで使用される他の例外については、個別のパッケージを作成することをお勧めします。

このパッケージでは、TiberoとOracleの両方で、-20999〜-20000のエラーコードを持つユーザー例外も順番に処理されます。 それ以外の場合、このアプリケーションを使用してOracleとTiberoの両方を使用する予定がある場合は、条件付きコンパイルを使用できます。







まず、どのDBMSを使用しているかを判断するための定数を含むパッケージが必要です。







create or replace package tmax_ConstPkg is c_isTibero constant boolean := false; end tmax_ConstPkg;
      
      





これで、DBMSに応じて例外バインディングを記述できます。







 create or replace package tmax_ErrPkg is e_object_not_exists exception; pragma exception_init(e_object_not_exists, $if tmax_Constpkg.c_isTibero $THEN -7071 $ELSE -4043 $END ); -- e_compilation_error exception; pragma exception_init(e_compilation_error, $IF tmax_Constpkg.c_isTibero $THEN -15163 $ELSE -06550 $END ); end tmax_ErrPkg;
      
      





例外を宣言およびバインドするためのパッケージがOracleのアプリケーションですでに使用されている場合は、Tiberoで対応するエラーコードを(経験的に)取得し、条件付きコンパイルを使用して追加するだけです。







例外の宣言とバインドがアプリケーションのコード全体にビーズで散らばっている場合、これはパニックの原因ではありません。







PL / Scopeを使用してPL / SQLコードを分析する絶好の機会を取ることにしました。 ここにすべてのユーティリティコードをリストすることは実用的ではなく、 Oracle2Tibero_Toolsで利用可能です。 このユーティリティは、いくつかのPL / SQLパッケージで構成されており、そのうちの2つは既に上記で説明されています。 分析されているPL / SQLオブジェクトとともにこれらのパッケージをアプリケーションのスキーマにインストールする場合、これらを使用するのが最も簡単です。







なぜなら PL / Scopeを使用してコードを分析するには、識別子検索モードでPL / SQLオブジェクトをコンパイルする必要があります。次に例を示します。







 SQL> ALTER SESSION SET plscope_settings='IDENTIFIERS:ALL'; SQL> alter procedure p1 compile;
      
      





識別子検索モードですべての PL / SQLオブジェクトを再コンパイルするには、次を実行するだけで十分です。







 SQL> exec tmax_check4migrate.recompile4plscope
      
      





これで、次のようにユーティリティを実行できます。







 SQL> set serveroutput on SQL> exec tmax_check4migrate.run
      
      





すべての問題のある例外に関するメッセージが表示され、Tmax_ErrPkgパッケージのOracleで例外を宣言してエラーコードに関連付けるために標準例外または空白を使用するように提案されます。







 1. Exception LONG_TEXT(PACKAGE BODY HR.TEST line 2528) init with error code -6502(line 2529) ...replace it to VALUE_ERROR Reference list 1) PACKAGE BODY HR.TEST line(s) 2570,2615 3. Exception E_MONTH_ERR(PACKAGE BODY HR.TEST line 6128) init with error code -1843(line 6129) Reference list 1) PACKAGE BODY HR.TEST line(s) 6198 ... ...You need to use conditional compilation to define different system error codes for Tibero and Oracle Following error codes did not find in Tmax_ErrPkg package, need to add: /* ORA-01843: not a valid month */ ------------------------------ e_not_a_valid_month exception; pragma exception_init(e_not_a_valid_month, $if tmax_Constpkg.c_isTibero $THEN -????? $ELSE -1843 $END );
      
      





ところで、すべての例外を1つのパッケージに統合する場合にのみ役立ちます。 このユーティリティは、例外をチェックすることに加えて、次のパートで説明する他の多くの互換性の問題を解決することをすぐに警告します。 したがって、この段階では、メインのRunプロシージャで、他のチェック(Chk_プレフィックスを持つプロシージャ)の呼び出しをコメントアウトできます。







すべての例外の空白をTmax_ErrPkgパッケージに追加したら、ユーティリティをパッチモードで実行できます。







 SQL> set serveroutput on SQL> exec tmax_check4migrate.run(p_modify => true)
      
      





古い宣言とバインディングはコメント化され、代わりに標準の例外またはTmax_ErrPkgパッケージの例外がコードで使用されます。







Tiberoの場合。 執筆時点では、条件付きコンパイルはtechnet.tmaxsoft.comで利用可能な標準アセンブリにまだ含まれていません。 必要な初期化パラメーターを設定することにより、Tiberoインスタンスの条件付きコンパイルのサポートを確認できます。







 _PSM_PREPROCESS=Y _PSM_PREPROCESS_SELECTION=Y
      
      





または、そのような隠されたパラメーターがあることをSQLクエリで確認できます。







 SQL> select NAME,VALUE from sys._vt_parameter where name like '_PSM_PREPROCESS%';
      
      





TmaxSoftのロシア代表オフィスで、条件付きコンパイルをサポートするTiberoのバージョンをリクエストできます。







以下の出版物では、発生する可能性のあるTibero構文とOracle構文の違いのいくつかと、これに関連する手動修正を回避する方法を検討します。








All Articles