转义一个PL/pgSQL变量

4

我有一个 PostgreSQL 9 上的触发器,如下所示:

CREATE OR REPLACE FUNCTION clients_update_billingdata_trigger()
RETURNS trigger AS
$BODY$
DECLARE
  columnsUpdate  TEXT;
BEGIN
   columnsUpdate := '';

   IF (NEW.rsocial IS DISTINCT FROM OLD.rsocial) THEN
      columnsUpdate := columnsUpdate || 'RSocial before: ' || OLD.rsocial || '. RSocial after: ' || NEW.rsocial || E'\n';
   END IF;

   IF (NEW.legalidentifier IS DISTINCT FROM OLD.legalidentifier) THEN
      columnsUpdate := columnsUpdate || 'ILegal before: ' || OLD.legalidentifier || '. ILegal after: ' || NEW.legalidentifier || E'\n';
   END IF;

   [...]

   IF (columnsUpdate != '') THEN
      SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx',
                          'INSERT INTO BillingDataUpdate (client_id, columnsupdate)
                           VALUES (''' || NEW.idclient || ''', ''' || columnsUpdate || ''');');
   END IF;
   RETURN NEW;
 END;
 $BODY$
 LANGUAGE plpgsql;
< p > NEW.rsocial 的值可以是例如:Tommy's service。如果我关闭触发器,则记录会被正确保存(在other表中,客户端)因为我使用pg_escape_string函数在PHP中转义字符串。问题是,如何转义NEW.rsocial以运行触发器?

提前致谢。

2个回答

4

函数quote_literalquote_nullable可能会很有用。但要注意,这些是PostgreSQL函数,因此请确保DBLINK的另一侧能够理解结果。

您还可以查看文档的此部分:

http://www.postgresql.org/docs/9.1/interactive/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE

编辑

quote_xyz 不应用于 rsocial 的用法,而应用于 dblink_exec

  SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx',
                      'INSERT INTO BillingDataUpdate (client_id, columnsupdate) '
                       || 'VALUES (' || quote_nullable(NEW.idclient) || ', ' 
                       || quote_nullable(columnsUpdate) || ');');

请注意字符串拼接中 ' 数量的变化。

谢谢@A.H.,但在提问之前我已经测试了这些函数,但是它们“不起作用”。 - doctore
@doctore:您能澄清一下吗:您究竟尝试了什么,出现了什么错误?提供代码和示例会更有帮助。 - A.H.
1
@doctore:"不工作" 不是有效的 Postgres 错误消息。 - user330315
@doctore:同样重要的是要知道dblink的另一端是什么数据库。是PostgreSQL吗?还是其他什么? - A.H.
错误:引号中的字符字符串在“'previous RSocial: test. RSocial new: rsocial test'');”附近是不确定的。 上下文:在名为“unnamed”的dblink连接上发生错误:无法执行命令。在这种情况下,RSocial = rsocial test'。 - doctore
显示剩余5条评论

2
尽管这篇文章已经有了一个被接受的答案,我建议使用FORMAT函数:(参考链接)FORMAT(E'%s', YOUR_VARIABLE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接