如何通过Oracle.DataAccess安全安装包并检测安装是否成功
回答
Oracle执行CREATE OR REPLACE PACKAGE这类PL/SQL对象创建语句时,只要语句本身语法合法,哪怕包内部存在关键字错误、逻辑错误,Oracle都会先完成对象创建,仅将对象标记为无效状态,因此默认配置下Oracle.DataAccess不会抛出执行异常,你可以通过以下两种方式直接检测包安装结果:
方法1:通过驱动内置事件直接捕获编译错误(无需查询系统视图)
该方法依赖Oracle.DataAccess的连接消息通知能力,不需要额外执行查询语句:
- 打开数据库连接前,设置
OracleConnection的FireInfoMessageEventOnUserErrors属性为$true - 订阅连接的
InfoMessage事件,即可直接接收PL/SQL编译阶段返回的错误信息、行号、错误码
对应PowerShell代码修改示例:
$con = [Oracle.DataAccess.Client.OracleConnection]::new('你的连接串') # 开启用户错误消息通知 $con.FireInfoMessageEventOnUserErrors = $true # 注册事件回调处理编译错误 Register-ObjectEvent -InputObject $con -EventName InfoMessage -Action { param($sender, $e) foreach ($err in $e.Errors) { Write-Host "编译错误:包名 $($err.Source) 第 $($err.LineNumber) 行,错误码 $($err.Number):$($err.Message)" } } | Out-Null $con.Open() # 后续原有的包创建执行逻辑不变,存在编译错误时会自动触发上面的回调 $cmd = [Oracle.DataAccess.Client.OracleCommand]::new() $cmd.Connection = $con # ... 其余执行代码和你原脚本一致
方法2:执行创建语句后快速校验状态
如果不想用事件回调,也可以在每次执行完包创建语句后,执行单条查询直接获取状态,比关联查询USER_OBJECTS、USER_ERRORS更简洁:
SELECT status FROM USER_OBJECTS WHERE object_name = UPPER('待校验的包名') AND object_type = 'PACKAGE'
返回结果为INVALID即代表包存在编译错误,安装失败。
内容的提问来源于stack exchange,提问作者René Nyffenegger
相关产品推荐
相关产品推荐

