Postgresql

如何使用變數在 Postgres 10 中動態創建視圖?

  • May 3, 2021

我知道如何在 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 $$;

然後每次我執行它時,我只需更改@myschemaand @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;

引用自:https://dba.stackexchange.com/questions/290916