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

Python脚本执行DBMS_STATS函数报ORA-00900错误求助

解决Python执行Oracle PL/SQL过程时的ORA-00900错误

问题原因

DBMS_STATS.gather_table_stats是Oracle的PL/SQL存储过程,并非标准SQL语句。SQL Developer等工具内置了PL/SQL解析能力,可以直接执行这类过程调用,但Python的数据库驱动(如cx_Oracle)要求PL/SQL代码必须包裹在BEGIN...END块中才能被正确识别执行,否则会抛出ORA-00900: invalid SQL statement错误。

解决方案

修改SQL文件中的DBMS_STATS语句

将原SQL文件末尾的两行过程调用,替换为完整的PL/SQL块:

BEGIN
  DBMS_STATS.gather_table_stats('CD_SS', 'MM_DSD_MIG_PATTERNS');
  DBMS_STATS.gather_table_stats('CD_SS', 'MM_DSD_MIG_MASTER');
END;

验证Python脚本逻辑

你的Python脚本通过分号;分割SQL命令,修改后的PL/SQL块会被作为一个完整的命令执行,无需调整脚本的分割逻辑。需要注意:

  • 确保PL/SQL块末尾的分号;保留,这样脚本才能正确识别这是一个独立的命令
  • 无需在块内添加COMMIT,因为gather_table_stats是统计信息收集过程,不会产生需要提交的事务

修改后的SQL文件末尾示例

DELETE
FROM CD_SS.MM_DSD_MIG_MASTER;  
commit;

INSERT INTO CD_SS.MM_DSD_MIG_MASTER  
SELECT DISTINCT
PATTERN,
b_ITEM_NUM,
'N',
NULL, NULL, NULL  
FROM CD_SS.MM_DSD_MIG_PATTERNS;  
commit;

update MM_DSD_MIG_MASTER   
set MIGRATION_STATUS_FLAG = 'Z'  
where MIGRATION_STATUS_FLAG = 'N';   
commit;  

grant all privileges on MM_DSD_MIG_MASTER to public;   
grant all privileges on MM_DSD_MIG_PATTERNS to public;

BEGIN
  DBMS_STATS.gather_table_stats('CD_SS', 'MM_DSD_MIG_PATTERNS');
  DBMS_STATS.gather_table_stats('CD_SS', 'MM_DSD_MIG_MASTER');
END;

内容的提问来源于stack exchange,提问作者ChrisJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:37:26