如何在调用PL/pgSQL函数时将export_path设为Bash脚本参数
解决方法
1. 修改PL/pgSQL函数,添加参数支持
首先修改原函数,让它接受外部传入的导出路径参数,同时改用参数化执行避免SQL注入风险(直接字符串拼接路径容易出现安全问题或特殊字符解析错误):
CREATE OR REPLACE FUNCTION public.test_function(p_export_path text) RETURNS void LANGUAGE plpgsql AS $function$ begin -- 使用USING传递参数,避免字符串拼接的安全问题 EXECUTE 'COPY (SELECT * FROM blabla) TO $1 csv header;' USING p_export_path; END $function$;
注意:原SQL里的
SELECT * blabla存在语法错误,已修正为SELECT * FROM blabla。
2. 修改Bash脚本,支持传入路径参数
修改Bash脚本,让它接收命令行传入的路径参数,并传递给PL/pgSQL函数:
#!/bin/bash # 检查是否传入了导出路径参数 if [ $# -eq 0 ]; then echo "请传入导出路径参数,例如:./test_export.sh /home/blabla/my_export.csv" exit 1 fi DB_NAME="blabla" DB_USER="postgres" # 将命令行第一个参数($1)传递给PostgreSQL函数 psql -d "$DB_NAME" -U "$DB_USER" -c "SELECT public.test_function('$1');"
注意:原脚本里的
-u是错误选项,PostgreSQL的psql客户端用-U指定用户名,已修正。另外chmod +x test_export.sh是给脚本添加执行权限的命令,需在脚本外部执行,不要写在脚本内容里。
3. 使用方式
- 先执行
chmod +x test_export.sh给脚本添加执行权限 - 运行脚本时传入导出路径:
./test_export.sh /home/blabla/custom_path.csv
额外注意事项
如果路径中包含特殊字符(比如空格、单引号),建议改用psql的--variable参数传递,能自动处理特殊字符,避免手动转义的麻烦:
修改Bash脚本中的psql调用部分:
psql -d "$DB_NAME" -U "$DB_USER" -v export_path="$1" -c "SELECT public.test_function(:'export_path');"
内容的提问来源于stack exchange,提问作者zed
相关产品推荐
相关产品推荐

