2012-03-27 50 views
1

我已經創建了功能和觸發如下:錯誤:查詢沒有目的地的結果數據

CREATE OR REPLACE FUNCTION New_Ticket() 
RETURNS TRIGGER AS 
$$BEGIN 
    SELECT * FROM Ticket WHERE productID=(SELECT MAX(ticketID) FROM Ticket); 
    RETURN NEW; 
END$$ 
LANGUAGE PLPGSQL; 

CREATE TRIGGER New_TicketTr 
AFTER INSERT ON Ticket 
FOR EACH ROW execute procedure New_Ticket(); 

我做插入後如下:

INSERT INTO Ticket (ticketID, Problem, Status, Priority,LoggedTime,CustomerID,ProductID) VALUES 
(1, 'Cannot play games.', 'open', 1,'2005-05-13 07:15:31.123456789',1,1); 

我收到錯誤消息:錯誤:查詢沒有結果數據的目的地 提示:如果您想放棄SELECT的結果,請改用PERFORM。 在SQL語句中,語境:PL/pgSQL函數「new_ticket」行2。 任何人都可以幫助我嗎?那裏有什麼問題?

+0

由於您的觸發器不做任何處理,您可以將其刪除。問題是:爲什麼你首先需要一個觸發器,你試圖解決什麼問題? – 2012-03-27 12:53:19

回答

3

我認爲問題在於你沒有對該查詢做任何事情。 DML也不會將結果返回到變量或記錄中。

+0

我可以在PHP中創建一些變量並將查詢分配給它並返回變量嗎?如果不是,你會建議什麼? – Sermilion 2012-03-27 12:16:38

+1

據我所知,你不能。觸發器是針對非常特殊的情況執行DML的......也許如果你解釋你正在努力達到的目標,我們可以給你一些選擇。 – 2012-03-27 12:49:19

1

你誤解了觸發器的基本概念。觸發器函數可以操縱它所要求的行。或者它可以執行額外的DML語句來操作數據庫中的其他數據。

但是沒有辦法「返回一個變量」,因爲沒有可以返回值的調用實例。

現在,如果您在您的問題中定義了,您打算如何處理您查詢的行,我們可能會提供幫助。

但是,查詢本身似乎沒有任何意義。爲什麼productid匹配max(ticketid)ticket

此外,您正在創建一個觸發器AFTER INSERT。在這種情況下,在觸發器功能中對RETURN NEW沒有任何意義。

你真的需要首先掌握整個概念。
首先閱讀chapter Triggers in the manual

+0

謝謝你的回答。我想要顯示插入後插入的所有行。是的,抱歉有錯,它應該是SELECT * FROM Ticket WHERE productID =(SELECT MAX(productID)FROM Ticket); – Sermilion 2012-04-01 23:35:45