gpt4 book ai didi

postgresql - 错误 : type "execute" does not exist

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

我正在尝试编写一个 PL/PgSQL 函数,它将执行存储在 PostgreSQL 表中的查询,如下所示:

CREATE OR REPLACE FUNCTION evaluate_scenario(scenario_id int)
RETURNS TABLE(line_item_id int, organization_id int, data_element_id int, value varchar) AS $$
BEGIN
RETURN QUERY
SELECT
li.id,
li.organization_id,
de.id,
(EXECUTE 'SELECT ' || de.query)::varchar
FROM
line_items AS li INNER JOIN
summary_files AS sf ON li.summary_file_id = sf.id INNER JOIN
scenarios AS s ON s.summary_file_id = sf.id CROSS JOIN
data_elements AS de
WHERE
s.id = 1 AND
de.scope = 3 AND (
de.model_id = s.model_id OR
de.scenario_id = s.id OR
de.organization_id = s.organization_id
);
END;
$$ LANGUAGE plpgsql;

当我尝试运行此查询时:

从 evaluate_scenario(1) 中选择 line_item_id、data_element_id、value

我收到以下错误:

********** Error **********

ERROR: type "execute" does not exist
SQL state: 42704
Context: PL/pgSQL function "evaluate_scenario" line 3 at RETURN QUERY

如有任何帮助,我们将不胜感激。请注意,如果我删除“EXECUTE”并在这些括号内执行 SELECT de.query,我会按预期收到该列的值,但我无法弄清楚如何使 de.query 成为“EXECUTE”的可接受查询字符串".

最佳答案

EXECUTE 将查询字符串作为参数并执行它,但您不能嵌套 EXECUTE 在查询中。

plpgsql 中的 EXECUTE 有几个变体。对于您的情况,RETURN QUERY EXECUTE query可能是最好的。阅读手册。

这可能行得通 - 我并不是要解决所有问题,只是演示一个可行的示例。

CREATE OR REPLACE FUNCTION evaluate_scenario(_scenario_id int)
RETURNS TABLE(line_item_id int, organization_id int, data_element_id int, value varchar) AS
$func$

BEGIN
RETURN QUERY EXECUTE '
SELECT li.id,
li.organization_id,
de.id,
(SELECT '
|| (SELECT query
FROM data_elements
WHERE scenario_id = _scenario_id)
|| ')
FROM line_items AS li
JOIN summary_files AS sf ON li.summary_file_id = sf.id
JOIN scenarios AS s ON s.summary_file_id = sf.id
CROSS JOIN data_elements AS de
WHERE s.id = 1
AND de.scope = 3
AND (de.model_id = s.model_id OR
de.scenario_id = s.id OR
de.organization_id = s.organization_id
)';

END;
$func$ LANGUAGE plpgsql;

请注意,将文本文字作为代码执行是本质上不安全的。如果有人可以将 DROP * FROM tbl 或类似的东西偷运到表 data_elements 中,那你就有大麻烦了。我说的是 SQL injection .
bobby-tables.com 阅读有关 SQLi 的更多信息.

关于postgresql - 错误 : type "execute" does not exist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519548/

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