Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menangkap kesalahan ke forall plsql

Saya akan berasumsi bahwa Anda ingin meletakkan save exceptions di bulk collect .

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;

Namun, untuk hal seperti ini, tampaknya tidak ada alasan untuk menggunakan PL/SQL sama sekali. Cukup tulis satu INSERT pernyataan mungkin dengan pencatatan kesalahan DML jika table_data memiliki data tidak valid yang perlu dicatat.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara bergabung dan mengekstrak di SQL

  2. Membuat tabel database dalam prosedur PL/SQL

  3. Nilai input pesan kesalahan Oracle tidak cukup lama

  4. Format tanggal default Oracle adalah YYYY-MM-DD, MENGAPA?

  5. Mungkinkah ada kebuntuan saat menggunakan penguncian optimis?