2017-01-05 8 views
0

Я пытаюсь создать функцию postgres, которая отправляет уведомление моему C-коду, где строка полезной нагрузки является текущим значением строки в таблице.Из C, получить сообщение Postgres с номером как полезной нагрузкой

Сторона С не представляет проблемы. У меня есть что-то вроде этого:

// postgres setup ... 
PGnotify *notify = PQnotifies(conn) 
printf("Notification: '%s'\n", notify->extra); 

Я хочу, чтобы напечатать что-то вроде: Notification: MyTable{"ID":123,"Value":9,"Status":false}.

На стороне Postgres вещей, я могу получить определенную строку как JSON с

select row_to_json(row) 
from (
    SELECT * FROM "MyTable" WHERE "MyTable"."ID"=123 
) row; 

Но я не могу понять, как это сделать в рамках функции и сохранить результат в формате JSON в том, что выбрать, чтобы локальная переменная. Я хотел бы ожидать следующие работы ...

do language plpgsql $$ 
begin 
    myjson := (select row_to_json(row) from (SELECT * FROM "MyTable" WHERE "MyTable"."ID"=123) row); 
    -- myrow := ... somehow convert myjson to text ... 
    -- pg_notify('mychannel', mytable || myrow); 
end; 
$$; 

... но я получаю ошибку «myjson не является известной переменной». Мой postgres fu слаб, поэтому я уверен, что это простая синтаксическая ошибка, но я не могу понять это. Я попробовал «выбрать», но не смог заставить его работать.

Кроме того, вы можете видеть из прокомментированных строк, что я намерен каким-то образом преобразовать этот json в текст, но я не уверен, как это сделать.

Любая помощь приветствуется, спасибо!

ответ

0

По-видимому, мне нужно было объявить переменную в ее собственном блоке. Я предполагаю, что он обрабатывает преобразование текста самостоятельно. Кроме того, мне пришлось добавить выполнение команды notify, чтобы она не жаловалась на неиспользованный результат. Это то, что я закончил с:

do language plpgsql $$ 
declare 
    mytable := "MyTable" 
    myjson text; 
begin 
    myjson := (select row_to_json(row) from (SELECT * FROM "MyTable" WHERE "MyTable"."ID"=123) row); 
    perform pg_notify('mychannel', mytable||myjson); 
end; 
$$; 

Для того, чтобы использовать переменную MyTable в запросе, я в конечном итоге, глядя на документацию Postgres на Executing Dynamic Commands и выяснить, что мне нужно сделать это так:

do language plpgsql $$ 
declare 
    mytable := "MyTable" 
    myjson text; 
begin 
    EXECUTE 
    format('(select row_to_json(row) from (SELECT * FROM %I WHERE %I."ID"=101) row);', mytable, mytable) 
    INTO myjson; 
    perform pg_notify('mychannel', mytable||myjson); 
end; 
$$;