Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak złapać błąd w forall plsql

Zakładam, że chcesz umieścić save exceptions w Twoim 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;

Jednak wydaje się, że w przypadku czegoś takiego nie ma żadnego powodu, aby używać PL/SQL. Wystarczy napisać jedną INSERT instrukcja prawdopodobnie z logowaniem błędów DML, jeśli table_data zawiera nieprawidłowe dane, które należy zarejestrować.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Agreguj wiersze w instrukcji Oracle SQL

  2. Jak zmienić język sesji Oracle

  3. Znacznik czasu Oracle do serwera sql DateTime

  4. Data Oracle Między zapytaniem

  5. Jak wstawić wartość do zagnieżdżonej tabeli bez utraty danych w tej tabeli?