Chinaunix
标题:
redhat环境下从shell传递参数到sql出错(solaris下ok)
[打印本页]
作者:
zdj007
时间:
2013-08-09 23:31
标题:
redhat环境下从shell传递参数到sql出错(solaris下ok)
如下是在solaris执行成功的运维脚本,但是移植到redhat却出错了,详见No.2,请问如何解决?
1。solaris执行成功的运维脚本
-bash-3.00$ cat topPID_prstat.sh
#!/usr/bin/bash
num=1
day=`date +%Y%m%d`
day1=`date +%Y%m%d%H%M`
while [ $num -lt 8 ]
do
ltime=`date +%H:%M:%S`
second=`date +%S`
var_pid=`prstat -a 1 1|sed -n "2p"|awk '{print $1;}'`
cputotal=`prstat -a 1 1|sed -n "2p"|awk '{print $1,$9;}'`
#echo $var_pid;
sqlplus -S abc/abc@abc <<EOF
conn / as sysdba;
set heading off;
set serveroutput off;
set linesize 400;
set pagesize 5000;
set trimspool on;
SELECT to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),sql_text FROM v\$sqltext a WHERE (a.hash_value, a.address) IN
(SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)FROM v\$session b
WHERE b.paddr = (SELECT addr FROM v\$process c WHERE
c.spid =$var_pid
))ORDER BY piece ASC;
EXIT
EOF
echo $ltime $cputotal >> /export/home/beiman/Monitor_TopPID/$day.cpu-mem.log
let num+=1;
sleep 1;
done
2。redhat执行出错信息如下:
[oracle@itms-sjz-db-4 Monitor]$ ./topPID_prstat.sh
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid=12345))
*
ERROR at line 4:
ORA-00920: invalid relational operator
作者:
bikong0411
时间:
2013-08-10 08:48
$process 没解析吧
作者:
zdj007
时间:
2013-08-11 06:30
回复
2#
bikong0411
copy到论坛后显示格式错位,
*是放置在$var_pid上的,肯定是没有解析,麻烦帮忙解决一下。
作者:
syncpk99
时间:
2013-08-14 08:51
使用sqlplus执行SQL的脚本有一种简单的测试手段,就是将sqlplus -S abc/abc@abc <<EOF注释掉,然后在此行下面增加一行cat <<EOF,然后执行代码,将生成的SQL语句,手工在sqlplus中执行,查找具体出错的原因。
另外spid是varchar2类型,最好将$var_pid使用单引号括起来。
作者:
zdj007
时间:
2013-08-14 10:19
本帖最后由 zdj007 于 2013-08-14 10:44 编辑
回复
4#
syncpk99
感谢回复。
测试后发现cat打印出来的sql拷贝到sqlplus中能够执行,但是直接执行shell还是老样子。
相信是c.spid=后面的参数值没有被带进数据库里。
作者:
zdj007
时间:
2013-08-20 10:09
怎么解决,那位帮忙?
作者:
zdj007
时间:
2013-08-22 09:59
回复
6#
zdj007
顶!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2