1

我想通过 PostgreSQL 中的 Pl/pgSQL 更新一行,但发生错误。这是我的代码:

CREATE OR REPLACE FUNCTION "Surrogate_Del"(tablename text, surro uuid)
  RETURNS void AS
$BODY$DECLARE
tblname text;
surrogate uuid;
BEGIN
tblname:=tablename;
surrogate:=surro;
execute 'UPDATE'||tblname||'SET ID=NULL WHERE surrogate='||surrogate|| ;
END$BODY$
LANGUAGE plpgsql

这是我要根据它更新记录的 UUID

*syntax Error »ab7«
cd32cdf0-5ab7-11e2-abda-1c4bd605a98d
                  ^*

我怎么解决这个问题?

4

2 回答 2

4

您需要在参数周围使用转义引号:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ''' || surrogate || '''';

mu 的建议更简洁、更可靠:

execute 'UPDATE ' || tblname || ' SET ID = NULL WHERE surrogate = ' || quote_literal(surrogate);

如果它是较新版本的 postgresql(我猜是 9.0+),您可以使用以下format功能:

execute format('UPDATE %I SET ID = NULL WHERE surrogate = %L', tblname, surrogate);

%L将其转义为 SQL 文字。

于 2013-01-09T17:32:24.593 回答
4

通常更好的方法是使用子句插入USING。这避免了强制转换的运行时开销text以及引用特殊字符可能带来的危险。

您也可以直接使用您的命名参数。声明和分配另一层局部变量没有意义:

CREATE OR REPLACE FUNCTION surrogate_del (_tblname text, _surro uuid)
   RETURNS void AS
$BODY$
BEGIN
   EXECUTE format('UPDATE %I SET ID = NULL WHERE surrogate = $1', _tblname)
   USING _surro;
END
$BODY$ LANGUAGE plpgsql

我还将您的函数名称转换为小写并删除了双引号。我个人的建议是永远不要在 PostgreSQL 中使用 CamelCase 标识符。那是痛苦的源泉。

在相关说明中:请记住以_tblname区分大小写的方式提供表名。format()quote_ident()逐字保留拼写。

于 2013-01-10T16:38:04.737 回答