查看: 4432|回复: 6

把v$sql_shared_cursor行列转换一下看起来似乎更舒服一些!

[复制链接]
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
跳转到指定楼层
1#
发表于 2008-1-8 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写函数不是目的,主要是为研究sql为什么不能共享,查看v$sql_shared_cursor更方便一些!

函数有些冗长,但是50多段都是重复的意思,一下没想到太好的办法,所以就先这样写了,谁有更好的办法可以再改装一下。
每一小段都是处理v$sql_shared_cursor中的一个mismatch的列,共53列
[php]
create or replace type my_type as object
(
sql_id varchar2(13),
address raw(4),
child_address raw(4),
child_number number,
mismatch_reason_name varchar2(30),
mismatch_reason varchar2(1)
);
--==============================
create or replace type my_type_table is table of my_type;
--==============================
create or replace function fun_table_column_to_row
(p_cursor sys_refcursor)
return my_type_table pipelined
is

type my_rec_type is record(
SQL_ID                                             VARCHAR2(13)                                                        ,
ADDRESS                                            RAW(4)                                                        ,
CHILD_ADDRESS                                      RAW(4)                                                        ,
CHILD_NUMBER                                       NUMBER             ,
UNBOUND_CURSOR                                     VARCHAR2(1)                                                        ,
SQL_TYPE_MISMATCH                                  VARCHAR2(1)                                                        ,
OPTIMIZER_MISMATCH                                 VARCHAR2(1)                                                        ,
OUTLINE_MISMATCH                                   VARCHAR2(1)                                                        ,
STATS_ROW_MISMATCH                                 VARCHAR2(1)                                                        ,
LITERAL_MISMATCH                                   VARCHAR2(1)                                                        ,
SEC_DEPTH_MISMATCH                                 VARCHAR2(1)                                                        ,
EXPLAIN_PLAN_CURSOR                                VARCHAR2(1)                    ,
BUFFERED_DML_MISMATCH                              VARCHAR2(1)                                                        ,
PDML_ENV_MISMATCH                                  VARCHAR2(1)                                                        ,
INST_DRTLD_MISMATCH                                VARCHAR2(1)                                                        ,
SLAVE_QC_MISMATCH                                  VARCHAR2(1)                                                        ,
TYPECHECK_MISMATCH                                 VARCHAR2(1)                                                        ,
AUTH_CHECK_MISMATCH                                VARCHAR2(1)                                                        ,
BIND_MISMATCH                                      VARCHAR2(1)                                                        ,
DESCRIBE_MISMATCH  VARCHAR2(1)                                                                                        ,
LANGUAGE_MISMATCH                                  VARCHAR2(1)                                                        ,
TRANSLATION_MISMATCH                               VARCHAR2(1)                                                        ,
ROW_LEVEL_SEC_MISMATCH                             VARCHAR2(1)                                                        ,
INSUFF_PRIVS                                       VARCHAR2(1)                                                        ,
INSUFF_PRIVS_REM                                   VARCHAR2(1)                                                        ,
REMOTE_TRANS_MISMATCH                              VARCHAR2(1)                                                        ,
LOGMINER_SESSION_MISMATCH                          VARCHAR2(1)                                                        ,
INCOMP_LTRL_MISMATCH                               VARCHAR2(1)                                                        ,
OVERLAP_TIME_MISMATCH                              VARCHAR2(1)                                                        ,
SQL_REDIRECT_MISMATCH                              VARCHAR2(1)                                                        ,
MV_QUERY_GEN_MISMATCH                              VARCHAR2(1)                                                        ,
USER_BIND_PEEK_MISMATCH                            VARCHAR2(1)                                                        ,
TYPCHK_DEP_MISMATCH                                VARCHAR2(1)                                                        ,
NO_TRIGGER_MISMATCH                                VARCHAR2(1)                                                        ,
FLASHBACK_CURSOR                                   VARCHAR2(1)                                                        ,
ANYDATA_TRANSFORMATION                             VARCHAR2(1)                                ,
INCOMPLETE_CURSOR                                  VARCHAR2(1)                                                        ,
TOP_LEVEL_RPI_CURSOR                               VARCHAR2(1)                                                        ,
DIFFERENT_LONG_LENGTH                              VARCHAR2(1)                                                        ,
LOGICAL_STANDBY_APPLY                              VARCHAR2(1)                                                        ,
DIFF_CALL_DURN                                     VARCHAR2(1)                                                        ,
BIND_UACS_DIFF                                     VARCHAR2(1)                                                        ,
PLSQL_CMP_SWITCHS_DIFF                             VARCHAR2(1)                                                        ,
CURSOR_PARTS_MISMATCH                              VARCHAR2(1)                                                        ,
STB_OBJECT_MISMATCH                                VARCHAR2(1)                                                        ,
ROW_SHIP_MISMATCH                                  VARCHAR2(1)                                                        ,
PQ_SLAVE_MISMATCH                                  VARCHAR2(1)                                                        ,
TOP_LEVEL_DDL_MISMATCH                             VARCHAR2(1)                                                        ,
MULTI_PX_MISMATCH                                  VARCHAR2(1)                                                        ,
BIND_PEEKED_PQ_MISMATCH                            VARCHAR2(1)                                                        ,
MV_REWRITE_MISMATCH                                VARCHAR2(1)                                                        ,
ROLL_INVALID_MISMATCH                              VARCHAR2(1)                                                        ,
OPTIMIZER_MODE_MISMATCH                            VARCHAR2(1)                                                        ,
PX_MISMATCH                                        VARCHAR2(1)                                                        ,
MV_STALEOBJ_MISMATCH                               VARCHAR2(1)                                                        ,
FLASHBACK_TABLE_MISMATCH                           VARCHAR2(1)                                                        ,
LITREP_COMP_MISMATCH                               VARCHAR2(1)                                                        
);
in_rec my_rec_type ;
out_rec my_type;

begin
loop
        fetch p_cursor into in_rec;   
        exit when p_cursor%NOTFOUND;
-- first row   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'UNBOUND_CURSOR',
                     in_rec.UNBOUND_CURSOR);
        pipe row(out_rec);
-- second row
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'SQL_TYPE_MISMATCH',
                     in_rec.SQL_TYPE_MISMATCH);
  pipe row(out_rec);
-- 3   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'OPTIMIZER_MISMATCH ',
                     in_rec.OPTIMIZER_MISMATCH) ;
        pipe row(out_rec);
-- 4
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'OUTLINE_MISMATCH',
                     in_rec.OUTLINE_MISMATCH);
  pipe row(out_rec);
-- 5  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'STATS_ROW_MISMATCH',
                     in_rec.STATS_ROW_MISMATCH);
        pipe row(out_rec);
-- 6
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'LITERAL_MISMATCH',
                     in_rec.LITERAL_MISMATCH);
  pipe row(out_rec);
-- 7   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'SEC_DEPTH_MISMATCH ',
                     in_rec.SEC_DEPTH_MISMATCH) ;
        pipe row(out_rec);
-- 8
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'EXPLAIN_PLAN_CURSOR',
                     in_rec.EXPLAIN_PLAN_CURSOR);
  pipe row(out_rec);
-- 9  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'BUFFERED_DML_MISMATCH',
                     in_rec.BUFFERED_DML_MISMATCH);
        pipe row(out_rec);
-- 10
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'PDML_ENV_MISMATCH ',
                     in_rec.PDML_ENV_MISMATCH );
  pipe row(out_rec);
-- 11  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'INST_DRTLD_MISMATCH ',
                     in_rec.INST_DRTLD_MISMATCH) ;
        pipe row(out_rec);
-- 12
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'SLAVE_QC_MISMATCH',
                     in_rec.SLAVE_QC_MISMATCH);
  pipe row(out_rec);
-- 13   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'TYPECHECK_MISMATCH',
                     in_rec.TYPECHECK_MISMATCH);
        pipe row(out_rec);
-- 14
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'AUTH_CHECK_MISMATCH',
                     in_rec.AUTH_CHECK_MISMATCH);
  pipe row(out_rec);
-- 15  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'BIND_MISMATCH ',
                     in_rec.BIND_MISMATCH) ;
        pipe row(out_rec);
-- 16
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'DESCRIBE_MISMATCH',
                     in_rec.DESCRIBE_MISMATCH);
  pipe row(out_rec);
--==============================================================
-- 17
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'LANGUAGE_MISMATCH',
                     in_rec.LANGUAGE_MISMATCH);
        pipe row(out_rec);
-- 18
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'TRANSLATION_MISMATCH',
                     in_rec.TRANSLATION_MISMATCH);
  pipe row(out_rec);
-- 19  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'ROW_LEVEL_SEC_MISMATCH ',
                     in_rec.ROW_LEVEL_SEC_MISMATCH) ;
        pipe row(out_rec);
-- 20
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'INSUFF_PRIVS',
                     in_rec.INSUFF_PRIVS);
  pipe row(out_rec);
-- 21
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'INSUFF_PRIVS_REM',
                     in_rec.INSUFF_PRIVS_REM);
        pipe row(out_rec);
-- 22
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'REMOTE_TRANS_MISMATCH',
                     in_rec.REMOTE_TRANS_MISMATCH);
  pipe row(out_rec);
-- 23   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'LOGMINER_SESSION_MISMATCH ',
                     in_rec.LOGMINER_SESSION_MISMATCH) ;
        pipe row(out_rec);
-- 24
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'INCOMP_LTRL_MISMATCH',
                     in_rec.INCOMP_LTRL_MISMATCH);
  pipe row(out_rec);
--===========================================================================
-- 25  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'OVERLAP_TIME_MISMATCH',
                     in_rec.OVERLAP_TIME_MISMATCH);
        pipe row(out_rec);
-- 26
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'SQL_REDIRECT_MISMATCH ',
                     in_rec.SQL_REDIRECT_MISMATCH );
  pipe row(out_rec);
-- 27   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'MV_QUERY_GEN_MISMATCH ',
                     in_rec.MV_QUERY_GEN_MISMATCH) ;
        pipe row(out_rec);
-- 28
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'USER_BIND_PEEK_MISMATCH',
                     in_rec.USER_BIND_PEEK_MISMATCH);
  pipe row(out_rec);
-- 29
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'TYPECHECK_MISMATCH',
                     in_rec.TYPECHECK_MISMATCH);
        pipe row(out_rec);
-- 30
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'NO_TRIGGER_MISMATCH',
                     in_rec.NO_TRIGGER_MISMATCH);
  pipe row(out_rec);
-- 31
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'FLASHBACK_CURSOR ',
                     in_rec.FLASHBACK_CURSOR) ;
        pipe row(out_rec);
-- 32
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'ANYDATA_TRANSFORMATION',
                     in_rec.ANYDATA_TRANSFORMATION);
  pipe row(out_rec);
--=============================================================================
-- 33
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'INCOMPLETE_CURSOR',
                     in_rec.INCOMPLETE_CURSOR);
        pipe row(out_rec);
-- 34
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'TOP_LEVEL_RPI_CURSOR ',
                     in_rec.TOP_LEVEL_RPI_CURSOR );
  pipe row(out_rec);
-- 35  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'DIFFERENT_LONG_LENGTH ',
                     in_rec.DIFFERENT_LONG_LENGTH) ;
        pipe row(out_rec);
-- 36
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'LOGICAL_STANDBY_APPLY',
                     in_rec.LOGICAL_STANDBY_APPLY);
  pipe row(out_rec);
-- 37
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'DIFF_CALL_DURN',
                     in_rec.DIFF_CALL_DURN);
        pipe row(out_rec);
-- 38
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'BIND_UACS_DIFF',
                     in_rec.BIND_UACS_DIFF);
  pipe row(out_rec);
-- 39  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'PLSQL_CMP_SWITCHS_DIFF ',
                     in_rec.PLSQL_CMP_SWITCHS_DIFF) ;
        pipe row(out_rec);
-- 40
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'CURSOR_PARTS_MISMATCH',
                     in_rec.CURSOR_PARTS_MISMATCH);
  pipe row(out_rec);
--=============================================================================
-- 41
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'STB_OBJECT_MISMATCH',
                     in_rec.STB_OBJECT_MISMATCH);
        pipe row(out_rec);
-- 42
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'ROW_SHIP_MISMATCH ',
                     in_rec.ROW_SHIP_MISMATCH );
  pipe row(out_rec);
-- 43   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'PQ_SLAVE_MISMATCH ',
                     in_rec.PQ_SLAVE_MISMATCH) ;
        pipe row(out_rec);
-- 44
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'TOP_LEVEL_DDL_MISMATCH',
                     in_rec.TOP_LEVEL_DDL_MISMATCH);
  pipe row(out_rec);
-- 45   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'MULTI_PX_MISMATCH',
                     in_rec.MULTI_PX_MISMATCH);
        pipe row(out_rec);
-- 46
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'BIND_PEEKED_PQ_MISMATCH',
                     in_rec.BIND_PEEKED_PQ_MISMATCH);
  pipe row(out_rec);
-- 47  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'MV_REWRITE_MISMATCH ',
                     in_rec.MV_REWRITE_MISMATCH) ;
        pipe row(out_rec);
-- 48
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'ROLL_INVALID_MISMATCH',
                     in_rec.ROLL_INVALID_MISMATCH);
  pipe row(out_rec);
--==========================================
-- 49
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'OPTIMIZER_MODE_MISMATCH',
                     in_rec.OPTIMIZER_MODE_MISMATCH);
  pipe row(out_rec);
-- 50  
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'PX_MISMATCH',
                     in_rec.PX_MISMATCH);
        pipe row(out_rec);
-- 51
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'MV_STALEOBJ_MISMATCH',
                     in_rec.MV_STALEOBJ_MISMATCH);
  pipe row(out_rec);
-- 52   
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'FLASHBACK_TABLE_MISMATCH ',
                     in_rec.FLASHBACK_TABLE_MISMATCH) ;
        pipe row(out_rec);
-- 53
  out_rec := my_type(in_rec.sql_id,
                     in_rec.address,
                     in_rec.child_address,
                     in_rec.child_number,
                     'LITREP_COMP_MISMATCH',
                     in_rec.LITREP_COMP_MISMATCH);
  pipe row(out_rec);
end loop ;
close p_cursor ;
return ;
end fun_table_column_to_row;

.
下面简单测试一下:
用户xys和sys下都存在完样一样的两个表t1
USER 为 "XYS"
SQL> select * from t1 where id=1;

        ID
----------
         1
另开一个sqlplus窗口:
SQL> show user
USER 为 "SYS"
SQL> select * from t1 where id=1;

        ID
----------
         1

SQL> select sql_id from v$sql where sql_text like 'select * from t1 where id=1%'
;

SQL_ID
-------------
5ag8kthgnvjk2
5ag8kthgnvjk2
--上面结果显示很显然这两个sql没有共享
SQL> select * from v$sql_shared_cursor
  2  where sql_id='5ag8kthgnvjk2';

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER U S O O S L S E B P I S T A B D L T

------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - -

R I I R L I O S M U T N F A I T D L D B P C S R P T M B M R O P M F L
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5ag8kthgnvjk2 6CC627C4 69C90804            0 N N N N N N N N N N N N N N N N N N

N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N

5ag8kthgnvjk2 6CC627C4 69C9063C            1 N N N N N N N N N N N N N Y N N N Y

N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N

--上面查询显示了两条sql不能共享的原因,每次看起来都感觉很难受,找'Y'感觉很费劲,于是想转换一下看看是不是更方便一些。
调用上面的函数看看:
SQL> SELECT * FROM (select * from table(fun_table_row_to_column(cursor(select *
from v$sql_shared_cursor
  2  where sql_id='5ag8kthgnvjk2')))) a
  3  where mismatch_reason_name in
  4  (select mismatch_reason_name from table(fun_table_row_to_column(cursor(sele
ct * from v$sql_shared_cursor
  5  where sql_id='5ag8kthgnvjk2')))
  6  where mismatch_reason='Y')
  7  order by mismatch_reason_name , child_number;

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER MISMATCH_REASON_NAME           M
------------- -------- -------- ------------ ------------------------------ -
5ag8kthgnvjk2 6CC627C4 69C90804            0 AUTH_CHECK_MISMATCH            N
5ag8kthgnvjk2 6CC627C4 69C9063C            1 AUTH_CHECK_MISMATCH            Y
5ag8kthgnvjk2 6CC627C4 69C90804            0 TRANSLATION_MISMATCH           N
5ag8kthgnvjk2 6CC627C4 69C9063C            1 TRANSLATION_MISMATCH           Y

SQL>
.
[/php]
看起来函数效果还不错,不过总觉得有些累赘,大家也可以看看函数是否可以进一步简化。

[ 本帖最后由 warehouse 于 2008-1-9 23:52 编辑 ]
论坛徽章:
59
狮子座
日期:2016-03-26 13:35:402013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-02-25 11:06:15ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:20灰彻蛋
日期:2012-04-25 13:19:33紫蛋头
日期:2012-03-14 11:16:09最佳人气徽章
日期:2012-03-13 17:39:18玉石琵琶
日期:2012-02-21 15:04:38鲜花蛋
日期:2011-11-30 14:13:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
2#
发表于 2008-1-8 16:04 | 只看该作者
类似这样的函数yang版主的blog上写过一个,也很经典

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
3#
 楼主| 发表于 2008-1-9 08:29 | 只看该作者
昨天有几个地方写错了,修正了一下
标题有点问题,这个函数是把列转换为行,不是行转换为列,其实就是利用
cursor express 结合object,table function处理结果集

[ 本帖最后由 warehouse 于 2008-1-9 08:57 编辑 ]

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
4#
 楼主| 发表于 2008-1-9 16:32 | 只看该作者
原帖由 bluemoon0083 于 2008-1-8 16:04 发表
类似这样的函数yang版主的blog上写过一个,也很经典


有没有连接提供一下,yang的blog上内容太多,非常丰富,没找到!
学习一下看看有没有可以借鉴的地方,正好我还需要写一个函数把我这个函数转换后的结果再转回去,这样看起来就更舒服了。

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
5#
发表于 2008-1-9 16:36 | 只看该作者
支持,我一般找到Y的位置去对文档,哈哈

使用道具 举报

回复
论坛徽章:
150
蓝锆石
日期:2011-11-16 22:31:22萤石
日期:2011-11-17 13:05:31祖母绿
日期:2008-06-14 15:23:26海蓝宝石
日期:2011-11-16 22:25:15紫水晶
日期:2011-11-16 22:31:22红宝石
日期:2011-10-09 08:54:30蓝锆石
日期:2009-01-31 15:20:54萤石
日期:2008-12-22 15:22:00祖母绿
日期:2011-11-17 13:13:26海蓝宝石
日期:2008-07-05 14:52:18
6#
 楼主| 发表于 2008-1-9 20:56 | 只看该作者
把列通过写的函数转换为行略去了'N'值对应的列之后发现还是原来v$sql_shared_cursor横向比较的结果更好,于是又将函数转换之后的结果转化了回来,只是'N'变成了null,视觉上感觉效果好了,就是一顿瞎折腾,纯当娱乐了
通过plsql developer显示看起来效果更好
函数很长,但是意思都一样,都是max(decode(...重复了53次,谁让v$sql_shared_cursor中mismatch...的列有53列
[php]
SQL> select sql_id , address , child_address , child_number,
  2  max(decode(mismatch_reason_name,'INST_DRTLD_MISMATCH',mismatch_reason,null)
)  INST_DRTLD_MISMATCH,
  3  max(decode(mismatch_reason_name,'SLAVE_QC_MISMATCH',mismatch_reason,null))
SLAVE_QC_MISMATCH,
  4  max(decode(mismatch_reason_name,'TYPECHECK_MISMATCH',mismatch_reason,null))
  TYPECHECK_MISMATCH,
  5  max(decode(mismatch_reason_name,'AUTH_CHECK_MISMATCH',mismatch_reason,null)
)  AUTH_CHECK_MISMATCH,
  6  max(decode(mismatch_reason_name,'BIND_MISMATCH',mismatch_reason,null))  BIN
D_MISMATCH,
  7  max(decode(mismatch_reason_name,'DESCRIBE_MISMATCH',mismatch_reason,null))
DESCRIBE_MISMATCH,
  8  max(decode(mismatch_reason_name,'LANGUAGE_MISMATCH',mismatch_reason,null))
LANGUAGE_MISMATCH,
  9  max(decode(mismatch_reason_name,'TRANSLATION_MISMATCH',mismatch_reason,null
))  TRANSLATION_MISMATCH,
10  max(decode(mismatch_reason_name,'ROW_LEVEL_SEC_MISMATCH',mismatch_reason,nu
ll))  ROW_LEVEL_SEC_MISMATCH,
11  max(decode(mismatch_reason_name,'INSUFF_PRIVS',mismatch_reason,null))  INSU
FF_PRIVS,
12  max(decode(mismatch_reason_name,'INSUFF_PRIVS_REM',mismatch_reason,null))
INSUFF_PRIVS_REM,
13  max(decode(mismatch_reason_name,'REMOTE_TRANS_MISMATCH',mismatch_reason,nul
l))  REMOTE_TRANS_MISMATCH,
14  max(decode(mismatch_reason_name,'LOGMINER_SESSION_MISMATCH',mismatch_reason
,null))  LOGMINER_SESSION_MISMATCH,
15  max(decode(mismatch_reason_name,'INCOMP_LTRL_MISMATCH',mismatch_reason,null
))  INCOMP_LTRL_MISMATCH,
16  max(decode(mismatch_reason_name,'OVERLAP_TIME_MISMATCH',mismatch_reason,nul
l))  OVERLAP_TIME_MISMATCH,
17  max(decode(mismatch_reason_name,'SQL_REDIRECT_MISMATCH',mismatch_reason,nul
l))  SQL_REDIRECT_MISMATCH,
18  max(decode(mismatch_reason_name,'MV_QUERY_GEN_MISMATCH',mismatch_reason,nul
l))  MV_QUERY_GEN_MISMATCH,
19  max(decode(mismatch_reason_name,'USER_BIND_PEEK_MISMATCH',mismatch_reason,n
ull))  USER_BIND_PEEK_MISMATCH,
20  max(decode(mismatch_reason_name,'TYPCHK_DEP_MISMATCH',mismatch_reason,null)
)  TYPCHK_DEP_MISMATCH,
21  max(decode(mismatch_reason_name,'NO_TRIGGER_MISMATCH',mismatch_reason,null)
)  NO_TRIGGER_MISMATCH,
22  max(decode(mismatch_reason_name,'FLASHBACK_CURSOR',mismatch_reason,null))
FLASHBACK_CURSOR,
23  max(decode(mismatch_reason_name,'ANYDATA_TRANSFORMATION',mismatch_reason,nu
ll))  ANYDATA_TRANSFORMATION,
24  max(decode(mismatch_reason_name,'INCOMPLETE_CURSOR',mismatch_reason,null))
INCOMPLETE_CURSOR,
25  max(decode(mismatch_reason_name,'TOP_LEVEL_RPI_CURSOR',mismatch_reason,null
))  TOP_LEVEL_RPI_CURSOR,
26  max(decode(mismatch_reason_name,'DIFFERENT_LONG_LENGTH',mismatch_reason,nul
l))  DIFFERENT_LONG_LENGTH,
27  max(decode(mismatch_reason_name,'LOGICAL_STANDBY_APPLY',mismatch_reason,nul
l))  LOGICAL_STANDBY_APPLY,
28  max(decode(mismatch_reason_name,'DIFF_CALL_DURN',mismatch_reason,null))  DI
FF_CALL_DURN,
29  max(decode(mismatch_reason_name,'BIND_UACS_DIFF',mismatch_reason,null))  BI
ND_UACS_DIFF,
30  max(decode(mismatch_reason_name,'PLSQL_CMP_SWITCHS_DIFF',mismatch_reason,nu
ll))  PLSQL_CMP_SWITCHS_DIFF,
31  max(decode(mismatch_reason_name,'CURSOR_PARTS_MISMATCH',mismatch_reason,nul
l))  CURSOR_PARTS_MISMATCH,
32  max(decode(mismatch_reason_name,'STB_OBJECT_MISMATCH',mismatch_reason,null)
)  STB_OBJECT_MISMATCH,
33  max(decode(mismatch_reason_name,'ROW_SHIP_MISMATCH',mismatch_reason,null))
ROW_SHIP_MISMATCH,
34  max(decode(mismatch_reason_name,'PQ_SLAVE_MISMATCH',mismatch_reason,null))
PQ_SLAVE_MISMATCH,
35  max(decode(mismatch_reason_name,'TOP_LEVEL_DDL_MISMATCH',mismatch_reason,nu
ll))  TOP_LEVEL_DDL_MISMATCH,
36  max(decode(mismatch_reason_name,'MULTI_PX_MISMATCH',mismatch_reason,null))
MULTI_PX_MISMATCH,
37  max(decode(mismatch_reason_name,'BIND_PEEKED_PQ_MISMATCH',mismatch_reason,n
ull))  BIND_PEEKED_PQ_MISMATCH,
38  max(decode(mismatch_reason_name,'MV_REWRITE_MISMATCH',mismatch_reason,null)
)  MV_REWRITE_MISMATCH,
39  max(decode(mismatch_reason_name,'ROLL_INVALID_MISMATCH',mismatch_reason,nul
l))  ROLL_INVALID_MISMATCH,
40  max(decode(mismatch_reason_name,'OPTIMIZER_MODE_MISMATCH',mismatch_reason,n
ull))  OPTIMIZER_MODE_MISMATCH,
41  max(decode(mismatch_reason_name,'PX_MISMATCH',mismatch_reason,null))  PX_MI
SMATCH,
42  max(decode(mismatch_reason_name,'MV_STALEOBJ_MISMATCH',mismatch_reason,null
))  MV_STALEOBJ_MISMATCH,
43  max(decode(mismatch_reason_name,'FLASHBACK_TABLE_MISMATCH',mismatch_reason,
null))  FLASHBACK_TABLE_MISMATCH,
44  max(decode(mismatch_reason_name,'LITREP_COMP_MISMATCH',mismatch_reason,null
))  LITREP_COMP_MISMATCH
45  from (
46  SELECT * FROM
47  (select * from table(fun_table_column_to_row(cursor(select * from v$sql_sha
red_cursor
48  where sql_id='5ag8kthgnvjk2')))) a
49  where mismatch_reason_name in
50  (select mismatch_reason_name from table(fun_table_column_to_row(cursor(sele
ct * from v$sql_shared_cursor
51  where sql_id='5ag8kthgnvjk2')))
52  where mismatch_reason='Y')
53  )
54  group by sql_id , address , child_address , child_number
55  order by child_number
56  /

SQL_ID        ADDRESS  CHILD_AD CHILD_NUMBER I S T A B D L T R I I R L I O S M U

------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - -

T N F A I T D L D B P C S R P T M B M R O P M F L
- - - - - - - - - - - - - - - - - - - - - - - - -
5ag8kthgnvjk2 6CCC4E58 6CD11BF0            0       N       N


5ag8kthgnvjk2 6CCC4E58 6CD136A8            1       Y       Y



SQL>
.
[/php]

[ 本帖最后由 warehouse 于 2008-1-9 23:54 编辑 ]

使用道具 举报

回复
论坛徽章:
33
红孩儿
日期:2006-04-13 07:34:50ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54玉石琵琶
日期:2012-02-21 15:04:38奥运会纪念徽章:射击
日期:2012-08-10 11:01:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
7#
发表于 2008-1-9 21:10 | 只看该作者
佩服

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表