Postgresql 错误:键入;执行;不存在
我正在尝试编写PL/PgSQL函数,该函数将执行存储在PostgreSQL表中的查询,如下所示:Postgresql 错误:键入;执行;不存在,postgresql,plpgsql,Postgresql,Plpgsql,我正在尝试编写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,
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;
当我尝试运行此查询时:
从评估场景(1)中选择行项目id、数据元素id、值
我收到以下错误:
********** Error **********
ERROR: type "execute" does not exist
SQL state: 42704
Context: PL/pgSQL function "evaluate_scenario" line 3 at RETURN QUERY
任何帮助都将不胜感激。请注意,如果我删除“EXECUTE”并在这些参数中选择de.query,我将按预期接收该列的值,但我无法确定如何使de.query成为“EXECUTE”的可接受查询字符串。
EXECUTE
将查询字符串作为参数并执行它,但是您不能在查询中嵌套执行
plpgsql中的EXECUTE
有两个变体。对你来说,这可能是最好的。阅读手册
这是可行的——我并不是在试图修复所有的混乱,只是演示一个工作示例
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;
请注意,将文本文本作为代码执行本质上是不安全的。如果有人可以将tbl中的DROP*或类似的内容偷偷地放入表data\u元素中
,那么您就有大麻烦了。我说的是。
阅读有关SQLi的更多信息。谢谢,我熟悉SQL注入,但这些查询是由服务器根据excel样式的公式生成的,因此,在那里可以出现的唯一查询类型是由解析代码的AST遍历发出的查询,所有这些查询都是安全的。