我在创建插入之前和更新触发器之前检查数据类型。例如,我有一个ytd_sales
字段,它是NUMBER
。我想制作一个触发器,如果有人试图在这里插入一个varchar,就会输出一条错误消息。 我试着做这样的人......SQL问题。在插入之前需要检查触发器的数据类型
IF :new.ytd_sales != NUMBER THEN
//print the message
但是这给编译错误。任何见解?
这里有一些代码供参考。
SHOW ERRORS;
CREATE OR REPLACE TRIGGER before_insert_book
BEFORE INSERT ON book
FOR EACH ROW
BEGIN
IF :new.ISBN is NULL THEN
raise_application_error(-20000, 'ISBN is null, insert was not accepted. Please revise your insert statement');
END IF;
IF :new.title is NULL THEN
raise_application_error(-20000, 'TITLE is null, insert was not accepted. Please revise your insert statement');
END IF;
/*
IF :new.isbn != VARCHAR2 THEN
raise_application_error(-20001, 'isbn is of wrong type, please correct.');
END IF;
IF :new.title != VARCHAR2 THEN
raise_application_error(-20001, 'title is of wrong type, please correct.');
END IF;
IF :new.pub_id != VARCHAR2 THEN
raise_application_error(-20001, 'pub id is of wrong type, please correct.');
END IF;
IF :new.price != NUMBER THEN
raise_application_error(-20001, 'number is of wrong type, pleace correct.');
END IF;
IF :new.advance != NUMBER THEN
raise_application_error(-20001, 'advance is of wrong type, please correct.');
END IF;
IF :new.ytd_sales != NUMBER THEN
raise_application_error(-20001, 'ytd sales is of wrong type, please correct.');
END IF;
IF :new.pubdate is not DATE THEN
raise_application_error(-20001, 'pubdate is of wrong type, please correct.');
END IF;
*/
END;
/
创建存储过程以插入行并使用适当数据类型的参数。 –
如果您尝试将任何内容插入到Oracle无法转换为数字的数字字段中,则会引发错误。任何数据类型都可以转换为varchar,所以这些检查也不是有用的。事实是,如果Oracle没有设法将输入转换为正确的数据类型,那么您将无法进入触发器来测试:NEW字段中的值。根据定义,它们必须是可浇注的才能存储到字段数据类型中。现在 - 如果您有特定的格式,那完全是另一个问题。 –
我知道它会给我带来错误。但这是我们得到的任务...这是给我们一些触发器的练习。我们也必须做空检查,但我已经覆盖了。 –