Oracle APEX apex_string.разделите порядок по

#oracle #oracle-apex

Вопрос:

Всегда ли apex_string.split гарантирует, что порядок возвращаемых строк соответствует порядку символов строки ? Могу ли я полагаться на то, что число строк всегда будет соответствовать 1 для первого символа разделенной строки ? или мне нужно добавить заказ по rownum ?

Каков метод получения строк в том же порядке символов строки ?

Мое требование состоит в том, чтобы вставить строки, возвращаемые apex_string.split, в том же порядке, что и символы строки.

В настоящее время я выполняю приведенное ниже, будет ли это поддерживать порядок символов ?

 select t.column_value value, rownum seq  from table(apex_string.split('test','')) t bulk collect into ins_arr;  for i in ins_arr.first..ins_arr.last loop   /* execute insert statement */  insert into table (seq, value )   values (ins_arr.seq,ins_arr.value);  end loop  

Вставка должна привести к

след. ценность
1 t
2 e
3 s
4 t

Заранее спасибо,

Комментарии:

1. Что касается фактического вывода функции разделения, это следует добавить в документацию. Цель состоит в том, чтобы методы разделения APEX_STRING сохраняли исходный порядок извлеченных подстрок. Я знаю о ряде обычаев, которые предполагают это.

2. Примечание: если запрос включает соединение с другой таблицей, порядок может быть потерян ( rownum больше не обязательно будет последовательным в отношении вывода функции).

3. Спасибо вам за разъяснение. Я действительно намереваюсь присоединиться к другой таблице , но объединенная таблица будет содержать только одну строку и один столбец. Даже в этом случае будет ли номер строки не в том же порядке, что и символы строки ? Например. с ename как ( выберите ename, empno ИЗ emp /* возвращает KING */ где empno = 7839 ) выберите номер строки как seq, empno, обрезать(значение столбца) ename_char из ename, таблица(apex_string.split(ename,»)) порядок по seq

4. Да; но чтобы гарантировать порядок, обязательно поместите запрос table() в подзапрос или CTE самостоятельно и сгенерируйте в нем номер строки, например: select t.value, t.seq, x.* from ( select column_value value, rownum seq from table(apex_string.split('test','')) ) t join other_table x on...

5. Кстати, если вам на самом деле не нужно запрашивать какую — либо другую таблицу, вы можете вообще избежать SQL- например: declare l_strings apex_t_string; begin l_strings := apex_string.split('test',''); for i in 1..l_strings.count loop ... end loop; end;

Ответ №1:

Я не думаю, что это гарантировано, потому что, если бы это было так, это было бы в документации. Но я думаю, что вы можете добиться того, чего хотите, изменив свой распорядок дня. (Обратите внимание, я не проверил это.)

 insert into table (seq, value) select t.column_value value,   row_number() over (order by t.column_value) from table(apex_string.split('test','')) t  

Я думаю, что вы можете сделать то же самое с rownum, но я никогда не уверен на 100%, в каком порядке rownum это order by происходит.

Комментарии:

1. Спасибо за ваш ответ, но порядок по t.column_value упорядочит его в алфавитном порядке, в котором перед t будет стоять «e». Я хотел бы упорядочить его в том же порядке, что и символы в строке

2. О, хороший улов. В этом случае, я думаю, вы могли бы использовать rownum, но это оставляет вопрос о том, будут ли строки в том порядке, в котором вы ожидаете.