2015-12-03 56 views
0

我有幾個表。表cexp是具有cid和total屬性的表。 CID是分組和總的數量的總和*價格爲CID(在CID匹配)Postgres - 觸發與匹配鍵

的CEXP表是用下面的代碼的結果填入:

SELECT c.cid, sum(ol.quantity*b.price) as total 
FROM customers c join orders o on c.cid=o.cid 
         join orderlist ol on o.ordernum=ol.ordernum 
         join books b on b.isbn=ol.isbn 
GROUP BY C.CID 

我的任務是創建一個觸發在插入訂單和訂單列表的行時,在cexp中找到匹配的名稱,並將新數量(來自訂單清單)和價格(來自書籍)的乘積遞增現有總量。如果不匹配,請在cexp中插入一行。

表如下:

客戶-CID,名PK-CID

書籍 - ISBN,標題,價格PK-ISBN

訂單 - ORDERNUM,CID PK-ORDERNUM

Orderlist - ORDERNUM,ISBN,數量 - PK-(ORDERNUM,ISBN)

CEXP - CID,總 - PK-CID

我收到語法錯誤。任何人都可以更正此代碼?

CREATE OR REPLACE FUNCTION cexpupd() 
RETURNS trigger as 
$cexpupd$ 
BEGIN 
UPDATE cexp 
SET new.total=total+Select (b.price*new.quantity) FROM customers c 
join orders o on c.cid=o.cid 
join orderlist ol on o.ordernum=ol.ordernum 
join books b on b.isbn=ol.isbn 
where b.isbn=new.isbn; 
--INSERT CODE WHEN ABOVE LINE DOES NOT OCCUR -INSERTS NEW ROW INTO CEXP 
END; 
$cexpupd$ 
LANGUAGE plpgsql 
+0

錯誤信息的確切含義是什麼? –

+0

錯誤:在「選擇」處或附近的語法錯誤 LINE 7:SET new.total = total + Select(b.price * new.quantity)FROM ^ **********錯誤*** ******* 錯誤:在「選擇」處或附近的語法錯誤 SQL狀態:42601 字符:130 – knight

+0

我有一個想法。你可以發佈你的'CREATE TRIGGER'語句,這樣我就可以確定我正在處理哪些表? –

回答

0

我會說,你UPDATE語句是無法挽救的鳥類巢。幸運的是,有一種更簡單的方法可以實現相同的結果。

請注意,觸發功能是程序代碼,因此在單個語句中不需要concurrently load the gun, pull the trigger, scream, and shoot yourself in the foot。您可以訪問所有過程優點,如本地變量和流量控制語句。

下應該給你你想要的好領先地位:

CREATE OR REPLACE FUNCTION cexpupd() 
    RETURNS trigger as 
    $cexpupd$ 
    DECLARE 
     bookprice  books.price%TYPE; 
     ext_total  cexp.total%TYPE; 
     custid  orders.cid%TYPE; 

    BEGIN 
     SELECT cid 
     INTO custid 
     FROM orders 
     WHERE orders.ordernum = NEW.ordernum; 

     SELECT price 
     INTO bookprice 
     FROM books 
     WHERE books.isbn = NEW.isbn; 

     ext_total = bookprice * NEW.quantity; 

     UPDATE cexp 
     SET total = ext_total 
     WHERE cid = custid; 
     IF NOT FOUND THEN 
     --INSERT new CID record here 
     INSERT INTO cexp 
      (cid, total) 
      VALUES 
      (custid, ext_total); 
     END IF; 

     RETURN NEW; 
    END; 
    $cexpupd$ 
    LANGUAGE plpgsql; 

注意接近尾聲的說法,RETURN NEW;這條線是至關重要的,因爲它是一個PostgreSQL觸發功能如何告訴數據庫去提前並完成執行觸發觸發器的語句。

如果您需要任何澄清,請不要猶豫,問。請注意我沒有試過執行這個函數,但我確實創建了必要的表來成功編譯它。