2015-03-26 5 views
0

У меня есть PHP скрипт, который вставляет данные из файла CSV в Oracle таблице:Объединить данные из 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(); 

Теперь я пытаюсь заменить вставку с слияния так Я могу сделать isert только в том случае, если данные уже не существуют.

Я посмотрел на некоторые SO вопросы и документации Oracle, но до сих пор не могу понять, что из (без использования процедур, whice все я нашел ...)

пожалуйста, вы можете помочь?

+0

* Теперь я пытаюсь заменить вставку слиянием, поэтому я могу сделать isert, только если данные уже не существуют. * Почему? В чем проблема с простым «INSERT»? Если у вас есть требуемые ограничения, определенные в таблице, вам не нужно будет думать о существующих строках. –

+0

Вы правы. я могу использовать простой ** INSERT **. но мне понадобится запрос ** MERGE **, чтобы сделать некоторые продвинутые вещи (используя совпадение, когда они не совпадают). Можете ли вы помочь мне с синтаксисом? – RidRoid

+0

Хорошо, см. Мой ответ. –

ответ

1

В вашем случае, если вы только хотите сделать INSERT, то вам не нужно использовать MERGE. Если у вас есть соответствующие ограничения определены на таблицы, то вам не придется беспокоиться о проверке в существующих строк в таблице.

В любом случае, согласно вашим комментариям к вопросу, вы хотите использовать MERGE. Итак, вот несколько примеров [опционально] MATCHED и НЕ 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); 

нет, не соответствием с lause, обновлять только

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.

+0

Спасибо за подробный ответ :) – RidRoid

+0

Добро пожаловать! –