Postgresql
如何使用變數在 Postgres 10 中動態創建視圖?
我知道如何在 MySQL 和 MSSQL 中做到這一點,但我正在努力在 Postgres 10.12 中做同樣的事情。我有大約 200 個視圖要創建,每個視圖的唯一區別是模式位置和 where 子句。
例如:
create or replace view SCHEMA1.myview as select * from SHAREDSCHEMA.sometable where MYCOL = 'ABC';
所以我需要做的是創建該視圖大約 200 次,每次迭代為:
SCHEMA1.myview SCHEMA2.myview SCHEMA3.myview etc... MYCOL = 'ABC' MYCOL = 'EFG' MYCOL = 'HIJ' etc...
希望這是有道理的。同樣,每次迭代之間的唯一區別是模式名稱更改和 where 子句更改。
我可能會編寫一些 Python 腳本或其他東西來生成程式碼,但如果可能的話,我寧願在 Postgres 中進行。
我知道這不是有效的程式碼,但基本上這就是我想要做的:
do $$ declare myschema varchar(10) := 'SCHEMA1'; mywhere varchar(3) := 'ABC'; begin create or replace view @myschema@.myview as select * from SHAREDSCHEMA.sometable where MYCOL = @mywhere@; end $$;
然後每次我執行它時,我只需更改
@myschema
and@mywhere
。任何幫助,將不勝感激。
謝謝!
為此,您需要動態 SQL:
do $$ declare myschema varchar(10) := 'SCHEMA1'; mywhere varchar(3) := 'ABC'; begin execute format(' create or replace view %I.myview as select * from SHAREDSCHEMA.sometable where MYCOL = %L', myschema, mywhere); end $$;
format()
在創建動態 SQL 以正確處理標識符和常量值時,強烈建議使用該函式。您還可以將其放入函式(或較新版本中的過程)中:
create function create_view(p_schema text, p_value text) returns void as $$ begin execute format(' create or replace view %I.myview as select * from SHAREDSCHEMA.sometable where MYCOL = %L', p_schema, p_value); end $$ language plpgsql;
然後你可以執行:
select create_view('myschema', 'xyz');
如果需要,可以使用它一次性創建所有視圖:
with data (schema_name, value) as values ('schema1', 'abc'), ('schema2', 'def'), ('schema3', 'ghi') ) select create_view(schema_name, value) from data;