DDL ХП: допускается ли в скрипте точка с запятой после завершающего 'end' ?

Таблоид
Дата: 24.04.2012 12:21:50
hi all.

Допускается ли в скрипте создания хранимой процедуры точка с запятой после завершающего 'end' ?
Вроде как да, и даже две можно. Но только через CR/LF и при условии, что сразу после второй ";" идёт set term:
set term ^;
create or alter procedure p1 returns(x double precision) as
begin
  x=rand()*10000;
  suspend;
end
;
;^set term ;^
commit;
-- компилируется ОК.
А вот так уже обламывается:
set term ^;
create or alter procedure p1 returns(x double precision) as
begin
  x=rand()*10000;
  suspend;
end
;
;/*lorem ipsum dolor sit amet*/^set term ;^
commit;
Statement failed, SQLSTATE = 42000
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 7, column 1
-;


SQL> show version;
ISQL Version: LI-V2.5.2.26448 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version "LI-V2.5.2.26448 Firebird 2.5"
on disk structure version 11.2
Dimitry Sibiryakov
Дата: 24.04.2012 12:47:21

Таблоид
А вот так уже обламывается:

Потому что в отличие от С и Паскаля в PSQL нет "пустого оператора".

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 24.04.2012 13:08:51
Оператора нет, но ";" поставить после 'end' таки можно. И даже две, через cr/lf. Это так и было задумано ?
Dimitry Sibiryakov
Дата: 24.04.2012 13:27:41

Таблоид
Это так и было задумано ?

Точка с запятой игнорируется на конце любого оператора. Две точки с запятой дадут ошибку
вне зависимости от того куда ты их воткнёшь.

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 24.04.2012 14:59:32

Dimitry Sibiryakov> Потому что в отличие от С и Паскаля в PSQL нет "пустого оператора".

Вообще-то есть - пустой составной оператор.

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 24.04.2012 19:12:36
Тогда вопрос.
После натравливания на репликант-базу здоровенного скрипта с хранимками вижу в некоторых из них (не всех!) в редакторе ИБЭ точку с запятой после завершающего 'end'.
Скрипт этот, сгенерённый автоматом, имел особенность: в нём *все* хранимки содержали символ ";" после финального 'end'. А в базе почему-то эта ";" оказалась только у *части* процедур.
Как такое могло случиться ?

ЗЫ. Проверил только что:
SQL> set term ^;
SQL> create or alter procedure p1 returns(x double precision) as
CON> begin
CON> x=rand()*10000;
CON> suspend;
CON> end
CON> ;
CON> ;^set term ;^
SQL> commit;
SQL> set blob all;
SQL> select rdb$procedure_source from rdb$procedures where rdb$procedure_name='P1';

RDB$PROCEDURE_SOURCE
====================
0:3
==============================================================================
RDB$PROCEDURE_SOURCE:
begin
x=rand()*10000;
suspend;
end
==============================================================================
-- т.е. вроде бы ";" никак не должна добавляться в блоб после финишного 'end'.
Гаджимурадов Рустам
Дата: 24.04.2012 19:19:38

Таблоид> Как такое могло случиться ?

Кто-то где-то кому-то врет.

Воспроизводится?

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 24.04.2012 19:25:45
Гаджимурадов Рустам
Воспроизводится?
Пока нет. Буду дальше пробовать.
Гаджимурадов Рустам
Дата: 24.04.2012 19:27:16

Таблоид> Пока нет. Буду дальше пробовать.

Пробуй не с ISQL. Пробуй из своего ПО или из IBE (Script Editor или SQL Editor).

Posted via ActualForum NNTP Server 1.5

Таблоид
Дата: 24.04.2012 19:30:45
Гаджимурадов Рустам
Пробуй не с ISQL.
Э, нееет! эта самая ";" появилась как раз после накатывания на базу скрипта isql'ем.
Но трабла на самом деле нет: просто у одного из моих коллег был установлен ИБЭ от 04-апр-2011, и он не хотел компилять такие ХП. После установки свежего ИБЭ всё прокатило.