2012-07-20 91 views
1

我有一个Postgresql PL/pgSQL函数,它具有双重嵌套的FOR循环,我想在其中动态设置列名称。但是我找不到以编程方式访问RECORD列的方式。动态更改PL/pgSQL RECORD列的值

我会直接跳到一个例子一些代码:

FOR loop_helper1 IN SELECT 
    id, name1, name2, name3, nameN, 
    FROM table1 
    LOOP 
    FOR loop_helper2 IN SELECT name FROM table2 LOOP 
     -- I want to set values of columns in loop_helper1, 
     -- with the column name given by loop_helper2.name 
     -- An EXECUTE would not allow me to do this: 
     EXECUTE 'loop_helper1.' || loop_helper2.name || ':= function_call(123);' 
     -- (Eg. 'loop_helper1.name2 := function_call(123);') 
     -- However, this produces: ERROR: syntax error at or near "loop_helper1" 
    END LOOP; 
END LOOP; 

任何想法?

当然,有一种方法可以做到这一点,但我似乎无法找到它。所有的帮助和建议表示赞赏。谢谢。

回答

1

我想你可能需要我们根据this related question设计的功能。
有了这个功能,你的代码片段可能是这样的:


FOR loop_helper1 IN 
    SELECT id, name1, name2, name3, nameN, 
    FROM table1 
LOOP 
    FOR loop_helper2 IN 
     SELECT name 
     FROM table2 
    LOOP 
     loop_helper1 := public.setfield (loop_helper1 ,loop_helper2.name ,function_call(123)); 
    END LOOP; 
END LOOP; 

可能有更简单的方法,特别是如果你想分配一个整体复合型...

+0

谢谢!有趣的阅​​读。 – ptrn 2012-07-20 19:19:04

+0

对于新读者来说:使用'hstore'扩展(PG 9.0)或使用PG 9.3/9.4附带的新内置'json'函数,可以更简单快速地完成此操作。新的解决方案(和基准)被添加到@Erwin的问题链接到:http://stackoverflow.com/a/28673097/1914376 – 2015-03-15 16:18:55