Может ли SQL INSERT потерпеть неудачу, не вызывая исключение в PL / SQL - PullRequest
3 голосов
/ 30 ноября 2010

Есть ли случаи, когда INSERT в SQL (в частности, Oracle-PL / SQL) может завершиться сбоем без исключения? Я вижу проверки в коде после INSERT, когда он проверяет, что SQL%ROWCOUNT = 1 ELSE вызывает свое собственное пользовательское исключение. Я не понимаю, как это может произойти.

Ответы [ 3 ]

8 голосов
/ 30 ноября 2010

Он не может терпеть неудачу без исключения, нет.Вероятно, разработчик, написавший код, не знал об этом.

Триггер после оператора мог предположительно удалить только что вставленную строку.И, конечно же, команда INSERT ... SELECT может не найти строк для вставки, что приведет к SQL% ROWCOUNT = 0.

2 голосов
/ 01 декабря 2010

Как упоминали @TonyAndrews и @GinoA, есть несколько способов, которыми INSERT может вернуть что-то, кроме ровно одной строки (триггеры, INSERT INTO tablename SELECT... синтаксис).

Но большая проблема в том, что выв PL / SQL.Таким образом, значение SQL%ROWCOUNT может использоваться в качестве условия для определения потока выполнения программы, включая выдачу операторов COMMIT или ROLLBACK.

Даже при простом вызове пользовательского исключения вызывающий PLБлок / SQL может обрабатывать само исключение.

РЕДАКТИРОВАТЬ: Кто-то должен изменить заголовок вопроса, чтобы указать PL / SQL (как указано в самом вопросе), поскольку это не то же самое, что область действия SQL, предложенная заголовком.

2 голосов
/ 30 ноября 2010

В дополнение к упомянутой проблеме @mcabral, связанной с триггером, у вас может быть успешная вставка, но вставки, отличные от 1 строки.Например, стиль вставки insert into blah(col1) select col2 from foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...