使用Oracle SQLcl导出ORDS对象时p_module_id不能为空错误求解
报错根因
- 核心问题是版本不兼容:你使用的SQLcl 21.3版本的Liquidbase生成对象逻辑,和ORDS 19.2底层的
ORDS_EXPORT存储过程参数规则不匹配。SQLcl调用导出API时,无法将你传入的模块名称正确转换为存储过程要求的p_module_id参数,即便是指定了-name参数也会因为取值失败导致空值报错。 - 次要可能原因:当前连接的数据库用户没有足够权限读取ORDS元数据,或者你指定的
sigaREST模块不属于当前登录用户的资源,导致SQLcl无法获取到对应模块的ID值。
解决方法
- 方案1:版本适配(最稳定)
降级SQLcl到19.2.x版本,该版本的lb genobject逻辑和ORDS 19.2的导出API完全兼容,执行lb genobject -type ORDS -name siga即可正常导出目标模块。 - 方案2:手动调用导出API(无需更换SQLcl版本)
先查询目标模块的ID,执行查询语句:
拿到返回的模块ID后,直接调用导出存储过程:SELECT id FROM ords_metadata.ords_modules WHERE name = 'siga' AND owner = USER;EXEC ords_metadata.ords_export.export_module(p_module_id => 替换为你查询到的模块ID); - 方案3:权限校验
先确认当前用户具备ORDS_REST_USER角色,同时确认目标模块归属于当前用户,执行如下语句可查看当前用户所有可用的REST模块:
如果列表中没有SELECT name FROM ords_metadata.ords_modules WHERE owner = USER;siga,需要切换到模块所属用户执行导出操作,或者给当前用户授予对应模块的访问权限。 - 方案4:全量导出替代
如果需要导出所有ORDS对象,可直接使用ORDS自带的导出工具,执行命令:ords export --db 你的数据库连接别名 --dir 本地导出目录路径
内容的提问来源于stack exchange,提问作者Salvador Arreola Rojas
相关产品推荐
相关产品推荐

