Помогите, я не хочу умирать.
Есть скрипт, при выполнении которого в 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 ; ^