如何创建不返回任何内容的函数
Posted
技术标签:
【中文标题】如何创建不返回任何内容的函数【英文标题】:How to create function that returns nothing 【发布时间】:2012-12-22 09:47:39 【问题描述】:我想用pl/pgsql
编写一个函数。
我正在使用 PostgresEnterprise Manager v3 并使用 shell 来创建一个函数,但是在 shell 中我必须定义返回类型。如果我不定义返回类型,我将无法创建函数。
如何创建没有返回结果的函数,即创建新表的函数?
【问题讨论】:
Please check out my answer if using PostgreSQL 11+ for a method of doing this withPROCEDURE
s
【参考方案1】:
使用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
。
@pir 你所说的完全没有道理。但是,如果您不想对 SELECT 数据执行任何操作,请使用 PERFROM。如果你这样做。你会想要 SELECT * INTO _record 其中 _record 是用 DECLARE _record RECORD 定义的;在 BEGIN 语句之前【参考方案2】:
函数必须总是返回一些东西,尽管你可以使用像
这样的过程do $$
并从正常功能开始,例如
declare
...
但如果您仍想执行某个功能,只需在 returns 之后添加 void。
【讨论】:
【参考方案3】:PostgreSQL 11+:PROCEDURE
s
PostgreSQL 11 introduces PROCEDURE
s 基本上是不返回任何内容的函数,但使用 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 | | |
【讨论】:
以上是关于如何创建不返回任何内容的函数的主要内容,如果未能解决你的问题,请参考以下文章