将 csv 文件中的数据合并到 Oracle

Merge data from a csv file into Oracle

我有一个 php 脚本,可以将 csv 文件中的数据插入 Oracle table :

$handle = fopen('file.txt', "r");
for($i =1;($data = fgetcsv($handle, 10000, ";")) !== FALSE; $i++) {
// The query uses placeholders for data
$sql = "INSERT INTO table
                (col1,col2,col3,col4)
            VALUES
                (:val1,:val2,:val3,:val4)";
$sth = $conn->prepare($sql);

// The data is bound to the placeholders
$sth->bindParam(':val1', $data[0]);
$sth->bindParam(':val2', $data[1]);
$sth->bindParam(':val3', $data[2]);
$sth->bindParam(':val4', $data[3]);

// The row is actually inserted here
$sth->execute();
$sth->closeCursor();

现在我正在尝试用 merge 替换插入,这样我就可以仅在数据不存在的情况下执行插入。

我查看了一些 SO 问题和 Oracle 文档,但仍然无法弄清楚(不使用过程,我只找到了这些...)

你能帮忙吗?

在你的情况下,如果你只想做一个 INSERT 那么你不需要使用 MERGE。如果您在 table 上定义了适当的 constraints,那么您不必担心 validating table.

中的 现有行

无论如何,根据您对问题的评论,您想使用 MERGE。因此,这里有一些 [optional] MATCHEDNOT MATCHED 子句的几个示例,适用于 10g 及更高版本:

两个子句都存在

MERGE INTO test1 a
  USING (SELECT :val1,:val2,:val3,:val4 FROM DUAL) b
    ON (a.key = b.key) -- put the required join key
  WHEN MATCHED THEN
    UPDATE SET a.col = b.col
  WHEN NOT MATCHED THEN
    INSERT (col1,col2,col3,col4)
    VALUES (b.object_id, b.status);

没有匹配的子句,只插入

MERGE INTO test1 a
  USING (SELECT :val1,:val2,:val3,:val4 FROM DUAL) b
    ON (a.key = b.key) -- put the required join key
  WHEN NOT MATCHED THEN
    INSERT (col1,col2,col3,col4)
    VALUES (b.object_id, b.status);

没有不匹配的子句,只更新

MERGE INTO test1 a
  USING (SELECT :val1,:val2,:val3,:val4 FROM DUAL) b
    ON (a.key = b.key) -- put the required join key
  WHEN MATCHED THEN
    UPDATE SET a.col = b.col;

查看一些用法示例here