这篇文章主要介绍了Python调用SQLPlus来操作和解析Oracle数据库的方法,这样用SQL*Plus方式来分析Oracle中的数据就变得十分方便,需要的朋友可以参考下
先来看一个简单的利用python调用sqlplus来输出结果的例子:
import os import sys from subprocess import Popen, PIPE sql = """ set linesize 400 col owner for a10 col object_name for a30 select owner, object_name from dba_objects where rownum<=10; """ proc = Popen(["sqlplus", "-S", "/", "as", "sysdba"], stdout=PIPE, stdin=PIPE, stderr=PIPE) proc.stdin.write(sql) (out, err) = proc.communicate() if proc.returncode != 0: print err sys.exit(proc.returncode) else: print out
用Python查询Oracle,当然最好用cx_Oracle库,但有时候受到种种限制,不能安装Python第三方库,就得利用现有资源,硬着头皮上了。
用Python调用SqlPlus查询Oracle,首先要知道SqlPlus返回结果是什么样的:
(这是空行) Number Name Address ------------ ----------- ------------------ 1001 张三 南京路 1002 李四 上海路
第1行是空行,第2行是字段名称,第3行都是横杠,有空格隔开,第4行开始是查询到的结果。
在查询结果规整的情况下,根据第3行可以很清晰的看到结构,用Python解析起来也比较方便。但是,如果一张表字段特别多,记录数也相当多,那么默认情况下调用SqlPlus查询出的结果会比较乱,这就需要在调用查询之前做一些设定,比如:
set linesize 32767 set pagesize 9999 set term off verify off feedback off tab off set numwidth 40
这样的调用查询结果就比较规整了。接下来就是用强大的Python来解析查询结果。
这里封装了一个函数,可以根据传入的SQL语句查询并解析结果,将每行结果存到列表中,列表中的每个元素是一个字段名称与值的映射。
#!/usr/bin/python #coding=UTF-8 ''' @author: 双子座@开源中国 @summary: 通过SqlPlus查询Oracles数据库 ''' import os; os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8' gStrConnect<i style="color:transparent">来源gaodai$ma#com搞$$代**码)网</i>ion = 'username/[email protected]:1521/ora11g' #解析SqlPlus的查询结果,返回列表 def parseQueryResult(listQueryResult): listResult = [] #如果少于4行,说明查询结果为空 if len(listQueryResult) <4: return listresult #第0行是空行,第1行可以获取字段名称,第2行可获取sqlplus原始结果中每列宽度,第3行开始是真正输出 # 1 解析第2行,取得每列宽度,放在列表中 liststrtmp=listQueryResult[2].split(' ') listintwidth=[] for onestr in liststrtmp: listintwidth.append(len(onestr)) 2 解析第1行,取得字段名称放在列表中 liststrfieldname=[] ilastindex linefieldnames=listQueryResult[1] iwidth listintwidth: #截取[ilastindex, ilastindex+iwidth)之间的字符串 strfieldname=lineFieldNames[iLastIndex:iLastIndex + iwidth] strfieldname.strip() #去除两端空白符 liststrfieldname.append(strfieldname) 3 第3行开始,解析结果,并建立映射,存储到列表中 i range(3, len(listqueryresult)): oneliseresult=unicode(listQueryResult[i], 'utf-8') fieldmap={} 0 j range(len(listintwidth)): strfieldvalue=oneLiseResult[iLastIndex:iLastIndex listintwidth[j]] strfieldvalue.strip() fieldmap[liststrfieldname[j]]=strFieldValue listintwidth[j] listresult.append(fieldmap) def querybysqlplus(sqlcommand): global gstrconnection #构造查询命令 strcommand % 'set linesize 32767\n' pagesize 9999\n' term off verify feedback tab \n' numwidth 40\n' sqlcommand '\n' #调用系统命令收集结果 result=os.popen(strCommand) list=[] line result: list.append(line) parsequeryresult(list) <pre></div><p>其中os.environ['NLS_LANG']的值来自</p><div class="gaodaimacode"><pre class="prettyprint linenums"> select userenv['language'] from dual;
在调用的时候,只要类似:
listResult = QueryBySqlPlus('select * from studentinfo')
然后就可以用循环打印出结果了。
以上就是Python调用SQLPlus来操作和解析Oracle数据库的方法的详细内容,更多请关注gaodaima搞代码网其它相关文章!