Страницы

Поиск по вопросам

среда, 6 марта 2019 г.

Почему условие if не срабатывает и транзакция подтверждается?

Сама транзакция:
CREATE PROCEDURE `prog_transact`(vprog_name varchar(255), yprog_cy year, vprog_purp varchar (255), vprog_dt varchar (255), ilic_id int, vprog_vers varchar (63), vprog_ff varchar (255), vprog_website varchar (511), vprog_interface varchar(127), iarch_id int, idev_id int, ipl_id int, ios_id int) begin declare iprog_id int; declare exit handler for sqlexception begin rollback; select 'transaction not commited: sqlexception'; show errors; end; start transaction; if ilic_id=null or iarch_id=null or idev_id=null or ipl_id=null or ios_id=null then rollback; select 'transaction not commited: nulldata'; end if; insert into program (name, creation_year, purpose, dist_type, lic_id, version, file_formats, website, interface) values (vprog_name, yprog_cy, vprog_purp, vprog_dt, ilic_id, vprog_vers, vprog_ff, vprog_website, vprog_interface); select max(id) into iprog_id from program; insert into arch_prog (arch_id, prog_id) values (iarch_id, iprog_id); insert into dev_prog (dev_id, prog_id) values (idev_id, iprog_id); insert into pl_prog (pl_id, prog_id) values (ipl_id, iprog_id); insert into os_prog (os_id, prog_id) values (ios_id, iprog_id); commit; end
По идее, если последние переменные в процедуре заданы как null'ы, то транзакция должна откатиться. Как бы не так!
call prog_transact('Spore',2008,'Компьютерная игра','коммерческое',11,'1.05.1',null,'spore.com','графический', null, null, null, null);
... и транзакция успешно подтверждается! Почему не проверяется условие выше?


Ответ

Нельзя сравнивать значение с NULL при помощи оператора =. Сравнение с неопределенной величиной всегда неопределенная величина. Для того, чтобы выяснить принимает ли величина значение NULL, используйте специальный оператор IS NULL и его отрицательную форму IN NOT NULL
SELECT NULL IS NULL, NULL IS NOT NULL, NULL = NULL, NULL <> NULL; +--------------+------------------+-------------+--------------+ | NULL IS NULL | NULL IS NOT NULL | NULL = NULL | NULL <> NULL | +--------------+------------------+-------------+--------------+ | 1 | 0 | NULL | NULL | +--------------+------------------+-------------+--------------+

Комментариев нет:

Отправить комментарий