2016-01-02 1 views
1

Я новичок в Postgres, и я хочу автоматизировать удаление столбца из таблицы с помощью функции. Но это дает мне ошибку, о которой я упоминал в названии.

Вот мой код:

create function dropColumn(table_name text,col_name text) returns void as $$ 
ALTER TABLE $1 DROP COLUMN IF EXIST $2; 
$$ 
language 'psql'; 

Ошибка:

ERROR: syntax error at or near "$$ 
language 'psql'; 
create function dropColumn(table_name text,col_name text) returns 
void $$" 
LINE 1: $$ 

В чем проблема? Как я могу это исправить?

ответ

3

Почти все плохо о вашей функции. Самое главное, вы не можете параметризовать идентификаторы в простом SQL. Вам нужен динамический SQL с EXECUTE в функции plpgsql (или любой другой процедурный язык, поддерживающий его). Это будет делать работу:

CREATE OR REPLACE FUNCTION drop_column(table_name text, col_name text) 
    RETURNS void AS 
$func$ 
BEGIN 
    EXECUTE format('ALTER TABLE %I DROP COLUMN IF EXISTS %I' 
       , table_name, col_name); 
END 
$func$ 
LANGUAGE plpgsql; 

Вызов:

SELECT drop_column('my_tbl', 'my_column'); 

Начните с reading the manual here и изучить некоторые из related questions and answers on SO.

Обратите особое внимание на защиту от инъекции SQL должным образом:

+0

Большое спасибо за подробный ответ. Я попробую это решение, а затем перейду по ссылкам, которые вы, как вы предложили. – Recomer

-1

Вы забыли ключевое слово AS:

create function dropColumn(table_name text,col_name text) returns void AS $$ 
ALTER TABLE $1 DROP COLUMN IF EXIST $2; 
$$ 
language 'psql'; 
+0

Обновленный код по-прежнему дает ту же ошибку. – Recomer

+0

Нет, пожалуйста, проверьте, синтаксис в порядке. – Ctx

+0

Спасибо за вашу помощь, но я просто скопировал код, который вы написали, но все же он дает ошибку. Я перезапущу свой терминал и повторю попытку. – Recomer