oracle12C以逗号隔开怎么写,Oracle 12c以一种奇怪的方式解释SQL(内部查询)

我们最近将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', 'VIEW', 'PROCEDURE', '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.*,

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', 'VIEW', 'PROCEDURE', 'TRIGGER')

ORDER BY ROWNUM ASC

) lst

where upper(DBMS_METADATA.GET_DDL(lst.object_type, lst.object_name)) like upper('%myFunction%')

在此先感谢有关为何会发生这种情况的任何解释? – 我记得,后来的查询在Oracle 10g上运行没有任何问题.

(我担心在其他报告中会有相同的行为,因为这种行为可能会导致计算错误!).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值