Bulk collect ve no_data_found
Hataya çok açık olan bir konuya değinmek istiyorum.Bildiğimiz gibi klasik select into ile tablodan okuduğumuz veriyi lokal değişkenimize yazıyoruz.
Select ile seçtğimiz sonuç kümesi boş gelirse no_data_found exception ı ile hatayı yakalayabiliyoruz.
Bunun paralelinde bulk_collect ile tablodan okuduğumuz veriyi lokal array imize yazmak istediğimizde ki sonuç kümesinin boş olduğunu varsayalım bu durumda oracle no_data_found hatasını fırlatmıyor ve eğer bizimde iş sürecimizde bu hatayı handle etmeye ihtiyacımız varsa farklı bir yol kullanmamız gerekiyor.Bunu da bulk collect işlemlerinde oracle ın lokalimizde yüklemeyi yapacağımız arrayimizi otomatik olarak boşaltmasından yararlanarak yani array in count metodunun sıfıra eşitliğini kullanarak yapıyoruz.
Örneklerle konuyu açıklamaya çalışayım.
drop table bulktable;
create table bulktable (col1 integer);
insert into bulktable values(1);
insert into bulktable values(2);
commit;
DECLARE
l_id PLS_INTEGER;
BEGIN
SELECT ora_rowscn INTO l_id FROM bulktable WHERE col1 = 11;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20001, 'Hata aldik bekledigimiz gibi sorun yok');
end;
DECLARE
l_scn_arr dbms_sql.Number_Table;
BEGIN
SELECT ora_rowscn bulk collect INTO l_scn_Arr FROM bulktable where col1 is null;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20001, 'Asla buraya girmeyecek');
end;
DECLARE
l_id_arr dbms_sql.number_table;
BEGIN
SELECT ora_rowscn BULK COLLECT
INTO l_scn_arr
FROM bulktable
WHERE col1 is NULL;
IF l_id.COUNT = 0 THEN
raise_application_error(-20001, 'Hatayi aldik istedigimiz de buydu ');
END IF;
END;
Select ile seçtğimiz sonuç kümesi boş gelirse no_data_found exception ı ile hatayı yakalayabiliyoruz.
Bunun paralelinde bulk_collect ile tablodan okuduğumuz veriyi lokal array imize yazmak istediğimizde ki sonuç kümesinin boş olduğunu varsayalım bu durumda oracle no_data_found hatasını fırlatmıyor ve eğer bizimde iş sürecimizde bu hatayı handle etmeye ihtiyacımız varsa farklı bir yol kullanmamız gerekiyor.Bunu da bulk collect işlemlerinde oracle ın lokalimizde yüklemeyi yapacağımız arrayimizi otomatik olarak boşaltmasından yararlanarak yani array in count metodunun sıfıra eşitliğini kullanarak yapıyoruz.
Örneklerle konuyu açıklamaya çalışayım.
drop table bulktable;
create table bulktable (col1 integer);
insert into bulktable values(1);
insert into bulktable values(2);
commit;
DECLARE
l_id PLS_INTEGER;
BEGIN
SELECT ora_rowscn INTO l_id FROM bulktable WHERE col1 = 11;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20001, 'Hata aldik bekledigimiz gibi sorun yok');
end;
DECLARE
l_scn_arr dbms_sql.Number_Table;
BEGIN
SELECT ora_rowscn bulk collect INTO l_scn_Arr FROM bulktable where col1 is null;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20001, 'Asla buraya girmeyecek');
end;
DECLARE
l_id_arr dbms_sql.number_table;
BEGIN
SELECT ora_rowscn BULK COLLECT
INTO l_scn_arr
FROM bulktable
WHERE col1 is NULL;
IF l_id.COUNT = 0 THEN
raise_application_error(-20001, 'Hatayi aldik istedigimiz de buydu ');
END IF;
END;
Comments