#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, но это оставляет вопрос о том, будут ли строки в том порядке, в котором вы ожидаете.