Для оптимальной производительности лучше избегать использования иерархических запросов (CONNECT BY) в функции сплиттера.
Следующая функция сплиттера значительно улучшает работу с большими объемами данных
CREATE OR REPLACE FUNCTION row2col(p_clob_text IN VARCHAR2)
RETURN sys.dbms_debug_vc2coll PIPELINED
IS
next_new_line_indx PLS_INTEGER;
remaining_text VARCHAR2(20000);
next_piece_for_piping VARCHAR2(20000);
BEGIN
remaining_text := p_clob_text;
LOOP
next_new_line_indx := instr(remaining_text, ',');
next_piece_for_piping :=
CASE
WHEN next_new_line_indx <> 0 THEN
TRIM(SUBSTR(remaining_text, 1, next_new_line_indx-1))
ELSE
TRIM(SUBSTR(remaining_text, 1))
END;
remaining_text := SUBSTR(remaining_text, next_new_line_indx+1 );
PIPE ROW(next_piece_for_piping);
EXIT WHEN next_new_line_indx = 0 OR remaining_text IS NULL;
END LOOP;
RETURN;
END row2col;
/
Эта разница в производительности может наблюдаться ниже (я использовал сплиттер функции, как было указано ранее в этом обсуждении).
SQL> SET TIMING ON
SQL>
SQL> WITH SRC AS (
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
3 FROM DUAL
4 CONNECT BY LEVEL <=10000
5 )
6 SELECT NULL
7 FROM SRC, TABLE(SYSTEM.row2col(txt)) t
8 HAVING MAX(t.column_value) > 'zzz'
9 ;
no rows selected
Elapsed: 00:00:00.93
SQL>
SQL> WITH SRC AS (
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
3 FROM DUAL
4 CONNECT BY LEVEL <=10000
5 )
6 SELECT NULL
7 FROM SRC, TABLE(splitter(txt)) t
8 HAVING MAX(t.column_value) > 'zzz'
9 ;
no rows selected
Elapsed: 00:00:14.90
SQL>
SQL> SET TIMING OFF
SQL>
В качестве альтернативы вы можете использовать расширение TestAG QAF , которое предоставляет различные встроенных поставщиков данных , а также управление ресурсами и средой . С QAF, если ваш тестовый пример управляется данными и имеет разные данные для разных сред, это может выглядеть следующим образом:
@QAFDataProvider(dataFile = "resources/${env}/data/tc_01.json")
@Test
public void tc_01(Map<String, Object>){
}
Значение ${env}
в пути к файлу данных может быть предоставлено во время выполнения в [ 115] разными способами . Это просто в качестве примера. Могут быть и другие альтернативные способы использования различных функций qaf в зависимости от необходимости.