web-dev-qa-db-ja.com

postgresが存在しない場合にテーブルを作成する手順

テーブルを作成したくない場合は、以下のコードを試してみます。

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';

この手順を初めて実行するとき:

select creat_table();

テーブルが作成されますが、もう一度実行すると、次のエラーが発生します。

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

これを達成する方法、およびInformatica pre-sqlターゲットセッションプロパティからこのプロシージャを呼び出したいので、テーブル名をパラメータとしてプロシージャを呼び出したいです。

1
user3253227

CREATE TABLE [IF NOT EXISTS]

このように見えます、

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

関数でラップする必要がある場合(ただし、ポイントはありません)、

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

その関数が名前を受け入れるようにしたい場合(これはまだ提案されていません)、

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 ]は9.1以降PostgreSQLに含まれています

3
Evan Carroll

あなたのコードのエラーは:

schemaname = 'Public'

必要です:schemaname = 'public'

しかし、エヴァンのソリューションの方が優れています

0
Roman Tkachuk