Oracle : из одной записи вернуть несколько строк,можно?

wwoland

Суть в том,что есть некоторое текстовое поле, содержащее составные данные,например массив чисел. Например : '1 2 3 4 5'
Вопрос: возможно ли как нибудь с помощью запроса вернуть пять записей , в каждой из которых будет одно из чисел.
ну или хотя бы с помощью функции?

Hastya

select 1 from dual
union
select 2 from dual
union
select 3 from dual
...и т.п.

wwoland

это понятно,но количество чисел,допустим - различное может быть для различных записей.
Пример














Поле1 Поле2

1 2 3
1

2 5
2


взависимости от значения поля2 получить либо 2 либо три записи,как результат моего запроса

sinet

http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DIS...
Описанная там хранимая процедура должна помочь.

wwoland

я тоже об этом думал
дай плз поточнее ссылку =)

sinet

Похоже форум не переварил ссылку.
Ну кликай сюда http://www.google.ru/search?q=varying%20elements%20in%20IN%2...

wwoland

Спасиб,так и думал,что надо будет табличнуй функцию делать =)

Gerkon

можно и запросом: ботай иерархии и в частности функцию SYS_CONNECT_BY_PATH

wwoland

SYS_CONNECT_BY_PATH
что то мне кажется это немного не то,иерархические запросы тут ни причем.
Просто надо условно строку распарсить в несколько значений и вернуть их как отдельные записи.

Gerkon

это только кажется
извратиться всегда можно, если найдено несколько решений - есть из чего выбрать!
все зависит от целей, Oracle большой

Gerkon

а с помощью оракловых функций решение можно всегда найти....ну, практически всегда

vijrel7878

еще можно блоб сделать а потом прочитать значения. Аналог стриму короче. Это еще проще, так как парсить ничего не надо. Только пистаь и читать. Главное придерживаться формата


Просто надо условно строку распарсить в несколько значений и вернуть их как отдельные записи

wwoland

А можно поподробней?

ava3443

Присоединяюсь. Можно подробнее?

vijrel7878

сорри, уже в отпуске . Потом могу кусок пакаджа запостить для примера

wwoland

с нетерпением ждем =)

vijrel7878

есть ф-ции для чтения и записи:


function ReadInteger(data in blob, pos in out binary_integer) return binary_integer is
l_val RAW(4);
l_size binary_integer := 4;
begin
dbms_lob.read(data, l_size, pos, l_val);
pos := pos + l_size;
return utl_raw.cast_to_binary_integer(l_val, utl_raw.little_endian);
end;

procedure WriteInteger(val in binary_integer, data in out blob, pos in out binary_integer) is
not_null_val binary_integer;
l_val RAW(4);
l_size binary_integer := 4;
begin
not_null_val := NVL( val, 0 );
l_val := UTL_RAW.cast_from_binary_integer(not_null_val, UTL_RAW.little_endian);
DBMS_LOB.write(data, l_size, pos, l_val);
pos := pos + l_size;
end;


и т.д. для остальных типов данных
Создается блоб, туда все пишется, потом читается в таком же порядке. Можно придумать ухищрения для устойчивости и последующей поддержки (писать флаги, затем читать только то, на что указывают флаги, это поможет для поддержки разных версий).
Можно сделать аналог EOF

function EOF(data in blob, pos in binary_integer) return boolean is
begin
return pos > DBMS_LOB.GETLENGTH(data);
end;

тогда можно читать произвольное количество данных заданного типа/формата.
Оставить комментарий
Имя или ник:
Комментарий: