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
相关产品推荐
相关产品推荐

