2016-07-18 6 views
0

私は最近、OracleからPostgresにデータベースを移行するように求められました(私はこの問題に関して本当に選択肢がありませんでした)。 ora2pgツールを使用してDDLのほとんどを移行することができましたが、いくつかのPL/SQLコードを手に入れたときに本当の頭痛が始まりました。PostgreSQLの型の反復と動的変更

私の問題の大半を表すコードがいくつかあります(同様の問題はコードの複数の部分にあります)。

list_aのように宣言された型とする
list_a  list_a:= list_a(); 
list_a_aux list_a:= list_a(); 

::私はに走った最初の問題だった

TYPE list_a IS TABLE OF TABLE_2; 

文を "BULK COLLECTを"

sql_statement := 'SELECT * FROM TABLE_1'; 

OPEN ref_cursor FOR sql_statement; 
FETCH ref_cursor BULK COLLECT INTO list_a_aux; 

WHILE list_a_aux.COUNT <> 0 
LOOP 
    FOR n in list_a_aux.FIRST..list_a_aux.LAST 
    LOOP 
     IF list_a_aux(n).id = 0 THEN 
      list_a.EXTEND; 
      list_a(list_a.COUNT).id = 1; 
      list_a_aux.DELETE(n); 
     ELSE 
      -- More Application Logic 
     END IF; 
    END LOOP; 
END LOOP; 

両方list_aとlist_a_auxは次のようにinitiliazedされています。いくつかのメーリングリストを検索したところ、HEREを指していました。 私はその解決法を理解していましたが、それは十分に単純だと思われましたが、コードに深く掘り下げて、残りのコードと統合する方法を理解できませんでした。私はこのコードにあるものと似た問題を探してみましたが、多くの個々の問題(1,など)の解決策を見つけましたが、この特定の問題にはまったく合わないようです。

このPL/SQLをどのように移行できますか?

答えて

0

はい、PostgreSQLにはBULK COLLECTはありません。あなたは別の(多分さらに簡単な)方法で物事について行きます。このようなクエリの結果を通じて、あなたが判明している、あなたループとして

FOR rec_var IN SELECT ... LOOP 
    <statements> 
END LOOP; 

あなたがオブジェクトのコレクションが必要な場合は、あなたが

DECLARE 
    list_a table_2[] := ARRAY[]::table_2[]; 

を使用する場合がありますあなたの例では配列–を使用することができます配列を宣言し、空の配列に初期化します。それらを操作する富はarray functions and operatorsです。新しい添字に割り当てるか、array_append()を割り当てるだけでそれらを拡張します。特定のインデックスで要素を削除する機能はありませんが、要素の前後にスライスを連結して新しい配列を作成するか、削除された要素にNULLを使用するようにロジックを変更することができます。

多くの場合、オブジェクトのコレクションを実行する必要がないようにコードを作成できます。一度に1つずつ結果を渡すために、表関数(OracleではPIPELINED関数)を使用できます。もちろん、これは常に可能ではなく、既存のコードを移行することが目標である場合は、おそらくそれほど重要ではないという大規模な書き直しが必要になる可能性があります。

関連する問題