4

我正在尝试从我从更新规则调用的函数中的记录变量中选择一列,并收到以下错误:

'无法识别记录数据类型中的列“名称”'

以下是我为产生错误所做的事情:

从更新规则中:

SELECT * INTO TEMPORARY TABLE TempTable FROM NEW;
SELECT MyFunction();

从 MyFunction() 内部

DECLARE RecordVar Record;
SELECT * INTO STRICT RecordVar FROM TempTable;
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar;

注意:我意识到有更简单的方法可以实现上述代码的实现,但我已经简化了实际实现以专注于我遇到的问题,这开辟了其他可能的解决方案,但我真的很想得到如果可能的话,上面的代码可以工作。

4

2 回答 2

4

我刚刚想通了。我没有将来自 NEW 的列插入到临时表中,而是将 NEW 记录作为单列插入到临时表中,并在我的函数中将其称为 RecordVar."NEW"。我的规则和功能现在看起来像这样:

从更新规则中:

SELECT NEW AS "NEW" INTO TEMPORARY TABLE TempTable;
SELECT MyFuction();

从 MyFunction() 内部

DECLARE RecordVar Record;
SELECT * INTO STRICT RecordVar FROM TempTable;
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar."NEW";
于 2012-07-25T00:16:49.383 回答
2

第二部分可以这样工作:

DO
$BODY$
DECLARE
   RecordVar TempTable;
BEGIN
   SELECT * INTO STRICT RecordVar FROM TempTable LIMIT 1;
   EXECUTE 'UPDATE AnotherTable  SET column = $1.name'
   USING RecordVar;
END;
$BODY$

请注意我如何使用表名作为类型。PostgreSQL 自动为系统中的每个表创建一个复合类型。

一个变量保存一行,SELECT可以返回多行。除第一个之外的所有内容都将被丢弃。我添加LIMIT 1以澄清效果。我怀疑那是你想要的。

一开始您可能不必在规则中使用临时表。您可能想发布您的完整设置...

于 2012-07-23T13:06:50.543 回答