我有一个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文档,但仍然无法弄清楚(没有使用程序,我找到了所有的......)
你可以帮忙吗?答案 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。