Выход из переменной PL / pgSQL - PullRequest
4 голосов
/ 21 февраля 2012

У меня есть триггер на 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;

Значения NEW.rsocial могут быть, например: Служба Томми . Если я выключу триггер, запись будет сохранена правильно (в таблице other в разделе Клиенты), потому что я экранирую строку в PHP с помощью функции pg_escape_string. Вопрос в том, как убежать NEW.rsocial, чтобы запустить триггер?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2012

Функции quote_literal и quote_nullable могут быть полезны. Но помните, что это функции PostgreSQL, поэтому убедитесь, что другая сторона DBLINK понимает результат.

Вы также можете взглянуть на эту часть документов:

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

EDIT

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) || ');');

И обратите внимание на измененный номер ' в конкатенации строк.

1 голос
/ 29 августа 2018

Хотя на этот пост уже есть принятый ответ, я бы предложил использовать функцию FORMAT :

FORMAT(E'%s', YOUR_VARIABLE)

...