2013-04-25 143 views
3

我正在處理作業問題。我遇到了觸發器的編譯問題,無法理解如何創建引用序列和另一個表的觸發器,並將這些值插入到我創建的日誌表中。 I have read that using SERIAL not null on the Table column entry may eliminates the need for a sequence and referencing table,但我需要這個功課才能工作。插入,更新,刪除後PL/SQL觸發器將數據輸入到包含序列的日誌表中

我需要一些幫助,弄清楚如何讓我的觸發器編譯。它與我的Bind變量有問題:序列中有NEW,還有從另一個Table插入的idpay值。我不確定我的聲明是否正確,並且BEGIN語句後的前兩條語句正確,因爲第一行被標記爲編譯錯誤。 I think something is going on with this example and my lack of the NULL value entry there in the IF statement, but unsure where to put that part in my coding.

當然Oracle 11g Reference Doc for Triggers, I've gone over it but you can check it out yourself too.

這裏,是設置問題: 1.使用捐贈數據庫。該組織希望追蹤所有承諾付款 活動。每次添加,更改或刪除質押付款時,應在一個單獨的表中捕獲以下 信息:用戶名,當前日期,採取的操作 (INSERT,UPDATE或DELETE)以及付款記錄的idpay值。

創建一個名爲DD_PAYTRACK的表來保存此信息。包含要由序列填充的主鍵列 ,併爲 主鍵列創建名爲DD_PTRACK_SEQ的新序列。

創建一個觸發器,用於記錄請求的信息以追蹤支付活動 支付活動,併爲idpay = 1470的所有操作類型測試觸發器。 使用SELECT語句顯示DD_PAYTRACK表中的記錄。

select * from dd_paytrack; 

IDTRACK PTUSER  PTDATE  PTACTION  PTPAYID     
4   AAX5367E220 10-DEC-12  INSERT  1470     
5   AAX5367E220 10-DEC-12  UPDATE   1470     
6   AAX5367E220 10-DEC-12  DELETE  1470     

這是我到目前爲止已經完成,即使添加這些插入,更新後,和Delete語句,它仍然返回一個空表,但因爲答案下面我有固定的建議什麼的。

* 我修正了這個問題,編譯觸發器後我不得不添加自己的Update,Insert和Delete語句。現在效果很好。感謝諾埃爾! *

DROP TABLE dd_paytrack; 
    DROP SEQUENCE idtrack_seq; 

    CREATE TABLE dd_paytrack(
    idtrack   NUMBER, 
    pt_user   VARCHAR2(30), 
    pt_date   DATE, 
    pt_action  VARCHAR2(30), 
    pt_payid  NUMBER(6,0), 
    CONSTRAINT pk_dd_paytrack PRIMARY KEY (idtrack) 
    ); 

    CREATE SEQUENCE idtrack_seq; 

    CREATE OR REPLACE TRIGGER pledge_pay_trigger 
     AFTER 
     INSERT OR 
     UPDATE OR 
     DELETE 
     ON dd_payment 
     FOR EACH ROW 
    DECLARE 
     log_action dd_paytrack.pt_action%TYPE; 
     id_pay  dd_paytrack.pt_payid%TYPE;  
    BEGIN 
    id_pay := :NEW.idpay; 
    IF INSERTING THEN 
    log_action := 'Insert'; 
    ELSIF UPDATING THEN 
    log_action := 'Update'; 
    ELSIF DELETING THEN 
    id_pay := :OLD.idpay; 
    log_action := 'Delete'; 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); 
    END IF; 

    INSERT INTO dd_paytrack (idtrack, pt_user, pt_date, pt_action, pt_payid) 
     VALUES(idtrack_seq.NEXTVAL, USER, TO_CHAR(SYSDATE, 'DD-MON-YY'), log_action,  
    id_pay); 

    END pledge_pay_trigger; 
    /

    INSERT INTO dd_payment(idpay, idpledge, payamt, paydate, paymethod) 
    VALUES (1470, 105, 250, SYSDATE, 'CC'); 
    commit; 

    UPDATE dd_payment 
    SET payamt = 25 
    WHERE idpay = 1470; 
    commit; 

    UPDATE dd_payment 
    SET payamt = 2000 
    WHERE idpay = 1470; 
    COMMIT; 

    DELETE 
    FROM dd_payment 
    WHERE idpay = 1470; 
    COMMIT; 


    SET serveroutput ON 
    select * from dd_paytrack; 

這裏是捐贈表計劃,它引用了dd_paytrack表對我的家庭作業的問題。我測試了它,並且這個模式似乎在剪切和粘貼之後可以正常工作。

-- The DoGood Donor Database 
-- A donor, who represents a person or company that has committed to make a donation to    
the DoGood organzation. 

DROP TABLE dd_donor CASCADE CONSTRAINTS; 
DROP TABLE dd_project CASCADE CONSTRAINTS; 
DROP TABLE dd_status CASCADE CONSTRAINTS; 
DROP TABLE dd_pledge CASCADE CONSTRAINTS; 
DROP TABLE dd_payment CASCADE CONSTRAINTS; 
CREATE TABLE DD_Donor (
    idDonor number(4), 
    Firstname varchar2(15), 
    Lastname varchar2(30), 
        Typecode CHAR(1), 
    Street varchar2(40), 
    City varchar2(20), 
    State char(2), 
    Zip varchar2(9), 
    Phone varchar2(10), 
    Fax varchar2(10), 
    Email varchar2(25), 
        News char(1), 
    dtentered date DEFAULT SYSDATE, 
    CONSTRAINT donor_id_pk PRIMARY KEY(idDonor)); 
CREATE TABLE DD_Project (
        idProj number(6), 
        Projname varchar2(60), 
        Projstartdate DATE, 
        Projenddate DATE, 
        Projfundgoal number(12,2), 
        ProjCoord varchar2(20), 
        CONSTRAINT project_id_pk PRIMARY KEY(idProj), 
        CONSTRAINT project_name_uk UNIQUE (Projname) );  
CREATE TABLE DD_Status (
        idStatus number(2), 
        Statusdesc varchar2(15), 
        CONSTRAINT status_id_pk PRIMARY KEY(idStatus));  
CREATE TABLE DD_Pledge (
        idPledge number(5), 
        idDonor number(4), 
        Pledgedate DATE, 
        Pledgeamt number(8,2), 
        idProj number(5), 
        idStatus number(2), 
        Writeoff number(8,2), 
        paymonths number(3), 
        Campaign number(4), 
        Firstpledge char(1), 
        CONSTRAINT pledge_id_pk PRIMARY KEY(idPledge), 
        CONSTRAINT pledge_idDonor_fk FOREIGN KEY (idDonor) 
          REFERENCES dd_donor (idDonor), 
        CONSTRAINT pledge_idProj_fk FOREIGN KEY (idProj) 
          REFERENCES dd_project (idProj), 
        CONSTRAINT pledge_idStatus_fk FOREIGN KEY (idStatus) 
          REFERENCES dd_status (idStatus));     
CREATE TABLE DD_Payment (
        idPay number(6), 
        idPledge number(5), 
        Payamt number(8,2), 
        Paydate DATE, 
        Paymethod char(2), 
        CONSTRAINT payment_id_pk PRIMARY KEY(idPay), 
        CONSTRAINT pay_idpledge_fk FOREIGN KEY (idPledge) 
          REFERENCES dd_pledge (idPledge));     
INSERT INTO dd_donor 
    VALUES (301, 'Mary', 'Treanor', 'I','243 main St.', 'Norfolk',  
'VA','23510',NULL,NULL,'[email protected]','Y','01-SEP-2012'); 
INSERT INTO dd_donor 
    VALUES (302, 'Patrick', 'Lee', 'I','11 Hooper St.', 'Norfolk',  
'VA','23510','7572115445',NULL,'[email protected]','N','09-SEP-2012'); 
INSERT INTO dd_donor 
    VALUES (303, 'Terry', 'Venor', 'I','556 Loop Lane.', 'Chesapeake', 
'VA','23320',NULL,NULL,'[email protected]','Y','18-SEP-2012'); 
INSERT INTO dd_donor 
    VALUES (304, 'Sherry', 'Pane', 'I','Center Blvd.', 'Virginia Beach', 
'VA','23455',NULL,NULL,'[email protected]','Y','21-SEP-2012'); 
INSERT INTO dd_donor 
    VALUES (305, 'Thomas', 'Sheer', 'I','66 Train St.', 'Chesapeake', 
'VA','23322','7579390022',NULL,'[email protected]','Y','01-MAR-2013'); 
INSERT INTO dd_donor 
    VALUES (306, NULL, 'Coastal Developers', 'B','3667 Shore Dr.', 'Virginia Beach', 
'VA','23450','8889220004',NULL,'[email protected]','Y','30-SEP-2012'); 
INSERT INTO dd_donor 
    VALUES (307, NULL, 'VA Community Org', 'G','689 Bush Dr.', 'Norfolk', 
'VA','23513','7578337467','7578337468','[email protected]','Y','03-OCT-2012'); 
INSERT INTO dd_donor 
    VALUES (308, 'Betty', 'Konklin', 'I','11 Shark Ln.', 'Virginia Beach', 
'VA','23455','7574550087',NULL,'[email protected]','N','04-OCT-2012'); 
INSERT INTO dd_donor 
    VALUES (309, 'Jim', 'Tapp', 'I','200 Pine Tree Blvd.', 'Chesapeake', 
'VA','23320','',NULL,'','N','08-OCT-2012'); 
INSERT INTO dd_donor 
    VALUES (310, NULL, 'Unique Dezigns', 'B','Connect Circle Unit 12', 'Chesapeake', 
'VA','23320','7574442121',NULL,'[email protected]','Y','11-SEP-2012'); 
INSERT INTO dd_project 
    VALUES (500,'Elders Assistance League', '01-SEP-2012','31-OCT-2012',15000,'Shawn 
Hasee'); 
INSERT INTO dd_project 
    VALUES (501,'Community food pantry #21 freezer equipment', '01-OCT-2012','31-DEC- 
2012',65000,'Shawn Hasee'); 
INSERT INTO dd_project 
    VALUES (502,'Lang Scholarship Fund', '01-JAN-2013','01-NOV-2013',100000,'Traci 
Brown'); 
INSERT INTO dd_project 
    VALUES (503,'Animal shelter Vet Connect Program', '01-DEC-2012','30-MAR- 
2013',25000,'Traci Brown'); 
INSERT INTO dd_project 
    VALUES (504,'Shelter Share Project 2013', '01-FEB-2013','31-JUL-2013',35000,'Traci 
Brown'); 
INSERT INTO dd_status 
    VALUES (10,'Open'); 
INSERT INTO dd_status 
    VALUES (20,'Complete'); 
INSERT INTO dd_status 
    VALUES (30,'Overdue'); 
INSERT INTO dd_status 
    VALUES (40,'Closed'); 
INSERT INTO dd_status 
    VALUES (50,'Hold'); 
INSERT INTO dd_pledge 
    VALUES (100,303,'18-SEP-2012',80,500,20,NULL,0,738,'Y'); 
INSERT INTO dd_pledge 
    VALUES (101,304,'21-SEP-2012',35,500,20,NULL,0,738,'Y'); 
INSERT INTO dd_pledge 
    VALUES (102,310,'01-OCT-2012',500,501,20,NULL,0,749,'Y'); 
INSERT INTO dd_pledge 
    VALUES (103,307,'03-OCT-2012',2000,501,20,NULL,0,749,'N'); 
INSERT INTO dd_pledge 
    VALUES (104,308,'04-OCT-2012',240,501,10,NULL,12,749,'Y'); 
INSERT INTO dd_pledge 
    VALUES (105,309,'08-OCT-2012',120,501,10,NULL,12,749,'Y'); 
INSERT INTO dd_pledge 
    VALUES (106,301,'12-OCT-2012',75,500,20,NULL,0,738,'N'); 
INSERT INTO dd_pledge 
    VALUES (107,302,'15-OCT-2012',1200,501,10,NULL,24,749,'Y'); 
INSERT INTO dd_pledge 
    VALUES (108,308,'20-JAN-2013',480,503,10,NULL,24,790,'N'); 
INSERT INTO dd_pledge 
    VALUES (109,301,'01-FEB-2013',360,503,10,NULL,12,790,'N'); 
INSERT INTO dd_pledge 
    VALUES (110,303,'01-MAR-2013',300,504,10,NULL,12,756,'N'); 
INSERT INTO dd_pledge 
    VALUES (111,306,'01-MAR-2013',1500,504,20,NULL,0,756,'Y'); 
INSERT INTO dd_pledge 
    VALUES (112,309,'16-MAR-2013',240,504,10,NULL,12,756,'N'); 
INSERT INTO dd_payment 
    VALUES (1425,100,80,'18-SEP-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1426,101,35,'21-SEP-2012','DC'); 
INSERT INTO dd_payment 
    VALUES (1427,102,500,'01-OCT-2012','CH'); 
INSERT INTO dd_payment 
    VALUES (1428,103,2000,'03-OCT-2012','CH'); 
INSERT INTO dd_payment 
    VALUES (1429,106,75,'12-OCT-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1430,104,20,'01-NOV-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1431,105,10,'01-NOV-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1432,107,50,'01-NOV-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1433,104,20,'01-DEC-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1434,105,10,'01-DEC-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1435,107,50,'01-DEC-2012','CC'); 
INSERT INTO dd_payment 
    VALUES (1436,104,20,'01-JAN-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1437,105,10,'01-JAN-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1438,107,50,'01-JAN-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1439,104,20,'01-FEB-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1440,105,10,'01-FEB-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1441,107,50,'01-FEB-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1442,108,20,'01-FEB-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1443,109,30,'01-FEB-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1444,104,20,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1445,105,10,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1446,107,50,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1447,108,20,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1448,109,30,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1449,110,25,'01-MAR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1450,111,1500,'01-MAR-2013','CH'); 
INSERT INTO dd_payment 
    VALUES (1451,104,20,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1452,105,10,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1453,107,50,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1454,108,20,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1455,109,30,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1456,110,25,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1457,112,20,'01-APR-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1458,104,20,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1459,105,10,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1460,107,50,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1461,108,20,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1462,109,30,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1463,110,25,'01-MAY-2013','CC'); 
INSERT INTO dd_payment 
    VALUES (1464,112,20,'01-MAY-2013','CC'); 
COMMIT; 

回答

2

由於您使用的INSERT語句中的序列值,

INSERT INTO dd_paytrack 
      (idtrack, pt_user, pt_date, 
      pt_action, pt_payid 
      ) 
    VALUES (idtrack_seq.NEXTVAL, USER, TO_CHAR (SYSDATE, 'DD-MON-YY'), 
      log_action, id_pay 
      ); 

沒有必要爲下面選擇它。

SELECT idtrack_seq.NEXTVAL 
INTO :NEW.idtrack 
FROM DUAL; 

而且,你已經錯過了這一行業的冒號,

 id_pay := :OLD.idpay; 

編輯:還有一兩件事,有在觸發其DBMS_OUTPUT聲明沒有任何意義。既然你不會看到它,即使執行達到它。

+0

我有固定的錯誤,但我選擇查詢現在返回一個空表。我將編輯上面的代碼以反映這一變化。感謝您的幫助。不知道爲什麼現在有這些編輯的空表。我包括設置服務器輸出ON – MeachamRob 2013-04-25 12:30:30

+0

@meachamrob您確定您使用了正確的where子句嗎?在插入語句中我沒有看到付款ID 1470。 – Noel 2013-04-25 12:37:02

+0

你是對的,通過數據顯示1470沒有語句,我想我必須自己創建這些插入,更新和刪除語句。教授沒有很好地解釋該部分 – MeachamRob 2013-04-25 12:58:56

1

PL/SQL觸發後插入,更新,刪除數據輸入到日誌表與序列

CREATE OR REPLACE TRIGGER pledge_pay_trigger2 
     AFTER 
     INSERT OR 
     UPDATE OR 
     DELETE 
     ON dd_payment 
     FOR EACH ROW 
    DECLARE 
     log_action dd_payment2.pt_action%TYPE; 
     id_pay  dd_payment2.idpay%TYPE;  
     id_Pledge dd_payment2.idPledge%TYPE;  
     Pay_amt  dd_payment2.Payamt%TYPE;  
     Pay_date dd_payment2.Paydate%TYPE;  
     Pay_method dd_payment2.Paymethod%TYPE;  

BEGIN 
id_pay := :NEW.idpay; 
id_Pledge := :NEW.IDPLEDGE; 
Pay_amt  := :NEW.PAYAMT; 
Pay_date := :NEW.PAYDATE; 
Pay_method := :NEW.PAYMETHOD; 
IF INSERTING THEN 
    log_action := 'Insert'; 
    INSERT INTO dd_payment2(idpay, idpledge, payamt, paydate, paymethod,pt_action) 
    VALUES (id_pay, id_Pledge, Pay_amt, TO_CHAR(Pay_date, 'DD-MON-YY'), Pay_method,log_action); 
ELSIF UPDATING THEN 
    log_action := 'Update'; 
    UPDATE DD_PAYMENT2 SET PAYAMT=Pay_amt,PAYDATE=TO_CHAR(Pay_date, 'DD-MON-YY'),pt_action='UPDATE' WHERE idpay=id_pay; 
ELSIF DELETING THEN 
id_pay := :OLD.idpay; 
log_action := 'Delete'; 
UPDATE DD_PAYMENT2 SET pt_action='DELETE' WHERE idpay=id_pay;   
ELSE 
DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); 
END IF; 
END pledge_pay_trigger2; 
/

COMMIT; 

// if log_action ='Insert' then 
     INSERT INTO dd_payment2(idpay, idpledge, payamt, paydate, paymethod,pt_action) 
     VALUES (id_pay, id_Pledge, Pay_amt, TO_CHAR(Pay_date, 'DD-MON-YY'), Pay_method,log_action); 
    else if log_action ='Update' then 
     UPDATE DD_PAYMENT2 SET PAYAMT=Pay_amt,PAYDATE=TO_CHAR(Pay_date, 'DD-MON-YY'),pt_action='UPDATE' WHERE idpay=id_pay; 
    else 
     UPDATE DD_PAYMENT2 SET pt_action='DELETE' WHERE idpay=id_pay;   
    end if 


    ALTER TABLE DD_PAYMENT2 ADD pt_action VARCHAR2(30 BYTE); 

    COMMIT; 


     INSERT INTO dd_payment(idpay, idpledge, payamt, paydate, paymethod) 
    VALUES (1470, 105, 250, SYSDATE, 'CC'); 
    commit; 



     UPDATE dd_payment 
    SET payamt = 2000 
    WHERE idpay = 1470; 
    COMMIT; 

     DELETE 
    FROM dd_payment 
    WHERE idpay = 1470; 
    COMMIT; 
相關問題