You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:12:59