gpt4 book ai didi

postgresql - 如何在不创建函数的情况下运行 plpgsql?

转载 作者:行者123 更新时间:2023-11-29 11:28:51 28 4
gpt4 key购买 nike

我想在不创建函数的情况下以编程方式在 Postgres 中运行 SQL。

原因:确保我的 plpgsql 事先工作,并在将查询提交给函数之前“解释分析”查询。

我是 Postgres 的新手,我认为这很简单。我在那里找不到任何例子。也许这是不可能的?下面的代码如何工作?

DO
$body$
DECLARE
v_name_short VARCHAR;
BEGIN

v_name_short := 'test Account 1';

RETURN QUERY
SELECT
a.name_short,
a.name_long
FROM enterprise.account a
WHERE
CASE WHEN v_name_short IS NOT NULL THEN
LOWER(a.name_short) = LOWER(v_name_short)
ELSE
1 = 1
END;
END;
$body$
LANGUAGE 'plpgsql';

同样,这里的目标是测试我的 SQL,在这种情况下,我想确保我的 CASE 语句仍在使用我创建的索引 (LOWER(name_short))。无论如何,我收到此错误消息:

ERROR: cannot use RETURN QUERY in a non-SETOF function

在 Postgres 中可以实现我的要求吗?如果没有,有没有办法在函数内查询分析计划?

最佳答案

匿名代码块返回 void。但是,您可以使用临时表的技巧,例如

CREATE TEMP TABLE IF NOT EXISTS trace (name_short text, name_long text);

DO
$body$
DECLARE
v_name_short VARCHAR;
BEGIN

v_name_short := 'test Account 1';

INSERT INTO trace
SELECT
a.name_short,
a.name_long
FROM enterprise.account a
WHERE
CASE WHEN v_name_short IS NOT NULL THEN
LOWER(a.name_short) = LOWER(v_name_short)
ELSE
1 = 1
END;
END;
$body$
LANGUAGE 'plpgsql';

SELECT * FROM trace;
-- DROP TABLE trace;

使用 EXPLAIN ANALYSE,您只能分析一个简单的 sql 查询,不能分析函数、do block 或脚本。所以你可以试试:

EXPLAIN ANALYSE
SELECT
a.name_short,
a.name_long
FROM enterprise.account a
WHERE
CASE WHEN 'test Account 1' IS NOT NULL THEN
LOWER(a.name_short) = LOWER('test Account 1')
ELSE
1 = 1
END;

请注意,在这种情况下,您不能使用变量,因为规划器无法识别它,请改用文字。

关于postgresql - 如何在不创建函数的情况下运行 plpgsql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38355720/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com