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", "//m.sbmmt.com/m/", "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' gStrConnection = 'username/password@10.123.5.123: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 = 0 lineFieldNames = listQueryResult[1] for iWidth in listIntWidth: #截取[iLastIndex, iLastIndex+iWidth)之间的字符串 strFieldName = lineFieldNames[iLastIndex:iLastIndex + iWidth] strFieldName = strFieldName.strip() #去除两端空白符 listStrFieldName.append(strFieldName) iLastIndex = iLastIndex + iWidth + 1 # 3 第3行开始,解析结果,并建立映射,存储到列表中 for i in range(3, len(listQueryResult)): oneLiseResult = unicode(listQueryResult[i], 'UTF-8') fieldMap = {} iLastIndex = 0 for j in range(len(listIntWidth)): strFieldValue = oneLiseResult[iLastIndex:iLastIndex + listIntWidth[j]] strFieldValue = strFieldValue.strip() fieldMap[listStrFieldName[j]] = strFieldValue iLastIndex = iLastIndex + listIntWidth[j] + 1 listResult.append(fieldMap) return listResult def QueryBySqlPlus(sqlCommand): global gStrConnection #构造查询命令 strCommand = 'sqlplus -S %s <其中os.environ['NLS_LANG']的值来自
select userenv['language'] from dual;在调用的时候,只要类似:listResult = QueryBySqlPlus('select * from studentinfo')然后就可以用循环打印出结果了。
php入门到就业线上直播课:查看学习
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。千万级数据并发解决方案(理论+实战):点击学习
相关文章推荐
• ❤️🔥共22门课程,总价3725元,会员免费学• ❤️🔥接口自动化测试不想写代码?• Python NumPy教程之数据类型对象• 使用Python处理KNN分类算法• Python标准库中的logging用法示例• python发腾讯微博代码分享• python自动化测试实例解析
相关课程推荐
独孤九贱(3)_JavaScript视频教程
javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。没有它,你的前端生涯是不完整的。《php.cn独孤九贱(3)-JavaScript视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了javascript知识。
JavaScript教程139740次播放
独孤九贱(6)_jQuery视频教程
jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等,是全球最流行的前端开发框架之一。PHP中文网根据最新版本,独家录制jQuery最新视频教程,回馈PHP中文网的新老用户。
jQuery教程114838次播放
jQuery与Ajax基础与实战
jQuery是最流行的JS函数库,封装了许多实用的功能,其中最引人入胜的就是Ajax。 jQuery中的Ajax操作,语法简单,操作方便,使Ajax从未如此轻松,前端人员从此不再为与服务器异步交互而发愁,本套课程,精选了最常用的几个方法,从基本的语法到每个参数,再到具体实例进行了全面的讲解。
AJAX教程14513次播放
Git教程(60分钟全程无废话版)
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持
JavaScript教程12491次播放
1/1