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

Откуда: Химки МО
Сообщений: 1248
Коллеги, имеется запрос:
select substr(a.dat1, 66, 8) ip,
                     case when a.dat2 like '%123%' Then 'Test1' Else 
                     case when a.dat2 like '%234%' Then 'Test2' Else 
                     case when a.dat2 like '%345%' Then 'Test3' Else '' End End End ddd
                from table1 a
               where a.ltimestamp > sysdate - 1 / 60 / 24
                 and a.serno >= (select max(serno) from table1) - 5000
                 and a.dat1 like 'UT%'


Так вот далее я хочу эту выборку преобразовать (IP->Страна) с помощью вызова функции
Подзапросом не получается сделать, оно начинает дичайше тормозить, хотя выбирает пару строк.

Что хочется:
for R in (select substr(a.dat1, 66, 8) ip,
                     case when a.dat2 like '%123%' Then 'Test1' Else 
                     case when a.dat2 like '%234%' Then 'Test2' Else 
                     case when a.dat2 like '%345%' Then 'Test3' Else '' End End End ddd
                from table1 a
               where a.ltimestamp > sysdate - 1 / 60 / 24
                 and a.serno >= (select max(serno) from table1) - 5000
                 and a.dat1 like 'UT%') loop    
        fCountry := geodata.GetIPCountry(geodata.ParseIPAddress(R.ip));
        data(fCountry, R.ddd) := NVL(data(fCountry, R.ddd), 0) + 1;
    End Loop;


Как бы мне так объявить коллекцию/массив с 2 измерениями и в нее суммировать данные?
Вот так не получается: type TIPGeo Is Table of Integer Index by VarChar2, VarChar2;
После чего я по ней пройду и соберу итог в нужном виде...
Временную таблицу городить не хочется...
29 авг 17, 18:25    [20757006]     Ответить | Цитировать Сообщить модератору
 Re: Выборка через массив  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18370
https://docs.oracle.com/cloud/latest/db112/LNPLS/composites.htm#LNPLS00507
29 авг 17, 19:00    [20757065]     Ответить | Цитировать Сообщить модератору
 Re: Выборка через массив  [new]
Vladimir Filin
Member

Откуда: Москва
Сообщений: 110
Петров Андрей
Как бы мне так объявить коллекцию/массив с 2 измерениями и в нее суммировать данные?
...
После чего я по ней пройду и соберу итог в нужном виде...

В дополнение к предыдущему тостующему,
если "пройти" это будет чисто plsql-ная операция, то я бы собирал по курсору от результатов исходного запроса:

Bulk-Selecting into Nested Table of Records
https://docs.oracle.com/cloud/latest/db112/LNPLS/tuning.htm#CIHGGBGF

Можно ещё так коллекцию определить:
RECORD Type
https://docs.oracle.com/cloud/latest/db112/LNPLS/composites.htm#LNPLS99971
и собирать туда, что угодно.

Но, в обоих случаях sql движок их не увидит.
29 авг 17, 20:52    [20757199]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить