2017-08-28 19 views
0

レポート表を作成するためのパッケージを作成しました。私がテストしています関数の単純化されたコードは次のとおりです。Oracle欠損レコードを挿入する

function do_build return integer is 
    V_RESULT  PLS_INTEGER := 0; 
    cursor all_entities is 
    select e.id_number 
    from entity e 
    ; 
BEGIN 
c_count := 0; -- this variable is declared at the package level outside of this function 
for rec in all_entities LOOP 
    BEGIN 
    insert into reporting (
     select * 
     from table(get_report_data(rec.id_number)) 
    ); 
    c_count := c_count + 1; 
    if MOD(c_count, 1000) = 0 Then 
     -- record status to table 
     commit; 
    end if; 
    EXCEPTION 
    WHEN OTHERS THEN 
    -- record exception to table 
    END; 
END LOOP; 
return V_RESULT; 
END; 

少し背景:get_report_dataが入力エンティティのレポートデータのすべてをデータセットを返す関数です。

ビルドが完了すると、「レポート」テーブルには約1,000件のレコードがありません。例外がスローされ、欠落したレコード以外のものはすべて成功したように見えます(関数は呼び出し元に0を返します)。

レポートデータが記録されていないエンティティレコードに対してget_report_dataを実行すると、レコードが正常に表示されます。実際には、私は特別な「レポートへの挿入(select * from table(get_reporting_data(missing_id))」を行うことができ、情報が挿入されます。

なぜこれらのレコードはスキップされますか?別の方法、それを行うために、任意のより良い方法

答えて

2

あなたは1000行ごとにコミットしています。あなたは最後のバッチをコミットしていません。 END LOOPの後にコミットを追加します。

BEGIN 
c_count := 0; -- this variable is declared at the package level outside of this function 
for rec in all_entities LOOP 
BEGIN 
    insert into reporting (
    select * 
    from table(get_report_data(rec.id_number)) 
    ); 
    c_count := c_count + 1; 
    if MOD(c_count, 1000) = 0 Then 
    -- record status to table 
    commit; 
    end if; 
EXCEPTION 
    WHEN OTHERS THEN 
    -- record exception to table 
END; 
END LOOP; 
COMMIT; -- <-- Add this commit to pick up last few records 
return V_RESULT; 

END; 
+0

ああ、そうです!私は今確認して再確認しています。ありがとう。 – nrg

1

これは同時実行の問題になる可能性がありますループは、それらが処理されることはありません実行中にレコードがENTITYテーブルにコミットしている場合

ところで:???。使い方このように他の人がトラブルを求めているとき

BTW2:単​​に使用しない理由:

INSERT INTO reporting 
SELECT rep.* 
FROM entity e 
CROSS JOIN table(get_report_data(e.id_number)) rep; 
+0

興味深い。私はこのメソッドを使って、より速い挿入が得られるかどうかを確認します。私はそうするだろうと思う。パフォーマンスが大幅に速い場合は、必ずしも状態の更新が必要なわけではありません。提案していただきありがとうございます。 – nrg

+0

また、他のときに悪い書式を使用する理由を詳しく説明していますか? – nrg

+0

いつでも、あなたが期待するものだけでなく、あらゆるエラーをキャッチします。ネットワーク接続、データベースのシャットダウンなどは、処理している行とはまったく関係がないため、捕捉されます。 – fhossfel

関連する問題