sql - 创建函数 : Syntax Error at or near $$

标签 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: $$

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

最佳答案

您的函数几乎所有地方都是错误的。最重要的是,您不能在纯 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注入(inject):

关于sql - 创建函数 : Syntax Error at or near $$,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571560/

相关文章:

sql - 为什么我在尝试执行这个在表中插入记录的简单查询时收到此错误消息?

python - 使用 psycopg2 复制到带有 ARRAY INT 列的表

sql - Postgresql 迭代数组字段并将记录用于另一个查询

c - 在 C 中查找函数调用者

php - 在 HighCharts 中单击饼图的图例时显示工具提示并选择饼图切片

java - 在封闭函数中处理未处理的检查异常

mysql - 合并来自同一个表的 2 个 MYSQL 计数查询

mysql - 具有求和函数时查询无法正常运行

sql - 从 pgAdmin 生成的 CREATE 语句中的 GRANT

sql - 使用sql hive比较两列中的值并在条件基础上返回值