首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解PLPGSQL基础

了解PLPGSQL基础
EN

Stack Overflow用户
提问于 2022-03-14 06:41:29
回答 2查看 50关注 0票数 0

在那里,我对PL/pgSQL很陌生,我正在从事的项目开始将它用于一些数据密集型处理实现,我没有理解一些基本的基础,甚至一遍又一遍地检查文档。

所以我有一个函数看起来是这样的:

代码语言:javascript
复制
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,以及在这里如何

代码语言:javascript
复制
INNER JOIN %I grid_mat ON grid_mat.index = region.index
INNER JOIN %I grid_def ON grid_def.index = region.index;

%I保存(我相信)不同的值来连接不同的表

我试图通过提高打印值的注意来解决这个问题,但我无法让它发挥作用。我正在尝试添加一些断点来调试DB中隔离的这个断点,但由于它对我来说并不简单

有人能帮我理解这是怎么回事吗?

提前谢谢

EN

回答 2

Stack Overflow用户

发布于 2022-03-14 07:18:21

您应该阅读format的文档。第一个%I将被format (column_name)的第二个参数的值替换,转义为标识符,第二个%I将被another_column的值所取代,依此类推。

票数 1
EN

Stack Overflow用户

发布于 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.1https://www.postgresql.org/docs/14/functions-string.html#FUNCTIONS-STRING-FORMAT引用

类型(必需)用于生成格式说明符输出的格式转换类型。支持下列类型:

S将参数值格式化为简单字符串。空值被视为空字符串。

将参数值作为SQL标识符,必要时双引用.值为null (等效于quote_ident)是一个错误。

L引用参数值作为SQL文本。空值显示为字符串NULL,没有引号(等效于quote_nullable)。有一些例子,引用如下:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71463835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档