2015-01-08 41 views
0

繼續執行a previous case(@Erwin Brandstetter的解決方案),其中使用「準備」語句的動態SELECT查詢已創建,然後是將使用準備語句的動態查詢的輸出保存到表中

--the功能使得準備的語句:

CREATE OR REPLACE FUNCTION f_prep_query (_tbl regclass, _prefix text) 
    RETURNS void AS 
$func$ 
DECLARE 
    _prep_qry text := (
    SELECT 'PREPARE stmt_dyn AS SELECT ' 
     || string_agg(quote_ident(attname), ',' ORDER BY attname) 
     || ' FROM ' || _tbl 
     FROM pg_attribute 
     WHERE attrelid = _tbl 
     AND attname LIKE _prefix || '%' 
     AND attnum > 0 
     AND NOT attisdropped 
    ); 
BEGIN 
    EXECUTE _prep_qry; 
EXCEPTION WHEN duplicate_prepared_statement THEN 
    DEALLOCATE stmt_dyn; 
    EXECUTE _prep_qry; 
END 
$func$ LANGUAGE plpgsql; 

--the電話:

BEGIN; -- optional 
SELECT f_prep_query('dkj_p_k27ac'::regclass, 'enri'::text); 
EXECUTE stmt_dyn; 
通過調用它,如下執行

我想問問以下問題: 我們從指示的過程中獲得的所需輸出被輸出到DataOutput中。 我想找到一種方法將數據存儲到數據庫中的新表中。

回答

1

通常,如果您只想寫入表格,請不要使用準備好的SELECT語句(或遊標)。這就是非常低效的的目的。

寫入表直接像在以前的答案解釋:

完整INSERT可能準備好的聲明。但不是CREATE TABLE ASPer documentation:

任何SELECTINSERTUPDATEDELETE,或VALUES聲明。

+0

我明白了,所以'準備好'的解決方案似乎在這方面相當有限,而'refcursor'解決方案確實使我們能夠創建一個新表格(這是原始計劃的一部分)。 「準備」僅限於INSERT,UPDATE和DELETE,有點奇怪,因爲它以某種方式降低其功能。我們之前完成的任務背後的全部想法是生成一個只包含選定列數的子表,我們不希望明確地預先定義,但是評估者依賴於它們的共享前綴。 – Roy

+0

我們在這裏使用'prepared'select語句,因爲它是如何執行動態SELECT語句的解決方案之一。整個過程似乎工作正常,因爲我們在這裏闡述:stackoverflow.com/questions/27831796/...和這裏:http://stackoverflow.com/questions/27824725/use-text-output-from-a-function-as-新的查詢/ 27830985#27830985 – Roy

+0

斷開的鏈接導致用例的正確解決方案:http://stackoverflow.com/questions/27831796/saving-the-output-of-a-dynamic-query-that-uses -refcursor-into-a-table要***動態創建***表,遊標和預準備語句都不是很好的工具。 –