2016-04-05 17 views
0

Bazı satırları eklerken herhangi bir hatayı önlemek için bu özel durumu koyarım ancak neden çalışabileceğimi bilmiyorum.Bir hata nasıl karşılanır forall plsql

DECLARE 
TYPE dataDate IS TABLE OF DATE; 
l_dataDate dataDate; 
BEGIN 
select data1 BULK COLLECT INTO l_dataDate from USER.TABLE_DATA; 
FORALL i IN l_dataDate.FIRST..l_dataDate.LAST 
    BEGIN   
     INSERT INTO USER.DIMDATE SELECT 
     to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS')), 
     to_number(to_char(l_dataDate(i), 'YYYYMMDD')), 
     l_dataDate(i), 
     to_number(to_char(l_dataDate(i), 'DD')), 
     to_char (l_dataDate(i), 'Day'), 
     to_number(to_char (l_dataDate(i), 'MM')), 
     to_char (l_dataDate(i), 'Month'), 
     to_number(to_char(l_dataDate(i), 'YYYY')) FROM DUAL 
     WHERE NOT EXISTS (SELECT 1 FROM USER.DIMDATE WHERE COD_FECHA=to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS'))); 
     COMMIT; 
    EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('ERROR '||SUBSTR(SQLERRM, 1, 200)); 
    END; 
END; 
/

Böyle bir şey yapmak mümkün mü? Şimdiden teşekkürler.

+2

Bir yığın toplu alım yapmak istediğinizi varsayalım. https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1422998100346727312 –

cevap

2

save exceptions ürününü bulk collect ürününüze yerleştirmek istediğinizi varsayardım.

DECLARE 
    TYPE dataDate IS TABLE OF DATE; 
    l_dataDate dataDate; 

    dml_errors EXCEPTION; 
    PRAGMA exception_init(dml_errors, -24381); 
BEGIN 
    select data1 
    BULK COLLECT INTO l_dataDate 
    from USER.TABLE_DATA; 

BEGIN 
    FORALL i IN l_dataDate.FIRST..l_dataDate.LAST SAVE EXCEPTIONS 
    INSERT INTO USER.DIMDATE 
     SELECT 
      to_number(to_char(l_dataDate(i), 'YYYYMMDDHH24MISS')), 
      to_number(to_char(l_dataDate(i), 'YYYYMMDD')), 
      l_dataDate(i), 
      to_number(to_char(l_dataDate(i), 'DD')), 
      to_char (l_dataDate(i), 'Day'), 
      to_number(to_char (l_dataDate(i), 'MM')), 
      to_char (l_dataDate(i), 'Month'), 
      to_number(to_char(l_dataDate(i), 'YYYY')) 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT 1 
         FROM USER.DIMDATE 
         WHERE COD_FECHA=to_number(
             to_char(l_dataDate(i), 
               'YYYYMMDDHH24MISS'))); 
EXCEPTION 
    WHEN dml_errors 
    THEN 
    FOR i IN 1..sql%bulk_exceptions.count 
    LOOP 
     <<do something with the exceptions>> 
    END LOOP; 
END; 

Bunun gibi bir şeye rağmen, PL/SQL'i kullanmak için bir neden yok gibi görünüyor. Sadece table_data'un günlüğe kaydedilmesi gereken geçersiz verilere sahip olması durumunda, DML hata kaydıyla tek bir INSERT ifadesi yazmanız yeterlidir.

+0

Çok teşekkürler, Fakat örneğin ikinci eklentide bir hata göründüğünde ne olur? istisnalar foral ifadeye girmediğinden diğer satırlar eklenmez. – lgerras84

+2

@ Igerras84 - Gerçekten test ettiniz mi? 'istisnaları kaydet' istisnaları kaydeder. Koleksiyonun ikinci unsuru bir hata oluşturuyorsa, 'forall' devam edecektir. Daha sonra dış istisna işleyicide raporlanır ve hatalar hakkında bilgi almak için 'sql% bulk_exceptions' koleksiyonunu yineleyebilirsiniz. Bu, döngü yinelemesindeki istisnaları ele almanız gereken bir 'for' döngüsüne sahip olsaydınız ne olacağından farklıdır. –

İlgili konular