Chinaunix

标题: 用sh列表显示oracle数据库单条查询结果 [打印本页]

作者: michaelds    时间: 2002-03-22 19:42
标题: 用sh列表显示oracle数据库单条查询结果
经常在UNIX下使用oracle数据库,用的是sqlplus,大体已经习惯了.但是有一点受不了,就是用select查询一个大表(字段比较多的表)时,虽然查的结果只有一行,但要是set head on,往往要显示几屏,每一屏都要显示一遍所有字段,根本看不清整个表的内容,如果set head off,又不知道每个值对应的是哪个字段,一个一个数太麻烦了.总想,要是这条数据纵向列表显示,左边列名,右边是值,看着该多方便啊,于是花了点写了一个shell程序,程序名就叫select.
#!/bin/sh

connectstr='username/password@connectstr'
table=`echo $*|sed 's/.*from *\([^ ]*\) *.*/\1/'|tr "[a-z]" "[A-Z]"`
where=`echo $*|sed 's/.*from/from/'`
cat > sel$$.sql << END
set head off
set feed off
set headsep off
set newp none
set linesize 255
set sqlblanklines OFF
set trimspool ON
set termout off
spool on$$.sql
select 'select '''||column_name||'|'',ltrim(rtrim('||column_name||')) $where;' from user_tab_columns where table_name='$table';
spool off
set termout on
select '##SQL BEGIN##' from dual;
select 'ColumnName| Value' from dual;
select '-----------| ------------' from dual;
@@on$$.sql
select '##SQL END##' from dual;
exit
END
sqlplus $connectstr @sel$$.sql|sed -n '/##SQL BEGIN##/,/##SQL END/{
/^$/d
/##SQL/d
p
}'|awk -F'|' '{printf &quot;%-30s%-s\n&quot;,$1,$2}'
rm -f on$$.sql sel$$.sql

哈哈,使用的时候跟在sqlplus状态下一样的语句,瞧,这是我在sh状态下查询一个有26个字段的表,要是在sqlplus状态下用set head on状态,得显示个几十屏的内容.当我在UNIX sh状态下用这个sql语句时,旁边的同事都呆住了,没搞清怎么回事.(为隐密起见,字段名用了X和乱符表示)
$ select * from testtable;
ColumnName                 Value
-----------                ------------
XXXX_ID                    2
XXXXON_ID                  3
XXXXXXXX_SUBS              2
XXXXTE_TIME                20020320173232
XXXXTOR                    0
XXXXTOR_GROUP              0
XXXXNAME                  
XXXXXXXX_BIRTHDAY_TIME   
XXXXXXXX_MODIFY_TIME       20020320173232
XXXXXXXX_OLDNO            
XXXXFIER                   0
XXXXFIER_NAME              Admin
XXXXFIER_LOGIN             super
XXXXOPERTYPE               0
XXXXXXXX_CHARGE_NO        
XXXXXXXX_BANK            
XXXXXXXX_BANK_NO         
XXXXXXXX_NET_USE           0
XXXXXXXX_ATTRIBUTE         1
XXXXUP1                    0
XXXXUP2                    Net
XXXXXXXX_BUSINESS          99
XXXXXXXX_SEX               0
XXXXXXXX_CREDIT_THRESHOLD  0
XXXXXXXX_CREDIT_FLOOR      0
XXXXXXXX_ID                11
XXXXXXXX_NAME              USER
XXXXXXXX_PASSWORD          xxxc6xxx2ab461b4
XXXXXXXX_IDENTITY         
XXXXXXXX_IDTYPE            0
XXXXXXXX_VOCATION         
XXXXXXXX_CITY            
XXXXXXXX_PROVINCE          13900000005
XXXXXXXX_COUNTRY         
XXXXXXXX_ZIP_CODE         
XXXXXXXX_PHONE             01062501658
XXXXXXXX_FAX              
XXXXXXXX_EMAIL             user@263.net
XXXXXXXX_STATUS            0
XXXXXXXX_STATUS_TIME       20020320173231
XXXXXXXX_STATUS_COMMENT   
XXXXXXXX_XXXOUNT_CXXLE     14
XXXXXXXX_PAY_TYPE          1
XXXXXXXX_NO                AN20000013
XXXXXXXX_ACCOUNT_NO        11
XXXXXXXX_XXXXING_CYCLE   
XXXXXXXX_XXXXING_AMOUNT   
XXXXXXXX_XXXXING_EAMOUNT  
XXXXXXXX_PAY_TIME         
XXXXXXXX_OWE_XXXXE         0
XXXXXXXX_PRE_XXXXK_DATE   
XXXXENCY_TYPE              0
XXXXXXXX_PARENT            0
XXXXXXXX_BANKNAME         
XXXXXXXX_BANKNUM         
XXXXXXXX_LINKMAN           99098808
XXXXICE_DELIVER_METHOD     1
XXXXXXXX_TYPE              0
XXXXXXXX_NUMBER           
CDT_XXXX_HOLDER           
CDT_XXXX_EXPIRY            20020320000000
XXXXXNT_TYPE               0
XXXXXXXX_GRADE             5
XXXXRTISE_FLAG             0
XXXXODE_ID                 0
XXXXS_ID                   0
XXXXLLER_ID                0
XXXX_NAME                  Admin
XXXX_LOGIN_NAME            super
ACYSEW_DATE                20041214000000
作者: valentine    时间: 2002-03-23 09:20
标题: 用sh列表显示oracle数据库单条查询结果
又是精华之作。
作者: ohwww    时间: 2003-06-18 21:33
标题: 用sh列表显示oracle数据库单条查询结果
厉害,厉害,佩服,佩服
我都看不动是怎么回事
作者: ohwww    时间: 2003-06-19 10:31
标题: 用sh列表显示oracle数据库单条查询结果
我试了一下怎么不显示结果呢???生成的sql文件最好也删不掉
作者: ohwww    时间: 2003-06-19 12:30
标题: 用sh列表显示oracle数据库单条查询结果
select 'select '''||column_name||'|'',ltrim(rtrim('||column_name||')) $where;' from user_tab_columns where table_name='$table';
这句是什么意思???
作者: ohwww    时间: 2003-06-20 15:31
标题: 用sh列表显示oracle数据库单条查询结果
问题大体已经解决了,谢谢这些天来被我烦的人,呵呵.
作者: rollingpig    时间: 2003-06-23 14:48
标题: 用sh列表显示oracle数据库单条查询结果
用set pages=10000会只有一header




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