Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 从C中,获取行作为有效负载的Postgres通知_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 从C中,获取行作为有效负载的Postgres通知

Postgresql 从C中,获取行作为有效负载的Postgres通知,postgresql,plpgsql,Postgresql,Plpgsql,我试图创建一个postgres函数,它向我的C代码发送一个通知,其中有效负载字符串是表中某一行的当前值 C端没有问题。我有这样的想法: // postgres setup ... PGnotify *notify = PQnotifies(conn) printf("Notification: '%s'\n", notify->extra); 我希望打印这样的内容:通知:MyTable{ID:123,值:9,状态:false} 在Postgres方面,我可以使用JSON获取特定的行 s

我试图创建一个postgres函数,它向我的C代码发送一个通知,其中有效负载字符串是表中某一行的当前值

C端没有问题。我有这样的想法:

// postgres setup ...
PGnotify *notify = PQnotifies(conn)
printf("Notification: '%s'\n", notify->extra); 
我希望打印这样的内容:通知:MyTable{ID:123,值:9,状态:false}

在Postgres方面,我可以使用JSON获取特定的行

select row_to_json(row) 
from (
    SELECT * FROM "MyTable" WHERE "MyTable"."ID"=123
) row;
但我不知道如何在函数中实现这一点,并将select的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转换为文本,但我不确定如何实现这一点


感谢您的帮助,谢谢

显然,我需要在它自己的块中声明变量。我猜它自己处理文本转换。此外,我还必须将perform添加到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文档,发现我需要这样做:

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; 
$$;

你也可以分享你的C代码吗?