Атомарный составной оператор работает по-другому в Db2

#db2 #db2-luw

#db2 #db2-luw

Вопрос:

При выполнении следующего оператора он печатает измененные строки с атомарным, но не без него. Однако я не нашел в документации ничего, что объясняло бы это поведение.

 --#SET TERMINATOR @
 
drop table mytable@
 
CREATE TABLE mytable (
col1 INTEGER
) @

SELECT * FROM new TABLE (INSERT INTO mytable (col1) VALUES (1)) @
SELECT * FROM mytable @

BEGIN ATOMIC
SELECT col1 FROM new TABLE (INSERT INTO mytable (col1) VALUES (2));
END @
SELECT * FROM mytable @

BEGIN
 SELECT col1 FROM new TABLE (INSERT INTO mytable (col1) VALUES (3));
END @
  

Я получил этот вывод:

введите описание изображения здесь

Комментарии:

1. BEGIN ATOMIC в соответствии с вашим примером ничего не печатается. Выходные строки печатаются с помощью последующего оператора select . BEGIN ATOMIC Оператор выводит только информацию об успешном завершении вместо ожидаемого сбоя, как для BEGIN NOT ATOMIC (последнего оператора).

2. @MarkBarinstein AngocA спрашивает, почему SQL0104N происходит в одном случае, но не в другом (учитывая, что оператор SELECT бесполезен в любом случае)?

3. @mao Исходное утверждение было: «он печатает измененные строки с помощью Atomic». Но он не печатает никаких строк ни в одном составном (атомарном или неатомном) операторе. Единственное странное поведение для меня здесь заключается в том, что он действительно не возвращает SQL0104N для оператора select во встроенном (атомарном) составном операторе. Кажется, что это какая-то недокументированная «особенность» db2 (не только CLP). Это может быть действительно полезно для таких выборок из операции изменения данных. Какой-то вывод в /dev/null .

4. @MarkBarinstein . Несоответствие между АТОМАРНЫМ / НЕАТОМНЫМ в этом случае вызывает беспокойство, поскольку кажется естественным ожидать одинакового результата в обоих случаях. Но поведение, похоже, таково, что АТОМАРНЫЙ случай каким-то образом обрабатывает исключение и подавляет его, в то время как НЕАТОМНЫЙ случай не обрабатывает исключение и корректно выдает его.

5. может быть, стоит обратиться в службу поддержки IBM