Created
May 9, 2022 15:05
-
-
Save rjchicago/c69c772f62ebc69368ef29c0b1da2e7f to your computer and use it in GitHub Desktop.
Postgres Import Table Function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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