Dies ist im Grunde die Lösung von Sola, aber nur ein bisschen aufgeräumt. Es ist anders genug, dass ich nicht nur seine Lösung "verbessern" wollte (außerdem finde ich das irgendwie unhöflich).
Der Hauptunterschied besteht darin, dass das EXECUTE-Format verwendet wird. Was ich für etwas sauberer halte, aber meiner Meinung nach bedeutet, dass Sie auf PostgresSQL 9.1 oder neuer sein müssen.
Dies wurde auf 9.1 getestet und funktioniert. Hinweis: Es wird ein Fehler ausgegeben, wenn das Schema / der Tabellenname / oder der Datentyp ungültig sind. Das könnte "behoben" werden, könnte aber in vielen Fällen das richtige Verhalten sein.
CREATE OR REPLACE FUNCTION add_column(schema_name TEXT, table_name TEXT,
column_name TEXT, data_type TEXT)
RETURNS BOOLEAN
AS
$BODY$
DECLARE
_tmp text;
BEGIN
EXECUTE format('SELECT COLUMN_NAME FROM information_schema.columns WHERE
table_schema=%L
AND table_name=%L
AND column_name=%L', schema_name, table_name, column_name)
INTO _tmp;
IF _tmp IS NOT NULL THEN
RAISE NOTICE 'Column % already exists in %.%', column_name, schema_name, table_name;
RETURN FALSE;
END IF;
EXECUTE format('ALTER TABLE %I.%I ADD COLUMN %I %s;', schema_name, table_name, column_name, data_type);
RAISE NOTICE 'Column % added to %.%', column_name, schema_name, table_name;
RETURN TRUE;
END;
$BODY$
LANGUAGE 'plpgsql';
Verwendung:
select add_column('public', 'foo', 'bar', 'varchar(30)');
DO $$ BEGIN BEGIN CREATE INDEX type_idx ON table1 USING btree (type); EXCEPTION WHEN duplicate_table THEN RAISE NOTICE 'Index exists.'; END; END;$$;
der gleiche Ansatz inCREATE INDEX
;) Danke für Ihre Antwort,