Shell脚本中嵌入式SQL传递参数的写法正确性咨询
问题解答
结论
你的写法可以正确实现参数替换,$1会被调用函数时传入的ACQ_NAME参数值正常替换:
你使用的是未加引号的Here Document(终止符EOF没有用单引号包裹),ksh会先对EOF块内的所有shell变量做解析替换,再把拼接完成的完整SQL语句传给sqlplus执行,所以WHERE ACQ = '$1'里的$1会被替换为函数的第一个入参值,最终拼成符合语法的SQL条件。
注意事项
- SQL注入风险:如果传入的
ACQ_NAME参数是用户可控的,存在SQL注入风险,比如传入值为' OR 1=1 --时,最终执行的SQL会变成WHERE ACQ = '' OR 1=1 --',会返回全表数据,生产环境使用需要先对入参做严格的合法性校验,或者改用Oracle绑定变量的写法避免注入。 - 单引号语法报错问题:如果
ACQ_NAME本身包含单引号(比如XX'AA),直接传入会导致SQL语法错误,建议调用函数前先做单引号转义,示例如下:
# 把参数里的单个单引号替换为两个单引号,符合Oracle SQL转义规则 SAFE_ACQ_NAME=${ACQ_NAME//'/''} get_aq_info "$SAFE_ACQ_NAME"
- 变量作用域问题:你当前代码里的
SQL_RESULT是全局变量,多次调用get_aq_info函数会覆盖之前的存储结果,如果需要隔离不同调用的返回结果,可以调整函数写法,把查询结果直接输出,调用时用变量接收:
function get_aq_info { sqlplus -s $DBNAME <<EOF set verify off; set heading off; set feedback off; SELECT * FROM CV_ACQ WHERE ACQ = '$1'; quit; EOF } # 调用时接收结果 SQL_RESULT=$(get_aq_info "$SAFE_ACQ_NAME")
内容的提问来源于stack exchange,提问作者SRK
相关产品推荐
相关产品推荐

