Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 что-то ламерское по коллекцмям  [new]
guest1980
Member

Откуда:
Сообщений: 46
Решил сортировку двух списков стрингов попробовать через коллекции.
Прогнал анонимку

Declare
  Type ttgl Is Table Of Number Not Null
    Index By Varchar2(4);

  a    Varchar(100) := '0002|0004|0008';
  b    Varchar(100) := '|0001|0003|0005|0007|0016';
  res  Varchar(100);
  pos  Integer;
  i    Integer;
  tgl  ttgl;   --         := tgl();
Begin
  a := a || b || '|';  
  pos := 1;
  i := 0;

  While pos < Length(a) Loop
    i := i + 1;
    tgl(substr(a, pos, 4)) := i;
    pos := pos + 5;
  End Loop;

  res := tgl.First;

  For b In tgl.First .. tgl.Last Loop
    res := res || '|' || b;
  End Loop;

  dbms_output.put_line(res);
End;

Выдало
0001|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16
вместо обещанных <ясно чего>.
1) Как переписать код грамотно для 10g с использованием вышеизложенной идеи?
2) Какую более крутую сортировку предложили бы вы, если известно, что на входе a и b посортированны и b надо просто "внедрить" в а?
21 авг 07, 19:16    [4556490]     Ответить | Цитировать Сообщить модератору
 Re: что-то ламерское по коллекцмям  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
может всетаки
Type ttgl Is Table Of Varchar2(4) Not Null
    Index By binary_integer;
21 авг 07, 19:24    [4556528]     Ответить | Цитировать Сообщить модератору
 Re: что-то ламерское по коллекцмям  [new]
guest1980
Member

Откуда:
Сообщений: 46
Сорри, разобрался.
  b := tgl.First;   -- get subscript of first element
  While b Is Not Null Loop
    res := res || '|' || b;
    b := tgl.Next(b);   -- get subscript of next element
  End Loop;
Закройте там тему, бо не знаю как єто тут делается...
21 авг 07, 19:27    [4556537]     Ответить | Цитировать Сообщить модератору
 Re: что-то ламерское по коллекцмям  [new]
TiG
Member

Откуда:
Сообщений: 780
в первую очередь подумать о передачи списков в виде коллекций - что будете делать если varchar2-а не хватит на список ?
алгоритмическую сортировку тогда гораздо проще сделать, особенно если оба входных массива уже отсортированы - sort merge
21 авг 07, 19:29    [4556540]     Ответить | Цитировать Сообщить модератору
 Re: что-то ламерское по коллекцмям  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Отсается только отметить, что сортировка по ключу при обходе табличных типов не документирована, хотя и наблюдается, как следствие внутренней реализации.

При наличии SQL-типа сортировать его можно обычным order by, не зависимо от имплементации

SQL> create type varchar2_table as table of varchar2(4000);
  2  /

Type created.

SQL> declare
  2   l_buffer varchar2_table:=varchar2_table();
  3  begin
  4   l_buffer.extend;
  5   l_buffer(l_buffer.count):='b';
  6  
  7   l_buffer.extend;
  8   l_buffer(l_buffer.count):='a';
  9  
 10   for cur in (select * from table(l_buffer) order by column_value)
 11   loop
 12    dbms_output.put_line(cur.column_value);
 13   end loop;
 14  end;
 15  /
a
b

PL/SQL procedure successfully completed.
21 авг 07, 21:55    [4556876]     Ответить | Цитировать Сообщить модератору
 Re: что-то ламерское по коллекцмям  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Q u a d r o
сортировка по ключу при обходе табличных типов не документирована

Разве? А это:
PL/SQL User's Guide and Reference Release 2 (9.2)
ordering is based on the binary values of the characters in the string, unless the NLS_COMP initialization parameter is set to ANSI, in which case the ordering is based on the locale-specific sort order specified by the NLS_SORT initialization parameter.

По-моему достаточно, чтобы аккуратно использовать. В частности если символы в ключах только из ANSI-набора, и обход делать через next, то IMHO вполне надежно.

Или есть еще какие-то подводные камни?
21 авг 07, 22:38    [4556924]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить