在PL / pgSQL触发器函数中使用主机变量

时间:2013-05-28 19:09:10

标签: sql postgresql plpgsql embedded-sql

我试图弄清楚如何在PL / pgSQL中编写一个可以在嵌入式SQL / C程序中为主变量选择值的触发器函数。我是SQL的新手,所以如果我的术语有点过时,我道歉。基本上,在对表的更改时,我希望函数触发视图以更新存储在主变量中的值。

这是我创建并测试的视图:

EXEC SQL CREATE VIEW idfound AS SELECT id, num FROM newtable WHERE id = 1;

这是我使用主机变量dbID和dbNum调用视图的方式:

EXEC SQL SELECT * INTO :dbID, :dbNum FROM idfound;

这是我创建的触发器:

EXEC SQL CREATE idTrigger AFTER INSERT OR UPDATE ON newtable 
FOR EACH ROW EXECUTE PROCEDURE idFunc();

这是我想要使用的触发器功能:

EXEC SQL CREATE FUNCTION idFunc() RETURNS TRIGGER AS $idTrigger$
    BEGIN
    SELECT * INTO :dbID, :dbNum FROM idfound;
    END;
$idTrigger$ LANGUAGE plpgsql;

出于测试目的,我使用的是pgAdmin III。当我更改函数以执行不使用主机变量的任何操作(例如更新预定义行中的值)时,我可以看到它已创建。但是,我无法使用主机变量创建触发器或触发器功能。

现在,我只想弄清楚如何实现这一点,所以我知道我当前的代码实际上没有做太多。一般的想法是,我希望我的触发器函数调用在C中使用主机变量的预定义视图。如果有更好的方法来实现触发器,那么该建议也将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

触发器功能在服务器环境中执行,无法访问客户端环境的内存空间,无论是读取还是写入。这是客户端 - 服务器架构的基本点,因此没有解决方法,这是不可能的。

更接近可行的等效项可能是触发器NOTIFY和客户端LISTEN,并使用通知和相关的有效负载。