将 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] MATCHED 和 NOT 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。
我有一个 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] MATCHED 和 NOT 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。