注册

all_objects和sysobjects联查问题咨询

哈撒给 2025/10/09 227 1

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM Database Server 64 V8,DB Version: 0x7000c,03134284094-20231109-208042-20067
【操作系统】:win10
【CPU】:10代i5
【问题描述】*:
SELECT a.object_id AS id,
a.owner AS schemaName,
a.object_name AS name,
a.status AS status,
to_char(a.last_ddl_time,'yyyy-MM-dd HH24:MI:ss') as lastDdlTime,
CASE
WHEN a.object_type = 'FUNCTION' THEN 'FUNCTION'
WHEN a.object_type = 'PROCEDURE' THEN 'PROCEDURE'
WHEN a.object_type = 'VIEW' AND (b.info1 & 0X001FFFE0 ==0) THEN 'VIEW'
WHEN a.object_type = 'VIEW' AND (b.info1 & 0X001FFFE0 !=0) THEN 'MATERIALIZED_VIEW'
WHEN a.object_type = 'PACKAGE' THEN 'PACKAGE'
WHEN a.object_type IN ('TYPE', 'CLASS') THEN 'TYPE'
WHEN a.object_type = 'TRIGGER' THEN 'TRIGGER'
ELSE NULL
END AS objectType
FROM all_objects a

left JOIN sysobjects b ON a.object_id = b.id
WHERE a.status = 'INVALID'
AND a.object_type IN ('FUNCTION', 'PROCEDURE', 'VIEW', 'PACKAGE', 'TYPE', 'CLASS', 'TRIGGER') AND a.object_name = 'INVALID_VIEW_TEST';
针对上述sql有个疑问,
可以看到上述sql中,有case when表达式,在视图分支中作为条件的a.object_type和b.info1在我自己单独查询了sysobjects和all_objects时发现都有值,但是上述sql执行结果中,objectType列为null,这是为什么?

select * from all_objects where object_name = 'INVALID_VIEW_TEST';

select
CASE
WHEN (info1 & 0X001FFFE0 ==0) THEN 'VIEW'
WHEN (info1 & 0X001FFFE0 !=0) THEN 'MATERIALIZED_VIEW'
ELSE NULL
END AS objectType,

  • from sysobjects where name = 'INVALID_VIEW_TEST';
    这两个单独的sql都能查询出想要的结果,但是针对联合查询就不能,
    后续在排查中,发现all_objects和sysobjects的id一个是dec(22,0),一个是int,所以我通过修改联合查询的条件 CAST(a.object_id AS INT) = b.id,改成了这样就能查询出正确的objectType,想知道这是为什么,有没有其他方式解决这种问题
回答 0
暂无回答
扫一扫
联系客服