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;