【发布时间】:2016-07-14 20:44:56
【问题描述】:
我有这两张表:
TABLE ASSET_ENTRY_NOTE (
ID NUMBER NOT NULL, --PK
ASSETMDL_ID NUMBER NOT NULL, --FK
DEPT_ID NUMBER NOT NULL, --FK
LOCATION NVARCHAR2(100) NOT NULL,
ASSET_ID NUMBER, --FK TO ASSETS
ACCOUNT_ID NUMBER NOT NULL, --FK
TOTAL_DPRC_DURATION FLOAT(126) NOT NULL,
TOTAL_PROD_HRS FLOAT(126),
AMORTIZATION_PRCNTG FLOAT(126),
ACQUIRE_DATE DATE NOT NULL,
DESCRIPTION NVARCHAR2(200) NOT NULL,
APPRFLAG NUMBER DEFAULT 0 NOT NULL,
WRK_HRS FLOAT(126),
)
TABLE ASSETS (
ID NUMBER NOT NULL, --PK
ASSETMDL_ID NUMBER NOT NULL, --FK
DEPT_ID NUMBER NOT NULL,
LOCATION NVARCHAR2(100) NOT NULL, --FK
ACCOUNT_ID NUMBER NOT NULL,
ACQUIRE_DATE DATE NOT NULL,
TOTAL_DPRC_DURATION FLOAT(126),
BALANCE_CLOSING_DATE DATE,
SELL_VAL FLOAT(126),
RPLCMNT_DISCOUNT FLOAT(126),
DESCRIPTION NVARCHAR2(200) NOT NULL,
)
请注意,两个表之间存在一对一的关系(即ASSET_ENTRY_NOTE.ASSET_ID 是唯一的。
当ASSETS_ENTRY_NOTE.APPRFLAG 更新为 1 我有这个触发器:
- 获取
ASSETS表的新主键序列。 - 将数据从
ASSETS_ENTRY_NOTE插入到ASSETS。 - 将
ASSETS_ENTRY_NOTE.ASSET_ID列更新为与序列中的主键值相同的值。
这是我的触发器的最新尝试:
CREATE OR REPLACE TRIGGER ENTRYNT_ASSET_TRIG
after UPDATE OF APPRFLAG ON ASSET_ENTRY_NOTE
for each row
when (new.apprflag = 1)
declare
v_asset_id number;
BEGIN
SELECT assets_PK_SEQ.NEXTVAL INTO v_asset_id
FROM DUAL d;
insert into assets (ID,
assets.assetmdl_id,
assets.dept_id,
assets.location,
assets.account_id,
assets.acquire_date,
assets.total_dprc_duration,
assets.description
)
values (v_asset_id,
assetmdl_id,
dept_id,
location,
account_id,
acquire_date,
total_dprc_duration,
description
);
update ASSET_ENTRY_NOTE set asset_id = v_asset_id where ;
END;
问题是,我知道ASSET_ENTRY_NOTE 是一个变异表,最后一个UPDATE 语句在这里是不允许的,但没有其他东西对我有用。
我已经尝试过的:
- 创建语句级触发器以仅更新一个值。
- 使用
before而不是after,但这是不正确的,因为我需要将值插入ASSETS。 - 使用游标遍历每个更改的值,但我遇到了准确的提取错误。
- 创建处理插入和更新的过程。
任何帮助将不胜感激。
【问题讨论】:
标签: oracle oracle11g triggers insert