當前位置:首頁 » 編程語言 » Python讀取oracle

Python讀取oracle

發布時間: 2023-05-24 14:04:38

㈠ 如何在python環境下連接Oracle資料庫

首先下載驅動

(cx_Oracle) 要注意一下版本 根據你的情況加以選擇

安裝

執行exe安裝程序就可以了 它會一個cx_Oracle pyd到{PYTHON_HOME}Libsite packages目錄下

執行一段測試程序 import cx_Oraclecon = nnect( xjtu_test xjtu world )cursor = con cursor()cursor close()con close()

里邊connect中的 個參數從左到右分別是 user pass TNS

那個TNS可以用Oracle客戶端高悉謹工具中的Net Configuration Assistant來配置

參考cx_Oracle API

好了 執行那段測試代碼時你肯定遇到問題了 一般會有以下問題戚基

【 】import cx_Oracle 時報告找不到OCI DLL

到裝了Oracle的機器上找一個 然後到{PYTHON_HOME}Libsite packages目錄下就可以了

【 】nnect 時報告RuntimeError Unable to acquire Oracle environment handle

這個問題相對比較麻煩 按以下步驟來解決陸衡 (可能不需要所有的步驟 我沒有確認 不過把以下步驟都執行了 確實問題就解決了)

首先 確認你是在控制台下邊來執行這個python腳本的 而不是某些ide 例如 PyDev(它們似乎無法載入os的環境變數)

其實 在本機安裝Oracle(只安客戶端工具就可以了)

lishixin/Article/program/Oracle/201311/17797

㈡ python如何保存從oracle資料庫中讀取的BLOB文件

import cx_Oracle

con = cx_Oracle.connect(『username』, 『password』, 『dsn』)

blob_sql = "select column_name from table where clause"

cursor = con.cursor()

cursor.execute(blob_sql)

result = cursor.fetchall()

file = open('file_name', "wb")

file.write(result[0][0].read()) #可以print查看result的內容,根據實際情況read

file.close()

㈢ python調用oracle的sql中wm_concat問題:

利用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/[email protected]: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 al;
在調用的時候,只要類似:
listResult = QueryBySqlPlus('select * from studentinfo')
然後就可以用循環列印出結果了。

㈣ python2.x讀取Oracle11g的NCLOB數據(超長文本)輸出時亂碼問題,怎麼解決

python 2.7.2需要使用cx_Oracle 5.1以上版本的,請升級版本後再試

㈤ Python 進行 Oracle 與 Mysql 不同資料庫類型之間的數據 diff


項目工作中,可能會有 A 類型資料庫數據需要遷移到 B 類型的資料庫中的需求。 例如:假設現有一個資料庫的遷移需求,是將 Oracle 資料庫里的數據遷移至 Mysql 資料庫中。 常規的測試方法是人工去抽樣檢測數據進行 diff,因為數據量太大,人工不可能實現全量數據的肉眼 diff。

因此,為提高數據 diff 的正確性以及測試效率,編寫測試腳本進行全量遷移數據的 diff 是十分必要的。以下內容將會著重講解如何使信銀用 Python 編寫腳本來實現 Oracle 與 Mysql 這種不同類型資料庫之間數據的 diff。


1、連接oracle資料庫並獲取要提取的數據,並輸出列表裡面嵌入的字典類型的數據

2、連接mysql資料庫並獲滑閉宴取要提取的數據態態,並輸出列表裡面嵌入的字典類型的數據

3、Oracle 與 Mysql 資料庫進行 diff,直接調用上面兩個方法即可

4、執行後的輸出結果


㈥ python 3.6 連接 oracle 後 怎麼讀取數據和列名

def query(self, sql):
connect = self.connect()
cur = connect.cursor()
cur.execute(sql)
index = cur.description
result = []
for res in cur.fetchall():
row = {}
for i in range(len(index)-1):
row[index[i][0]] = res[i]
result.append(row)
connect.close()
return result
這個方法返回查詢結果就是帶欄位名的{『字團隱段名野凳』:頌或旅『值』}

㈦ python如何自動獲取oracle資料庫中所有表的表結構

你看你怎麼調用這個sql語句吧

selecta.owner所屬用戶,
a.table_name表名,
a.column_name欄位名,
a.data_type欄位類型,
a.欄位長度,
a.欄位精度,
a.是否為空襪租悶,
a.創建日期,
a.最後修改日期,
casewhena.owner=d.owneranda.table_name=d.table_nameanda.column_name=d.column_namethen'主鍵'else''end是否主鍵
from
(selecta.owner,a.table_name,b.column_name,b.data_type,casewhenb.data_precisionisnullthenb.data_lengthelsedata_precisionend欄位長度,data_scale欄位精度,
decode(nullable,'Y','√','N','×')是否為空,c.created創建日期,c.last_ddl_time最後修改日期
fromall_tablesa,all_tab_columnsb,all_objectsc
wherea.table_name=b.table_nameanda.owner=b.owner
anda.owner=c.owner
anda.table_name=c.object_name
anda.owner='SCOTT'--這個是查某個用戶,你到時候把用戶名換一下就好型畢,一定大寫
andc.object_type='TABLE')a
leftjoin
(selecta.owner,a.table_name,a.column_name,a.constraint_namefromuser_cons_columnsa,user_constraintsb
wherea.constraint_name=b.constraint_nameandb.constraint_type='P')d
on告彎a.owner=d.owneranda.table_name=d.table_nameanda.column_name=d.column_name
orderbya.owner,a.table_name;

㈧ python打包以後不能連接orcle資料庫怎麼辦

應該是少了某些文件
前言

Python自帶的模塊中有很多操縱文件的。我們可以把文件的數據讀出來,經過處理還可以將數據寫入文件中。但是對於數據的管理和分析來說,資料庫還是專業一些。如果Python能和資料庫結合在一起,那麼就能結合兩種的優勢,提高效率。

工作中使用的是Oracle資料庫,Python有一個模塊cx_Oracle可以與Oracle相連。要使用cx_Oracle,就要先下載。

1. 下載cx_Oracle

Python一個官方網站PyPI,上面有豐富的模塊。cx_Oracle就可以在PyPI中下載。打開PyPI的,在裡面搜索cx_Oracle,即可找到該模塊。當然也可以通過其它的途徑下載。

下載之後就可以使用了。

2. 使用流程

簡單的使用流程如下:

1.引用模塊cx_Oracle
2.連接資料庫
3.獲取cursor
4.使用cursor進行各種操作
5.關閉cursor
6.關閉連接

下面是一個簡單的例子:

import cx_Oracle #引用模塊cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g') #連接資料庫
c=conn.cursor() #獲取cursor
x=c.execute('select sysdate from al') #使用cursor進行各種操作
x.fetchone()
c.close() #關閉cursor
conn.close() #關閉連接

3. 幾種用法

Python對資料庫的操作主要有2方面:一個是寫數據,一個是讀數據。這2個方面的實現可以通過SQL語句實現,也可以通過存儲過程實現。所以cx_Oracle的主要用法有:

1. 執行SQL語句

2. 調用存儲過程和函數。

4. 執行SQL語句

執行SQL語句很簡單,從上面的例子就可以看出。使用cursor.execute即可執行。使用fetchone或fetchall即可將執行結果讀出來。

下面一個例子是Insert語句,使用的變數綁定。

import cx_Oracle
conn=cx_Oracle.connect('load/123456@loaclhost/ora11g')
c=conn.cursor()
x=c.execute('insert into demo(v) values(:1)',['nice'])
conn.commit();
c.close()
conn.close()

變數綁定和Oracle的動態SQL一樣,都是冒號將佔位符,即代碼中的:1,對變數的復制就是傳入一個List,即代碼中的['nice']。有多少個變數,list中就應該對應多少個值,數目要一致,否則會報錯。

執行之後,可以使用連接的一個方法connect.commit(),將事務提交。

5. 調用存儲過程和方法

直接上代碼:

--存儲過程代碼:
CREATE OR REPLACE PROCEDURE P_DEMO(V1 IN VARCHAR2, V2 OUT VARCHAR2) IS
BEGIN
V2 := V1;
END;

#Python代碼:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2=' '#需要有值,即len(str2)>=len(str1)
x=c.callproc('p_demo',[str1,str2])
print(str2)
c.close()
conn.close()

調用存儲過程使用的是cursor.callproc方法。上面的存儲過程中,一個變數的值是OUT型的,在Python中,對OUT型的變數賦值,主要該變數的長度不能小於存儲過程中的。

--函數代碼:
CREATE OR REPLACE function F_DEMO(V1 VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN V1;
END;

#Python代碼:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2=c.callfunc('f_demo',cx_Oracle.STRING,[str1])
print(str2)
c.close()
conn.close()

調用函數使用的方法是cursor.callfunc。這個與調用存儲過程不同之處在於,它需要指定傳輸參數的類型。

結束

通過cx_Oracle,可以是Python與Oracle資料庫相互溝通,這樣兩者就可以長處互補。

比如,可以將Python當成一個數據收集的工具,可以從Web,從文件中獲取數據,然後將這些數據保存到Oracle資料庫中,在Oracle資料庫上進行數據的進一步分析。

㈨ 怎麼用Python腳本怎麼從oracle資料庫中取出clob數據

stmt = con.prepareStatement("select attach,fjmc,piid,swsj fromreceiveFile");//attach是clolb對象
rs = stmt.executeQuery( );
while (rs.next()) {
java.sql.Blob blob = rs.getBlob(1);//這一句可獲得blob,clob等對象。

然後再把blob轉成文件

File file = new File("G:\\XiangMu_dwoa\\資料庫文件資料\\aaa");
OutputStream fout = new FileOutputStream(file);
//下面將BLOB數據寫入文件
byte[] b = new byte[1024];
int len = 0;
while ( (len = ins.read(b)) != -1) {
fout.write(b, 0, len);

你可以參考一下

㈩ 我現在在用python調用oracle的一個介面,但是返回值是一個游標,我該如何獲取這個游標的具體值啊

zs = cursor.var(cx_Oracle.CURSOR)
cursor.callproc('proc_query_news',[zs])
第二個參數是游標啊,其他參數放後面,沒有可以省略

熱點內容
如何設置強緩存的失效時間 發布:2025-05-19 15:21:28 瀏覽:695
winxp無法訪問 發布:2025-05-19 15:19:48 瀏覽:947
文件預編譯 發布:2025-05-19 15:14:04 瀏覽:643
怎麼在伺服器上掛公網 發布:2025-05-19 15:14:02 瀏覽:272
濟南平安e通如何找回密碼 發布:2025-05-19 14:56:58 瀏覽:176
安卓手機如何找到iccid碼 發布:2025-05-19 14:46:51 瀏覽:227
編譯的內核為什麼那麼大 發布:2025-05-19 14:45:21 瀏覽:179
什麼控制壓縮 發布:2025-05-19 14:28:13 瀏覽:931
網路伺服器忙指什麼 發布:2025-05-19 14:28:10 瀏覽:189
伺服器有外網ip 發布:2025-05-19 14:02:02 瀏覽:833