Я согласен. Синтаксические диаграммы явно заявляют, что plsql_block
фактически item_list_2
предшествует необязательный item_list_1
.
Кроме того, курсор определения (с битом is
) может встречаться только в item_list_2
, а объявления переменных (с =
или без *) являются частью набора item_declaration
и могут поэтому быть только в item_list_1
.
Эти факты делают ваш пример кода некорректным, поэтому, если ему удастся скомпилировать, то либо:
- синтаксические диаграммы неверны; или
- компилятор не следует за ними до буквы; или
- ваш взгляд на код, охватываемый различными синтаксическими диаграммами.
Что касается последнего пункта, достаточно интересно, что синтаксические диаграммы для 11.1 немного отличаются.
Раздел объявления может быть item_list_1
или item_list_2
или item_list_1
, за которым следует item_list_2
.
Интересно, что item_list_1
может иметь любое количество item_declaration
записей, включая variable_declaration
и cursor_declaration
.
В 11.1 cursor_declaration
может быть либо объявлением , либо определением, основанным на элементах языка в 11.2 (другими словами, нет типа cursor_definition
, так как объявление допускает оба в декларации).
То, что у вас есть, совершенно верно в 11.1, поэтому первое, что я проверю, это то, что вы на самом деле запускаете 11.2, где происходит эта успешная компиляция.
Конечно, все еще возможно, что вы используете 11.2 и синтаксические диаграммы неверны, и в этом случае вы должны горько жаловаться на Oracle, но я не знаю, какой ответ вы получите от компании, флагман которой продукт базы данных не может определить разницу между пустым varchar
и NULL (a) .
(a) Я никогда не упущу возможность упомянуть об этом и изложу причину моей любимой DB2: -)