Как зафиксировать ошибку ограничения на уникальность данных в МН блоке / блоке SQL?

Метод CURL-less с PHP5:

$url = 'http://server.com/path';
$data = array('key1' => 'value1', 'key2' => 'value2');

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

См. руководство по PHP для получения дополнительной информации о методе и способах добавления заголовков, например:

37
задан Thiago Arrais 13 January 2009 в 18:17
поделиться

4 ответа

EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
         UPDATE
66
ответ дан Ricardo Villamil 10 October 2019 в 08:25
поделиться

Я уверен, что у Вас есть свои причины, но на всякий случай... необходимо также рассмотреть использование запроса "слияния" вместо этого:

begin
    merge into some_table st
    using (select 'some' name, 'values' value from dual) v
    on (st.name=v.name)
    when matched then update set st.value=v.value
    when not matched then insert (name, value) values (v.name, v.value);
end;

(измененное вышеупомянутое, чтобы быть в начать/закончить блоке; очевидно, можно выполнить его независимо процедуры также).

26
ответ дан William 10 October 2019 в 08:25
поделиться

Я подозреваю условие, которое Вы ищете, DUP_VAL_ON_INDEX

EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
        DBMS_OUTPUT.PUT_LINE('OH DEAR. I THINK IT IS TIME TO PANIC!')
12
ответ дан EvilTeach 10 October 2019 в 08:25
поделиться

Как альтернатива явной ловле и обрабатыванию исключения Вы могли сказать Oracle ловить и автоматически игнорировать исключение включением /*+ hint */ в операторе вставки. Это немного быстрее, чем явная ловля исключения и затем артикулирование, как это должно быть обработано. Также легче установить. Оборотная сторона - то, что Вы не получаете обратной связи от Oracle, что исключение было поймано.

Вот пример, где мы выбрали бы из другой таблицы или возможно внутреннего запроса, и вставили бы результаты в таблицу, названную TABLE_NAME, который имеет ограничение на уникальность данных на столбец, названный IDX_COL_NAME.

INSERT /*+ ignore_row_on_dupkey_index(TABLE_NAME(IDX_COL_NAME)) */ 
INTO TABLE_NAME(
    INDEX_COL_NAME
  , col_1
  , col_2
  , col_3
  , ...
  , col_n)
SELECT 
    INDEX_COL_NAME
  , col_1
  , col_2
  , col_3
  , ...
  , col_n);

Это не отличное решение, если Ваша цель это, чтобы поймать и обработать (т.е. распечатать или обновить строку, которая нарушает ограничение). Но если Вы просто хотели поймать его, и проигнорировать строку нарушения тогда тогда это должно сделать задание.

0
ответ дан 27 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: