2016-12-23 37 views
1

我有我的命令行运行下面的(工作)代码.sql文件返回值:如何从使用匿名DO

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

不能从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只计算新插入的行,但不包括预 - 现有的行。

除了:username是用于integer列的奇数列名。