Это в основном решение от sola, но немного поправленное. Это достаточно другое, что я не просто хотел «улучшить» его решение (плюс, я думаю, что это грубо).
Основное отличие состоит в том, что он использует формат EXECUTE. Я думаю, что это немного чище, но я считаю, что это означает, что вы должны быть на PostgresSQL 9.1 или новее.
Это было протестировано на 9.1 и работает. Примечание: это вызовет ошибку, если схема / имя_таблицы / или тип_данных недействительны. Это могло быть «исправлено», но во многих случаях могло быть правильным поведением.
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';
Применение:
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;$$;
такой же подход вCREATE INDEX
;) Спасибо за Ваш ответ,