• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python调用SQLPlus来操作和解析Oracle数据库的方法

python 搞代码 4年前 (2022-01-07) 26次浏览 已收录 0个评论

这篇文章主要介绍了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搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python调用SQLPlus来操作和解析Oracle数据库的方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址