У меня есть несколько файлов CSV, которые нужно загрузить в несколько таблиц Oracle. Я использую функцию загрузки SQLcl (версия 22.3); у меня есть скрипт SQL (loadCSVs.sql) следующего формата:
Ожидаемое: если загрузка в таблицу B не удалась по какой-либо причине (нарушения PK, FK, UK, недопустимость значений NULL и т. д.), мне нужно остановить выполнение (чтобы я исправил CSV и перезапустил).
Фактическое: выполнение продолжается, загрузка в таблицу C продолжается (таким образом, вы в конечном итоге успешно завершаете работу таблиц A и C, в то время как загрузка в B не удалась — на самом деле, имея сотни таблиц/загрузок — легко пропустить эти ошибки).
Я попытался захватить вывод выполнения (оператора загрузки и/или файла SQL) — то есть code выхода — и в зависимости от этого выхода или нет, но пока безуспешно. Я также рассматривал возможность записи в файл (журнала) и чтения его на предмет #ERROR, но мне не нравится этот подход.
Как мне остановить выполнение этого (когда tableB дает сбой)? Любые идеи приветствуются, заранее спасибо!
Вывод:
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK
whenever oserror EXIT SQL.SQLCODE ROLLBACK
set load errors 0
set load truncate on
load tableA input_tableA.csv
load tableB input_tableB.csv
load tableC input_tableC.csv
SQL> @loadCSVs.sql
Load data into table tableA
csv
column_names on
delimiter ,
enclosures ""
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
batch_rows 50
batches_per_commit 10
clean_names transform
column_size rounded
commit on
date_format
errors 0
map_column_names off
method insert
timestamp_format yyyy-mm-dd HH24:MI:SS.FF9
timestamptz_format
locale English United States
scan_rows 100
truncate on
unknown_columns_fail on
#INFO Number of rows processed: 2
#INFO Number of rows in error: 0
#INFO Last row processed in final committed batch: 2
SUCCESS: Processed without errors
Load data into table tableB
csv
column_names on
delimiter ,
enclosures ""
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
batch_rows 50
batches_per_commit 10
clean_names transform
column_size rounded
commit on
date_format
errors 0
map_column_names off
method insert
timestamp_format yyyy-mm-dd HH24:MI:SS.FF9
timestamptz_format
locale English United States
scan_rows 100
truncate on
unknown_columns_fail on
#ERROR Insert failed in batch rows 1 through 2
#ERROR ORA-01722: invalid number
#ERROR Row 1 data follows:
< removed atual data for anonimization reasons>
#INFO Number of rows processed: 2
#INFO Number of rows in error: 2
#INFO No rows committed
ERROR: The Errors Allowed or the Error Limit parameter was exceeded
Load data into tableC
csv
column_names on
delimiter ,
enclosures ""
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
batch_rows 50
batches_per_commit 10
clean_names transform
column_size rounded
commit on
date_format
errors 0
map_column_names off
method insert
timestamp_format yyyy-mm-dd HH24:MI:SS.FF9
timestamptz_format
locale English United States
scan_rows 100
truncate on
unknown_columns_fail on
#INFO Number of rows processed: 28
#INFO Number of rows in error: 0
#INFO Last row processed in final committed batch: 28
SUCCESS: Processed without errors
SQL> version
Oracle SQLDeveloper Command-Line (SQLcl) version: 22.3.0.0 build: 22.3.0.257.1628
SQL>