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

Shell脚本中SQL LIKE语句含%字符执行异常问题排查

问题:Shell脚本执行带LIKE的SQL查询报ORA-00911错误

场景重现

从文本文件读取员工ID列表,通过第一个脚本传递给第二个脚本,在第二个脚本中执行带LIKE运算符的SQL查询时,触发ORA-00911: invalid character错误。

原脚本内容

first.sh

#!/bin/sh
while IFS= read -r line; 
do
/d/ShellScripts/second.sh  $line
done < "$1"

second.sh

#!/bin/sh
EMP_ID=$1
sqlplus -s user/password@//localhost:1521/xepdb1 <<EOF
alter session set current_schema = HR;
set linesize 1000
select * from employees where EMPLOYEE_ID like "\'"%$EMP_ID"\'" ;
select * from employees where EMPLOYEE_ID like %{$EMP_ID} ;
EOF

list.txt

101
102
103

执行报错

$ ./first.sh list.txt

Session altered.

"\'"ct * from employees where EMPLOYEE_ID like "\'"%101
                                                   *
ERROR at line 1:
ORA-00911: invalid character

}elect * from employees where EMPLOYEE_ID like %{101
                                               *
ERROR at line 1:
ORA-00911: invalid character

错误原因

  1. 引号转义错误:第一个SQL语句中"\'"%$EMP_ID"\'"的写法导致Shell解析出混乱字符,破坏了SQL语法结构。
  2. 通配符语法错误:第二个SQL语句中%{$EMP_ID}的写法错误,Shell会将{}视为特殊字符处理,且LIKE的通配符未正确用引号包裹,导致SQL无法识别。

修正方案

1. 修正first.sh:传递参数时加双引号

避免ID包含特殊字符时出现参数拆分问题:

#!/bin/sh
while IFS= read -r line; 
do
/d/ShellScripts/second.sh "$line"
done < "$1"

2. 修正second.sh:正确处理SQL中的LIKE语法

根据需求选择精确匹配或模糊匹配的写法:

#!/bin/sh
EMP_ID="$1"
sqlplus -s user/password@//localhost:1521/xepdb1 <<EOF
alter session set current_schema = HR;
set linesize 1000
-- 精确匹配(EMP_ID为数字时,用=效率更高)
select * from employees where EMPLOYEE_ID = '$EMP_ID';
-- 模糊匹配:匹配以该ID开头的记录
select * from employees where EMPLOYEE_ID like '$EMP_ID%';
-- 模糊匹配:匹配包含该ID的记录
-- select * from employees where EMPLOYEE_ID like '%$EMP_ID%';
EOF

关键说明

  • 用单引号'$EMP_ID'包裹变量,确保SQL能正确识别参数值,避免Shell解析干扰。
  • 模糊匹配时,将通配符%放在单引号内部,比如'$EMP_ID%'或'%$EMP_ID%',符合SQL语法规范。

内容的提问来源于stack exchange,提问作者DipayanRay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:45