[英]What is the difference between INSERT…RETURNING and pl/pgsql RETURN?
(交叉發布到pgsql-novice郵件列表 )
CREATE TABLE base_foo (size int);
CREATE VIEW foo AS SELECT * FROM base_foo;
CREATE FUNCTION insert_foo() RETURNS TRIGGER AS
$$BEGIN
INSERT INTO base_foo VALUES (NEW.size);
RETURN NEW;
END$$ language plpgsql;
CREATE TRIGGER insert_foo INSTEAD OF INSERT ON foo
FOR EACH ROW execute PROCEDURE insert_foo();
我可以插入我的觀點:
INSERT INTO foo VALUES (2);
有用; 沒問題。 現在,如果我改變了觸發功能
而不是兩個語句,第二個是RETURN
,而是一個
使用RETURNING
子句INSERT
,如下所示:
CREATE OR REPLACE FUNCTION insert_foo() RETURNS TRIGGER AS
$$BEGIN
INSERT INTO base_foo VALUES (NEW.size)
RETURNING NEW;
END$$ language plpgsql;
然后插入會導致錯誤:
INSERT INTO foo VALUES (3);
ERROR: query has no destination for result data
CONTEXT: PL/pgSQL function insert_foo() line 2 at SQL statement
帶表達式的RETURN終止函數並將表達式的值返回給調用者。
文檔說回歸 :
可選的RETURNING子句使INSERT根據實際插入的每一行計算和返回值 。
(強調我的)
在這種情況下,這兩個關鍵字之間的實際意義差異是什么,以允許我預測錯誤的方式進行解釋?
錯誤的含義是什么, 即 ,因為觸發器函數需要返回一個值,並且由於INSERT
是觸發器函數的最終語句,為什么查詢沒有結果數據的目標?
請閱讀此摘錄(來自同一鏈接: http : //www.postgresql.org/docs/9.3/static/sql-insert.html )
如果INSERT命令包含RETURNING子句,則結果將類似於SELECT語句的結果,該SELECT語句包含RETURNING列表中定義的列和值,通過命令插入的行計算。
是的,我知道這個描述可能會令人困惑:)
簡單來說:returns子句類似於SELECT,它從表中檢索行,將它們組合成結果集 ,並將此結果集直接發送到客戶端 (client = gui工具,java / c ++程序等)。 客戶端必須知道如何讀取此結果集(打開它,從中檢索行,值等),使用某些API - 例如在java中有JDBC api用於處理結果集 - >查找ResultSet
類。
因此,returns子句創建一個結果集並將其發送到客戶端 - 與普通SELECT一樣。
函數中的return語句終止該函數,並將表達式的值返回給調用者。
不是直接對客戶端,而是對調用者 - 調用此函數的其他函數/過程或SELECT語句。 並且不返回結果集(一組行),而是返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.