python调用oracle存储过程传入多参数_精通 Oracle+Python,第 5 部分:存储过程、Python 编程...

本文介绍了如何使用Python的cx_Oracle模块调用Oracle数据库的存储过程,包括IN、OUT和IN OUT参数的处理。通过示例展示了添加部门、获取员工数量和查找员工的方法。此外,还探讨了Python中的并行处理、数据库外部的GROUP BY操作以及数据序列化。文章最后提到了Oracle Berkeley DB在缓存中的应用。
摘要由CSDN通过智能技术生成

调用数据库存储过程及其他感兴趣的高级 Python 编程功能。

2010 年 3 月发布

对于涉及数据库的软件开发来说,有两种主流开发方法:一种是在应用程序中(对于三层体系结构,也可以是在中间件中)实现所有业务逻辑,另一种是在数据库内部实现所有业务逻辑。本教程不讨论这两种解决方案的优缺点;不过,使用 Oracle 数据库方法还是会为面向数据库的应用程序带来某些好处。

用 PL/SQL 嵌入所有业务逻辑可大大减少应用程序与数据库之间的往返次数,从而此使处理都在服务器端进行。PL/SQL 与 SQL 紧密集成,并与 Python 类似,提供了大量的标准程序包库:从安排数据库作业时间 (DBMS_SCHEDULER),到自动查询调优 (DBMS_SQLTUNE) 和闪回 (DBMS_FLASHBACK),再到线性代数 (UTL_NLA) 和 LDAP 访问 (DBMS_LDAP)。

本教程介绍使用 cx_Oracle 模块在 Python 中调用 Oracle 数据库内部的 PL/SQL 存储过程和函数的各种方法,同时还介绍一些使用 PL/SQL 无法实现或者实现起来非常复杂的编程功能。在本文的最后,我们将简单介绍 Oracle Berkeley DB,它作为即取即用插件内置在 Python 中。

IN-OUT 方式

Oracle 过程和函数是将 SQL 功能与编程语言功能相结合一些数据库对象。过程(从现在开始也称其为函数)的参数可以是以下三种类型之一:

IN:传递给过程,但不能写入到过程内部

OUT:从过程返回,在过程主体内部可写

IN OUT:传递给过程,在过程内部完全可写

默认情况下,参数都是 IN 类型。

为了说明 Python 和 Oracle 过程之间的交互,我们考虑将以下程序包安装在 Oracle Database XE 实例的 HR 模式中。

CREATE OR REPLACE PACKAGE pkg_hr AS

PROCEDURE add_department(

p_department_id OUT NUMBER,

p_department_name IN VARCHAR2,

p_manager_id IN NUMBER,

p_location_id IN NUMBER

);

FUNCTION get_employee_count(

p_department_id IN NUMBER

) RETURN NUMBER;

PROCEDURE find_employees(

p_query IN VARCHAR2,

p_results OUT SYS_REFCURSOR

);

END pkg_hr;

/

CREATE OR REPLACE PACKAGE BODY pkg_hr AS

PROCEDURE add_department(

p_department_id OUT NUMBER,

p_department_name IN VARCHAR2,

p_manager_id IN NUMBER,

p_location_id IN NUMBER

) AS

BEGIN

INSERT INTO departments(department_id, department_name, manager_id, location_id)

VALUES (departments_seq.nextval, p_department_name, p_manager_id, p_location_id)

RETURNING department_id

INTO p_department_id;

COMMIT;

END add_department;

FUNCTION get_employee_count(

p_department_id IN NUMBER

) RETURN NUMBER AS

l_count NUMBER;

BEGIN

SELECT COUNT(*)

INTO l_count

FROM employees

WHERE department_id= p_department_id;

RETURN l_count;

END get_employee_count;

PROCEDURE find_employees(

p_query IN VARCHAR2,

p_results OUT SYS_REFCURSOR

) AS

BEGIN

OPEN p_results FOR

SELECT *

FROM employees

WHERE UPPER(first_name||'

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python调用Oracle存储过程的步骤如下: 1. 安装Oracle客户端和PythonOracle驱动程序。 2. 使用Python的cx_Oracle模块连接Oracle数据库。 3. 创建一个游标对象。 4. 使用游标对象执行存储过程。 5. 提交事务并关闭游标和数据库连接。 示例代码如下: ``` import cx_Oracle # 连接Oracle数据库 conn = cx_Oracle.connect('username/password@host:port/service_name') # 创建游标对象 cursor = conn.cursor() # 执行存储过程 cursor.callproc('procedure_name', [arg1, arg2, ...]) # 提交事务 conn.commit() # 关闭游标和数据库连接 cursor.close() conn.close() ``` 其中,`username`和`password`是Oracle数据库的用户名和密码,`host`是数据库服务器的IP地址或主机名,`port`是数据库服务器的端口号,`service_name`是数据库的服务名。`procedure_name`是要执行的存储过程的名称,`arg1`、`arg2`等是存储过程参数。执行存储过程后,可以通过游标对象获取存储过程的返回值。 ### 回答2: Python调用Oracle存储过程的过程相对比较简单,需要安装OraclePython驱动包cx_Oracle。下面是一个简单的示例: 1. 安装cx_Oracle包 使用pip安装cx_Oracle包: ``` pip install cx_Oracle ``` 2. 连接Oracle数据库 使用cx_Oracle包的connect()方法连接Oracle数据库,需要提供数据库地址、用户名、密码等信息: ```python import cx_Oracle conn = cx_Oracle.connect('USER/PASSWORD@DATABASE_ADDRESS') ``` 3. 调用存储过程 使用cursor对象的callproc()方法调用存储过程,需要提供存储过程名称、参数列表等信息: ```python cursor = conn.cursor() # 定义存储过程参数 in_param1 = 'param1' in_param2 = 'param2' out_param = cursor.var(cx_Oracle.NUMBER) # 调用存储过程 cursor.callproc('procedure_name', [in_param1, in_param2, out_param]) # 获取存储过程返回值 result = out_param.getvalue() # 提交事务 conn.commit() # 关闭连接 cursor.close() conn.close() ``` 其中,in_param1和in_param2是传递给存储过程的输入参数,out_param是存储过程的输出参数,使用cursor.var()方法创建。最后使用out_param.getvalue()获取存储过程的返回值。 以上就是Python调用Oracle存储过程的基本步骤,具体的实现方式还需要根据具体的业务需求进行相应的调整。 ### 回答3: Python 通过 cx_Oracle 模块可以方便地调用 Oracle 存储过程。以下是一些步骤和代码示例: 1. 安装 cx_Oracle 模块。可以通过 pip install cx_Oracle 命令进行安装,也可以到官网下载安装包手动安装。 2. 导入模块并连接 Oracle 数据库。 ```python import cx_Oracle # 连接数据库 dsn = cx_Oracle.makedsn('hostname', 'port', service_name='service_name') conn = cx_Oracle.connect('username', 'password', dsn) ``` 3. 定义存储过程参数和游标,并创建一个调用存储过程的函数。 ```python def call_sp(param1, param2): # 定义参数和游标 in_param1 = conn.cursor() in_param2 = conn.cursor() out_cursor = conn.cursor() # 绑定参数 in_param1.var(cx_Oracle.NUMBER) in_param2.var(cx_Oracle.STRING) out_cursor.var(cx_Oracle.CURSOR) # 调用存储过程 conn.callproc('proc_name', [in_param1, in_param2, out_cursor]) # 打印结果 for row in out_cursor.fetchone(): print(row) # 关闭游标 in_param1.close() in_param2.close() out_cursor.close() ``` 4. 调用函数并传入存储过程参数。 ```python call_sp(1, 'value') ``` 以上是调用 Oracle 存储过程的基本步骤和示例代码。需要注意的是,在绑定游标变量时,需要使用 cx_Oracle.CURSOR 类型,并在调用存储过程时将其放在参数列表的最后。此外,如果存储过程有返回游标类型的输出参数,需要在游标变量的 var() 方法中指定游标类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值