Oracle 12c调用DBMS_METADATA.PUT修改表结构报ORA-31607错误
问题根源
该ORA-31607报错的核心是DBMS_METADATA写入操作的方法和内容类型不匹配,你的代码存在两处错误:
- 你添加的
ALTERXML转换属于读取场景的输出转换,作用是把数据库对象的元数据转换为ALTER XML格式,写入ALTER XML的场景不需要配置该转换 - 你调用了通用的
PUT方法提交XML内容,提交ALTER XML格式的修改需要调用专用的PUTXML方法,这是报错的直接原因,也是你之前调整add_transform语句无效的核心原因。
修复后的代码
FUNCTION putxml( alterxml IN CLOB, sub_res OUT NOCOPY sys.ku$_SubmitResults ) RETURN BOOLEAN IS ret_val BOOLEAN := true; openw_handle NUMBER; BEGIN openw_handle := DBMS_METADATA.openw ('TABLE'); dbms_output.put_line(alterxml); -- 替换原PUT方法为专用的PUTXML方法,无需添加额外转换 ret_val := DBMS_METADATA.putxml(openw_handle, alterxml, sub_res); DBMS_METADATA.close (openw_handle); return ret_val; END;
前置权限验证
执行前请确认运行该函数的用户满足以下权限要求:
- 拥有
ALTER ANY TABLE系统权限,或GLOBALREFschema下的表修改权限 - 拥有
DBMS_METADATA包的执行权限 - 可直接运行XML中携带的
ALTER TABLE "GLOBALREF"."EDO_DOC_OUT" ADD ("AUTHOR" VARCHAR2(50))语句,确认SQL本身可正常执行,排除字段已存在、表不存在等基础错误。
内容的提问来源于stack exchange,提问作者Olga Pshenichnikova
相关产品推荐
相关产品推荐

