如何从使用匿名DO的.sql文件返回值

时间:2016-12-23 21:53:25

标签: postgresql plpgsql

我有以下(工作)代码,我从命令行运行:

DO $$
DECLARE first_ext INTEGER;
        last_ext INTEGER;
BEGIN
   first_ext:=100;
   last_ext:=150;

   INSERT INTO widgets (username)
   SELECT i
   FROM generate_series(first_ext, last_ext) AS t(i);

   INSERT INTO widget2
   SELECT generate_series(first_ext, last_ext), 'sometext', 
          generate_series(first_ext, last_ext);
END $$;

我现在想对两张桌子进行统计,以确保我已正确创建数据。
但是我很难回归这个价值。这就是我试过的:

RETURNS rec_count AS
DO $$
DECLARE first_ext INTEGER;
        last_ext INTEGER;
BEGIN
   first_ext:=100;
   last_ext:=150;

   INSERT INTO widgets (username)
   SELECT i
   FROM generate_series(first_ext, last_ext) AS t(i);

   INSERT INTO widget2
   SELECT generate_series(first_ext, last_ext), 'sometext', 
          generate_series(first_ext, last_ext);

   SELECT COUNT(*) FROM widget2 INTO rec_count;
END $$;

但它失败并出现以下错误:

ERROR:  syntax error at or near "RETURNS" LINE 1: RETURNS rec_count AS

我不想把它变成功能/存储过程。
有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

您无法从DO语句返回值。有各种解决方法:

但为什么不创建临时功能?

CREATE FUNCTION pg_temp.f_dummy(OUT rec_count bigint) AS
$func$
DECLARE
   first_ext int := 100;  -- assign at declaration time
   last_ext  int := 150;
BEGIN
   INSERT INTO widgets (username)
   SELECT i
   FROM   generate_series(first_ext, last_ext) i;

   INSERT INTO widget2(col_a, col_b, col_c)  -- column names !?
   SELECT i, 'sometext', i
   FROM   generate_series(first_ext, last_ext) i;  -- do not call it twice

   SELECT COUNT(*) FROM widget2 INTO rec_count;  -- counts *all* rows in widget2
END
$func$  LANGUAGE plpgsql;

呼叫:

SELECT pg_temp.f_dummy();

仅在当前会话中可见;在会话结束时像所有临时对象一样死亡。

或者只使用带有数据修改CTE的单个SQL语句和RETURNING子句:

WITH ins1 AS (
   INSERT INTO widgets (username)
   SELECT i
   FROM   generate_series(100, 150) i  --  enter number here *once*
   RETURNING username
   )
, ins2 AS (
   INSERT INTO widget2(username, txt, some_int)
   SELECT username, 'sometext', username
   FROM   ins1
   RETURNING widget2.username
   )
SELECT count(*) FROM ins2;

仅计算widget2中新插入的行,不包括预先存在的行。

除此之外:usernameinteger列的奇数列名称。