加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle 12c以一种奇怪的方式解释SQL(内部查询)

发布时间:2021-01-17 13:39:57 所属栏目:站长百科 来源:网络整理
导读:我们最近将Oracle数据库从10g迁徙到12c(12.1.0.1.0).在思量了某些查询的题目后,我们抉择进一步整理数据库并删除全部不必要的工具. 因此,我编写了一个查询,在数据库DDL中搜刮要表现的特定文本,个中行使了特定的视图或函数. SELECT object_name,object_type,DB

我们最近将Oracle数据库从10g迁徙到12c(12.1.0.1.0).在思量了某些查询的题目后,我们抉择进一步整理数据库并删除全部不必要的工具.
因此,我编写了一个查询,在数据库DDL中搜刮要表现的特定文本,个中行使了特定的视图或函数.

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中的错误导致非常.

有两种选择可供选择:
1)更新到Oracle Version 12.1.0.2并修复了错误.
2)守候几周的Oracle即将开始事变的补丁.该修补措施将在Oracle Version 12.1.0.1中修复此题目.

我们没有抉择回收哪种方案,但我很是有信念,由于Oracle支持确实重现了我的题目,以是个中一种要领可行.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读