HelloDBA [中文]
Search Internet Search HelloDBA
  Oracle Technology Site. email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com Add to circle  acoug  acoug 

12.1.0.2Bug --- SQL_FULLTEXT in v$sql become messy when the length of raw SQL text larger than 131072

[中文]

Author:  fuyuncat

Source:  www.HelloDBA.com

Date:  2017-06-26 11:39:05

Share to  Twitter Facebook GMail Blogger Orkut Google Bookmarks Sina Weibo QQ Renren Tieba Kaixin Douban Taobao

 SQL_FULLTEXT in v$sql become messy when the length of raw SQL text larger than 131072.

This is the sample code to reproduce this problem.

SQL代码
  1. HelloDBA.COM> set serveroutput on  
  2. declare  
  3.   sql_r clob;  
  4.   sql_t clob;  
  5.   sql_c clob;  
  6.   end loop;  
  7.   sql_t := sql_r||lpad(' ',11005);  
  8. begin  
  9.   sql_r := '/*astav*/with a as (select 1 c from dual) select * from a order by 1';  
  10.   end if;  
  11.   for i in 1..4 loop  
  12.     sql_r := sql_r||lpad(' ',30000);  
  13.   end loop;  
  14.   sql_t := sql_r||lpad(' ',11005);  
  15.   execute immediate sql_t;  
  16.   select sql_fulltext into sql_c from v$sqlarea where sql_text like '/*astav*/%';  
  17.   if sql_c != sql_t then  
  18.     dbms_output.put_line('Yes');  
  19.     dbms_output.put_line(' ');  
  20.     return;  
  21.   end if;  
  22. end;  
  23.  19  /  
  24. Yes  
  25.   
  26. PL/SQL procedure successfully completed.  
  27.   
  28. HelloDBA.COM> set serveroutput on  
  29. HelloDBA.COM> declare  
  30.   sql_r clob;  
  31.   sql_t clob;  
  32.   sql_c clob;  
  33. begin  
  34.   sql_r := '/*asta*/with a as (select 1 c from dual) select * from a order by 1';  
  35.   for i in 1..4 loop  
  36.     sql_r := sql_r||lpad(' ',30000);  
  37.   9    end loop;  
  38.   sql_t := sql_r||lpad(' ',11005);  
  39.   execute immediate sql_t;  
  40.   select sql_fulltext into sql_c from v$sqlarea where sql_text like '/*asta*/%';  
  41.   if sql_c != sql_t then  
  42.     dbms_output.put_line('Yes');  
  43.     dbms_output.put_line(' ');  
  44.   end if;  
  45.     return;  
  46.   end if;  
  47. end;  
  48.  19  /  
  49.   
  50. PL/SQL procedure successfully completed.  
  51.   
  52. HelloDBA.COM> set pagesize 50000 lines 2000 long 10000000 longchunksize 10000000  
  53.   
  54. HelloDBA.COM> select sql_fulltext, dbms_lob.getlength(sql_fulltext) from v$sqlarea where sql_text like '/*asta*/%';  
  55. DBMS_LOB.GETLENGTH(SQL_FULLTEXT)  
  56. --------------------------------  
  57. /*astav*/with a as (select 1 c from dual) select * from a order by 1  
  58. ...  
  59. 131072  
  60.   
  61. HelloDBA.COM> select sql_fulltext, dbms_lob.getlength(sql_fulltext) from v$sqlarea where sql_text like '/*astav*/%';  
  62. DBMS_LOB.GETLENGTH(SQL_FULLTEXT)  
  63. --------------------------------  
  64. /*astav*/with a as (select 1 c from dual) select * from a order by 1  
  65. ...                                           /  
  66. 131073  

Start from 131073, it begins to repeat the raw SQL.

Top

Copyright ©2005, HelloDBA.Com All reseverd.

Declaration
by fuyuncat