mysql - Oracle SQL 触发器更新问题 - 研究/学习

标签 mysql sql oracle plsql triggers

我使用以下代码创建了现有数据库 (I_Customer) 的副本:

CREATE TABLE N_CUSTOMER AS SELECT * FROM I_CUSTOMER;

我创建了下表,它将充当 N_Customer 表修改的日志:

CREATE TABLE CUSTOMER_CHANGELOG 
( cust_no NUMBER(5),
cust_name VARCHAR2(20),
contact VARCHAR2(20),
log_date DATE);

我还创建了(在堆栈成员的帮助下)以下触发器,该触发器将在编辑 N_Customer 表并将一些特定字段(新的和旧的)写入 Customer_Changelog 表后触发:

CREATE OR REPLACE 
TRIGGER customer_up_tr
AFTER UPDATE ON n_customer
FOR EACH ROW
WHEN (OLD.contact <> 1 AND NEW.contact = 1 OR OLD.cust_name <> 1 AND NEW.cust_name = 1)
BEGIN
      INSERT INTO customer_changelog (cust_no, cust_name, contact, log_date) VALUES (:OLD.cust_no, :OLD.cust_name, :OLD.contact, sysdate);
      INSERT INTO customer_changelog (cust_no, cust_name, contact, log_date) VALUES (:NEW.cust_no, :NEW.cust_name, :NEW.contact, sysdate);
END;

现在,当我使用以下代码编辑 N_Customer 表时:

UPDATE N_CUSTOMER
SET cust_name = 'Peter Davis', contact = 'Sam Bogdanovich'
WHERE cust_no = 2338;

我收到此错误:

UPDATE N_CUSTOMER
*
ERROR at line 1: 
ORA-01722: invalid number 

现在我的数据类型等都匹配,所以我不确定是什么原因导致的。

任何想法将不胜感激。

最佳答案

问题出在触发器的这一行:

(OLD.contact <> 1 AND NEW.contact = 1 OR OLD.cust_name <> 1 AND NEW.cust_name = 1)

Contact 和 cust_name 字段为 VARCHAR2,但触发器将它们与数字进行比较。

这个简单的示例将失败并出现相同的错误:

SELECT 1 FROM DUAL
WHERE 'abc' <> 1;

关于mysql - Oracle SQL 触发器更新问题 - 研究/学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19257326/

相关文章:

SQL子字符串非贪婪正则表达式

java - 获取Java Web App中的大量数据并下载到客户端

SQL删除表中最旧的记录

MySQL 错误 #1215 - 无法添加外键约束

php - 根据 mysql 字段值进行重定向

mysql - 保护数据库数据

mysql - 在 Oracle 和 MySQL 之间添加日期的可移植方法?

php - 表单的字段值直接写入mysql表

SQL Server 2005 使用查找表更新查询

mysql - 如何统计不同时间的同一字段?