BBS.ChinaUnix.net
今日推荐    首页 | 新闻 | Linux | AIX | 博客 | 论坛 | 存储 | 人才 | 培训 | 知识库 | 资料 | 读书 | 手册 | 精华 | 下载 | 空间     
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


关于shell脚本的sql插入问题
首页 » 论坛 » Shell »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
  [未解决] 本主题悬赏 可用积分 20  
jinl
光明使者



UID:475574
注册:2006-10-12
最后登录: 2008-07-07
帖子:840
精华:0

可用积分:973
信誉积分:100
专家积分:38 (本版)

状态:...在线...

[个人空间] [短信] [博客]


顶部
11楼 发表于 2008-5-8 09:24 
sqlplus 后面的应该是sqlplus里的命令,那么这部分也应该使用here document
你现在只在su - oralce -c <<EOF用了一个 here document ,当然会执行sqlplus后面的命令错误了



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
qwldcl
侠客




UID:202067
注册:2004-11-24
最后登录: 2008-06-17
帖子:34
精华:0

可用积分:3
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
12楼 发表于 2008-5-8 09:30 


QUOTE:
原帖由 li2002 于 2008-5-8 09:17 发表


你直接在sqlplus里写要加引号,那么你在shell中写当然也要有引号

$ip,这个是变量 ,加引号不是变成string了吗



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
qwldcl
侠客




UID:202067
注册:2004-11-24
最后登录: 2008-06-17
帖子:34
精华:0

可用积分:3
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
13楼 发表于 2008-5-8 09:39 


QUOTE:
原帖由 jinl 于 2008-5-8 09:24 发表
sqlplus 后面的应该是sqlplus里的命令,那么这部分也应该使用here document
你现在只在su - oralce -c  

说的详细点,他好像根本就不执行这些命令,在循环中能执行oracle连接吗?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
jinl
光明使者



UID:475574
注册:2006-10-12
最后登录: 2008-07-07
帖子:840
精华:0

可用积分:973
信誉积分:100
专家积分:38 (本版)

状态:...在线...

[个人空间] [短信] [博客]


顶部
14楼 发表于 2008-5-8 09:59 
你先把su - oracle -c <<EOF后面要执行的这部分代码拿出来,做成shell 脚本,测试一下,就知道了
按照道理,shell 脚本里面执行sqlplus的命令,也要采取如下方式
sqlplus /nolog <<!
conn user/pass
sql语句
...
!

QUOTE:
su - oracle -c <<EOF
sqlplus /nolog
connect sim/hpsim@ov_net]sim/hpsim@ov_net
set feedback off;
set pagesize 0;
insert into permon (ip,permondate,cpuper) values ($ip,$date$time,$cpu_ut);
commit;
EOF

按照你这样的写法,sqlplus /nolog 执行以后,后面的conn,set ,insert等命令不是发给sqlplus的,而是发给shell的,都是独立的shell 命令

[ 本帖最后由 jinl 于 2008-5-8 10:01 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
ly5066113   帅哥
大天使



UID:465018
注册:2006-9-13
最后登录: 2008-07-06
帖子:2189
精华:0

可用积分:2069
信誉积分:110
专家积分:153 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
15楼 发表于 2008-5-8 10:09 


QUOTE:
原帖由 qwldcl 于 2008-5-8 09:30 发表

$ip,这个是变量 ,加引号不是变成string了吗

不会的,在here doc中这么写是可以的:

insert into permon (ip,permondate,cpuper) values ('$ip','$date$time','$cpu_ut');

给你个参考:

sqlplus -s $DBUSER/$DBPWD@$DBNAME<<! >/dev/null 2>&1
set serveroutput on;
set feedback off;
spool $TMPDIR/tmp.$$;
DECLARE
                v1                            NUMBER;
                v2                            VARCHAR2( 500 );
BEGIN
    SP_Log
        ( '$WORKDATE'
         ,'$job'
         ,'$tab'
         ,'1'
         ,$insert
         ,''
         ,''
         ,'$execute_flag'
         ,'$end_time'
         ,'$start_time'
         ,'$info'
         ,v1
         ,v2 );
        DBMS_OUTPUT.put_line( v1 );
END;
/
spool off;
!

[ 本帖最后由 ly5066113 于 2008-5-8 10:14 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

记住该记住的,忘记该忘记的。改变能改变的,接受不能改变的。
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
qwldcl
侠客




UID:202067
注册:2004-11-24
最后登录: 2008-06-17
帖子:34
精华:0

可用积分:3
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
16楼 发表于 2008-5-8 10:21 


QUOTE:
按照你这样的写法,sqlplus /nolog 执行以后,后面的conn,set ,insert等命令不是发给sqlplus的,而是发给shell的,都是独立的shell 命令

我表达不好,就是这个意思,怎么把命令发送到sqlplus而不是shell



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
jinl
光明使者



UID:475574
注册:2006-10-12
最后登录: 2008-07-07
帖子:840
精华:0

可用积分:973
信誉积分:100
专家积分:38 (本版)

状态:...在线...

[个人空间] [短信] [博客]


顶部
17楼 发表于 2008-5-8 10:27 


QUOTE:
原帖由 qwldcl 于 2008-5-8 10:21 发表


我表达不好,就是这个意思,怎么把命令发送到sqlplus而不是shell

不是上面给你写了么,再用一次here document来引用你的sqlplus 命令
su - oracle -c <<EOF
sqlplus /nolog <<SQLEOF
sqlcommand
.....
SQLEOF
EOF



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
qwldcl
侠客




UID:202067
注册:2004-11-24
最后登录: 2008-06-17
帖子:34
精华:0

可用积分:3
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
18楼 发表于 2008-5-8 10:43 
#!/bin/sh
for i in *.csv
do
ip=$(echo $i|cut -d, -f 1)
temp=$(echo $i|cut -d, -f 2)
type=$(echo $temp|cut -d. -f 1)
if [ "$type" = "CPU Utilization Baseline" ]
then
lastline=$(tail -1  "$i")
date=$(echo $lastline|cut -d, -f 1)
time=$(echo $lastline|cut -d, -f 2)
cpu_ut=$(echo $lastline|cut -d, -f 3)
dated=$date$time
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_SID=hpov
export ORACLE_HOME=/oracle/app/oracle/product/10.2.0
export PATH=$PATH:$ORACLE_HOME/bin
su - oracle -c <<EOF
sqlplus /nolog
connect system/manager
set feedback off;
set pagesize 0;
insert into permon (ip,cpuper,permondate) values ('$ip','$cpu_ut','$dated');
commit;
EOF
fi
done

这样做也能插入成功,为什么要2次here document呢?



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
li2002
精灵使



UID:6382
注册:2002-4-5
最后登录: 2008-06-24
帖子:2604
精华:10

可用积分:1313
信誉积分:100
专家积分:15 (本版)

来自:江苏
状态:...离线...

[个人空间] [短信] [博客]


顶部
19楼 发表于 2008-5-8 10:48 
没必要两次<<,还是你没加引号的原因



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
jinl
光明使者



UID:475574
注册:2006-10-12
最后登录: 2008-07-07
帖子:840
精华:0

可用积分:973
信誉积分:100
专家积分:38 (本版)

状态:...在线...

[个人空间] [短信] [博客]


顶部
20楼 发表于 2008-5-8 10:52 
如果一次here doc就可以正常工作,那么应该是你的后续几个脚本里面EOF不匹配,还有就去缺少commit(从你paste的代码看存在这些问题,真实情况自己检查吧 )



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » 论坛 » Shell »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.067727 second(s), 4 queries , Gzip enabled