Skip to content

Instantly share code, notes, and snippets.

@rjchicago
Created May 9, 2022 15:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rjchicago/c69c772f62ebc69368ef29c0b1da2e7f to your computer and use it in GitHub Desktop.
Save rjchicago/c69c772f62ebc69368ef29c0b1da2e7f to your computer and use it in GitHub Desktop.
Postgres Import Table Function
CREATE OR REPLACE FUNCTION "my_schema"."import_table" (fdw_server text, tablename text, where_filter text) RETURNS bigint
VOLATILE
AS $body$
DECLARE
v_fdw_schema TEXT;
v_fdw_tablename TEXT;
v_col_def TEXT;
v_query TEXT;
v_schema_name TEXT;
v_table_name TEXT;
v_row_cnt BIGINT;
BEGIN
v_schema_name:=substring(tablename,0,position('.' in tablename));
v_table_name:=substring(tablename,position('.' in tablename)+1);
v_fdw_schema:=v_schema_name ||'_fdw';
v_fdw_tablename:=v_fdw_schema || '.' || v_table_name;
v_query:='CREATE SCHEMA IF NOT EXISTS '|| v_fdw_schema;
RAISE INFO '%', v_query;
EXECUTE v_query;
v_query:='DROP FOREIGN TABLE IF EXISTS '|| v_fdw_schema || '.' || v_table_name ||' CASCADE';
RAISE INFO '%', v_query;
EXECUTE v_query;
v_query:='IMPORT FOREIGN SCHEMA '|| v_schema_name || ' LIMIT TO (' || v_table_name ||') FROM SERVER ' || fdw_server || ' INTO ' || v_fdw_schema;
RAISE INFO '%', v_query;
EXECUTE v_query;
v_query:='CREATE SCHEMA IF NOT EXISTS '|| v_schema_name;
RAISE INFO '%', v_query;
EXECUTE v_query;
v_query:='CREATE TABLE IF NOT EXISTS '|| tablename ||' AS SELECT * FROM '|| v_fdw_tablename ||' WHERE 1=0';
RAISE INFO '%', v_query;
EXECUTE v_query;
v_col_def:= STRING_AGG(column_name,',')
FROM information_schema.columns
WHERE table_catalog IN (SELECT current_database())
AND table_schema = v_schema_name
AND table_name = v_table_name;
v_query:='DELETE FROM '|| tablename ||'; INSERT INTO '|| tablename ||' ('||v_col_def||') SELECT '||v_col_def||' FROM ' || v_fdw_tablename || ' ' || where_filter;
RAISE INFO '%', v_query;
EXECUTE v_query;
GET DIAGNOSTICS v_row_cnt = ROW_COUNT;
v_query:='DROP SCHEMA IF EXISTS '|| v_fdw_schema || ' CASCADE';
RAISE INFO '%', v_query;
EXECUTE v_query;
RETURN v_row_cnt;
END;
$body$ LANGUAGE plpgsql
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment