MainBlogContactRSS




Login    
Login
 
Recent Entries    
Next Projects
INITCAP this!
APEX 3.1 released ...
Exploiting the strange behavio ...
Where's my SQL?
Undocumented Packages for Back ...
Debugging an APEX application
Splitting strings
Where's the space gone?
The size of a (XE) database
1 2 3 4 5 6 
Search    
Search
 
Recent Articles    
Introduction to Regular Expres ...
Extracting SQL statements from ...
BBCode Parser
MODEL clause vs. old school SQ ...
IF NULL or how to match two va ...
Views    
Firefox1241
IExplorer1597
Linux108
Windows2888
Total Views49332
System    
BCHR 
CMS_TS (100MB) 
DB (XE) (5GB) 
PGA (256MB) 
Daily insights of a database application developer    
Splitting strings [2008.01.08] Bookmark (1.0.0.0)

Somehow this question slipped my last years Odd things (on OTN) series, so I decided to collect several methods for this problem. Sort of a reverse String Aggregation Techniques. ;-)

Version 1: CONNECT BY (taken from MODEL clause vs. old school SQL)

WITH t AS (SELECT '10,12,20,30,30,3,12,12,56' col1
             FROM dual
          )
SELECT SUBSTR(col1
             ,DECODE(level, 1, 1, INSTR(col1,',',1,level-1)+1)
             ,DECODE(INSTR(col1,',',1,level), 0, LENGTH(col1), instr(col1,',',1,level)
             -DECODE(level, 1, 0, INSTR(col1,',',1,level-1))-1)
             ) col_new
  FROM t
  CONNECT BY level < LENGTH(REPLACE(TRANSLATE(col1,'01234567890','00000000000'),'0')) + 2
; 
COL_NEW
----------
10
12
20
30
30
3
12
12
56


Version 2: regular expressions

WITH t AS (SELECT '10,12,20,30,30,3,12,12,56' col1
             FROM dual
          )
SELECT REGEXP_SUBSTR(col1, '[^,]+', 1, ROWNUM) col_new
  FROM t
  CONNECT BY level <= LENGTH(REGEXP_REPLACE(col1, '([^,])+|.', '\1'))
; 

COL_NEW
----------
10
12
20
30
30
3
12
12
56


Version 3: pipelined function

CREATE OR REPLACE PACKAGE utl_strings
AS
  TYPE t_outtab IS TABLE OF VARCHAR2(255);
  
  FUNCTION str_to_rows(
    p_string IN VARCHAR2             -- source string
  , p_delim  IN VARCHAR2 DEFAULT ',' -- delimiteter 
  ) RETURN t_outtab PIPELINED
  ;
END utl_strings;
/ 
 
CREATE OR REPLACE PACKAGE BODY utl_strings
AS
  FUNCTION str_to_rows(
    p_string IN VARCHAR2             -- source string
  , p_delim  IN VARCHAR2 DEFAULT ',' -- delimiteter 
  ) RETURN t_outtab PIPELINED
  IS
    v_start   NUMBER := 1;
    v_len     NUMBER := NVL(LENGTH(p_string), 0);
    v_pos     NUMBER;
  BEGIN  
    WHILE v_start <= v_len 
    LOOP
      v_pos := INSTR(p_string, p_delim, v_start);  
    
      IF v_pos = 0 THEN 
         v_pos := v_len + 1;
      END IF;
         
      PIPE ROW(SUBSTR(p_string, v_start, v_pos - v_start));
      
      v_start := v_pos + 1;   
    END LOOP;  
  END str_to_rows;  
END utl_strings;
/ 

SELECT column_value col_new
  FROM TABLE(utl_strings.str_to_rows('10,12,20,30,30,3,12,12,56'))
;

COL_NEW
----------
10
12
20
30
30
3
12
12
56


Version 4: MODEL clause (taken from MODEL clause vs. old school SQL)

WITH t AS (SELECT '10,12,20,30,30,3,12,12,56' col1
             FROM dual
          )
SELECT col_new
  FROM t
 MODEL
   PARTITION BY (ROWNUM rn)
   DIMENSION BY (0 dim)
   MEASURES(col1, col1 col_new)
   RULES ITERATE(99) UNTIL (ITERATION_NUMBER = LENGTH(REGEXP_REPLACE(col1[0], '[^,]')))
                (col_new[ITERATION_NUMBER] = REPLACE(REGEXP_SUBSTR(col1[0], '(^|,)[^,]*', 1, ITERATION_NUMBER+1), ','))
;

COL_NEW
----------
10
12
20
30
30
3
12
12
56


There are probably more variations, but that should cover it for now.

Where's the space gone? [2008.01.07] Bookmark (1.0.0.0)

After checking the current size of my XE instance in my yesterday's blog I decided to take a closer look at SYSTEM and SYSAUX tablespace:

SELECT tablespace_name
     , SUM(bytes / 1024 / 1024) size_mb
  FROM dba_segments
 WHERE tablespace_name IN ('SYSAUX', 'SYSTEM')
 GROUP BY tablespace_name
;

TABLESPACE_NAME                   SIZE_MB
------------------------------ ----------
SYSAUX                           764,4375
SYSTEM                           434,6875


I was curious about the top 10 objects' size for those 2 tablespaces, here's SYSTEM:

SELECT segment_name 
     , segment_type
     , bytes / 1024 / 1024 size_mb
  FROM dba_segments
 WHERE tablespace_name = 'SYSTEM'
 ORDER BY bytes DESC
;

SEGMENT_NAME                   SEGMENT_TYPE          SIZE_MB
------------------------------ ------------------ ----------
SOURCE$                        TABLE                     143
IDL_UB1$                       TABLE                      42
IDL_UB2$                       TABLE                      15
C_OBJ#_INTCOL#                 CLUSTER                    11
C_TOID_VERSION#                CLUSTER                    10
PK_C0                          INDEX                      10
PK_O                           INDEX                      10
PK_CT                          INDEX                      10
PK_CS                          INDEX                      10
ARGUMENT$                      TABLE                       7


and SYSAUX:

SELECT segment_name 
     , segment_type
     , bytes / 1024 / 1024 size_mb
  FROM dba_segments
 WHERE tablespace_name = 'SYSAUX'
 ORDER BY bytes DESC
;

SEGMENT_NAME                   SEGMENT_TYPE          SIZE_MB
------------------------------ ------------------ ----------
SYS_LOB0000010794C00025$$      LOBSEGMENT                 58
WWV_FLOW_PAGE_PLUGS            TABLE                      30
WWV_FLOW_STEP_ITEMS            TABLE                      27
I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST INDEX                      22
WRI$_OPTSTAT_HISTGRM_HISTORY   TABLE                      14
WWV_FLOW_REGION_REPORT_COLUMN  TABLE                      12
SYS_LOB0000012406C00009$$      LOBSEGMENT                 12
WWV_FLOW_STEP_PROCESSING       TABLE                      11
WWV_FLOW_PAGE_PLUGS            TABLE                      11
SYS_LOB0000012186C00017$$      LOBSEGMENT                 11


Looks like APEX is taking its share of the system resources.

1 2 3 
Entries rendered in: 0.20 s




nobody