从Bash脚本在PostgreSQL中创建函数
我正试图从Bash脚本在我的Postgres数据库中创建一个函数。不幸的是,我无法让它工作。这是我的剧本:从Bash脚本在PostgreSQL中创建函数,bash,postgresql,stored-procedures,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
#!/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}\""
看来$$有问题了?如何从Bash脚本在Postgres中创建类似于脚本中的函数?我需要掩饰什么吗
编辑:
最终的工作脚本还添加了创建语言(如果尚未注册):
#!/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替换您应该转义像这样的$$东西\$\$,甚至\$\$,因为它转义了两次进程id替换了$$,您应该转义像这样的$$东西\$\$,甚至\$\$,因为它转义了两次使用当转义美元符号时,它实际上起作用。我不知道。谢谢阿拉克尼德的答案比我的要好得多,它在两次逃离美元符号时实际起作用。我不知道。谢谢阿拉克尼人的答案比我的好得多
#!/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;
sudo su - postgres -c "psql -d postgres -U postgres" <<'EOF'
...
EOF