我是 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: $$
有什么问题吗?我该如何解决这个问题?
多个问题。最重要的是,您无法在普通 SQL 中参数化标识符(或者在 DDL 命令中参数化“anything”)。您需要在 PL/pgSQL 函数中使用 EXECUTE
进行动态 SQL。这可以完成工作:
CREATE OR REPLACE FUNCTION drop_column(table_name text, col_name text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
EXECUTE format('ALTER TABLE %I DROP COLUMN IF EXISTS %I'
, table_name, col_name);
END
$func$;
致电:
SELECT drop_column('my_tbl', 'my_column');
阅读手册这里
,并研究一些相关问题和答案: 特别注意妥善防御SQL注入:
AS
:
create function dropColumn(table_name text,col_name text) returns void AS $$
ALTER TABLE $1 DROP COLUMN IF EXIST $2;
$$
language 'psql';