Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

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