SSIS作业偶发ORA-06550/PLS-00907错误,寻求解决方案
先看一下你遇到的错误详情:
开始时间:9:00:01 AM
错误时间:2018-01-26 09:33:53.01
错误代码:0xC002F210
来源:Run proc SP_MISSING_FILE_CASE_CLOSURE Execute SQL Task
描述:执行查询begin SP_MISSING_FILE_CASE_CLOSURE; end;失败,错误信息为:"ORA-06550: line 0, column 0: PLS-00907: cannot load library unit USAGE.SP_MISSING_FILE_CASE_CLOSURE (referenced by )"。可能的失败原因:查询存在问题、"ResultSet"属性设置不正确、参数设置不正确或连接未正确建立。
结束错误
DTExec:包执行返回DTSER_FAILURE (1)。
开始时间:9:00:01 AM
结束时间:9:33:53 AM
耗时:2031.88秒。
进程退出代码1。步骤失败。
既然问题是偶发的,且仅涉及USAGE.SP_MISSING_FILE_CASE_CLOSURE这一个存储过程,没有明显触发规律,那大概率是依赖资源临时不可用、数据库状态波动或SSIS连接层面的偶发问题,下面给你几个针对性的排查和解决方向:
1. 确认存储过程本身的状态与依赖
PLS-00907错误的核心是Oracle无法加载指定库单元,先从存储过程本身入手排查:
- 执行以下SQL检查存储过程的状态:
如果结果为SELECT STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME = 'SP_MISSING_FILE_CASE_CLOSURE' AND OWNER = 'USAGE';INVALID,说明存储过程已失效,直接重新编译:ALTER PROCEDURE USAGE.SP_MISSING_FILE_CASE_CLOSURE COMPILE; - 再检查它的所有依赖对象,确认是否存在偶发不可用的情况:
逐一验证这些依赖的表、视图、函数等是否权限正常,有没有在作业执行时被锁定、进行维护(比如分区重建、索引优化)的情况。SELECT * FROM ALL_DEPENDENCIES WHERE NAME = 'SP_MISSING_FILE_CASE_CLOSURE' AND OWNER = 'USAGE';
2. 排查Oracle外部过程与资源加载问题
如果该存储过程调用了外部库(比如通过EXTPROC),偶发加载失败可能和操作系统资源有关:
- 检查对应的操作系统库文件(如
.so或.dll)是否存在,Oracle用户是否有读取权限; - 查看Oracle的
listener.ora和tnsnames.ora中EXTPROC的配置是否稳定,有没有偶发的监听中断; - 查看作业失败时间点的数据库服务器资源(CPU、内存、磁盘IO)是否达到峰值,资源不足会导致库文件无法正常加载。
3. 优化SSIS连接与执行配置
从SSIS层面调整,降低偶发连接问题的影响:
- 打开Execute SQL Task对应的连接管理器,将
RetainSameConnection属性设为True,避免每次执行任务都重新建立连接,减少连接波动带来的问题; - 在SQL Server Agent的作业步骤中设置重试次数(比如失败后重试2次),偶发问题往往是临时的,重试大概率能恢复正常执行;
- 尝试将执行语句改为
EXEC USAGE.SP_MISSING_FILE_CASE_CLOSURE;,虽然语法上和匿名块等价,但有时能避开Oracle解析器的偶发异常。
4. 增加错误捕获,定位根源
如果以上方法都没解决,可以给存储过程添加异常捕获,获取更详细的错误上下文:
BEGIN USAGE.SP_MISSING_FILE_CASE_CLOSURE; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error timestamp: ' || SYSTIMESTAMP || ', Code: ' || SQLCODE || ', Message: ' || SQLERRM); RAISE; END;
在SSIS的Execute SQL Task中启用DBMS_OUTPUT捕获,下次失败时就能拿到更具体的错误信息,方便定位偶发问题的触发原因。
内容的提问来源于stack exchange,提问作者Vladimir Todorov

