Обсуждение: how to prepare a create table statement
I am trying to create 500 partitions using a loop:
--
do $$
declare
counter integer := 0;
begin
while counter <= 500 loop
PREPARE create_table(int) AS
CREATE TABLE mbk_auth_method_$1 PARTITION OF mbk_auth_method FOR VALUES WITH (modulus 500, remainder $1);
EXECUTE create_table (counter);
counter := counter + 1;
end loop;
end$$;
problem is that a CREATE TABLE cannot be prepared statement..
Anyone know how I can accomplish the above? Seems like this is a missing feature - to prepare a CREATE TABLE statement..
po 4. 1. 2021 v 11:31 odesílatel Alexander Mills <alexander.d.mills@gmail.com> napsal:
I am trying to create 500 partitions using a loop:do $$
declare
counter integer := 0;
begin
while counter <= 500 loop
PREPARE create_table(int) AS
CREATE TABLE mbk_auth_method_$1 PARTITION OF mbk_auth_method FOR VALUES WITH (modulus 500, remainder $1);
EXECUTE create_table (counter);
counter := counter + 1;
end loop;
end$$;problem is that a CREATE TABLE cannot be prepared statement..Anyone know how I can accomplish the above? Seems like this is a missing feature - to prepare a CREATE TABLE statement..
This is a bad idea. You should not use PREPARE statement in plpgsql code ever. Your code looks like from MySQL :)
do $$
begin
for i in 0..500
loop
execute format('CREATE TABLE %I PARTITION OF mbk_auth_method FOR VALUES WITH (modulus 500, remainder %s)',
'mbk_auth_method_' || i, i);
end loop;
end;
$$;
It can be a little bit messy, but EXECUTE from the plpgsql environment is a different statement than EXECUTE from SQL environment. Dynamic statements are "prepared" implicitly in plpgsql. You cannot use PREPARE there.
Regards
Pavel
On Sun, Jan 03, 2021 at 08:46:19PM -0800, Alexander Mills wrote: > I am trying to create 500 partitions using a loop: > > do $$ > declare > counter integer := 0; > begin > while counter <= 500 loop > PREPARE create_table(int) AS > CREATE TABLE mbk_auth_method_$1 PARTITION OF mbk_auth_method FOR > VALUES WITH (modulus 500, remainder $1); > EXECUTE create_table (counter); > counter := counter + 1; > end loop; > end$$; > > Anyone know how I can accomplish the above? Seems like this is a missing > feature - to prepare a CREATE TABLE statement.. What if you simply used a FOR loop and EXECUTE with format()? Say, roughly, something like that: FOR i IN 1..num_tables LOOP EXECUTE format(' CREATE TABLE mbk_auth_method_%I PARTITION OF mbk_auth_method FOR VALUES WITH (modulus 500, remainder %I)', i, i); END LOOP; -- Michael