最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python調(diào)用SQLPlus來操作和解析Oracle數(shù)據(jù)庫的方法

 更新時間:2016年04月09日 17:34:53   作者:雙子座  
這篇文章主要介紹了Python調(diào)用SQLPlus來操作和解析Oracle數(shù)據(jù)庫的方法,這樣用SQL*Plus方式來分析Oracle中的數(shù)據(jù)就變得十分方便,需要的朋友可以參考下

先來看一個簡單的利用python調(diào)用sqlplus來輸出結(jié)果的例子:

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,當(dāng)然最好用cx_Oracle庫,但有時候受到種種限制,不能安裝Python第三方庫,就得利用現(xiàn)有資源,硬著頭皮上了。

用Python調(diào)用SqlPlus查詢Oracle,首先要知道SqlPlus返回結(jié)果是什么樣的:

(這是空行)
Number    Name    Address
------------ ----------- ------------------
1001     張三     南京路
1002     李四     上海路

第1行是空行,第2行是字段名稱,第3行都是橫杠,有空格隔開,第4行開始是查詢到的結(jié)果。

在查詢結(jié)果規(guī)整的情況下,根據(jù)第3行可以很清晰的看到結(jié)構(gòu),用Python解析起來也比較方便。但是,如果一張表字段特別多,記錄數(shù)也相當(dāng)多,那么默認(rèn)情況下調(diào)用SqlPlus查詢出的結(jié)果會比較亂,這就需要在調(diào)用查詢之前做一些設(shè)定,比如:

set linesize 32767
set pagesize 9999
set term off verify off feedback off tab off
set numwidth 40

這樣的調(diào)用查詢結(jié)果就比較規(guī)整了。接下來就是用強(qiáng)大的Python來解析查詢結(jié)果。

這里封裝了一個函數(shù),可以根據(jù)傳入的SQL語句查詢并解析結(jié)果,將每行結(jié)果存到列表中,列表中的每個元素是一個字段名稱與值的映射。

#!/usr/bin/python
#coding=UTF-8

'''
@author: 雙子座@開源中國
@summary: 通過SqlPlus查詢Oracles數(shù)據(jù)庫
'''

import os;

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.AL32UTF8'
gStrConnection = 'username/password@10.123.5.123:1521/ora11g'

#解析SqlPlus的查詢結(jié)果,返回列表
def parseQueryResult(listQueryResult):
  listResult = []
  #如果少于4行,說明查詢結(jié)果為空
  if len(listQueryResult) < 4:
    return listResult
  #第0行是空行,第1行可以獲取字段名稱,第2行可獲取SQLPlus原始結(jié)果中每列寬度,第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行開始,解析結(jié)果,并建立映射,存儲到列表中
  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
  #構(gòu)造查詢命令
  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'
  #調(diào)用系統(tǒng)命令收集結(jié)果
  result = os.popen(strCommand)
  list = []
  for line in result:
    list.append(line)
  return parseQueryResult(list)

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

select userenv['language'] from dual;

在調(diào)用的時候,只要類似:
listResult = QueryBySqlPlus('select * from studentinfo')

然后就可以用循環(huán)打印出結(jié)果了。

相關(guān)文章

  • Python3通過chmod修改目錄或文件權(quán)限的方法示例

    Python3通過chmod修改目錄或文件權(quán)限的方法示例

    這篇文章主要介紹了Python3通過chmod修改目錄或文件權(quán)限的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python 圖形界面框架TkInter之在源碼中找pack方法

    Python 圖形界面框架TkInter之在源碼中找pack方法

    這篇文章主要介紹了Python 圖形界面框架TkInter之在源碼中找pack方法,根據(jù)不同的需求,選擇對應(yīng)的布局方式,每個控件都可以使用pack作為布局管理,下面我們就來看看從源碼中找pack()在哪里,需要的朋友可以參考下
    2022-03-03
  • 詳解Pandas中GroupBy對象的使用

    詳解Pandas中GroupBy對象的使用

    本文將探討如何在Python的Pandas庫中創(chuàng)建GroupBy對象以及該對象的工作原理。我們將詳細(xì)了解分組過程的每個步驟,以及我們可以從中提取哪些有用信息,需要的可以參考一下
    2022-06-06
  • Python遠(yuǎn)程方法調(diào)用實現(xiàn)過程解析

    Python遠(yuǎn)程方法調(diào)用實現(xiàn)過程解析

    這篇文章主要介紹了Python遠(yuǎn)程方法調(diào)用實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 基于Python實現(xiàn)代碼版彩票小游戲

    基于Python實現(xiàn)代碼版彩票小游戲

    彩票是一個恒古不變的話題,現(xiàn)在的生活越來越好,大部分人開始關(guān)注福利彩票的事情,當(dāng)然也有很多人都想中將是真的啦~哈哈哈,但是大家還是要適當(dāng)哦!小編今天給大家做了一款簡易的彩票小游戲,讓我們看看誰能中一等獎吧?誰又是二等獎、三等獎呢
    2023-03-03
  • Python生成器以及應(yīng)用實例解析

    Python生成器以及應(yīng)用實例解析

    這篇文章主要介紹了Python生成器以及應(yīng)用實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 解讀tf.keras.layers模塊中的函數(shù)

    解讀tf.keras.layers模塊中的函數(shù)

    這篇文章主要介紹了tf.keras.layers模塊中的函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Django配置Redis使用的方法步驟

    Django配置Redis使用的方法步驟

    本文主要介紹了Django配置Redis使用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Python命令行解析工具Argparse

    詳解Python命令行解析工具Argparse

    這篇文章主要為大家詳細(xì)介紹了Python命令行解析工具Argparse的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-04-04
  • python如何使用split多字符分割字符串的方法

    python如何使用split多字符分割字符串的方法

    這篇文章主要給大家介紹了關(guān)于python如何使用split多字符分割字符串的相關(guān)資料,split()方法是一個非常強(qiáng)大的工具,可以幫助我們輕松地分割字符串,需要的朋友可以參考下
    2023-10-10

最新評論

包头市| 乌鲁木齐县| 望谟县| 中西区| 探索| 宁安市| 惠来县| 华阴市| 北京市| 镇江市| 东山县| 临安市| 丽水市| 长丰县| 陇南市| 安西县| 丹凤县| 炉霍县| 富宁县| 正安县| 阳山县| 绩溪县| 兴和县| 乳源| 西盟| 横峰县| 包头市| 涪陵区| 江西省| 民权县| 凤城市| 台北县| 阳朔县| 阜新市| 阳山县| 日土县| 黄梅县| 四平市| 陆丰市| 万全县| 桑植县|