我正在尝试在 Oracle 8i 中创建一个包含 3 个表的小型数据库,并在其中创建两个触发器。这是数据库架构:
我已经创建了表格:
CREATE TABLE SYSTEM.Invoices(
invoice_id NUMBER NOT NULL,
invoice_body_xml CLOB NOT NULL,
insertTS DATE NOT NULL,
modifyTS DATE,
PRIMARY KEY (invoice_id))
TABLESPACE SYSTEM;
CREATE TABLE SYSTEM.Invoice_Statuses(
invoice_id NUMBER NOT NULL,
status NVARCHAR2(15) NOT NULL,
status_details CLOB,
transaction_id NVARCHAR2(50),
transaction_index NUMBER,
request_id NVARCHAR2(50),
insertTS DATE NOT NULL,
CONSTRAINT from_statuses_to_invoices
FOREIGN KEY(invoice_id)
REFERENCES SYSTEM.INVOICES(invoice_id))
TABLESPACE SYSTEM;
CREATE TABLE SYSTEM.Open_Invoices(
invoice_id NUMBER NOT NULL,
invoice_body_xml CLOB NOT NULL,
status NVARCHAR2(15) NOT NULL,
transaction_id NVARCHAR2(50),
transaction_index NUMBER,
insertTS DATE NOT NULL,
CONSTRAINT from_open_to_invoices
FOREIGN KEY(invoice_id)
REFERENCES SYSTEM.INVOICES(invoice_id))
TABLESPACE SYSTEM;
我需要的触发器:
CREATE OR REPLACE TRIGGER after_invoice_insert
AFTER INSERT
ON SYSTEM.INVOICES
FOR EACH ROW
BEGIN
INSERT INTO SYSTEM.INVOICE_STATUSES
(INVOICE_ID,
STATUS,
INSERTTS)
VALUES
(
:NEW.invoice_id,
n'NEW',
SYSDATE);
END;
还有一个:
CREATE OR REPLACE TRIGGER after_invoice_statuses_insert
AFTER INSERT
ON SYSTEM.INVOICE_STATUSES
FOR EACH ROW
DECLARE
body_xml CLOB;
BEGIN
SELECT SYSTEM.INVOICES.invoice_body_xml INTO body_xml FROM SYSTEM.INVOICES WHERE SYSTEM.INVOICES.invoice_id = :NEW.invoice_id;
INSERT INTO SYSTEM.OPEN_INVOICES
(INVOICE_ID,
INVOICE_BODY_XML,
STATUS,
TRANSACTION_ID,
TRANSACTION_INDEX,
INSERTTS)
VALUES
(
:NEW.invoice_id,
body_xml,
:NEW.status,
:NEW.transaction_id,
:NEW.transaction_index,
SYSDATE);
END;
如您所见,在 OPEN_INVOICES 表中,我需要来自 INVOICES 表的 body_xml,这就是为什么我要使用 select 创建 body_xml。