我只是敲了一個快速的方法來做到這一點。它僅適用於單行,所以我創建了一個臨時視圖,它只選擇我想要的行,然後用我想要插入的實際表替換pg_temp.temp_view。因此
CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text)
RETURNS text AS
$BODY$
DECLARE
selquery text;
valquery text;
selvalue text;
colvalue text;
colrec record;
BEGIN
selquery := 'INSERT INTO ' || quote_ident(p_schema) || '.' || quote_ident(p_table);
selquery := selquery || '(';
valquery := ' VALUES (';
FOR colrec IN SELECT table_schema, table_name, column_name, data_type
FROM information_schema.columns
WHERE table_name = p_table and table_schema = p_schema
ORDER BY ordinal_position
LOOP
selquery := selquery || quote_ident(colrec.column_name) || ',';
selvalue :=
'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' ||
' THEN ''NULL''' ||
' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' ||
' END' ||
' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table);
EXECUTE selvalue INTO colvalue;
valquery := valquery || colvalue || ',';
END LOOP;
-- Replace the last , with a)
selquery := substring(selquery,1,length(selquery)-1) || ')';
valquery := substring(valquery,1,length(valquery)-1) || ')';
selquery := selquery || valquery;
RETURN selquery;
END
$BODY$
LANGUAGE plpgsql VOLATILE;
調用:
SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data')
from pg_stat_activity
where procpid = pg_backend_pid()
我沒有反對注入式攻擊測試此,請讓我知道,如果通話的quote_nullable不足以說。
此外,它只適用於可以簡單地轉換爲:: text和返回的列。
另外這是Greenplum,但我想不出它爲什麼不能在Postgres,CMIIW上工作的原因。
您可以跳過INSERT語句,並直接在數據庫之間使用SELECT進行復制。http://albertech.blogspot.com/2016/11/dump-table-to-another-database-in.html – jar
PostgreSQL無法選擇跨數據庫。至少,舊版本不能,Greenplum也不能,也不知道9.x. – PhilHibbs