在那里,我对PL/pgSQL很陌生,我正在从事的项目开始将它用于一些数据密集型处理实现,我没有理解一些基本的基础,甚至一遍又一遍地检查文档。
所以我有一个函数看起来是这样的:
CREATE OR REPLACE FUNCTION sum_stuff_over_value(
param1 uuid,
param2 uuid,
param3 enum
)
RETURNS float AS
$$
DECLARE
table_name varchar;
column_name varchar;
resolution integer;
another_table varchar := 'name_of_another_table';
another_column varchar := 'name_of_another_column';
sum float;
BEGIN
-- Get data from another table fiven a param2 ID
SELECT * INTO table_name, column_name, esolution
FROM get_table_and_column_by_Id(param2, param3);
-- Sum table column over region
EXECUTE format(
'SELECT sum(grid_mat.%I * grid_def.%I)
FROM
get_uncompact_region($1, $2) region
INNER JOIN %I grid_mat ON grid_mat.index = region.index
INNER JOIN %I grid_def ON grid_def.index = region.index;
', column_name, another_column, table_name, another_table)
USING param1, resolution
INTO sum;
RETURN sum;
END;
$$
LANGUAGE plpgsql;我可以说我相当理解非常基本的流程,实例化的vars,其中一些被分配,等等.
我最挣扎的是理解哪个值持有%I,以及在这里如何
INNER JOIN %I grid_mat ON grid_mat.index = region.index
INNER JOIN %I grid_def ON grid_def.index = region.index;%I保存(我相信)不同的值来连接不同的表
我试图通过提高打印值的注意来解决这个问题,但我无法让它发挥作用。我正在尝试添加一些断点来调试DB中隔离的这个断点,但由于它对我来说并不简单
有人能帮我理解这是怎么回事吗?
提前谢谢
发布于 2022-03-14 07:18:21
您应该阅读format的文档。第一个%I将被format (column_name)的第二个参数的值替换,转义为标识符,第二个%I将被another_column的值所取代,依此类推。
发布于 2022-03-14 07:45:19
来自https://www.postgresql.org/docs/14/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW。
关于部分:示例43.1。引用动态查询中的值
引用:
还可以使用format函数安全地构造
动态SQL语句(,参见9.4.1节)。例如:
执行格式(‘UPDATE tbl SET %I = %L’‘其中key = %L',colname,newvalue,keyvalue);
节9.4.1链接::来自节9.4.1的https://www.postgresql.org/docs/14/functions-string.html#FUNCTIONS-STRING-FORMAT引用
类型(必需)用于生成格式说明符输出的格式转换类型。支持下列类型:
S将参数值格式化为简单字符串。空值被视为空字符串。
我将参数值作为SQL标识符,必要时双引用.值为null (等效于quote_ident)是一个错误。
L引用参数值作为SQL文本。空值显示为字符串NULL,没有引号(等效于quote_nullable)。有一些例子,引用如下:
SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
Result: INSERT INTO "Foo bar" VALUES('O''Reilly')最后解释:您的执行格式字符串有4 %I。然后
1 %I指的是column_name
2 %I指的是another_column
3 %I指的是table_name
4 %I指的是another_table
https://stackoverflow.com/questions/71463835
复制相似问题