You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:27:02