python调用sqlplus执行_Python调用SQLPlus来操作和解析Oracle数据库的方法

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 <

其中os.environ['NLS_LANG']的值来自

select userenv['language'] from dual;

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

立即提交

专题推荐独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值