web-dev-qa-db-fra.com

Procédure de postgrees pour créer une table s'il n'existe pas

je veux créer une table si cela ne fait pas, j'ai essayé ci-dessous le code:

create or replace function create_table() returns void as
$$
begin
    if not exists(select * 
                  from   pg_tables 
                  where  schemaname = 'Public'
                  and    tablename = 'test') 
    then

        create table test
        (
            the_id int not null,
            name text
        );

    end if;

end;
$$
language 'plpgsql';

Tout en exécutant cette procédure pour la première fois:

select creat_table();

la table est créée mais quand je l'exécute à nouveau, je reçois l'erreur ci-dessous:

ERROR:  relation "test" already exists
CONTEXT:  SQL statement "create table test
        (
            the_id int not null,
            name text
        )"
PL/pgSQL function create_table() line 8 at SQL statement
********** Error **********

ERROR: relation "test" already exists
SQL state: 42P07
Context: SQL statement "create table test
        (
            the_id int not null,
            name text
        )"
PL/pgSQL function create_table() line 8 at SQL statement

Comment y parvenir, et aussi, je souhaite appeler cette procédure à partir de la propriété Informatica Pré-SQL Cible Session de cible afin que je souhaite appeler la procédure avec le nom de la table en tant que paramètre.

1
user3253227

Il suffit d'utiliser CREATE TABLE [IF NOT EXISTS]

Ressemble à ça,

CREATE TABLE IF NOT EXISTS test (
  the_id  int   PRIMARY KEY,
  name    text
);

Si vous devez l'envelopper dans une fonction (ne le faites pas, il n'ya pas de point),

CREATE FUNCTION myCreateTable() RETURNS void AS $$
  CREATE TABLE IF NOT EXISTS test (
    the_id  int   PRIMARY KEY,
    name    text
  );
$$ LANGUAGE sql
VOLATILE;

Si vous voulez que cette fonction accepte un nom (ne le suggérez toujours pas),

CREATE OR REPLACE FUNCTION myCreateTable(myIdent text) RETURNS void AS $$
  BEGIN
    EXECUTE format(
      '
        CREATE TABLE IF NOT EXISTS %I (
          the_id  int   PRIMARY KEY,
          name    text
        );
      ',
      myIdent
    );
  END;
$$ LANGUAGE plpgsql
VOLATILE;

[ IF NOT EXISTS ] a été dans PostgreSQL depuis 9,1

3
Evan Carroll

Erreur dans votre code est:

schemaname = 'Public'

vous avez besoin : schemaname = 'public'

Mais Evan Solution est meilleur

0
Roman Tkachuk