Базы данных Oracle - статьи



             

Имена объектов, ключевые и зарезервированные слова - часть 2


1 row updated.

Беда в том, что точно та же команда UPDATE, равно как и любая другая, обращающаяся к столбцу "NUMBER", не работает в PL/SQL:

SQL> BEGIN UPDATE t SET "NUMBER" = "NUMBER"; END; 2 / BEGIN UPDATE t SET "NUMBER" = "NUMBER"; END; * ERROR at line 1: ORA-06550: line 1, column 53: PL/SQL: ORA-06552: PL/SQL: Compilation unit
analysis terminated ORA-06553: PLS-320: the declaration of the type
of this expression is incomplete or malformed ORA-06550: line 1, column 25: PL/SQL: SQL Statement ignored

Это и вызвало недоумение автора вопроса в форум. В Oracle уверяют, что начиная с версии 9 (которая помогала готовить эту статью) обработка запросов в SQL и в PL/SQL ведется одним и тем же модулем СУБД. И тем не менее факт налицо: SQL терпит обращение к полю "NUMBER", а PL/SQL - нет.

Заинтересовавшись, после серии экспериментов я нащупал очередную уступку Oracle, позволившую достичь компромисса, но сообщить найденное решение автору вопроса уже не смог, так как sql.ru оказался для меня слишком сложно устроен: он не только требует регистрации (а придуманные себе кличку и пароль я назавтра же забыл), но и содержит чересчур много "нитей", среди которых "свою" я безнадежно потерял.

Вот что выяснилось: PL/SQL начинает все обрабатывать правильно, как только в названии столбца появляется хотя бы одна малая буква, например, не "NUMBER", а "NuMBER". Лучше, конечно, "number". Возникает вопрос: в чем причина такого странного поведения ?

Переписка с разработчиками PL/SQL несколько прояснила ситуацию. Можно посочувствовать: им приходится расплачиваться по счетам самой логики жизни. В любом языке есть множество зарезервированных слов, которые нельзя использовать для имен объектов. В Oracle первую очередь это ключевые слова: BEGIN, SELECT и другие. Заметьте кстати, что множества зарезервированных слов Oracle в SQL и PL/SQL не совпадают:

SQL> CREATE TABLE t1 (begin NUMBER);




Содержание  Назад  Вперед