单独运行正常的SQL嵌入Bash脚本后报ORA-00942错误求助
问题根因
报错是Bash对特殊字符的提前解析导致的,本质是$符号的转义不生效:
你使用反引号()做命令赋值时,Bash会先解析反引号内部的转义字符,你写的gv$session里的$会被先吃掉一层反斜杠,后续$session会被Bash识别为变量进行解析,由于session变量无值,最终传递到Oracle的SQL里表名就被截断为gv,自然会报ORA-00942: table or view does not exist`。
修复方案
优先推荐第一种方案,写法更简洁不易出错:
方案1:给HEREDOC终止符加单引号
给EOF包裹单引号后,HEREDOC内部的所有特殊字符都不会被Bash解析,无需额外转义$,同时建议把反引号替换为$()做命令替换,是Bash更推荐的标准写法,嵌套和转义逻辑更清晰:
JOB_RUNNING=$(sqlplus -s "/ as sysdba" << 'EOF' SET FEEDBACK OFF; SET HEADING OFF; SELECT count(1) from gv$session b,gv$process a WHERE b.paddr = a.addr AND type='USER' AND b.status='ACTIVE' AND b.program='Thin Client'; exit; EOF )
方案2:增加转义层数适配反引号解析逻辑
如果你要保留原有反引号的写法,需要给$加两层转义,抵消反引号和无引号HEREDOC的两次转义消耗:
JOB_RUNNING=`sqlplus -s "/ as sysdba" << EOF SET FEEDBACK OFF; SET HEADING OFF; SELECT count(1) from gv\\\$session b,gv\\\$process a WHERE b.paddr = a.addr AND type='USER' AND b.status='ACTIVE' AND b.program='Thin Client'; exit; EOF `
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

