how to prepare a create table statement

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

how to prepare a create table statement

Alexander Mills
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..


--
Alexander D. Mills
New cell phone # (415)730-1805
linkedin.com/in/alexanderdmills
Reply | Threaded
Open this post in threaded view
|

Re: how to prepare a create table statement

Pavel Stehule


po 4. 1. 2021 v 11:31 odesílatel Alexander Mills <[hidden email]> 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
Reply | Threaded
Open this post in threaded view
|

Re: how to prepare a create table statement

Michael Paquier-2
In reply to this post by Alexander Mills
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

signature.asc (849 bytes) Download Attachment