Oracle 12c以一种奇怪的方式解释SQL(内部查询)
我们最近将Oracle数据库从10g迁移到12c(12.1.0.1.0).在考虑了某些查询的问题后,我们决定进一步清理数据库并删除所有不需要的对象.
SELECT object_name,object_type,DBMS_METADATA.GET_DDL(object_type,object_name) as ddl_txt FROM user_objects WHERE object_type IN ( 'FUNCTION','VIEW','PROCEDURE','TRIGGER') AND UPPER( DBMS_METADATA.GET_DDL(object_type,object_name) ) LIKE upper('%myFunction%') 这导致以下异常: ORA-31600: invalid input value TYPE BODY for parameter OBJECT_TYPE in function GET_DDL ORA-06512: at "SYS.DBMS_METADATA",line 5746 ORA-06512: at "SYS.DBMS_METADATA",line 8333 ORA-06512: at line 1 31600. 00000 - "invalid input value %s for parameter %s in function %s" *Cause: A NULL or invalid value was supplied for the parameter. *Action: Correct the input value and try the call again. 由于我们的数据库中有“Body Type”对象,并且它们没有提供带有DBMS_METADATA.GET_DDL()的ddl,因此会发生这种情况.运行下面的查询会显示与初始查询完全相同的异常. select dbms_metadata.get_ddl('TYPE BODY','myBodyStringType') from dual 所以,我尝试创建一个内部列表,首先将所有用户对象的列表减少到我真正关心的一次,重写我的查询如下: select lst.*,DBMS_METADATA.GET_DDL(lst.object_type,lst.object_name) as ddl_txt from ( SELECT object_name,object_type FROM user_objects WHERE object_type IN ( 'FUNCTION','TRIGGER') ) lst where upper(DBMS_METADATA.GET_DDL(lst.object_type,lst.object_name)) like upper('%myFunction%') 有趣的是,它带来了如上所示的相同异常.我不明白为什么会这样. 我希望Oracle首先创建内部列表并仅使用剩余值来使用DBMS_METADATA.GET_DLL()函数,因为相同的值将导致异常.为什么Oracle在这里做其他事情? 要解决这个特定的问题,我必须在内部查询中添加一个看起来很愚蠢的ORDER BY.为什么我必须首先使用ORDER BY强制Oracle创建内部查询? select lst.*,'TRIGGER') ORDER BY ROWNUM ASC ) lst where upper(DBMS_METADATA.GET_DDL(lst.object_type,lst.object_name)) like upper('%myFunction%') 在此先感谢有关为何会发生这种情况的任何解释? – 我记得,后来的查询在Oracle 10g上运行没有任何问题. 解决方法这是一个错误. Oracle Support刚刚向我确认,由于Oracle Version 12.1.0.1中的错误导致异常.有两种选择可供选择: 我们没有决定采用哪种方案,但我非常有信心,因为Oracle支持确实重现了我的问题,所以其中一种方法可行. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |