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支持确实重现了我的题目,以是个中一种要领可行. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |