我正在编写一个php代码,以通过php oci将一个csv文件上传到Oracle DB中。我想要原子插入文件的所有行,即如果一行中缺少/错误的字段,则不能将整个csv文件插入DB。
我知道我可以使用INSERT ALL
语句来实现这一点,但是我无法使其与参数绑定一起使用。
例如。 oci_bind_by_name仅适用于一行的INSERT
,不适用于多行INSERT ALL
或INSERT
的我。
您是否有替代解决方案或有效的代码段?
非常感谢
答案 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中不可用。