gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:33:58 26 4
gpt4 key购买 nike

我们最近将 Oracle 数据库从 10g 迁移到 12c (12.1.0.1.0)。在考虑了一些查询的问题后,我们决定进一步清理数据库并删除所有不需要的对象。
因此,我编写了一个查询,在数据库 DDL 中搜索要显示的特定文本,其中使用了特定的 View 或函数。

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 上运行没有任何问题。
(我担心在其他进行计算的报告上有相同的行为,这可能会因为这种行为而出错!)。

最佳答案

这是一个错误。 Oracle Support 刚刚向我确认,该异常仅由 Oracle 版本 12.1.0.1 中的错误引起。

有两个选项可供选择:
1) 更新到 Oracle 12.1.0.2 版本,bug 已修复。
2) 等待几周 Oracle 即将开始工作的补丁。该补丁将在 Oracle 版本 12.1.0.1 中修复此问题。

我们没有决定我们采用哪个选项,但我非常有信心,因为 Oracle Support 确实重现了我的问题,所以其中一个会起作用。

关于sql - Oracle 12c 以一种奇怪的方式解释 SQL(内部查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33412327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com