创建函数:语法错误在$$或附近

时间:2016-01-02 22:53:44

标签: sql postgresql function plpgsql dynamic-sql

我是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: $$

有什么问题?我该如何解决这个问题?

2 个答案:

答案 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';