@Sanya899

Php oracle insert vs update?

Спасибо пользователю Kerm который мне помог поправить этот код все работает. Но теперь возник вопрос как сделать проверку на добавление записи, если существует то делать ничего не нужно , а вот если нету то добавить или обновить недостающие записи. Как правильно реализовать такой функционал ?
Смотрю в сторону merge, но не знаю как его реализовать. Прошу меня простить за создание нового вопроса т к предыдущий мой вопрос утонул.

<blockquote>require_once "simple_html_dom.php";

error_reporting(E_ALL);
ini_set('display_errors', '1');
$conn = oci_connect('ddd', 'ddd', '127.0.0.1/orcl', 'AL32UTF8');


$brands = array();

$html = str_get_html(file_get_contents('https://kolesa.kz/cars/'));
$i = 'INSERT ALL';
$select = $html->find('select[id=auto-car-mm-0]', 0);

foreach($select->find('option') as $opt)
{
  if($opt->value == '') continue;
  $i .= ' INTO kolesa_brands (id, name) VALUES('.$opt->value.', \''.$opt->plaintext.'\')';
  $brands[$opt->value] = $opt->plaintext; 
}

$insert = oci_parse($conn, $i.' SELECT * FROM dual;');

oci_execute($insert);</blockquote>
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
idShura
@idShura
Можно еще такой вариант попробовать

BEGIN   
   UPDATE kolesa_brands SET name = 'name' WHERE id = <id>;   
   
   IF SQL%NOTFOUND THEN   
      INSERT INTO kolesa_brands (id, name) VALUES (<id>, '<name>'); 
   END IF;   
END;


upd/
или вариант с merge (Вместо <id>, <name> нужно подставить значения $opt->value и $opt->plaintext). Так как для merge нужно две таблицы можно попробовать использовать виртуальную таблицу dual

merge into kolesa_brands t
using ( select <id> id, '<name>' name from dual ) n on ( t.id = n.id)
when matched then 
  update set t.name = n.name
when not matched then
  insert (t.id, t.name) values (n.id, n.name)


upd2

<blockquote>require_once "simple_html_dom.php";

error_reporting(E_ALL);
ini_set('display_errors', '1');
$conn = oci_connect('ddd', 'ddd', '127.0.0.1/orcl', 'AL32UTF8');


$brands = array();

$html = str_get_html(file_get_contents('https://kolesa.kz/cars/'));
$i = 'begin ';
$i .= '\r\n';

$select = $html->find('select[id=auto-car-mm-0]', 0);

foreach($select->find('option') as $opt)
{
  if($opt->value == '') continue;

  $i .= 'merge into kolesa_brands t ';
  $i .= 'using (select '.$opt->value.' id, \''.$opt->plaintext.'\' name from dual) n on (t.id = n.id) ';
  $i .= 'when matched then ';
  $i .= 'update set t.name = n.name ';
  $i .= 'when not matched then ';
  $i .= 'insert (t.id, t.name) values (n.id, n.name);';
  $i .= '\r\n';

  $brands[$opt->value] = $opt->plaintext; 
}

$i .= '\r\n';
$i .= 'end;';

$insert = oci_parse($conn, $i);

oci_execute($insert);</blockquote>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽