2012-07-20 48 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