Postgresql EXECUTE的Format()格式中整数变量的格式说明符?

Postgresql EXECUTE的Format()格式中整数变量的格式说明符?,postgresql,plpgsql,dynamic-sql,string-concatenation,Postgresql,Plpgsql,Dynamic Sql,String Concatenation,上述功能中存在两个问题: parent\u id是integer但它被引号替换了吗?int变量的正确格式说明符是什么 选择进入不与执行一起工作?如何使用传递的表名进行上述注释查询 对字符串使用%s%I用于标识符: CREATE OR REPLACE FUNCTION getParentLtree(parent_id bigint, tbl_name varchar) RETURNS ltree AS $BODY$ DECLARE parent_ltree ltree; BEGIN -

上述功能中存在两个问题:

  • parent\u id
    integer
    但它被引号替换了吗?
    int
    变量的正确格式说明符是什么
  • 选择进入
    不与执行一起工作?如何使用传递的表名进行上述注释查询

  • 对字符串使用
    %s
    <代码>%I用于标识符:

    CREATE OR REPLACE FUNCTION getParentLtree(parent_id bigint, tbl_name varchar) 
      RETURNS ltree AS
    $BODY$
    DECLARE
       parent_ltree ltree;
    BEGIN
    -- This works fine:
    -- select into parent_ltree l_tree from tbl1 where id = parent_id;
    
    EXECUTE format('select into parent_ltree l_tree from %I
                    where id = %I', tbl_name,parent_id);
    
    RETURN parent_ltree;
    END;
    $BODY$ LANGUAGE plpgsql;
    

    PL/pgSQL的
    选择进入
    与Postgresql的
    选择进入
    不同。改为使用
    创建表作为

    select format('select into parent_ltree l_tree from %I  where id = %s', 'tbl1', 1);
                             format                          
    ---------------------------------------------------------
     select into parent_ltree l_tree from tbl1  where id = 1
    

    提示:注意,SELECT with INTO的这种解释与PostgreSQL的常规SELECT INTO命令大不相同,其中INTO目标是一个新创建的表。如果要从PL/pgSQL函数内的SELECT结果创建表,请使用create table。。。作为选择

    execute
    语句中选择一个变量,请执行以下操作:

    create table parent_ltree as 
    select l_tree 
    from tbl1
    where id = 1
    

    这将更短、更快、更安全:

    EXECUTE format('select l_tree from %I where id = %s', tbl_name,parent_id) 
    into parent_ltree;
    
    为什么?
    • 最重要的是,使用参数值。不要将它们转换为
      文本
      ,将它们连接起来并重新解释。这将更加缓慢,并且容易出错

    • 通常情况下,您会使用表名等标识符。不过,还有一个更好的方法:使用一个。此处的详细信息:

    • 使用一个简单的方法来简化代码。性能是一样的

    • 不要在Postgres中使用未加引号的驼峰大小写标识符,如
      getParentLtree


    感谢回复,%s是正确的类型说明符,适用于问题1,但对于问题2,结果只是一个值而不是一个集合,因为在这种情况下id是唯一的,我们如何将其读入变量而不是表中?这同样适用,非常感谢!总结您的解决方案1.%s表示标识符2。应该在格式化函数外使用。太好了!,它更好,不知道两个答案是否可以接受。will使用所有建议,CaMel case是我的错误,只是出于习惯,我知道postgres会使用小写,使用引号只会让事情变得更糟。在你的select语句中$1是什么意思?@RonaldDas:这是using子句提供的第一个值的参数。请按照第一个链接了解详细信息。
    CREATE OR REPLACE FUNCTION get_parent_ltree(parent_id bigint, tbl_name regclass
                                              , OUT parent_ltree ltree) AS
    $func$
    BEGIN
    
    EXECUTE format('SELECT l_tree FROM %s WHERE id = $1', tbl_name)
    INTO  parent_ltree
    USING parent_id;
    
    END
    $func$ LANGUAGE plpgsql;