首页 > 解决方案 > 简单的 sql 脚本执行失败

问题描述

下面是一个示例 bash 脚本,当我执行 bash 时它似乎出错了。sql 独立工作,但奇怪的是在脚本中工作。

请指教

  • JOB_RUNNING='SELECT count(1) from gv b,gv a WHERE b.paddr = a.addr AND type='''USER''' AND b.status='''ACTIVE''' AND b.program=' ''瘦客户端''' * 第 1 行出现错误:ORA-00942:表或视图不存在'
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
`

标签: sqlbashoracle

解决方案


输出显示from gv b,gv a,因此$仍然被视为 shell 变量。

来自 BashFAQ

反引号内的反斜杠 (\) 以不明显的方式处理...

要么双重逃避那些:

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
`

或使用$()而不是反引号:

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
)

另请参阅:在 shell 脚本中使用 $() 而不是反引号有什么好处?


推荐阅读