我有以下(工作)代码,我从命令行运行:
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
我不想把它变成功能/存储过程。
有没有其他方法可以做到这一点?
答案 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
中新插入的行,不包括预先存在的行。
除此之外:username
是integer
列的奇数列名称。