powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Стандарты SQL и Файрберд
24 сообщений из 49, страница 2 из 2
Стандарты SQL и Файрберд
    #38587679
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В сложившемся диалекте процедурного языка ФБ присутствует "синтаксический шум", причём его - много.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
set term ^;
create or alter procedure sp(a_id int) returns(name varchar(80), code varchar(20) ) as
  declare [variable] i int;
  declare [variable] s varchar(80);
begin
  i=0;
  for select fio from employee into name
  do begin
     if ( i=0 ) then
     begin
         ... ... ...
     else begin
         ... ... ...
     end
     suspend;
     i = i + 1;
  end
end^

create or alter function fn(a_id int) returns varchar(80) as
  declare [variable] dts timestamp;
begin
   ... ... ...
   return ... ;
end
set term ;^

- легко могло бы читаться и так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
sp( a_id int ) ( name varchar(80), code varchar(20) ) {
  // Селективная процедура: в первой паре скобок - входные параметры, во второй - поля возвращаемого кортежа
  // Комментарии, кстати, тоже можно ввести как везде: две косые палки! 
  // Потому что это не SQL, а его ПРОЦЕДУРНОЕ расширение.
  i int; // никакого declare, и так понятно, что тут объявляется переменная
  s varchar(80);
  i=0;
  // Не надо никакого 'as begin' после раздела объявления переменных! 
  // Да, хорошим стилем считается объявлять всё вверху, но я в упор не понимаю, почему переменную,
  // которая нужна только внутри блока ("{ }"), надо тоже тащить наверх. 
  // Все объявленные переменные всё равно уничтожаются на выходе.
  for select fio from employee into name {
     if i=0 { // не надо скобок вокруг bool-условия: слева от него "if", справа - "{", ну так что тут нельзя понять ?!
         ... ... ...
     } else {
         ... ... ...
     }
     suspend; // оставить! suspend отражает не только передачу клиенту, но и ожидание запроса от него след. кортежа.
     i++; // почему нельзя инкремент сделать как уже 40 лет в Си и 20 в java ?
  }
}

varchar(80) fn(a_id int) { // выходной параметр (единственный) указан слева от имени модуля ==> это - функция
  dts timestamp;
  ... ... ...
  return ... ; // раз функция, значит обязана что-то возвращать. Вот и возвращаем.
}

С языком по-настоящему приятно работать, когда всё можно делать даже не в текстовом редакторе типа notepad, а вообще в подсказке штатной консольной утилиты (isql в случае ФБ).
Но это делается уже без всяких подсказчиков типа IBE, так что тут непременно будут опечатки. А минимизировать их можно только при сокращении необходимости долбёжки пустопорожних слов типа "create or alter" (на котором IBE постоянно норовит затолкать "alter" внутрь скобок :)), declare, begin-end'ов и прочего словесного хлама. Про set term я вообще не говорю.
Синтаксис в стиле c/java вообще можно считать идеальным - он и краток и выразителен.
Но у нас такого никогда не будет, КМК.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587681
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

бобер, выдыхай (с)
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587682
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уууууу, понесло Остапа, понесло...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587684
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> бобер, выдыхай (с)

ага, +1

Мало того, что на стандарты и логику покласть, так
ещё и внутри одного сообщения противоречия есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587685
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrбобер, выдыхай (с)дык только что и выдохнул :-)
сижу вот, жду теперь, когда мутузить начнёте...
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587686
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамМало того, что на стандарты и логику покласть, так
ещё и внутри одного сообщения противоречия есть.Про какие стандарты в процедурных расширениях sql можно говорить, когда де-факто все давно "на своём" говорят ?
И что за противоречия ты на шёл, ткни, плз.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587693
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Про какие стандарты в процедурных расширениях sql можно
Таблоид> говорить, когда де-факто все давно "на своём" говорят ?

Де-факто, стандарт есть, и де-факто, говорят не все на своём,
и свой не у всех и не во всём отличается от стандарта. И уж
совсем точно глупо менять что-то ради чьих-бы то ни было
вкусовых предпочтений.

> И что за противоречия ты на шёл, ткни, плз.

Ну, те же "идеальный синтаксис c/java" (громкий хохот в зале)
и необязательные скобки в if-e, function и пр. Я уж не говорю
про всякие мелочи типа отличающиеся между собой и от
c/java объявления параметров/переменных и т.д.

А скобки вместо begin-end - это да, это святое, без этого никуда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587703
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамДе-факто, стандарт есть, и де-факто, говорят не все на своём,
и свой не у всех и не во всём отличается от стандарта.Посмотри аттаченный скрин с текста SQL-2006: насколько близко к нему стоит ФБ и, например, M$ ? (орацле, кажись, и то ближе... странно даже! :)).

Гаджимурадов РустамНу, те же "идеальный синтаксис c/java" (громкий хохот в зале)А что смешного тут ? Эти два языка позволяют писать КРАТКО, но в то же время не до параноидального уровня, как в Cache', когда хрен разберёшь, чего сам же наваял, если не сидишь в нём постоянно.

Гаджимурадов Рустами необязательные скобки в if-e, functionВ if'e скобки вокруг boolean-условия действительно НЕ обязательны. Я не понимаю, почему парсер не в состоянии определить, где начало этого условия (т.е. сам "if") и где оно заканчивается ("begin" или "{"). И не случайно во многих IDE когда пишешь этот самый if, среда сразу же выставляет пару "(" ... ")".

Гаджимурадов РустамА скобки вместо begin-end - это да, это святое, без этого никуда.Это проклятый пережиток царизма паскаля. С ним надо бороться до победы! :-)
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587713
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

не знаю, почему, но на твой текст мне вспомнился язык MUMPS/ДИАМС (свят-свят)
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587720
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvне знаю, почему, но на твой текст мне вспомнился язык MUMPS/ДИАМС (свят-свят)К излишней краткости (в COS почти все команды сокращены до 1-2 символов, вроде) привыкаешь быстро. А вот к необходимости всё время выправлять очепятки при наборе текста привыкнуть нельзя. Для тех, кто на каждый чих запускает IBE, это не актуально, разумеется. Но таки есть еще странные персонажи (типа мну), кто запускает IBE только когда долбать надо действительно много и долго.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидК излишней краткости (в COS почти все команды сокращены до 1-2 символов,
вроде) привыкаешь быстро.
А сколько адреналина-то когда вместо какого-нибудь "df" на автомате набираешь "rf"... И
столько радости, что не "rm"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587728
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА сколько адреналина-то когда вместо какого-нибудь "df" на автомате набираешь "rf"... И столько радости, что не "rm"...Это ты про команды операционки говоришь. Не будем отвлекаться от основной темы топега - выразительности и краткости процедурного диалекта ФБ...
PS. Кстати, я месяца два взад набрал rm -f, думая, что сижу в папке с ненужными логами. А оказалось, что сидел в каталоге со своими драгоценными скриптами. В итоге, "откатился" взад примерно на 2-3 недели, когда бекап их делал. "Сам себе дурак" - сказал я, и стал делать бекапы раз в 3-4 дня. Так что это быстро лечится, достаточно одной "процедуры"
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587736
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

А я думал, что основная тема топика - ембеддед тройки


Ну я, конечно, знал, что линуксоид ты не так чтобы очень, но чтобы бекапами не обезопаситься...

Поставь себе какой-нибудь git или svn и потрать час на первоначальную настройку. Да даже день - все равно сторицей окупится. Даже без навороченных хуков и прочего - тупо git commit/svn commit в крон ещечасно - и потом хоть об-«rm -rf»-ся
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587763
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
set term ^;
create or alter procedure sp(a_id int) returns(name varchar(80), code varchar(20) ) as
  declare [variable] i int;
  declare [variable] s varchar(80);
begin
  i=0;
  for select fio from employee into name
  do begin
     if ( i=0 ) then
     begin
         ... ... ...
     else begin
         ... ... ...
     end
     suspend;
     i = i + 1;
  end
end^

create or alter function fn(a_id int) returns varchar(80) as
  declare [variable] dts timestamp;
begin
   ... ... ...
   return ... ;
end
set term ;^
- легко могло бы читаться и так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
sp( a_id int ) ( name varchar(80), code varchar(20) ) {
  // Селективная процедура: в первой паре скобок - входные параметры, во второй - поля возвращаемого кортежа
  // Комментарии, кстати, тоже можно ввести как везде: две косые палки! 
  // Потому что это не SQL, а его ПРОЦЕДУРНОЕ расширение.
  i int; // никакого declare, и так понятно, что тут объявляется переменная
  s varchar(80);
  i=0;
  // Не надо никакого 'as begin' после раздела объявления переменных! 
  // Да, хорошим стилем считается объявлять всё вверху, но я в упор не понимаю, почему переменную,
  // которая нужна только внутри блока ("{ }"), надо тоже тащить наверх. 
  // Все объявленные переменные всё равно уничтожаются на выходе.
  for select fio from employee into name {
     if i=0 { // не надо скобок вокруг bool-условия: слева от него "if", справа - "{", ну так что тут нельзя понять ?!
         ... ... ...
     } else {
         ... ... ...
     }
     suspend; // оставить! suspend отражает не только передачу клиенту, но и ожидание запроса от него след. кортежа.
     i++; // почему нельзя инкремент сделать как уже 40 лет в Си и 20 в java ?
  }
}

varchar(80) fn(a_id int) { // выходной параметр (единственный) указан слева от имени модуля ==> это - функция
  dts timestamp;
  ... ... ...
  return ... ; // раз функция, значит обязана что-то возвращать. Вот и возвращаем.
}

или так :)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
// set term ^; - не нужен
function sp(a_id: int): dataset(name: varchar(80); code: varchar(20));
var
  i: int;
  s: varchar(80);
begin
  i := 0;
  for 
    select fio from employee into name 
  do 
  begin
    if i = 0 then
    begin
         ... ... ...
    end
    else 
    begin
         ... ... ...
    end;
    suspend;
    i := i + 1;
  end;
end;

function fn(a_id: int): varchar(80);
var
  dts: timestamp;
begin
   ... ... ...
   return ... ; // or Result := ... - without exit
end;
// set term ;^ - не нужен


причем ещё было бы неплохо написать что-нибудь типа:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
type
  TNameCodeDataSet = dataset(name: varchar(80); code: varchar(20)); 

function sp1(id: int): TNameCodeDataSet;
begin
  for 
    select fio, code from employee 
    where id > :id
    into result.name, result.code 
  do 
    suspend;
end;

function sp2(id1, id2: int): TNameCodeDataSet;
begin
  for 
    select fio, code from employee 
    where id between :id1 and :id2
    into result.name, result.code 
  do 
    suspend;
end;

function ProcessIt(Ds: TNameCodeDataset): int;
begin
  Result := 0;

  for select * from Ds do
  begin
    if Ds.Name contains '.' then
    begin
      insert into processed (code, name) values (Ds.Code, Ds.Name); 
      Result := Result + 1;
    end;
  end;
end;

execute block(A, B: int): int;
begin
  if A > B then
    Result := ProcessIt(sp1(A))
  else
    Result := ProcessIt(sp2(A, B));
end;



Эхх... :)
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587808
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо фигнёй маятся.
Я понимаю если бы вы придумывали расширения PSQL, но переделывать синтаксис смысла нет. Из расширений я подумывал над такими

Код: sql
1.
select * from some_procedure (param1 := :param_value1, param3 := :param_value2) 

CORE-4152

объектные типы, ROWTYPE и коллекции, а также чтобы можно было писать

Код: plsql
1.
2.
3.
4.
5.
6.
FOR(C IN (SELECT A, B FROM T)) DO
BEGIN
  UPDATE T2
  SET T2.A = C.A
  WHERE T2.B = C.B;
END



ещё раз повторю хотеть есть смысл расширений синтаксиса, а не полную его переделку
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587829
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса также чтобы можно было писать

Код: plsql
1.
2.
3.
4.
5.
6.
FOR(C IN (SELECT A, B FROM T)) DO
BEGIN
  UPDATE T2
  SET T2.A = C.A
  WHERE T2.B = C.B;
END



к слову, вот это у меня лежит сделанным, только в более "нашем" синтаксисе:

Код: plsql
1.
2.
3.
4.
for select A, B from T as cursor C -- нет INTO-кляузы
do begin
  update T2 set A = C.A where B = C.B;
end



есть какие-либо конструктивные возражения на этот счет?

вот только я пока не вижу, как это изящно прикрутить к PSQL-курсорам. Смущает глобальность имени курсора, т.е. ссылки на него, во-первых, будут гадить в пространство имен в пределах всей процедуры (случайно написал запрос с алиасом таблицы C, а тебе вернулись данные курсора C - сюрприз! или напрочь запрещать использовать C как имя или алиас таблицы в процедуре?), а во-вторых, придется на каждую ссылку проверять состояние курсора (чтобы ему ненароком CLOSE не успели сделать между FETCH и обращением к полям C).
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38587849
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrесть какие-либо конструктивные возражения на этот счет?
так тоже пойдёт

dimitrво-первых, будут гадить в пространство имен в пределах всей процедуры (случайно написал запрос с алиасом таблицы C, а тебе вернулись данные курсора C - сюрприз! или напрочь запрещать использовать C как имя или алиас таблицы в процедуре?)
можно разыменовывать курсор как это сделано для переменных

Код: plsql
1.
2.
3.
....
  update T2 set A = :C.A where B = :C.B;
....



dimitrа во-вторых, придется на каждую ссылку проверять состояние курсора (чтобы ему ненароком CLOSE не успели сделать между FETCH и обращением к полям C).

ну тут ничего не поделаешь, единственное что его можно проверять на каждый оператор где используется хоть одна ссылка на курсор, т.е. в приведённом выше примере для UPDATE достаточно проверить 1 раз для каждый итерации, а не по количеству этих ссылок внутри UPDATE
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588439
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНе будем отвлекаться от основной темы топега - выразительности и краткости процедурного диалекта ФБ...
Никто не мешает писать прямо на BLR.
Никакого синтаксического сахара, всё кратко, чёткая структура.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588452
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

нет уж, боже упаси. Хотя Таблоид может
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588476
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВ сложившемся диалекте процедурного языка ФБ присутствует "синтаксический шум", причём его - много.
Возможно "проблему" смягчит подключение внешних языков в новой версии?
Хочется чистоты и лаконичности - Python именно такой.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588646
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmТаблоидВ сложившемся диалекте процедурного языка ФБ присутствует "синтаксический шум", причём его - много.
Возможно "проблему" смягчит подключение внешних языков в новой версии?
Типа делаем что-то типа isc_dsql_execute2 (с указанием диалекта N), и серверный плагин для этого языка парсит это (+переводит в BLR), и отдаёт на выполнение ядру? :)
Такое уже можно в тройке?

Вообще что-то пока нет глубокого понимания, что можно и что нельзя перехватывать (переопределять) с помощью механизма плагинов, куда можно вклиниваться.
Как бы нам эту тему раскрыть... :)
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588659
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

так в RN перечислены все типы плагинов и что какой из них может
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38588865
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

BLR тут не причём. Это UDR. Как вариант языка отличного от C++ - Java, которую мне так и не удалось заставить работать на специальной сборке. Я так понимаю реализация этих механизмов ещё не финал. Вопрос к отцам, но помнится от себя обещали лишь UDR (C++) и возможно Java. Delphi и прочие шалости - сторонние разработчики. С точки зрения сервера программа на внешнем языке выглядит как UDR dll. По сути обёртка. Могу быть неправ.
...
Рейтинг: 0 / 0
Стандарты SQL и Файрберд
    #38592534
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассуждения про эксперт выкусил в отдельный топик
Шаблоны в IBExpert
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Стандарты SQL и Файрберд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]