Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Приветствую знатоков FB.
Переписываю серверную часть с MS SQL на FB. Подскажите, где можно найти хорошие примеры с курсорами (явными и неявными). А то у меня триггер в пять строк, но как я не извращался с for...select...do, переменными и двоеточием (":"), так и не смог его создать.
10 апр 19, 13:32    [21858262]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

триггеры в MS SQL совершенно не годятся для Firebird, ибо в MS они FOR EACH STATEMENT, а в Firebird — FOR EACH ROW. Надо полностью пересматривать логику.

А по синтаксису всё можно найти в этом документе Firebird_3_0_Language_Reference_RUS.pdf
10 апр 19, 13:36    [21858266]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, Да этим руководствуюсь. Примеры оттуда беру, но все равно получаю ошибки. В MS объявил переменную и работаю с ней, как хочу; здесь - без двоеточия, с ним.

Вот скрипт в MS SQL - при добавлении записи в таблице User_Info из таблицы Prog_MenuItem берутся все записи и заносятся в табличку связи Link_UserMenuItem (По-русски: при добавлении пользователя на него автоматом вешаются настроечные пункты меню)
create trigger T_User_Info_I1
on User_Info for insert
as
  declare @ID_MenuItem int, @ID_User int
  declare curUser cursor for
    Select ID_User
    From Inserted
  open curUser
  fetch curUser into @ID_User
  while @@FETCH_STATUS = 0
    begin
      declare curMI cursor for
        Select ID_MenuItem
        From Prog_MenuItem
      open curMI
      fetch curMI into @ID_MenuItem
      while @@FETCH_STATUS = 0
        begin
          if not exists(Select * From Link_UserMenuItem Where ID_User = @ID_User and ID_MenuItem = @ID_MenuItem)
            insert into Link_UserMenuItem(ID_User, ID_MenuItem) values (@ID_User, @ID_MenuItem)
          fetch curMI into @ID_MenuItem
        end
      close curMI
      deallocate curMI
      fetch curUser into @ID_User
    end
  close curUser
  deallocate curUser
go 


Вот переработка для FB.

create trigger T_User_Info_I1 for User_Info 
active after insert
as
  --  переменная
  declare vID_MenuItem int;
  --  аналог курсора
  begin
  for Select ID_MenuItem From Prog_MenuItem into :vID_MenuItem do
    begin
      --  проверяем есть ли такая запись
      if (not exists(Select * From Link_UserMenuItem Where ID_User = new.ID_User and ID_MenuItem = :vID_MenuItem)) then
        --  заносим
        insert into Link_UserMenuItem(ID_User, ID_MenuItem) values (new.ID_User, :vID_MenuItem)
    end
  end;


Что здесь не так, понять не могу.
10 апр 19, 20:46    [21858792]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

очевидно что ты не там выполняешь сей запрос. Если пользуешься IB Expert, то выполнять надо в редакторе скриптов.
Если в ISQL то прочитай про переключения терминатора с помощью команды SET TERM
10 апр 19, 20:58    [21858797]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, IBExpert у меня вообще не работает - вот выдает ошибку при подключении к базе FB (после регистрации)

Error Message:
----------------------------------------
can't format message 13:96 -- message file c:\Program Files\Embarcadero\InterBase/interbase.msg not found.
unavailable database.

[00544E97] FIB.IBError (Line 558, "FIB.pas" + 55) + $2
[00540253] FIBDatabase.TFIBDatabase.Open (Line 1115, "FIBDatabase.pas" + 69) + $9
[005181EF] pFIBDatabase.TpFIBDatabase.Open (Line 279, "pFIBDatabase.pas" + 9) + $2
[0054054D] FIBDatabase.TFIBDatabase.SetConnected (Line 1185, "FIBDatabase.pas" + 4) + $4
[010DF082] IBEDatabases.TIBEDatabase.Connect (Line 3223, "IBEDatabases.pas" + 2) + $10
[01068CEA] InspectorFm.TInspectorFrame.OpenDatabase (Line 3347, "Frames\InspectorFm.pas" + 44) + $D
[01063AFA] InspectorFm.TInspectorFrame.ObjectsTLDblClick (Line 1314, "Frames\InspectorFm.pas" + 11) + $A
[004555C5] Controls.TControl.DoMouseDown (Line 4306, "Controls.pas" + 2) + $21
[00455681] Controls.TControl.WMLButtonDblClk (Line 4331, "Controls.pas" + 5) + $C
[00444388] Forms.StdWndProc (Line 1459, "Forms.pas" + 8) + $0
[0044DB97] Forms.TApplication.ProcessMessage (Line 6630, "Forms.pas" + 13) + $1
[011251BE] IBExpert.IBExpert (Line 935, "D:\Projects_5\IBExpert\IBExpert.dpr" + 147) + $7

================================================================================
Пользуюсь SQL Manager Lite for InterBase & Firebird.
10 апр 19, 21:20    [21858811]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

для начала узнай чем ты именно пользуешься Firebird или Interbase. И если Firebird. то неплохо бы озвучить версию. В IB Expert путь к клиенту можно указывать отдельно для каждой зарегистрированной базы. Надо указывать родной клиента. Очевидно, что у тебя что-то там ищется интербейсовское.
10 апр 19, 21:23    [21858814]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
ёёёёё
Member

Откуда:
Сообщений: 404
WellSlava
Симонов Денис, IBExpert у меня вообще не работает - вот выдает ошибку при подключении к базе FB (после регистрации)

Error Message:
----------------------------------------
can't format message 13:96 -- message file c:\Program Files\Embarcadero\InterBase/interbase.msg not found.
unavailable database.

[00544E97] FIB.IBError (Line 558, "FIB.pas" + 55) + $2
[00540253] FIBDatabase.TFIBDatabase.Open (Line 1115, "FIBDatabase.pas" + 69) + $9
[005181EF] pFIBDatabase.TpFIBDatabase.Open (Line 279, "pFIBDatabase.pas" + 9) + $2...
...


Вот само сообщение: unavailable database.

Покажи, как подключаешься.
10 апр 19, 21:27    [21858817]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
ёёёёё
WellSlava
Симонов Денис, IBExpert у меня вообще не работает - вот выдает ошибку при подключении к базе FB (после регистрации)

Error Message:
----------------------------------------
can't format message 13:96 -- message file c:\Program Files\Embarcadero\InterBase/interbase.msg not found.
unavailable database.

[00544E97] FIB.IBError (Line 558, "FIB.pas" + 55) + $2
[00540253] FIBDatabase.TFIBDatabase.Open (Line 1115, "FIBDatabase.pas" + 69) + $9
[005181EF] pFIBDatabase.TpFIBDatabase.Open (Line 279, "pFIBDatabase.pas" + 9) + $2...
...


Вот само сообщение: unavailable database.

Покажи, как подключаешься.


Оно то понятно, но какого хрена IDExpert лезет сюда: "c:\Program Files\Embarcadero\InterBase/interbase.msg not found". У меня IB нет на компе. Подключаюсь двойным щелчком мыши в окне, где отображаются базы данных.
10 апр 19, 22:08    [21858822]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

потому что в качестве клиента надо было выбирать fbclient.dll от правильной версии сервера, а не оставлять gds32.dll по умолчанию, который подхватывается от установленного interbase или Delphi
10 апр 19, 22:15    [21858824]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
ёёёёё
Member

Откуда:
Сообщений: 404
WellSlava
ёёёёё
пропущено...


Вот само сообщение: unavailable database.

Покажи, как подключаешься.


Оно то понятно, но какого хрена IDExpert лезет сюда: "c:\Program Files\Embarcadero\InterBase/interbase.msg not found". У меня IB нет на компе. Подключаюсь двойным щелчком мыши в окне, где отображаются базы данных.


Покажи окошко, где регистрационная информация для данной конкретной базы.
10 апр 19, 22:45    [21858832]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, Благодарю. Я, в принципе, и думал, что связано с этим, но только предполагал, что выбрав в настройках FB 3.0, программа сама выберет нужный файл или сделает запрос.
11 апр 19, 12:36    [21859228]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

откуда IB Expert это должен узнать. В системе можно хотя 10 разных или одинаковых версий Firebird поставить. Есть библиотека зарегистрированная глобально, вот она и берётся. Исторически сложилось что по умолчанию в эксперте в качестве клиента выставлено gds32.dll. Никто не мешает fbclient.dll зарегистрировать как gds32.dll
11 апр 19, 12:41    [21859243]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, Да я просто рассуждаю, как бы сам делал. Но скрипт из IB тоже выдает ошибку. Буду сейчас здесь менять синтаксис .
11 апр 19, 12:53    [21859277]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

ошибка обычно всякие буковки содержит, они часто подсказывают в чём дело
11 апр 19, 13:16    [21859333]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, В данном случае выдает ошибку

This operation is not defined for system tables.
unsuccessful metadata update.
CREATE TRIGGER T_USER_INFO_I1 failed.
no permission for ALTER access to TABLE USER_INFO.
Транзакция откачена... (0 ms)

Не могу понять каких прав нет? Вхожу под sysdba.

И, кстати, почему после перезагрузки IBExpert снова ищет IB? В настройках выставил по-умолчанию fbclient.dll
11 апр 19, 13:37    [21859375]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
WellSlava,

уверен? Что даёт

select
  *
from sec$users
where sec$user_name = current_user


Какой user_management используется? Маппигом не баловался?
11 апр 19, 13:46    [21859395]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
WellSlava
Member

Откуда:
Сообщений: 205
Симонов Денис, Благодарю за ответы.
С синтаксисом разобрался. Пользуюсь SQL Manager Lite for InterBase & Firebird - на мой взгляд он качественней IBExpert.
11 апр 19, 14:13    [21859466]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28015
WellSlava
И, кстати, почему после перезагрузки IBExpert снова ищет IB? В настройках выставил по-умолчанию fbclient.dll

хочешь работать с ИБ и ФБ - удали из системных путей gds32.dll и fbclient.dll.
В IbExpert всегда указывай конкретный путь и конкретную библиотеку, а не просто имя fbclient.dll, которого в PATH может не оказаться.
Хочешь чтобы fbclient был в системном пути - сделай instclient i f.
Хочешь, чтобы gds32.dll из fbclient был в системном пути - сделай instclient i g

если что непонятно - читай http://www.ibase.ru/inst_manual/
11 апр 19, 14:17    [21859476]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30037

11.04.2019 14:13, WellSlava пишет:
> Пользуюсь SQL Manager Lite for InterBase & Firebird

нет такого.
https://www.sqlmanager.net/ru/products/ibfb/manager

Posted via ActualForum NNTP Server 1.5

11 апр 19, 14:19    [21859480]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
Мимопроходящий,

есть, они переименовали в EMS SQL Manager for InterBase/Firebird Freeware
11 апр 19, 14:33    [21859507]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9634
Мимопроходящий,

https://www.sqlmanager.net/ru/products/ibfb/manager/matrix
11 апр 19, 14:35    [21859511]     Ответить | Цитировать Сообщить модератору
 Re: Циклы в FireBird  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30037

offtop:
у них не сайт, а помойка.
за качество продуктов не скажу, не касался.

Posted via ActualForum NNTP Server 1.5

11 апр 19, 14:47    [21859527]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить