从记录变量中选择列(PostgreSQL 8.4)

时间:2012-07-23 11:28:38

标签: function postgresql variables record rule

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

'无法识别记录数据类型“

中的列”名称“

以下是我正在做的产生错误的内容:

在更新规则中:

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;

注意:我意识到有更简单的方法来实现上述代码的实现,但我已经简化了实际的实现,专注于我遇到的问题,这已经开辟了其他可能的解决方案,但我真的喜欢尽可能使上面的代码工作。

2 个答案:

答案 0 :(得分:4)

我只是想通了。我不是将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";

答案 1 :(得分: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来澄清效果。我怀疑这是你想要的。

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