当前位置:首页 » 编程语言 » 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])
第二个参数是游标啊,其他参数放后面,没有可以省略

热点内容
电信光纤上传限制 发布:2024-05-18 16:08:05 浏览:910
sql中的limit 发布:2024-05-18 16:05:57 浏览:895
启动ug时服务器无响应是怎么回事 发布:2024-05-18 15:48:24 浏览:372
小数除法的计算法则 发布:2024-05-18 15:36:52 浏览:530
安卓网卡免驱动如何实现 发布:2024-05-18 15:25:15 浏览:860
8加6算法 发布:2024-05-18 15:04:25 浏览:738
名图16款尊享什么配置 发布:2024-05-18 14:55:37 浏览:585
我的世界怎样刷出32k服务器 发布:2024-05-18 14:32:32 浏览:565
c语言程序设计江宝钏 发布:2024-05-18 14:32:22 浏览:780
右击文件夹总是转圈圈 发布:2024-05-18 14:31:10 浏览:697