INSERT…返回和pl/pgsql返回之间有什么区别?

INSERT…返回和pl/pgsql返回之间有什么区别?,sql,postgresql,sql-insert,Sql,Postgresql,Sql Insert,(交叉过账至) INSERT INTO foo VALUES (2); CREATE OR REPLACE FUNCTION insert_foo() RETURNS TRIGGER AS $$BEGIN

(交叉过账至)

INSERT INTO foo VALUES (2);                                                                                    
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                                               
假设如下: 观察这种行为 我可以在我的视图中插入:

INSERT INTO foo VALUES (2);                                                                                    
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                                               
它起作用了;没问题。现在,如果我将触发函数更改为
第二条语句返回的不是两条语句,而是一条语句
插入带有
返回
子句的
,如下所示:

INSERT INTO foo VALUES (2);                                                                                    
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                                               
然后,插入会导致错误:

INSERT INTO foo VALUES (2);                                                                                    
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                                               
文件 :

INSERT INTO foo VALUES (2);                                                                                    
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终止函数并返回 表达式对调用方的值

INSERT INTO foo VALUES (2);                                                                                    
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                                               
:

INSERT INTO foo VALUES (2);                                                                                    
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                                               
可选的RETURNING子句导致INSERT计算并返回 基于实际插入的每行的值

INSERT INTO foo VALUES (2);                                                                                    
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                                               
(我的重点)

INSERT INTO foo VALUES (2);                                                                                    
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                                               
我的问题有两个:
  • 真正意义上的区别是什么 在这两个关键字之间,以一种 允许我预测错误吗

  • INSERT INTO foo VALUES (2);                                                                                    
    
    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                                               
    
  • 错误的含义是什么,即自触发以来 函数需要返回一个值,因为插入是 触发器函数的最终语句,为什么查询没有 结果数据的目的地

  • INSERT INTO foo VALUES (2);                                                                                    
    
    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                                               
    

    也请阅读此摘录(来自同一链接:)

    INSERT INTO foo VALUES (2);                                                                                    
    
    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                                               
    
    如果INSERT命令包含RETURNING子句,则结果将为 类似于包含列和的SELECT语句 返回列表中定义的值,在行上计算 由命令插入

    INSERT INTO foo VALUES (2);                                                                                    
    
    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                                               
    
    是的,我知道这个描述可能会让人困惑:)
    简单地说:returning子句的工作原理类似于SELECT,它从表中检索行,将它们组合成一个结果集,并将该结果集直接发送到客户端(client=gui工具、java/c++程序等)。客户端必须知道如何使用某种API读取此结果集(打开它,从中检索行、值等)-例如,在java中,有用于处理结果集-->查找
    resultset
    类的JDBC API。

    所以,returning子句创建一个resultset并将其发送到客户机,方法与普通SELECT相同。

    函数中的Return语句终止该函数,并将表达式的值返回给调用方。
    不是直接发送给客户机,而是发送给调用者-发送给调用此函数的其他函数/过程或SELECT语句。并且不返回结果集(一组行),而是返回值

    INSERT INTO foo VALUES (2);                                                                                    
    
    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