【问题标题】:Atomic multiple insert with parameter binding in OracleOracle中带有参数绑定的原子多次插入
【发布时间】:2019-09-13 12:16:48
【问题描述】:

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

您有替代解决方案或工作代码 sn-p 吗?

非常感谢

【问题讨论】:

    标签: php oracle oracle11g oracle-call-interface bulk-operations


    【解决方案1】:

    为了提高性能,请考虑使用 oci_bind_array_by_name() 并单独插入列。这可能不适合所有数据。 Oracle的PHP OCI8书籍http://www.oracle.com/technetwork/topics/php/underground-php-oracle-manual-098250.html中的“Array Binding and PL/SQL Bulk Processing”中有一个例子@

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

    【讨论】:

    • 所以基本上你会编写一个 PL/SQL 过程来为你完成这项工作,而不是在 php.. 中处理插入,对吗?
    【解决方案2】:

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

    如果这不是一个可行的选项,您可以在对oci_execute() 的调用中使用OCI_NO_AUTO_COMMIT 标志的组合,然后检查返回值。如果oci_execute() 失败,那么您可以调用oci_rollback()。这里提供了一个代码示例:https://www.php.net/manual/en/function.oci-rollback.php#refsect1-function.oci-rollback-examples

    【讨论】:

    • 在插入之前验证数据确实很好,但是一些(非 PHP !)工具可以帮助您从中恢复,并节省您自己做的成本,例如参见 @987654322 中的批处理错误@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多