Синтаксическая диаграмма Oracle для блоков PL / SQL неверна? - PullRequest
4 голосов
/ 24 августа 2011

Я подозреваю, что синтаксическая диаграмма для plsql_block, указанная в Oracle® Database PL / SQL Language Reference для Relese 2, неверна.(Для справки: вот текущая ссылка на этот документ)

Следующий фрагмент PL / SQL компилируется нормально:

declare

  cursor 
    cursor_definition 
  is select * from dual;

  variable_declaration number;

begin
  null;
end;

Следующие утверждения являются предположениями, которые яmake основан на приведенном выше фрагменте PL / SQL и основан на синтаксической диаграмме Oracle.

  1. Раздел объявлений (выше) состоит из cursor definition, за которым следует variable declaration (который вход item declaration).

  2. item declaration может только быть элементом item list 1.

  3. A cursor definition может только быть элементом item list 2.

  4. За item list 2 никогда не может следовать item list 1.

Теперь variable declaration после cursor definition противоречит точке 4 .Поэтому я делаю вывод, что синтаксическая диаграмма неверна.

Может быть, я что-то упускаю, и в этом случае я был бы очень благодарен за то, что указал мне на это.

Пожалуйста, поймите, что неправильная синтаксическая диаграмма сама по себе не имеет большого значения для меня.Но я нахожусь в процессе написания синтаксического анализатора PL / SQL, и синтаксический анализатор сталкивается с точной ситуацией, приведенной в примере кода PL / SQL.Итак, чтобы улучшить парсер, я хотел бы иметь более авторитетную диаграмму последовательности.

1 Ответ

4 голосов
/ 24 августа 2011

Я согласен. Синтаксические диаграммы явно заявляют, что 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: -)

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