
Python调用SQLPlus来操作和解析Oracle数据库的方法
这篇文章主要介绍了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'
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 <<!\n' % gStrConnection
strCommand = strCommand + 'set linesize 32767\n'
strCommand = strCommand + 'set pagesize 9999\n'
strCommand = strCommand + 'set term off verify off feedback off tab off \n'
strCommand = strCommand + 'set numwidth 40\n'
strCommand = strCommand + sqlCommand + '\n'
#调用系统命令收集结果
result = os.popen(strCommand)
list = []
for line in result:
list.append(line)
return parseQueryResult(list)
其中os.environ['NLS_LANG']的值来自
select userenv['language'] from dual;
在调用的时候,只要类似:
listResult = QueryBySqlPlus('select * from studentinfo')
然后就可以用循环打印出结果了。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
用 Power BI 制作地图热力图:基于经纬度数据的实践指南 在数据可视化领域,地图热力图凭借直观呈现地理数据分布密度的优势,成 ...
2025-07-24解析 insert into select 是否会锁表:原理、场景与应对策略 在数据库操作中,insert into select 是一种常用的批量数据插入语句 ...
2025-07-24CDA 数据分析师的工作范围解析 在数字化时代的浪潮下,数据已成为企业发展的核心资产之一。CDA(Certified Data Analyst)数据分 ...
2025-07-24从 CDA LEVEL II 考试题型看 Python 数据分析要点 在数据科学领域蓬勃发展的当下,CDA(Certified Data Analyst)认证成为众多从 ...
2025-07-23用 Python 开启数据分析之旅:从基础到实践的完整指南 在数据驱动决策的时代,数据分析已成为各行业不可或缺的核心能力。而 Pyt ...
2025-07-23鸢尾花判别分析:机器学习中的经典实践案例 在机器学习的世界里,有一个经典的数据集如同引路明灯,为无数初学者打开了模式识别 ...
2025-07-23解析 response.text 与 response.content 的核心区别 在网络数据请求与处理的场景中,开发者经常需要从服务器返回的响应中提取数 ...
2025-07-22解析神经网络中 Softmax 函数的核心作用 在神经网络的发展历程中,激活函数扮演着至关重要的角色,它们为网络赋予了非线性能力, ...
2025-07-22CDA数据分析师证书考取全攻略 一、了解 CDA 数据分析师认证 CDA 数据分析师认证是一套科学化、专业化、国际化的人才考核标准, ...
2025-07-22左偏态分布转正态分布:方法、原理与实践 左偏态分布转正态分布:方法、原理与实践 在统计分析、数据建模和科学研究中,正态分 ...
2025-07-22你是不是也经常刷到别人涨粉百万、带货千万,心里痒痒的,想着“我也试试”,结果三个月过去,粉丝不到1000,播放量惨不忍睹? ...
2025-07-21我是陈辉,一个创业十多年的企业主,前半段人生和“文字”紧紧绑在一起。从广告公司文案到品牌策划,再到自己开策划机构,我靠 ...
2025-07-21CDA 数据分析师的职业生涯规划:从入门到卓越的成长之路 在数字经济蓬勃发展的当下,数据已成为企业核心竞争力的重要来源,而 CD ...
2025-07-21MySQL执行计划中rows的计算逻辑:从原理到实践 MySQL 执行计划中 rows 的计算逻辑:从原理到实践 在 MySQL 数据库的查询优化中 ...
2025-07-21在AI渗透率超85%的2025年,企业生存之战就是数据之战,CDA认证已成为决定企业存续的生死线!据麦肯锡全球研究院数据显示,AI驱 ...
2025-07-2035岁焦虑像一把高悬的利刃,裁员潮、晋升无望、技能过时……当职场中年危机与数字化浪潮正面交锋,你是否发现: 简历投了10 ...
2025-07-20CDA 数据分析师报考条件详解与准备指南 在数据驱动决策的时代浪潮下,CDA 数据分析师认证愈发受到瞩目,成为众多有志投身数 ...
2025-07-18刚入职场或是在职场正面临岗位替代、技能更新、人机协作等焦虑的打工人,想要找到一条破解职场焦虑和升职瓶颈的系统化学习提升 ...
2025-07-182025被称为“AI元年”,而AI,与数据密不可分。网易公司创始人丁磊在《AI思维:从数据中创造价值的炼金术 ...
2025-07-18CDA 数据分析师:数据时代的价值挖掘者 在大数据席卷全球的今天,数据已成为企业核心竞争力的重要组成部分。从海量数据中提取有 ...
2025-07-18