postgresql - 如何在 PostgreSQL 中用很少的 INOUT 参数消除对函数的多次调用

标签 postgresql inout

我将代码从 Oracle 移植到 PosgreSQL(经典,Carl)。 我发现我的函数调用了 3 次,我做了这个简单的例子: 请看我的例子:

create function trak_test001(inout int,inout int, inout int)
AS
$BODY$
<<trak_test001>>
DECLARE
  x ALIAS FOR $1;
  y ALIAS FOR $2;
  z ALIAS FOR $3;

BEGIN
  Raise DEBUG  'trak_test001 FOR x=% y=% z=% ',x,y,z;
  x:=x+1;
  y:=y+1;
  z:=z+1;
END trak_test001;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;

create function trak_test002()
RETURNS void
AS
$BODY$
<<trak_test002>>
DECLARE
  x int default 0;
  y int default 0;
  z int default 0;

BEGIN
  Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
 SELECT (trak_test001(x,y,z)).* INTO x,y,z;
    Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
END trak_test002;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;

SELECT trak_test002();

然后得到下一个调试输出:

DEBUG:  trak_test002 FOR x=0 y=0 z=0
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test002 FOR x=1 y=1 z=1
Total query runtime: 56 msec

所以这是一个问题:为什么我的函数调用了 3 次以及如何避免这种情况? 谢谢。

最佳答案

我是个笨蛋。使用多个 INOUT 参数调用函数的正确方法是:

create function trak_test002()
RETURNS void
AS
$BODY$
<<trak_test002>>
DECLARE
  x int default 0;
  y int default 0;
  z int default 0;

BEGIN
  Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
 SELECT * INTO x,y,z FROM trak_test001(x,y,z);
    Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
END trak_test002;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;

关于postgresql - 如何在 PostgreSQL 中用很少的 INOUT 参数消除对函数的多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35995445/

相关文章:

django - celery 和 transaction.atomic

postgresql - PostgreSQL 有类似Cassandra keyspace 的特性吗?

postgresql - pg_terminate_backend 在循环中不起作用

sql - 针对数百万行的 PostgreSQL 查询在 UUID 上需要很长时间

swift - 替换参数字符串中的字符

swift - 在实例函数中初始化实例变量

SQL:使用连接过滤数据不好吗?

MySQL 存储过程参数

python - SWIG 输入类型(C++ 到 Python)

swift - "implicit conversion from <tuple type> to <tuple type 2> requires a temporary"将元组作为 inout 参数传递时出错