Oracle Trigger Если условие оператора как-то не выполняется? - PullRequest
3 голосов
/ 04 декабря 2011

Спасибо за чтение. В настоящее время я работаю над базой данных из 10 объектов для гипотетического магазина. Поэтому основной сущностью является Customer_Order, и цель этого триггера состоит в том, чтобы проверить, что почтовый индекс Клиента не является нулевым, когда строка вставляется или обновляется в Customer_order. Если он нулевой, триггер должен выдать предупреждение.

CREATE OR REPLACE TRIGGER Check_Order  
BEFORE INSERT OR UPDATE ON Customer_Order 
for each row
DECLARE ShipAddress customer.ship_address.post_code%TYPE;
BEGIN 
IF (ShipAddress = '') then 
RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty');
END IF;
END; 
. 
run

Я знаю, что "Else" нет, но у меня нет других действий, кроме обновления таблицы, которую он выполняет. Не беспокойтесь о ShipAddress, я пробовал это с более простыми атрибутами, и он просто не срабатывает. Все, что происходит, это то, что строка будет вставлена ​​или обновлена, поэтому она не соответствует условию. Я пробовал все виды, например "if (Payment_No = 'PAYM0001'), который тоже не работает. Это потому, что я использую для каждого вместо триггера уровня Statement?

Ответы [ 2 ]

6 голосов
/ 04 декабря 2011

Oracle молча преобразует пустые строки (то есть строки с нулевой длиной) в NULL. Таким образом, в вашем столбце никогда не будет значения ''. Поэтому утверждение IF никогда не является правдой. Вам нужно проверить NULL в этом триггере:

IF (ShipAddress IS NULL) then 
  RAISE_APPLICATION_ERROR(-20103, 'Shipping Address is empty');
END IF;

Но вы должны действительно, действительно следовать совету Бена и просто объявить этот столбец как НЕ НУЛЬ, вместо использования триггера для проверки этого.

Редактировать

Вы можете выполнить ненулевую проверку с помощью ограничения проверки на вашей таблице:

 CREATE TABLE FOO
 (
    shipping_address ship_addres,
    CONSTRAINT check_post_code CHECK (shipping_address.post_code IS NOT NULL)
 )
1 голос
/ 04 декабря 2011

Oracle использует 3-х значную логику, ноль - 3-е значение. Что-то может быть истинным, ложным или несуществующим. null - это небытие, равное ничему. Вы не можете проверить на ноль с оператором равенства. Используйте IF :new.ShipAddress is null для проверки на нулевые значения.

Вы также неправильно ссылаетесь на столбец в триггере. Не нужно ничего объявлять, и вы должны ссылаться на значение :new или :old. Это хороший ресурс.

Было бы лучше запретить нули, накладывая ограничение на таблицу, чтобы shipaddress никогда не мог быть нулевым. Смотрите здесь . Итак,

alter table my_table modify shipaddress not null;

чтобы добавить его в таблицу на месте. Лучше добавить ограничение при создании таблицы. Это также немного ускорит процесс, потому что вам не нужно оценивать триггер.

EDIT:

shipaddress имеет кольцо полного адреса, возможно, разделенный запятыми? Я определенно рекомендую выделять каждую часть адреса таким образом, что-то вроде address1, address2, address3, town, county, postcode. Я британец, поэтому при необходимости измените на state, zip и т. Д. Это делает запрос и манипулирование данными, если вам нужно сделать это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...