【问题标题】:Oracle 11g Trigger IssueOracle 11g 触发器问题
【发布时间】:2014-06-21 15:42:35
【问题描述】:

我是数据库的新手,并尝试创建一个触发器,如果​​另一个表的元组设置为 0,它将将字符从“Y”更改为“N”。我让它工作了一些,但它正在更改所有元组我想要的一个。这是触发器和代码。任何建议都非常感谢。

create or replace TRIGGER CHANGE_STOCK_FLAG
AFTER UPDATE OF AMOUNT_REMAINING ON PRODUCT
FOR EACH ROW
BEGIN
UPDATE BOOK

SET IN_STOCK = 'N';

END;

更新声明:

UPDATE PRODUCT
SET AMOUNT_REMAINING = 0
WHERE PROD_ID = 5001;

触发器编译成功并且在上述更新时将 Book TABLE 中所有元组的 IN_STOCK 重置为“N”。 有 where 子句或我可以使用的东西吗?

【问题讨论】:

  • 您能否将 DDL 共享到您的 bookproduct 表中?
  • 感谢整理 吃个桃子。发的时候就乱了有什么建议吗?
  • 您的 PRODUCT 和 BOOK 表是如何连接的?如何定义为哪本书更改 IN_STOCK 列的值?
  • 嗨 Mureinik,这是表 CREATE TABLE 产品(PROD_ID NUMBER(, 0) NOT NULL,AMOUNT_REMAINING NUMBER(, 0) NOT NULL,PRICE NUMBER(9, 2) NOT NULL , IN_STOCK CHAR(1 BYTE) NOT NULL , CONSTRAINT PRODUCT_PK PRIMARY KEY
  • 对不起 Mureinik,这是另一本 CREATE TABLE BOOK ( BOOK_ID NUMBER(, 0) NOT NULL , ISBN_ID VARCHAR2(100 BYTE) , TITLE VARCHAR2(100 BYTE) NOT NULL , PROD_ID NUMBER( , 0) NOT NULL , IN_STOCK CHAR(1 BYTE) , CONSTRAINT BOOK_PK PRIMARY KEY (BOOK_ID)

标签: sql oracle triggers oracle11g


【解决方案1】:

试试这个:

CREATE OR REPLACE TRIGGER CHANGE_STOCK_FLAG 
AFTER UPDATE OF AMOUNT_REMAINING ON PRODUCT 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
BEGIN 
IF (:NEW.AMOUNT_REMAINING=0) THEN
  UPDATE BOOK SET IN_STOCK = 'N' WHERE PROD_ID=:NEW.PROD_ID;
END IF;
END;

【讨论】:

  • 感谢 Guneli,这很有效。我需要查看您所做的代码更改:引用和 if 语句以理解这一点。再次感谢。
  • 您可能也应该让它检查 negative 库存(所以,NEW.AMOUNT_REMAINING <= 0)。毕竟,零售环境中存在缩水之类的东西。
猜你喜欢
  • 2017-07-19
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2012-05-23
相关资源
最近更新 更多