在PL/pgSQL上执行和执行有什么区别?

从手册中:

有时,对表达式或SELECT查询求值,但放弃结果是有用的,例如在调用具有副作用但没有有用结果值的函数时.要在PL/pgSQL中实现这一点,请使用PERFORM语句.

但是,当我try 这样的事情时:

perform 'create table foo as (select 1)';

什么都没发生.虽然这个查询应该有副作用(创建表),但结果可以被丢弃.

我想我有一件事做对了:为了运行函数,我可以使用perform:

perform pg_temp.addInheritance(foo);

推荐答案

PERFORM是用于调用void函数的plpgsql命令.PLpgSQL小心处理无用的SELECT语句——不允许使用SELECT without INTO子句.但有时您需要调用一个函数,而不需要存储结果(或者函数没有结果).SQL中的函数用SELECT语句调用.但这在PLpgSQL中是不可能的——因此引入了命令PERFORM.

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS $$
BEGIN
  RAISE NOTICE 'Hello from void function';
END;
$$ LANGUAGE plpgsql;

-- direct call from SQL
SELECT foo();

-- in PLpgSQL
DO $$
BEGIN
  SELECT foo(); -- is not allowed
  PERFORM foo(); -- is ok
END;
$$;

PERFORM条语句执行一个参数并忘记了结果.

你的例子perform 'create table foo as (select 1)';

SELECT 'create table foo as (select 1)'差不多.它返回一个字符串"create table foo as( Select 1)",该字符串将被丢弃.

计算字符串以得到表达式EXECUTE.在下一步中,将执行该字符串.

所以EXECUTE 'create table ' || some_var || '(a int)';有两个步骤

  1. 计算表达式'create table ' || some_var || '(a int)'
  2. 例如,如果some_var是mytab,则执行命令create table mytab(a int)

当函数未在赋值语句中使用时,PERFORM语句用于函数调用.EXECUTE用于判断动态SQL——当运行时已知SQL命令的形式时.

Postgresql相关问答推荐

在Go中,如何在没有数据库包的情况下运行PostgreSQL查询?

docker-compose.yml用于使用postgres的spring-boot应用程序

Postgres 对 WHERE 子句并行使用两个索引

无法将 json 范围读取为 pgtype.Int4range

Postgres 14 反斜杠 Z 没有给出正确的输出

pgadmin db 限制服务器属性不起作用

如何将 grafana 与 Google Cloud SQL 集成

如何在 PSQL 中查找从另一个表继承的子表

postgresql 更新错误ERROR: invalid input syntax for type boolean:

如何查询存储在数组中的 Rails ActiveRecord 数据

Postgresql:在插入列时(或之前)自动小写文本

Postgres 类似于 SQL Server 中的 CROSS APPLY

获取全文搜索配置语言的完整列表

解释结果中的Recheck Cond是什么意思?

可以为空的列在 PostgreSQL 中是否会占用额外的空间?

PostGIS - 将多面体转换为单面体

判断 PostgreSQL 中的角色是否设置了密码

调用 getNextException 来查看原因:如何让 Hibernate / JPA 显示异常的数据库服务器消息

与 PostgreSQL 相比,为什么 Mysql 不需要真空?

Spring boot 无法使用 PostgreSQL 驱动程序加载 DataSource