我正在尝试通过 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/