Python使用oracledb创建PL/SQL存储过程无报错但未生成,如何解决?
解决Python oracledb创建PL/SQL存储过程后找不到的问题
以下是针对你遇到的问题的具体排查和解决步骤:
1. 必须提交事务
oracledb默认不会自动提交事务,执行CREATE PROCEDURE语句后如果不手动提交,事务处于未完成状态,其他会话(包括你登录的数据库客户端)无法看到这个存储过程。
两种解决方式:
- 创建连接时开启自动提交:
import oracledb conn = oracledb.connect( user="你的用户名", password="你的密码", dsn="你的数据库连接串", autocommit=True )
- 执行创建语句后手动提交:
conn = oracledb.connect(user="你的用户名", password="你的密码", dsn="你的数据库连接串") cursor = conn.cursor() # 执行创建存储过程的SQL cursor.execute(create_proc_sql) # 手动提交事务 conn.commit()
2. 确保PL/SQL语法完整
创建存储过程的SQL必须包含完整的PL/SQL块,末尾的/是Oracle识别PL/SQL块结束的标志,不能省略。示例SQL如下:
CREATE OR REPLACE PROCEDURE HELLO AS BEGIN DBMS_OUTPUT.PUT_LINE('示例存储过程'); END HELLO; /
在Python中要将这段完整的SQL作为一个字符串传递给cursor.execute(),不要拆分多行或遗漏结束符。
3. 确认存储过程所属Schema
- 如果你是用用户A的连接创建存储过程,那么存储过程默认属于用户A的Schema。登录数据库时需要切换到用户A,或者调用时加上Schema前缀(比如
A.HELLO)才能找到。 - 也可以在创建时直接指定Schema:
CREATE OR REPLACE PROCEDURE 目标Schema.HELLO AS BEGIN DBMS_OUTPUT.PUT_LINE('示例存储过程'); END HELLO; /
4. 检查用户权限
确保连接数据库的用户拥有CREATE PROCEDURE权限,如果没有,需要DBA执行授权:
GRANT CREATE PROCEDURE TO 你的用户名;
5. 即时验证创建结果
执行完创建语句后,可以直接在Python中查询存储过程是否存在,不用切换到数据库客户端:
cursor.execute("SELECT object_name FROM user_procedures WHERE object_name = 'HELLO'") result = cursor.fetchone() if result: print("存储过程创建成功") else: print("存储过程未创建")
内容的提问来源于stack exchange,提问作者Zenith_1024
相关产品推荐
相关产品推荐

