Задать вопрос
@Airslip

Почему появляется ошибка Invalid token. Dynamic SQL Error. SQL error code = -104?

Помогите, я не хочу умирать.
Есть скрипт, при выполнении которого в IBExpert выдаёт ошибки. Помогите поправить скрипт, мой уровень знаний sql почти нулевой.
------------------------------
-- 1. добавить поле - идентификатор RFID метки.
-- домена R_VARCHAR255 точно будет достаточно
ALTER TABLE SITE
ADD RFID R_VARCHAR255;
-- 1.1. Уникальный индекс для RFID
CREATE UNIQUE INDEX SITE_IDX_RFID ON SITE (RFID);

------------------------------
-- 2. Справочник - тип складской техники
CREATE TABLE EQUIPAUTO_TYPE (
    EQUIPATID R_ID NOT NULL,
    CODE R_CODE NOT NULL,
    NAME R_NAME NOT NULL,
    LASTDATE r_datetime);

ALTER TABLE EQUIPAUTO_TYPE
ADD CONSTRAINT PK_EQUIPATID
PRIMARY KEY (EQUIPATID);
---------------
-- Генератор ID
CREATE GENERATOR GEN_EQUIPAUTO_TYPE_ID;
---------------
-- Триггер заполения ID
SET TERM ^ ;
/* Trigger: T_BIEQUIPAUTO_TYPE_BASIC */
CREATE OR ALTER TRIGGER T_BIEQUIPAUTO_TYPE_BASIC FOR EQUIPAUTO_TYPE
ACTIVE BEFORE INSERT POSITION 0
AS
  DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (NEW.EQUIPATID IS NULL) THEN
    NEW.EQUIPATID = GEN_ID(GEN_EQUIPAUTO_TYPE_ID,1);
  ELSE BEGIN
    ID = GEN_ID(GEN_EQUIPAUTO_TYPE_ID,0);
    IF (NEW.EQUIPATID > ID) THEN
      ID = GEN_ID(GEN_EQUIPAUTO_TYPE_ID, NEW.EQUIPATID - ID);
  END
/*  EXECUTE PROCEDURE R_VerifyUserSession NEW.SessionID
  RETURNING_VALUES NEW.SessionID; */
  NEW.LastDate = 'NOW';
END^

/* Trigger: T_BUEQUIPAUTO_TYPE_BASIC */
CREATE OR ALTER TRIGGER T_BUEQUIPAUTO_TYPE_BASIC FOR EQUIPAUTO_TYPE
ACTIVE BEFORE UPDATE POSITION 0
AS
  DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (NEW.EQUIPATID IS NULL) THEN
    NEW.EQUIPATID = OLD.EQUIPATID;
  ELSE
    IF (NEW.EQUIPATID <> OLD.EQUIPATID) THEN BEGIN
      ID = GEN_ID(GEN_EQUIPAUTO_TYPE_ID,0);
      IF (NEW.EQUIPATID > ID) THEN
        ID = GEN_ID(GEN_EQUIPAUTO_TYPE_ID, NEW.EQUIPATID - ID);
    END
 /* EXECUTE PROCEDURE R_VerifyUserSession NEW.SessionID
  RETURNING_VALUES NEW.SessionID; */
  NEW.LastDate = 'NOW';
END^

/* Trigger: T_BUEQUIPAUTO_TYPE_CHKCODECNG */
CREATE OR ALTER trigger T_BUEQUIPAUTO_TYPE_CHKCODECNG for equipauto_type
active before update position 0
AS
begin
  if (new.code <> old.code) then
    exception exc_k_common 'Запрещено изменения кода складской техники';
end^

/* INDEXES */
CREATE UNIQUE INDEX EQUIPAUTO_TYPE_IDX_CODE
ON EQUIPAUTO_TYPE (CODE)

SET TERM ; ^

------------------------------
-- 3. Справочник - складская техника
CREATE TABLE EQUIPAUTO (
    EQUIPAID R_ID NOT NULL,
    EQUIPATID R_ID NOT NULL,
    NAME R_NAME NOT NULL,
    BARCODE R_BARCODE, -- ШК генерировать в зависимости от ID? см. K_AUTO_GEN_BARCODE. Формат: EA0000000.
    STATUS r_status,
    LASTDATE r_datetime,
    RFIDREADER R_VARCHAR255); -- откуда брать id считывателя RFID

ALTER TABLE EQUIPAUTO
ADD CONSTRAINT PK_EQUIPAUTO
PRIMARY KEY (EQUIPAID);

ALTER TABLE EQUIPAUTO
ADD CONSTRAINT FK_EQUIPAUTO__EQUIPATID
FOREIGN KEY (EQUIPATID)
REFERENCES EQUIPAUTO_TYPE(EQUIPATID)
ON DELETE CASCADE
ON UPDATE CASCADE;
---------------
-- Генератор ID
CREATE GENERATOR GEN_EQUIPAUTO_ID;
---------------
-- Добавление префикса для складской техники
INSERT INTO WM_PREFIX (TABLENAME, FIELDNAME, SELECTSQL, USERMESS, PREFIX, USERCODE, SITESPICIESID, KSELECTSQL)
               VALUES ('EQUIPAUTO', 'BARCODE', NULL, 'Складская техника', 'EA', 'EQUIPAUTO', NULL,
               'SELECT first(1) cast(ea.EQUIPAID as double precision) FROM EQUIPAUTO ea WHERE ea.barcode=''%s''');
COMMIT WORK;

SET TERM ^ ;
---------------
-- Процедура генерации ШК техники
create or alter procedure K_EQUIPAUTO_GEN_BARCODE
returns (
    BARCODE type of R_BARCODE)
as
declare variable PREFIX type of R_SHORTNAME;
declare variable FLAG type of R_FLAG;
begin
  select p.prefix
    from wm_prefix p
   where p.tablename = 'EQUIPAUTO'
    into :prefix;

  flag = 'F';
  while (:flag <> 'T') do
  begin
    --Генерируем новый ШК
    select :prefix || padleft(cast(cast(trunc(rand() * 9999999) as integer) + 1 as varchar(7)), 7, '0')
      from rdb$database
      into :barcode;
    --Проверяем уникальность
    if (not exists(select ea.EQUIPAID
                     from equipauto ea
                    where ea.barcode = :barcode)) then
      flag = 'T';
  end
  suspend;
end^

---------------
-- Триггер заполения ID и Barcode
/* Trigger: t_biequipauto_basic */
CREATE OR ALTER trigger t_biequipauto_basic for equipauto
active before insert position 0
AS
  DECLARE VARIABLE ID INTEGER;
  DECLARE VARIABLE barcode R_BARCODE;
BEGIN
  IF (NEW.EQUIPAID IS NULL) THEN
    NEW.EQUIPAID = GEN_ID(GEN_EQUIPAUTO_ID,1);
  ELSE BEGIN
    ID = GEN_ID(GEN_EQUIPAUTO_ID,0);
    IF (NEW.EQUIPAID > ID) THEN
      ID = GEN_ID(GEN_EQUIPAUTO_ID, NEW.EQUIPAID - ID);
  END

  if (new.status is null) then
    new.status = '1';
  if (new.barcode is null) then
  begin
    execute procedure K_EQUIPAUTO_GEN_BARCODE
        returning_values :barcode;
    new.barcode = :barcode;
  end

 /* EXECUTE PROCEDURE R_VerifyUserSession NEW.SessionID
  RETURNING_VALUES NEW.SessionID; */
  NEW.LastDate = 'NOW';
END^

/* Trigger: T_BUEQUIPAUTO_BASIC */
CREATE OR ALTER TRIGGER T_BUEQUIPAUTO_BASIC FOR EQUIPAUTO
ACTIVE BEFORE UPDATE POSITION 0
AS
  DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (NEW.EQUIPAID IS NULL) THEN
    NEW.EQUIPAID = OLD.EQUIPAID;
  ELSE
    IF (NEW.EQUIPAID <> OLD.EQUIPAID) THEN BEGIN
      ID = GEN_ID(GEN_EQUIPAUTO_ID,0);
      IF (NEW.EQUIPAID > ID) THEN
        ID = GEN_ID(GEN_EQUIPAUTO_ID, NEW.EQUIPAID - ID);
    END
/*  EXECUTE PROCEDURE R_VerifyUserSession NEW.SessionID
  RETURNING_VALUES NEW.SessionID; */
  NEW.LastDate = 'NOW';
END^

/* INDEXES */
CREATE UNIQUE INDEX EQUIPAUTO_IDX_RFIDREADER ON equipauto (RFIDREADER);

SET TERM ; ^

5a8d6a643a8ce940456182.png
  • Вопрос задан
  • 1341 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы