PL/pgSQL执行vs执行

Guy*_*y s 15 postgresql plpgsql

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

从手册:

有时,评估表达式或SELECT查询但丢弃结果很有用,例如在调用具有副作用但没有有用结果值的函数时.要在PL/pgSQL中执行此操作,请使用PERFORM语句.

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

perform 'create table foo as (select 1)';
Run Code Online (Sandbox Code Playgroud)

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

我想我有一件事是正确的:为了运行我可以使用的函数:

perform pg_temp.addInheritance(foo);
Run Code Online (Sandbox Code Playgroud)

Pav*_*ule 21

PERFORM是用于调用void函数的plpgsql命令.PLpgSQL对无用SELECT语句很谨慎 - 不允许使用SELECTwithout INTO子句.但有时您需要调用函数而不需要存储结果(或者函数没有任何结果).函数in SQLSELECTcall语句调用.但是在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;
$$;
Run Code Online (Sandbox Code Playgroud)

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命令的一种形式在运行时是已知的.


Vao*_*sun 5

您引用的文档中的下一行:

这将执行查询并丢弃结果。编写查询的方式与编写SQL SELECT命令的方式相同,只是将初始关键字SELECT替换为PERFORM。

重点矿

execute 依次执行动态查询(与上述相同的文档)