0

我正在编写一个 php 代码,通过 php oci 将 csv 文件上传到 Oracle DB。我想要对文件的所有行进行原子插入,即如果一行缺少/错误的字段,则不得将整个 csv 文件插入数据库中。我知道我可以实现这个 usingINSERT ALL语句,但我不能让它与参数绑定一起工作。例如oci_bind_by_name仅适用于INSERT单行,它不适用于我的多行INSERT ALL或多INSERT行。

您有替代解决方案或有效的代码片段吗?

非常感谢

4

2 回答 2

1

为了提高性能,请考虑使用 oci_bind_array_by_name() 并单独插入列。这可能不适合所有数据。在 Oracle 的 PHP OCI8 书籍http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html中的“数组绑定和 PL/SQL 批量处理”中有一个示例

$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 中不可用。

于 2019-06-04T06:32:13.133 回答
0

一般来说,在尝试将数据插入数据库之前验证数据是否正确是一种很好的做法,即在通过网络发送数据之前验证没有丢失的行/不正确的字段。这将帮助您减少重大故障率的出口和潜在的高成本。

如果这不是一个可行的选项,您可以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

于 2019-05-13T22:14:08.837 回答