为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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,

可以下载最新版本的数据库,最新版本all_objects已经区分VIEW和MATERIALIZED VIEW了