Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Bash脚本在PostgreSQL中创建函数_Bash_Postgresql_Stored Procedures - Fatal编程技术网

从Bash脚本在PostgreSQL中创建函数

从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

我正试图从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}\""
看来$$有问题了?如何从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