konto usunięte

Temat: Problem z BLOB

Cześć,

mam pewien problem. Mam tablicę w której mam zapisane dane w formacie BLOB.

Teraz potrzebuję napisać funkcję, która połączy mi BLOBy pod pewnymi warunkami i zwróci mi jeden BLOB.

Do celów testowych napisałem coś takiego:

create or replace function getblob(begindate2 date) return blob
as
PRAGMA AUTONOMOUS_TRANSACTION;
ccc blob;
aaa blob;
bbb blob;
begin
DBMS_LOB.CREATETEMPORARY(ccc,true);
select track into aaa from header;
dbms_lob.append(ccc,aaa);
FOR counter IN 1..10 LOOP
SELECT track INTO bbb FROM(SELECT track FROM ttracks where begindate>=begindate2 order by begindate)where rownum =counter;
dbms_lob.append(ccc,bbb);
END LOOP;

return ccc;
end;

działa jeżeli pętla idzie od 1 do 1, w innych warunkach zwraca pustego BLOBa.

Bardzo proszę o szybką pomoc.

konto usunięte

Temat: Problem z BLOB

Marcin Kaleta:
Cześć,

mam pewien problem. Mam tablicę w której mam zapisane dane w formacie BLOB.

Teraz potrzebuję napisać funkcję, która połączy mi BLOBy pod pewnymi warunkami i zwróci mi jeden BLOB.

Do celów testowych napisałem coś takiego:

create or replace function getblob(begindate2 date) return blob
as
PRAGMA AUTONOMOUS_TRANSACTION;
ccc blob;
aaa blob;
bbb blob;
begin
DBMS_LOB.CREATETEMPORARY(ccc,true);
select track into aaa from header;
dbms_lob.append(ccc,aaa);
FOR counter IN 1..10 LOOP
SELECT track INTO bbb FROM(SELECT track FROM ttracks where begindate>=begindate2 order by begindate)where rownum =counter;
dbms_lob.append(ccc,bbb);
END LOOP;

return ccc;
end;

działa jeżeli pętla idzie od 1 do 1, w innych warunkach zwraca pustego BLOBa.

Ja bym przerobił tą pętle trochę
FOR rec IN select * (SELECT * FROM ttracks where
begindate>=begindate2 order by begindate ) where rownum < 10
loop
--można by to jeszcze tu wsadzić
DBMS_LOB.CREATETEMPORARY(ccc,true);
SELECT track INTO bbb FROM ttracks where PM = rec.PM -- przez PM mam na myśli prymary key
--
--
--
end loop

konto usunięte

Temat: Problem z BLOB

Dzięki wielkie, działa

konto usunięte

Temat: Problem z BLOB

Marcin Kaleta:
Dzięki wielkie, działa
A możesz wrzucić działające rozwiązanie ?
Wojtek Jurewicz

Wojtek Jurewicz ETL and Database
Developer / Business
Intelligence
specia...

Temat: Problem z BLOB

Już tylko gwoli wyjaśnienia, problem leży oczywiście w konstrukcji:

rownum = counter;

rownum nie jest numerem wiersza jako takim, tylko numerem wiersza *zwróconego*. To znaczy, że numerowane są tylko zwrócone wiersze, dlatego konstrukcje typu:

SELECT * FROM tab WHERE rownum = 2 [cokolwiek różne od jednego]

lub też

SELECT * FROM tab WHERE rownum BETWEEN 2 AND 3

nie zadziałają. Łopatologicznie tłumacząc, DBMS w fazie filtrowania patrzy na pierwszy wiersz wyników, oznacza go numerem 1, w warunku sprawdza, że chodzi o drugi - czyli nie o ten - więc go odrzuca, wybiera następny, oznacza go numerem 1 (bo nic do tej pory nie zostało wybrane), w warunku sprawdza, że chodzi o drugi, więc go odrzuca i tak aż skończą się potencjalne wyniki, a końcowy efekt jest zbiorem pustym.

Rozwiązaniem jest zawarcie tego wyrażenia w podzapytaniu:

Select * FROM (SELECT rownum AS n, tab.* FROM tab) sub WHERE n= 2

Następna dyskusja:

Dziwny problem w funkcji T-...




Wyślij zaproszenie do