创建函数:语法错误等于或接近$$

问题描述 投票:0回答:2

我是 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 postgresql function plpgsql dynamic-sql
2个回答
2
投票

多个问题。最重要的是,您无法在普通 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注入:

    表名作为 PostgreSQL 函数参数

-2
投票
AS

:


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

© www.soinside.com 2019 - 2024. All rights reserved.