Имеет ли значение порядок операторов DML при использовании предложения "of"? - PullRequest
0 голосов
/ 06 июня 2019

Я заметил, что Oracle SQL Developer (19.1.0.094.2042) процитировал синтаксическую ошибку (через выделение) для триггера базы данных, который был включен с 2013 года (я только начал), триггер, который выполняется без ошибок и срабатываний.Oracle был только что обновлен с 11g до 18c.Теперь я спрашиваю, имеет ли значение порядок операторов DML при использовании предложения «of».

Когда я меняю порядок «DELETE» и «UPDATE», он компилируется точно так же, хотя и безвыделение ошибок.

С синтаксической ошибкой:

AFTER UPDATE OR DELETE OF column_name ON table_name
FOR EACH ROW

Без синтаксической ошибки:

AFTER DELETE OR UPDATE OF column_name ON table_name
FOR EACH ROW

Кажется, что prima facie странно использовать первый порядок, поскольку он выглядит грамматическиподразумевает, что оба дизъюнкта применяются к предложению "of".Нет смысла для "УДАЛИТЬ".Однако я нигде не мог найти этот вопрос или объяснение, и хотя я видел оба порядка, на самом деле было больше случаев «ОБНОВЛЕНИЕ ИЛИ УДАЛЕНИЕ», чем «УДАЛЕНИЕ ИЛИ ОБНОВЛЕНИЕ».

Iя все еще новичок в ИТ-индустрии (<1 года), и это мой первый пост;Я ценю любые отзывы. </p>

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Да, это важно. Тот, кто не терпит неудачу, фактически говорит

AFTER (DELETE) OR (UPDATE OF COLUMN_NAME) ON TABLE_NAME

Тот, кто терпит неудачу - это (пытается) сказать

AFTER (UPDATE) OR (DELETE OF COLUMN_NAME) ON TABLE_NAME

(здесь скобки предназначены только для пояснения - использование их в реальном коде (tm) также приведет к синтаксической ошибке).

'OF COLUMN_NAME' действителен только в сочетании с UPDATE. При связывании с DELETE это синтаксическая ошибка.

Если вы не указали имя столбца, вы можете написать его в любом случае, например, в

AFTER UPDATE OR DELETE ON TABLE_NAME

или

AFTER DELETE OR UPDATE ON TABLE_NAME

Удачи.


EDIT

Цитирую Попай: «Ну, взорви меня !!!».

Я удивлен, но Oracle фактически примет OF column_name после либо ОБНОВЛЕНИЯ, либо УДАЛЕНИЯ, и, очевидно, он срабатывает правильно в любом случае, рассматривая его так, как если бы триггер был написан для UPDATE OF COLUMN_NAME, даже если UPDATE не предшествует непосредственно OF COLUMN_NAME.

dbfiddle здесь

Очевидно, что сообщение об ошибке создается исключительно разработчиком SQL, и база данных с радостью принимает его где и когда угодно.

Я узнаю что-нибудь «новое когда-либо» день. : -)

0 голосов
/ 06 июня 2019

Я не вижу требуемого порядка, определенного на синтаксической диаграмме, поэтому я думаю, что вы могли найти ошибку в sqldeveloper.

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