Атомная множественная вставка с привязкой параметров в Oracle - PullRequest
0 голосов
/ 24 апреля 2019

Я пишу код php для загрузки файла csv в базу данных Oracle с помощью php oci. Я хочу атомарную вставку всех строк файла, т. Е. Если в одной строке пропущено / неправильное поле, то весь файл CSV не должен быть вставлен в БД. Я знаю, что могу добиться этого с помощью оператора INSERT ALL, но не могу заставить его работать с привязкой параметров. Например. oci_bind_by_name работает только с INSERT одной строки, у меня не работает с INSERT ALL или INSERT из нескольких строк.

У вас есть альтернативное решение или фрагмент рабочего кода?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Для повышения производительности рассмотрите возможность использования oci_bind_array_by_name () и вставки столбцов по отдельности.Это может не подходить для всех данных.В книге Oracle OCI8 есть пример в разделе «Привязка к массиву и массовая обработка PL / SQL» http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html

$a = array('abc', 'def', 'ghi', 'jkl');
$s = oci_parse($c, "begin mypkg.myinsproc(:a); end;"); 
oci_bind_array_by_name($s, ":a", $a, count($a), -1, SQLT_CHR); 
oci_execute($s);

На других языках (например, Python ) есть «executemany ()»"возможность, но это не доступно в PHP OCI8.

0 голосов
/ 14 мая 2019

Как правило, перед попыткой вставить данные в вашу БД рекомендуется проверять правильность данных, т. Е. Проверять отсутствие пропущенных строк / неправильных полей перед отправкой данных по проводам. Это поможет вам снизить выход и потенциально высокую стоимость значительных отказов.

Если это недопустимый вариант, вы можете использовать комбинацию флага OCI_NO_AUTO_COMMIT в вызове oci_execute(), а затем проверить возвращаемое значение. Если oci_execute() не удается, вы можете позвонить oci_rollback(). Пример кода приведен здесь: https://www.php.net/manual/en/function.oci-rollback.php#refsect1-function.oci-rollback-examples

...