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