


SQL - помогите разобраться в решении задачи
существует таблица в БД:
CREATE TABLE Phonebook
(
ID NUMBER (6) NOT NULL,
FIRST_NAME VARCHAR2 (20 BYTE) NULL, -- имя
LAST_NAME VARCHAR2 (25 BYTE) NULL, -- фамилия
MIDDLE_NAME VARCHAR2 (50 BYTE) NULL, -- отчество
FULL_NAME varchar (100 BYTE) NULL, -- фамилия, имя и отчество
EMAIL VARCHAR2 (50 BYTE) NULL, -- емайл
PHONE_NUMBER VARCHAR2 (20 BYTE) NULL, -- телефон
BIRTHDATE DATE NULL, -- Дата рождения
TAXID NUMBER(12) NULL, -- ИНН
SALARY NUMBER(12) NULL, -- ЗП
) NOLOGGING
;
Создать триггер, который бы выдавал ошибку - "TAXID не может быть пустым", если TAXID не передали.
Мое решение:
CREATE TRIGGER TR_PhoneBook_B_U
Before UPDATE of TAXID ON Phonebook
FOR EACH ROW
DECLARE
N VARCHAR2(50);
BEGIN
IF TAXID is NULL THEN
PRINT N :='TAXID не может быть пустым';
END IF;
END;
выдает ошибку: PLS-00103: Встретился символ "N" в то время как ожидалось одно из следующих: := . ( @ % ; Символ "." заменен на "N", чтобы можно было продолжать.
Errors: check compiler log
что я не так делаю?
А что это за синтаксис? СУБД-то какая? Я больше по Оракулу, но тогда тут чуть менее чем все неправильно...
Конкретно по этой ошибке - я бы разделил присваивание и вывод или вообще выкинул это N:
PRINT 'TAXID не может быть пустым';
Правильно и по-оракловски:
CREATE OR REPLACE TRIGGER TR_PHONEBOOK_B_U
BEFORE INSERT OR UPDATE OF TAXID
ON PHONEBOOK
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
EX_TAXID_NULL EXCEPTION;
PRAGMA EXCEPTION_INIT (EX_TAXID_NULL, -20001);
BEGIN
IF (:NEW.TAXID IS NULL)
THEN
RAISE_APPLICATION_ERROR (-20001, 'TAXID cannot be null');
END IF;
END;
похож на T-SQL
попробуй
IF TAXID is NULL THEN
PRINT N :='TAXID не может быть пустым';
END IF;
заменить на
IF TAXID is NULL THEN
BEGIN
RAISERROR 'TAXID не может быть пустым', 16, 1
RETURN
END