在Oracle

时间:2019-04-24 08:50:08

标签: php oracle oracle11g oci bulk-operations

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

您是否有替代解决方案或有效的代码段?

非常感谢

2 个答案:

答案 0 :(得分:0)

通常,优良作法是在尝试将数据插入数据库之前验证数据是否正确,即,在通过网络发送数据之前,验证没有丢失的行/不正确的字段。这将帮助您减少出口,并降低重大故障率的潜在高昂成本。

如果这不是可行的选择,则可以在对import pandas as pd data_id = {'id':[1, 2, 3], 'start_time':[1, 2, 4], 'end_time':[2, 4, 5]} df_id = pd.DataFrame(data_id) data_time = {'time': list(range(1,6)), 'x': [2,2,4,5,3] } df_time = pd.DataFrame(data_time) # This works, but is way too slow for i, row in df_id.iterrows(): start = row['start_time']-1 end = row['end_time'] df_id.at[i,'mean_x'] = ((df_time['x'][start:end])).mean() 的调用中结合使用OCI_NO_AUTO_COMMIT标志,然后检查返回值。如果oci_execute()失败,则可以呼叫oci_execute()。此处提供了代码示例:https://www.php.net/manual/en/function.oci-rollback.php#refsect1-function.oci-rollback-examples

答案 1 :(得分:0)

为了提高性能,请考虑使用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中不可用。