テーブルを作成したくない場合は、以下のコードを試してみます。
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ターゲットセッションプロパティからこのプロシージャを呼び出したいので、テーブル名をパラメータとしてプロシージャを呼び出したいです。
このように見えます、
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に含まれています
あなたのコードのエラーは:
schemaname = 'Public'
必要です:schemaname = 'public'
しかし、エヴァンのソリューションの方が優れています