Chinaunix

标题: 请教Shell中结合数据库操作的变量赋值 [打印本页]

作者: lxr_wolf    时间: 2006-06-06 17:05
标题: 请教Shell中结合数据库操作的变量赋值
小弟有需求如下:将isql命令中返回的日期传递到$trandate中,以供下面的shell内容判断,但是怎么尝试都发现不对,有哪位大虾试过,有没有解决方案?

test.sh的内容如下:

. /opt/sybase-12.5/POS/posenv

trandate=""

$ISQL_dir/isql -U$DUMPUSER -P$DUMPPWD -S$MYSERVER << EOF
use zdposht
go
select '$trandate' = convert(char(,trandate,112) from sys_autotrandate
go
EOF

echo "TESTRESULT:"$trandate
作者: 大蚂蚁    时间: 2006-06-06 18:56
先导出到文件再读取吧
作者: lxr_wolf    时间: 2006-06-06 19:31
这个我也想过, 不过我要的数据只有一个啊, 没有其他方法了?
作者: lxr_wolf    时间: 2006-06-07 10:32
生成文件如下:

--------
20060601

(1 row affected)

问一下各位大虾, 我只读取第3行, 应该怎么写?
作者: pvb1979    时间: 2006-06-07 10:46
使用sed 来读取 ,sed -n '3p' filname
作者: lxr_wolf    时间: 2006-06-07 10:52
Thanks pvb1979 , 很简单方便的解决了。
作者: 轩静天    时间: 2006-06-07 12:18
A=$(sqlplus -s system/aspire@TEST << EOF
set head off;
set echo off;
set feedback off;
set head off;
set serveroutput on;
declare
inum number;
begin
select 1 into inum from dual;
dbms_output.put_line(inum);
end;
/
exit
EOF
)


或者
在select的时候加入特殊标记符号,如:select 'DATEOUT'|| 1 from dual;再SPOOL出来,用GREP准确定位.

[ 本帖最后由 轩静天 于 2006-6-7 13:23 编辑 ]
作者: lxr_wolf    时间: 2006-06-07 15:24
1 . 试验过, 发现serveroutput并不是sybase关键字啊
2 . 能否详细介绍一下spool如何操作?
作者: 大蚂蚁    时间: 2006-06-07 19:53
sybase不能直接倒成一行么?你是直接把查询结果重定向了。
作者: 林子    时间: 2006-06-07 22:59
fun_day()
{
( $ISQL_dir/isql -U$DUMPUSER -P$DUMPPWD -S$MYSERVER)|awk 'substr($1,1,1)~/2/{print $1}` << EOF
use zdposht
go
select  convert(char(,trandate,112) from sys_autotrandate
go
EOF
}
trandate=`fun_day`
作者: 林子    时间: 2006-06-07 23:06
楼上有错!
fun_day()
{
( $ISQL_dir/isql -U$DUMPUSER -P$DUMPPWD -S$MYSERVER|awk 'substr($1,1,1)~/2/{print $1}`) << EOF
use zdposht
go
select  convert(char(,trandate,112) from sys_autotrandate
go
EOF
}
trandate=`fun_day`
作者: 林子    时间: 2006-06-07 23:09
楼上有错!
fun_day()
{
( $ISQL_dir/isql -U$DUMPUSER -P$DUMPPWD -S$MYSERVER|awk 'substr($1,1,1)~/2/{print $1}` )<< EOF
use zdposht
go
select  convert(char(,trandate,112) from sys_autotrandate
go
EOF
}
trandate=`fun_day`
作者: lxr_wolf    时间: 2006-06-10 14:46
十分感谢, 这个可以用, 测试代码如:
gettrandate()
{
(/opt/sybase-12.5/OCS-12_5/bin/isql -Usa -P -Sserver | awk 'substr($1,1,1)~/2/{print $1}') <<EOF
use zdposht
go
select isnull(convert(char(,max(trandate),112),getdate()) from sys_autotrandat
e
go
exit
EOF
}

trandate=`gettrandate`

echo $trandate
作者: lxr_wolf    时间: 2006-06-10 14:49
楼上的大虾能否帮小弟解释一下这个语法是如何的运作?
为何要这么写? 谢谢
awk 'substr($1,1,1)~/2/{print $1}'
作者: 林子    时间: 2006-06-10 21:46
原本awk输出有sybase的字段名及--------等,为保证其输出的是日期 ,取awk输出$1取其第一位,与年份第一
位比较,如匹配则输出的就是日期了.
作者: lxr_wolf    时间: 2006-06-11 15:25
收到并学习了,谢谢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2