Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. select * from table(schema.mypackage.myfunction('one, two, three'))
  2.  
  3. one
  4. two
  5. three
  6.  
  7. create or replace function splitter(p_str in varchar2) return sys.odcivarchar2list
  8. is
  9. v_tab sys.odcivarchar2list:=new sys.odcivarchar2list();
  10. begin
  11. with cte as (select level ind from dual
  12. connect by
  13. level <=regexp_count(p_str,',') +1
  14. )
  15. select regexp_substr(p_str,'[^,]+',1,ind)
  16. bulk collect into v_tab
  17. from cte;
  18. return v_tab;
  19. end;
  20. /
  21.  
  22. create or replace function string_tokenizer
  23. (p_string in varchar2
  24. , p_separator in varchar2 := ',')
  25. return sys.dbms_debug_vc2coll
  26. is
  27. return_value SYS.DBMS_DEBUG_VC2COLL;
  28. pattern varchar2(250);
  29. begin
  30.  
  31. pattern := '[^('''||p_separator||''')]+' ;
  32.  
  33. select trim(regexp_substr (p_string, pattern, 1, level)) token
  34. bulk collect into return_value
  35. from dual
  36. where regexp_substr (p_string, pattern, 1, level) is not null
  37. connect by regexp_instr (p_string, pattern, 1, level) > 0;
  38.  
  39. return return_value;
  40.  
  41. end string_tokenizer;
  42. /
  43.  
  44. SQL> select * from table (string_tokenizer('one, two, three'))
  45. 2 /
  46.  
  47. COLUMN_VALUE
  48. ----------------------------------------------------------------
  49. one
  50. two
  51. three
  52.  
  53. SQL>
  54.  
  55. SELECT regexp_substr('one,two,three','[^,]+', 1, level) abc
  56. FROM dual
  57. CONNECT BY regexp_substr('one,two,three', '[^,]+', 1, level) IS NOT NULL
  58.  
  59. CREATE OR REPLACE FUNCTION row2col(p_clob_text IN VARCHAR2)
  60. RETURN sys.dbms_debug_vc2coll PIPELINED
  61. IS
  62. next_new_line_indx PLS_INTEGER;
  63. remaining_text VARCHAR2(20000);
  64. next_piece_for_piping VARCHAR2(20000);
  65. BEGIN
  66.  
  67. remaining_text := p_clob_text;
  68. LOOP
  69. next_new_line_indx := instr(remaining_text, ',');
  70. next_piece_for_piping :=
  71. CASE
  72. WHEN next_new_line_indx <> 0 THEN
  73. TRIM(SUBSTR(remaining_text, 1, next_new_line_indx-1))
  74. ELSE
  75. TRIM(SUBSTR(remaining_text, 1))
  76. END;
  77.  
  78. remaining_text := SUBSTR(remaining_text, next_new_line_indx+1 );
  79. PIPE ROW(next_piece_for_piping);
  80. EXIT WHEN next_new_line_indx = 0 OR remaining_text IS NULL;
  81. END LOOP;
  82. RETURN;
  83. END row2col;
  84. /
  85.  
  86. SQL> SET TIMING ON
  87. SQL>
  88. SQL> WITH SRC AS (
  89. 2 SELECT rownum||',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'||rownum txt
  90. 3 FROM DUAL
  91. 4 CONNECT BY LEVEL <=10000
  92. 5 )
  93. 6 SELECT NULL
  94. 7 FROM SRC, TABLE(SYSTEM.row2col(txt)) t
  95. 8 HAVING MAX(t.column_value) > 'zzz'
  96. 9 ;
  97.  
  98. no rows selected
  99.  
  100. Elapsed: 00:00:00.93
  101. SQL>
  102. SQL> WITH SRC AS (
  103. 2 SELECT rownum||',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'||rownum txt
  104. 3 FROM DUAL
  105. 4 CONNECT BY LEVEL <=10000
  106. 5 )
  107. 6 SELECT NULL
  108. 7 FROM SRC, TABLE(splitter(txt)) t
  109. 8 HAVING MAX(t.column_value) > 'zzz'
  110. 9 ;
  111.  
  112. no rows selected
  113.  
  114. Elapsed: 00:00:14.90
  115. SQL>
  116. SQL> SET TIMING OFF
  117. SQL>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement