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
错误原因
- 引号转义错误:第一个SQL语句中
"\'"%$EMP_ID"\'"的写法导致Shell解析出混乱字符,破坏了SQL语法结构。 - 通配符语法错误:第二个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
相关产品推荐
相关产品推荐

