レポート表を作成するためのパッケージを作成しました。私がテストしています関数の単純化されたコードは次のとおりです。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))」を行うことができ、情報が挿入されます。
なぜこれらのレコードはスキップされますか?別の方法、それを行うために、任意のより良い方法
ああ、そうです!私は今確認して再確認しています。ありがとう。 – nrg