我是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: $$
有什么问题?我该如何解决这个问题?
答案 0 :(得分:3)
你的功能几乎一切都是错的。最重要的是,您无法在纯SQL中参数化标识符。您需要在plpgsql函数(或支持它的任何其他过程语言)中使用EXECUTE
的动态SQL。这样就可以了:
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注入:
答案 1 :(得分:-1)
您忘记了关键字AS
:
create function dropColumn(table_name text,col_name text) returns void AS $$
ALTER TABLE $1 DROP COLUMN IF EXIST $2;
$$
language 'psql';