将使用 prepare 语句的动态查询的输出保存到 table
Saving the output of a dynamic query that uses prepare statement into a table
继续 (@Erwin Brandstetter 的解决方案),其中使用 a 'prepare' 语句的动态 SELECT 查询 被创建,然后被调用执行,如下:
--准备语句的函数:
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;
--调用:
BEGIN; -- optional
SELECT f_prep_query('dkj_p_k27ac'::regclass, 'enri'::text);
EXECUTE stmt_dyn;
我想请教以下问题:
我们从指定过程中获得的所需输出被输出到 DataOutput 中。
我想找到一种方法将数据存储到数据库中的新 table 中。
通常,如果您只想写入 table,请不要使用准备好的 SELECT
语句(或游标)。就此目的而言,效率非常低。
直接写到 table,就像前面的回答中解释的那样:
完整的INSERT
可以成为准备好的语句。但不是 CREATE TABLE AS
。 Per documentation:
Any SELECT
, INSERT
, UPDATE
, DELETE
, or VALUES
statement.
继续
--准备语句的函数:
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;
--调用:
BEGIN; -- optional
SELECT f_prep_query('dkj_p_k27ac'::regclass, 'enri'::text);
EXECUTE stmt_dyn;
我想请教以下问题: 我们从指定过程中获得的所需输出被输出到 DataOutput 中。 我想找到一种方法将数据存储到数据库中的新 table 中。
通常,如果您只想写入 table,请不要使用准备好的 SELECT
语句(或游标)。就此目的而言,效率非常低。
直接写到 table,就像前面的回答中解释的那样:
完整的INSERT
可以成为准备好的语句。但不是 CREATE TABLE AS
。 Per documentation:
Any
SELECT
,INSERT
,UPDATE
,DELETE
, orVALUES
statement.