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

时间:2015-03-26 11:29:19

标签: php sql oracle csv fgetcsv

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

$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 替换插入,所以只有在数据不存在的情况下我才能使用isert。

我看了一些SO问题和Oracle文档,但仍然无法弄清楚(没有使用程序,我找到了所有的......)

你可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

在您的情况下,如果您只想INSERT,则无需使用MERGE。如果您在上定义了正确的约束,那么您不必担心验证 现有行在表格中。

无论如何,根据您对该问题的评论,您希望使用 MERGE 。因此,以下是对于10g及更高版本有效的[可选] MATCHED NOT MATCHED 条款的几个示例:

两个条款都出现

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