bash - 从 Bash 脚本在 PostgreSQL 中创建 FUNCTION

标签 bash postgresql stored-procedures

我正在尝试通过 Bash 脚本在我的 Postgres 数据库中创建一个函数。不幸的是,我无法让它工作。这是我的脚本:

#!/bin/bash
# Save Postgres command to $POSTGRES_CMD
read -d '' POSTGRES_CMD <<"EOF"
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = username AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ';';
    END LOOP;
END; 
$$
LANGUAGE plpgsql;
EOF

sudo su - postgres -c "psql -d postgres -U postgres -c \"${POSTGRES_CMD}\""

当我运行脚本时,出现以下错误:

ERROR:  Syntax error at »20541«
LINE 1: ...N truncate_tables(username IN VARCHAR) RETURNS void AS 20541

所以 $$ 好像有问题?如何从 Bash 脚本在 Postgres 的脚本中创建一个 FUNCTION?我需要掩盖什么吗?


编辑:

最终的工作脚本(如果尚未注册,还添加了创建语言):

#!/bin/bash
sudo su - postgres -c "psql -d postgres -U postgres" << 'EOF'
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = 'username' AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ';';
    END LOOP;
END;
$$
LANGUAGE plpgsql;

最佳答案

$$ 被进程 ID 替换,你应该像这样转义 $$ 东西\$\$ 甚至\\$\\$ 因为它转义了两次

关于bash - 从 Bash 脚本在 PostgreSQL 中创建 FUNCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5080270/

相关文章:

python - SqlAlchemy:Postgresql 自定义类型数组

linux - Bash 脚本从源文件读取变量显示没有这样的文件或目录错误

linux - 使用另一个字符串拆分变量中的值并存储在数组中(Bash)

postgresql - 隔离级别和显式锁定 : Unexpected Serialization Error

postgresql 触发器 - 而不是插入不起作用

MYSQL 循环函数不起作用

mysql - 尝试使用 ":="将值分配给 select 中的过程变量时出错

mysql - 不同表列之间的差异

bash - 循环查找文件位置,直到文件存在于 bash 中

python - 我应该坚持使用bash来开发高级Linux自动化脚本,还是切换到Python?