亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python調用SQLPlus來操作和解析Oracle數據庫的方法

2020-01-04 17:33:38
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python調用SQLPlus來操作和解析Oracle數據庫的方法,這樣用SQL*Plus方式來分析Oracle中的數據就變得十分方便,需要的朋友可以參考下
 

先來看一個簡單的利用python調用sqlplus來輸出結果的例子:

import osimport sysfrom subprocess import Popen, PIPE sql = """set linesize 400col owner for a10col 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 32767set pagesize 9999set term off verify off feedback off tab offset 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 listResultdef 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')

然后就可以用循環打印出結果了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文在线视频| 国产美女精品免费电影| 欧美丰满片xxx777| 日韩精品在线免费观看| 色偷偷噜噜噜亚洲男人| 色小说视频一区| 欧美日韩国内自拍| 欧美性视频在线| 亚洲一级黄色片| 久久精品国产亚洲精品| 播播国产欧美激情| 亚洲乱码国产乱码精品精| 欧美第一页在线| 红桃av永久久久| 欧美激情中文字幕乱码免费| 亚洲日本中文字幕免费在线不卡| 亚洲欧洲第一视频| 青青久久aⅴ北条麻妃| 久久久久久久久久久亚洲| 91欧美视频网站| 日本中文字幕成人| 国产精品视频久久久| 久久精品一本久久99精品| 日韩av在线免费看| 亚洲第一在线视频| 日韩一区二区精品视频| 国产97在线观看| 国产一区二区三区久久精品| 欧美成人亚洲成人| 国产精品一区二区三区成人| 亚洲另类欧美自拍| 精品日韩中文字幕| 欧美日韩国产精品| 欧美日韩精品中文字幕| 97av在线视频免费播放| 亚洲影院高清在线| 久久久久久成人| 日韩av电影在线网| 亚洲国产精品久久久久久| 精品毛片三在线观看| 91亚洲精品在线观看| 欧美做受高潮电影o| 久久影院免费观看| 亚洲精品天天看| 色综合久久中文字幕综合网小说| 国产日韩欧美91| 日韩精品在线观看一区二区| 亚洲人成自拍网站| 国产国语刺激对白av不卡| 欧美网站在线观看| 亚洲一级黄色av| 日本精品性网站在线观看| 国产一区二区成人| 国产女同一区二区| 国产精品久久久91| 九九九久久国产免费| 国产在线视频2019最新视频| 国产午夜精品全部视频在线播放| 欧美性视频精品| 自拍偷拍亚洲欧美| 欧美另类99xxxxx| 国产日本欧美在线观看| 国产精品高清网站| 亚洲v日韩v综合v精品v| 亚洲色在线视频| 国产91在线播放九色快色| 最近2019年好看中文字幕视频| 久久久精品国产亚洲| 亚洲无线码在线一区观看| 97国产真实伦对白精彩视频8| 97香蕉久久夜色精品国产| 亚洲精品自拍视频| 国产精品大片wwwwww| 91久久久亚洲精品| 91精品国产91久久久久久不卡| 精品久久久久久国产91| 亚洲精品国精品久久99热一| 久久中文字幕在线| 日韩av影片在线观看| 欧美日韩国内自拍| 国产精品尤物福利片在线观看| 福利一区视频在线观看| 亚洲高清久久久久久| 亚洲视频在线观看视频| 欧美日韩成人免费| 亚洲成人精品久久久| 日韩在线观看免费全| 亚洲高清久久久久久| 久久99久久99精品中文字幕| 黄色91在线观看| 92看片淫黄大片看国产片| 国产一区二区三区丝袜| 日韩免费在线看| 国产精品免费观看在线| 亚洲色图色老头| 亚洲欧美一区二区三区久久| 国产日韩精品综合网站| 精品视频久久久久久| 在线日韩av观看| 亚洲精品理论电影| 一区二区亚洲精品国产| 亚洲欧美日韩爽爽影院| 欧美与黑人午夜性猛交久久久| 亚洲乱码国产乱码精品精| 亚洲第一免费播放区| 亚洲天堂男人天堂女人天堂| 在线观看视频亚洲| 国产精品丝袜久久久久久不卡| 欧美午夜精品伦理| 97成人超碰免| 一区国产精品视频| 久久久女人电视剧免费播放下载| 日韩精品高清在线| 不卡毛片在线看| 欧美性69xxxx肥| 欧美日韩精品二区| 亚洲在线视频福利| 欧美激情性做爰免费视频| 亚洲欧美制服另类日韩| 一区二区成人av| 爱福利视频一区| 久久成人亚洲精品| 欧美激情2020午夜免费观看| 色哟哟亚洲精品一区二区| 欧美孕妇孕交黑巨大网站| 欧美视频中文在线看| 亚洲成人av片在线观看| 高清一区二区三区日本久| 国产综合香蕉五月婷在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 狠狠久久五月精品中文字幕| 91色视频在线观看| 亚洲欧美一区二区三区四区| 国产福利视频一区| 国产精品免费一区豆花| 久久久欧美一区二区| 亚洲欧美综合另类中字| 精品久久久在线观看| 国产成人精品在线播放| 久久精品国产亚洲| 亚洲成人久久一区| www高清在线视频日韩欧美| 欧美尺度大的性做爰视频| 国自产精品手机在线观看视频| 日韩亚洲欧美中文在线| 色狠狠av一区二区三区香蕉蜜桃| 成人免费xxxxx在线观看| 亚洲精品美女在线观看| 岛国av一区二区在线在线观看| 国产午夜精品免费一区二区三区| 欧美日韩国产成人| 欧美性生交xxxxxdddd| 国产精品第100页| 日韩在线视频免费观看| 久久久91精品国产一区不卡| 欧美日韩亚洲国产一区| 精品国产乱码久久久久酒店| 亚洲国产成人在线视频| 久久噜噜噜精品国产亚洲综合| 韩剧1988免费观看全集| 91wwwcom在线观看| 精品美女国产在线| 欧美午夜影院在线视频| 国产成人精品久久久|