Как остановить выполнение загрузки SQLcl при возникновении ошибки (загрузка нескольких таблиц)

1
8

У меня есть несколько файлов 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>
Лукьян
Вопрос задан27 февраля 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.