py调用oracle的存储过程,注意procedure的out取值方式

#!/usr/bin/env python
import sys
import csv
import cx_Oracle
import codecs
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'

conn = cx_Oracle.connect("vivigsrp", "vivigsrp", "10.1.1.210/orcl")
curs = conn .cursor()

str1='nice'
str2='    '

#x=curs.callproc('p_demo',[str1,str2])  #x返回的是个array类型的in  out组成

lstr1,lstr2=curs.callproc('p_demo',[str1,str2])
print(str2) #这个是取不到返回的out参数的
print(lstr1) #这个是in参数
print(lstr2) #这个是out参数


str2=curs.callfunc('f_demo',cx_Oracle.STRING,[str1])
print(str2) 

curs.close()
conn.close()
 

 

p_demo( in ,out)

f_demo(in) return  varchar2

找到取不到值的原因了,出参需要特殊声明一下:

这里主要测试在Python中通过cx_Oracle调用PL/SQL。

首先,在数据库端创建简单的存储过程。

1

2

3

4

create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is

begin

 o_msg := i_user ||', Good Morning!';

end;

然后,开始在Python命令行中进行存储过程调用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import cx_Oracle as cx

conn = cx.connect('database connecting string')

cursor = conn.cursor()

#声明变量

user = 'Nick' #plsql入参

msg = cursor.var(cx_Oracle.STRING) #plsql出参

#调用存储过程

cursor.callproc('test_msg', [user, msg]) #['Nick', 'Nick, Good Morning!']

#打印返回值

print msg #<cx_Oracle.STRING with value 'Nick, Good Morning!'>

print msg.getvalue() #Nick, Good Morning!

#资源关闭

cursor.close()

conn.close()

延伸阅读:

存储过程、cx_Oracle、Python的对象类型之间存在转换关系。具体如下:

 

Oraclecx_OraclePython
VARCHAR2, NVARCHAR2, LONGcx_Oracle.STRINGstr
CHARcx_Oracle.FIXED_CHARstr
NUMBERcx_Oracle.NUMBERint
FLOATcx_Oracle.NUMBERfloat
DATEcx_Oracle.DATETIMEdatetime.datetime
TIMESTAMPcx_Oracle.TIMESTAMPdatetime.datetime
CLOBcx_Oracle.CLOBcx_Oracle.LOB
BLOBcx_Oracle.BLOBcx_Oracle.LOB

 

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值