ITPub博客

首页 > 数据库 > Oracle > [20241010]视图定义查询问题.txt

[20241010]视图定义查询问题.txt

原创 Oracle 作者:lfree 时间:2024-10-10 20:23:56 0 删除 编辑

[20241010]视图定义查询问题.txt

--//别人问的问题,在pdb下使用tpt的v2.sql脚本无法查询视图定义,测试验证为什么。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.测试:
SYS@book01p> @ v2 DBA_EXPRESSION_STATISTICS
Show SQL text of views matching "DBA_EXPRESSION_STATISTICS"...

V_OWNER                   VIEW_NAME                      TEXT
------------------------- ------------------------------ -------------------------------------------------
SYS                       DBA_EXPRESSION_STATISTICS
no rows selected

--//确实看不到该视图的定义。查看v2.sql脚本,发现查询的是text字段。
select owner v_owner, view_name, text from dba_views
.....

$ ocol.sh sys.DBA_views text
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    3      TEXT_LENGTH                              NUMBER
    4      TEXT                                     LONG
    5      TEXT_VC                                  VARCHAR2(4000)
    6      TYPE_TEXT_LENGTH                         NUMBER
    7      TYPE_TEXT                                VARCHAR2(4000)
    8      OID_TEXT_LENGTH                          NUMBER
    9      OID_TEXT                                 VARCHAR2(4000)
--//text字段类型是long类型。

SYS@book01p> select text c100 from dba_views where view_name='DBA_EXPRESSION_STATISTICS';
C100
----------------------------------------------------------------------------------------------------

--//确实没有!

SYS@book01p> select text_vc c100 from dba_views where view_name='DBA_EXPRESSION_STATISTICS';
C100
----------------------------------------------------------------------------------------------------
select u.name, o.name, v.expid, decode(v.snapshot_id, 0, 'CUMULATIVE',
                                                      1, 'LATEST',
                                                      'WINDOW'),
       v.evaluation_count, h.fixed_cost,
       v.dynamic_cost, h.text, h.ctime, v.last_modified
from obj$ o, user$ u, exp_head$ h,
  -- latest expressions
  ((select nvl(ds.exp_id, ms.expid) expid,
           nvl(ds.objn, ms.objnum) objn, 1 snapshot_id,
           (nvl(ds.eval_count, 0) + nvl(ms.evalcnt, 0)) evaluation_count,
           nvl(ms.dyncost, ds.dynamic_cost) dynamic_cost,
           decode(ms.expid, null, ds.last_modified, systimestamp) last_modified
  from (select * from exp_stat$ where snapshot_id = 1) ds full outer join
  (select expid, objnum, dyncost, evalcnt
   from gv$exp_stats where evalcnt > 0) ms
  on ds.exp_id = ms.expid and ds.objn = ms.objnum)
  union all
  -- window expression if window capture mode is OPEN
  (select nvl(ds.exp_id, ms.expid) expid,
           nvl(ds.objn, ms.objnum) objn, 2 snapshot_id,
           (nvl(ds.eval_count, 0) + nvl(ms.evalcnt, 0)) evaluation_count,
           nvl(ms.dyncost, ds.dynamic_cost) dynamic_cost,
           decode(ms.expid, null, ds.last_modified, systimestamp) last_modified
  from (select * from exp_stat$ where snapshot_id = 2) ds full outer join
  (select expid, objnum, dyncost, evalcnt
   from gv$exp_stats where evalcnt > 0) ms
  on ds.exp_id = ms.expid and ds.objn = ms.objnum
  where dbms_stats_internal.check_window_capture_mode() = 1)
  union all
  -- window expressions if window capture mode is CLOSED
  (select exp_id expid, objn, snapshot_id, eval_count evaluation_count,
          dynamic_cost, last_modified
   from exp_stat$ where snapshot_id = 2 and
        dbms_stats_internal.check_window_capture_mode() = 0)
  union all
  -- cumulative expressions
  (select exp_id expid, objn, snapshot_id, eval_count evaluation_count,
          dynamic_cost, last_modified
  from exp_stat$ where snapshot_id = 0)) v
where v.objn = o.obj# and v.expid = h.exp_id and o.owner# = u.user#
  and o.subname is null
  -- check for dba privileges
  and o.namespace = 1 and o.remoteowner IS NULL and o.linkname IS NULL

--//很明显现在的oracle版本已经不在text保存定义内容。

--//而以sys用户登录:
SYS@book> select text c100 from dba_views where view_name='DBA_EXPRESSION_STATISTICS' ;
C100
----------------------------------------------------------------------------------------------------
select u.name, o.name, v.expid, decode(v.snapshot_id, 0, 'CUMULATIVE',
                                                      1, 'LATEST',
                                                      'WINDOW'),
       v.evaluation_count, h.fixed_cost,
       v.dynamic_cost, h.text, h.ctime, v.last_modified
from obj$ o, user$ u, exp_head$ h,
  -- latest expressions
  ((select nvl(ds.exp_id, ms.expid) expid,
           nvl(ds.objn, ms.objnum) objn, 1 snapshot_id,
           (nvl(ds.eval_count, 0) + nvl(ms.evalcnt, 0)) evaluation_count,
           nvl(ms.dyncost, ds.dynamic_cost) dynamic_cost,
           decode(ms.expid, null, ds.last_modified, systimestamp) last_modified
  from (select * from exp_stat$ where snapshot_id = 1) ds full outer join
  (select expid, objnum, dyncost, evalcnt
   from gv$exp_stats where evalcnt > 0) ms
  on ds.exp_id = ms.expid and ds.objn = ms.objnum)
  union all
  -- window expression if window capture mode is OPEN
  (select nvl(ds.exp_id, ms.expid) expid,
           nvl(ds.objn, ms.objnum) objn, 2 snapshot_id,
           (nvl(ds.eval_count, 0) + nvl(ms.evalcnt, 0)) evaluation_count,
           nvl(ms.dyncost, ds.dynamic_cost) dynamic_cost,
           decode(ms.expid, null, ds.last_modified, systimestamp) last_modified
  from (select * from exp_stat$ where snapshot_id = 2) ds full outer join
  (select expid, objnum, dyncost, evalcnt
   from gv$exp_stats where evalcnt > 0) ms
  on ds.exp_id = ms.expid and ds.objn = ms.objnum
  where dbms_stats_internal.check_window_capture_mode() = 1)
  union all
  -- window expressions if window capture mode is CLOSED
  (select exp_id expid, objn, snapshot_id, eval_count evaluation_count,
          dynamic_cost, last_modified
   from exp_stat$ where snapshot_id = 2 and
        dbms_stats_internal.check_window_capture_mode() = 0)
  union all
  -- cumulative expressions
  (select exp_id expid, objn, snapshot_id, eval_count evaluation_count,
          dynamic_cost, last_modified
  from exp_stat$ where snapshot_id = 0)) v
where v.objn = o.obj# and v.expid = h.exp_id and o.owner# = u.user#
  and o.subname is null
  -- check for dba privileges
  and o.namespace = 1 and o.remoteowner IS NULL and o.linkname IS NULL

--//而以sys用户登录能够查询到相关定义。也就是以pdb登录使用原来的脚本查询视图定义查询不到信息。
--//而查询text_vc的缺点是仅仅显示4000字符。

--//无法写成如下,因为text是long类型。
SYS@book01p> select decode(text,null,text_vc) text from dba_views where view_name='DBA_EXPRESSION_STATISTICS' ;
select decode(text,null,text_vc) text from dba_views where view_name='DBA_EXPRESSION_STATISTICS'
              *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

--//直接改写如下:
$ cat v2.sql
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.

col view_name for a30
col text for a100 word_wrap
col text_vc for a100 word_wrap
col v_owner for a25

prompt Show SQL text of views matching "&1"...

select owner v_owner, view_name, text,text_vc from dba_views
where
  upper(view_name) LIKE
        upper(CASE
          WHEN INSTR('&1','.') > 0 THEN
              SUBSTR('&1',INSTR('&1','.')+1)
          ELSE
              '&1'
          END
             ) ESCAPE '\'
AND owner LIKE
    CASE WHEN INSTR('&1','.') > 0 THEN
      UPPER(SUBSTR('&1',1,INSTR('&1','.')-1))
    ELSE
      user
    END ESCAPE '\'
/

select view_name, view_definition text from v$fixed_View_definition where upper(view_name) like upper('&1');

--//不知道为什么我自己内心特别不喜欢pdb,搞得oracle异常复杂。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3036569/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969784