FireBird 2.1.
Есть такая таблица
Код: Выделить всё
CREATE TABLE CLIENTS (
CLIENTID CHAR(10) NOT NULL,
BORNDATE DATE,
TEXTCODE CHAR(4),
SEX INTEGER,
REGIONID INTEGER NOT NULL
)
Код: Выделить всё
CREATE OR ALTER TRIGGER CLIENTS_BI0 FOR CLIENTS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE Fday SMALLINT;
DECLARE VARIABLE FTxtDay CHAR(2);
DECLARE VARIABLE FTxtMonth CHAR(2);
DECLARE VARIABLE FMonth SMALLINT;
DECLARE VARIABLE FPrefix CHAR(3);
BEGIN
IF (NEW.CLIENTID IS NULL)
THEN BEGIN
IF ((NOT(NEW.BORNDATE IS NULL))AND(NOT(NEW.TEXTCODE IS NULL)))
THEN BEGIN
FDay = EXTRACT(DAY FROM NEW.BORNDATE);
FMonth = EXTRACT(MONTH FROM NEW.BORNDATE);
IF (fday < 10)
THEN FTxtDay = '0' || CAST(Fday AS CHARACTER);
ELSE FTxtDay = CAST(Fday AS CHARACTER);
IF (FMonth < 10)
THEN FTxtMonth = '0' || CAST(FMonth AS CHARACTER);
ELSE FTxtMonth = CAST(FMonth AS CHARACTER);
NEW.CLIENTID = UPPER(NEW.TEXTCODE) || FTxtDay || FTxtMonth || SUBSTRING(EXTRACT(YEAR FROM NEW.BORNDATE) FROM 3);
END
ELSE BEGIN
IF ((NEW.REGIONID IS NULL)OR(NEW.REGIONID = 0))
THEN FPrefix = '';
ELSE BEGIN
IF (NEW.REGIONID < 10)
THEN FPrefix = '00';
ELSE IF (NEW.REGIONID < 100)
THEN FPrefix = '0';
ELSE FPrefix = '';
END
NEW.CLIENTID = FPrefix || (CAST(NEW.REGIONID AS CHARACTER))|| CAST(GEN_ID(gen_clientid, 1) AS CHARACTER);
END
END
NEW.TEXTCODE = UPPER(NEW.TEXTCODE);
END
1. для клиента указывается специальный текстовый код (четыре символа) + дата рождения и из них делается уникальный идентификатор (придумал не я...);
2. Если нет текстового кода или нет даты рождения, тогда уникальный идентификатор формируется следующим образом: Поле REGIONID в текстовом представлении + Значение генератора gen_clientid.
Триггер добавляется, но при попытке добавить запись с нулевыми текстовым кодом и датой рождения, но с ненулевым REGIONID БД выводит ошибку (REGIONID = 15 в данном случае):
Код: Выделить всё
Overflow occurred during data type conversion.
conversion error from string "15".
At trigger 'CLIENTS_BI0' line: 36, col: 7.