【发布时间】:2012-12-22 09:47:39
【问题描述】:
我想用pl/pgsql 编写一个函数。
我正在使用 PostgresEnterprise Manager v3 并使用 shell 来创建一个函数,但是在 shell 中我必须定义返回类型。如果我不定义返回类型,我将无法创建函数。
如何创建没有返回结果的函数,即创建新表的函数?
【问题讨论】:
标签: postgresql function plpgsql void
我想用pl/pgsql 编写一个函数。
我正在使用 PostgresEnterprise Manager v3 并使用 shell 来创建一个函数,但是在 shell 中我必须定义返回类型。如果我不定义返回类型,我将无法创建函数。
如何创建没有返回结果的函数,即创建新表的函数?
【问题讨论】:
标签: postgresql function plpgsql void
使用RETURNS void,如下所示:
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
#variable_conflict use_variable
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = curtime, comment = comment
WHERE users.id = id;
END;
$$ LANGUAGE plpgsql;
【讨论】:
#variable_conflict 指令与其余答案没有任何关系。它只是示例函数的一部分;唯一重要的是RETURNS void。另外,很酷,我不知道 PL/PgSQL 有编译指示。
#variable_conflict的相关案例:dba.stackexchange.com/a/105828/3684
SELECT * FROM stamp_user(...),那么我会得到error: query has no destination for result data,如果我只写stamp_user(...),那么我会得到syntax error。
函数必须总是返回一些东西,尽管你可以使用像
这样的过程do $$
并从正常功能开始,例如
declare
...
但如果您仍想执行某个功能,只需在 returns 之后添加 void。
【讨论】:
PROCEDUREsPostgreSQL 11 introduces PROCEDUREs 基本上是不返回任何内容的函数,但使用 CALL 而不是 SELECT 调用,
如何创建没有返回结果的函数,即创建新表的函数?
这样,
=# CREATE PROCEDURE create_table_foo()
AS $$
CREATE TABLE foo ( id int )
$$ LANGUAGE sql;
=# CALL create_table_foo();
=# \d foo;
Table "public.foo"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
【讨论】: