簡體   English   中英

INSERT ... RETURNING和pl / pgsql RETURN有什么區別?

[英]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

帶表達式的RETURN終止函數並將表達式的值返回給調用者。

文檔說回歸

可選的RETURNING子句使INSERT根據實際插入的每一行計算和返回值

(強調我的)

我的問題是兩個:

  1. 在這種情況下,這兩個關鍵字之間的實際意義差異是什么,以允許我預測錯誤的方式進行解釋?

  2. 錯誤的含義是什么, ,因為觸發器函數需要返回一個值,並且由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM