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

4

我正在尝试从一个记录变量中选择一列,并在更新规则中调用一个函数,但出现了以下错误:

“无法在记录数据类型中识别列'name'”

以下是我产生错误的方法:

在更新规则内部:

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个回答

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

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 来说明这个效果。不过我怀疑这不是你想要的。
你可能本来就不需要在规则中使用临时表。你可能需要发布完整的设置……

嗨,Erwin,非常感谢您的回复。我相信您的建议对于一个情况会起作用,但我的问题是我有多个视图,每个视图都有自己的基础表,我想将我的函数应用于这些表。如果我将表指定为RecordVar的类型,我将不得不为每个表类型创建一个函数,而我希望避免这样做。抱歉我在原始问题中没有包含这些信息。 - user1545610
关于我的临时表的使用,我只是将它们用作从规则到我的函数中交换NEW和OLD的机制,因为您无法将数据类型记录传递给函数。如果有更好的方法可以从规则到函数中传递NEW和OLD,这样做可能会导致解决我的问题。我不明白的一件事是,为什么我可以在规则或触发器的上下文中使用NEW.<column name>,知道NEW是记录数据类型,但不能使用RecordVar.<column name>,尽管我已经从NEW的实例中填充了它。 - user1545610
我尝试了以下组合,结果出现了“记录类型未注册”或“无法将记录类型转换为<表>”: EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar::Table; EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING ROW(RecordVar.*)::Table; 我认为以下方式会起作用,但它也没有起作用: CREATE TEMPORARY TABLE YetAnotherTable (Like Table); INSERT INTO YetAnotherTable (SELECT * FROM TempTable); SELECT * FROM YetAnotherTable INTO RecordVar; EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar::YetAnotherTable; - user1545610

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接