[ darko_sudarov @ 08.08.2007. 09:09 ] @
Kako se moze pretrazivati blob.

Firebird 2.0,IBEXPERT

Naime nasao sam da treba da se deklarise kursor i koliko sam shvatio posle se poziva fech cursor da prikaze rezultate ali mi ne uspeva da to uradim.

Nesto ovog tipa:

Code:
 declare nadji cursor  for read blob komentar from tblnov_napom maximum_segment 40; 


ali problem je sto mi to ne radi nigde ni u editoru ni u proceduri(mada vidim da u proceduri ima polje za cursor ali ne radi,IBEXPERT verzija 2007.07.20-sa crvenim znate vec sta).
Kako bi isla tacna procedura deklarisanja i pretrazivanja po blobu?


[ schild @ 08.08.2007. 10:13 ] @
Evo jedan glup primer ali mislim da ce ti pomoci...
Code:

CREATE PROCEDURE NEW_PROCEDURE1
returns (
    rname char(31))
as
declare c cursor for (select rdb$relation_name
  from rdb$relations );
BEGIN
  OPEN C;
  WHILE (1 = 1) DO
  BEGIN
    FETCH C INTO :RNAME;
    IF (ROW_COUNT = 0) THEN
      LEAVE;
    SUSPEND;
  END
  CLOSE C;
END

Znaci, u tvom slucaju bi deklaracija kursora isla:
Code:
declare nadji cursor for (select komentar from tblnov_napom);


Ali razmisli da li ti bas treba CURSOR, isti efekat kao gornji primer ce ti dati i sledeca procedure koja ne koristi cursor:
Code:

CREATE PROCEDURE NEW_PROCEDURE2
returns (
    rname char(31))
as
BEGIN
  for
    select rdb$relation_name
    from rdb$relations
    into :rname
  do
  begin
    suspend;
  end
END
[ Mr. Rejn @ 08.08.2007. 10:55 ] @
Citat:
darko_sudarov: Kako se moze pretrazivati blob.

O kakvom se to pretraživanju bloba radi? Fulltext search ili nešto drugo? Tebi ustvari treba sadržaj
kolone "komentar" koja je tipa BLOB iz tabele "tblnov_napom"-običan select može vratiti
sadržaj te kolone.

Ova gore procedura i cursor vraćaju sve tabele uključujući i sistemske iz metapodataka,
samo ne vidim u kakvoj je to vezi sa blob-ovima,mogli bi da čujemo neko pojašnjenje.
[ darko_sudarov @ 08.08.2007. 11:08 ] @
Pokusao sam to da uradim ali mi vrati gresku Overflow occurred during datatype conversion.Conversion error from string "BLOB".

Code:
 CREATE PROCEDURE ZA_BLOB 
returns (
    rname char(31))
as
BEGIN
  for
    select komentar from tblnov_napom
    into :comment
  do
  begin
    suspend;
  end 



Pretrazivanje teksta je u pitanju :
ali mi je nekako nesigurno jer recimo like ne radi,ono sto sam nasao jeste da radi sa containinig i radi sa starting with.

Ali problem je inace generalne prirode kako prertazivati po blobu ;tj postoji li nesto univerzalno sto radi bilo sa slikama bilo sa tekstom.Znaci ja tazim nesto u blob polju kako da ga nadjem?
[ schild @ 08.08.2007. 12:01 ] @
Citat:
Mr. Rejn: Ova gore procedura i cursor vraćaju sve tabele uključujući i sistemske iz metapodataka,
samo ne vidim u kakvoj je to vezi sa blob-ovima,mogli bi da čujemo neko pojašnjenje.
Ma ta procedura samo daje primer rada sa cursorom, posto sam mislio da mu je to problem.

Citat:
darko_sudarov: Pokusao sam to da uradim ali mi vrati gresku Overflow occurred during datatype conversion.Conversion error from string "BLOB".
Greska je verovatno jer ti je blob veci od deklarisane kolone char(31). Ja sam ti dao banalan primer, samo zbog načina rada sa cursorom, jer sam mislio da si tu zapeo. Blob ćeš teško moći smestiti u (var)char jer je blob promenljive dužine, a (var)char fixne.

Citat:
...ali mi je nekako nesigurno jer recimo like ne radi,ono sto sam nasao jeste da radi sa containinig i radi sa starting with.
Treba da ti radi like sa blob poljem... To smo već bili diskutovali ranije, proveri starije postove.

Citat:
Ali problem je inace generalne prirode kako prertazivati po blobu ;tj postoji li nesto univerzalno sto radi bilo sa slikama bilo sa tekstom.Znaci ja tazim nesto u blob polju kako da ga nadjem?
Ne razumem kako bi pretraživao sliku?



[ darko_sudarov @ 08.08.2007. 12:22 ] @
Like sigurno ne radi sa blobom i takodje ne podrzava = ,%, cast i ostalo (odnosi se na cisti select).Problem je jednostavan,ili ja nesto ne razumem kako treba,blob je Binary Long OBject u koji moze svasta da se smesti od teksta do slike...kako da ja sa select statement da pretrazim blob,ako je tekst unutar bloba da nadje kao select ..... where polje='nesto'(ovo inace nema sanse da prodje) ili ako je slika naziv slike(predpostavljam nisam to jos koristio).Koliko primecujem malo ko i radi sa blob poljima pa i objasnjenja nisu preterano jasna,mozda bi bilo dobro ovu temu detaljnije obraditi.
[ Mr. Rejn @ 08.08.2007. 12:57 ] @
^
Ako želiš da koristiš sve te mogućnosti pretraživanja pomoću regularnih izraza,moraš tu kolonu da
postaviš kao VARCHAR umesto kao BLOB tip TEXT (tip 1).FB još uvek nema mogučnosti upotrebe RI na
tom tipu iako verzija 2.1 uvodi neku kompatibilnost između BLOB tipa TEXT i VARCHAR.
Verovatno će ver. 3 FB biti osposobljena da tretira BLOB tip TEXT polje isto kao i VARCHAR..i u
blob može svašta da se smesti ali ne i da se pretražuje na isti način,bar za sada.Bož sačuvaj da
možeš da nalaziš sliku u blobu preko naziva slike (niti to ima neki smisao),jedino ako taj naziv
smestiš u posebnu kolonu recimo tipa CHAR ili VARCHAR,ta slika je u bazi identifikovana preko svog
blobid-a.
BTW pogledaj o raznim tipovima bloba,možda je to izvor konfuzije.Ne bi trebalo korisiti isti tip za slike
(tip 0,binarni podaci) i za tekst (tip 1,u suštini isto što i VARCHAR samo bez limita od 32kB).
Na kraju možeš sačuvati sadržaj te kolone u stream ili fajl i onda ga pretraživati pomoću regularnih
izraza u tom jeziku koji koristiš (C#, Delphi itd.)
[ darko_sudarov @ 08.08.2007. 13:37 ] @
Znaci koliko sam razumeo ,ni kada bi napravio proceduru koja bi imala fech from cursor sa promenljivom koju trazim ( u smislu : select ..from..where... like :promenljiva (kao char ili varchar)) ni to ne bi radilo?Posto sam u dokumentaciji nalazio da se fech i cursor vezuju skoro redovno sa blob poljima,kao i filter koji je vezan za blob.I dali bi se mogla koristiti naredba read from blob kod pretrazivanja?





[Ovu poruku je menjao darko_sudarov dana 08.08.2007. u 14:55 GMT+1]
[ Mr. Rejn @ 08.08.2007. 15:50 ] @
^
Možda bi radilo ako je ta kolona tipa VARCHAR.
Ne postoji "univerzalni" tip BLOB podatka koji mozes koristiti za sve to sto ti treba.Postoji blob
tip (tj. podtip) 0-binarni i tip 1-tekstualni.U smislu pretrazivanja tekstualni blob je ograničen
u odnosu na tip podatka VARCHAR,a sam VARCHAR je ograničen na 32 kB.Znači ako hoćeš da imaš sve f-je
pretraživanja teksta koje nudi FB razmisli u VARCHAR tipu umesto BLOB tip TEXT, s tim da možeš smesiti
max 32 kB teksta u to polje.Pogledaj ovde o ovome: http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_blobs


Citat:
darko_sudarov: I dali bi se mogla koristiti naredba read from blob kod pretrazivanja?

read from blob,šta je to?
[ schild @ 09.08.2007. 08:02 ] @
Citat:
darko_sudarov: Like sigurno ne radi sa blobom i takodje ne podrzava = ,%, cast i ostalo (odnosi se na cisti select).

LIKE I said, LIKE radi sa BLOB poljem, naravno da mora biti subtype TEXT.
Ja bih ti preporučio da proučiš malo dokumentaciju koja ide uz FB, može se dosta toga naučiti kako FB tretira blob polja, i još svašta nešto.
[ darko_sudarov @ 10.08.2007. 13:57 ] @
Ovako stoji u dokumentaciji:


Code:
DECLARE CURSOR (BLOB)
Declares a Blob cursor for read or insert. Available in
gpre
.
Syntax DECLARE cursor CURSOR FOR
{READ BLOB column FROM table
| INSERT BLOB column INTO table}
[FILTER [FROM subtype] TO subtype]
[MAXIMUM_SEGMENT length];
Description
Declares a cursor for reading or inserting Blob data. A Blob cursor can be associated
with only one Blob column.
Argument
Description
cursor
Name for the Blob cursor
column
Name of the Blob column
table
Table name
READ BLOB
Declares a read operation on the Blob
INSERT BLOB
Declares a write operation on the Blob
[
FILTER [FROM
subtype
]
TO
subtype
]
Specifies optional Blob filters used to translate a Blob from one
user-specified format to another;
subtype
determines which filters are
used for translation
MAXIMUM_
SEGMENT
length
Length of the local variable to receive the Blob data after a
FETCH


Mozda je Child u pravu sto se tice like jer i u tom linku koji je Mr.Rejn poslao stoji da like radi, ali kod mene to zaista ne radi. Inace da je like radilo ja nebi ni postavio pitanje u vezi bloba jer mi je to i bio problem da izvadim neke fiskalne isecke koji su smesteni u blobu.

jos stoji

Code:

FETCH (BLOB)
Retrieves the next available segment of a Blob column and places it in the specified local
buffer. Available in
gpre
.
Syntax FETCH cursor INTO
[:<buffer> [[INDICATOR] :segment_length];
Argument
Description
cursor
Name of an open Blob cursor from which to retrieve segments
:
buffer
Host-language variable for holding segments fetched from the Blob
column; user must declare the buffer before fetching segments into it
INDICATOR
Optional keyword indicating that a host-language variable for
indicating the number of bytes returned by the
FETCH
follows
:
segment_length
Host-language variable used to indicate he number of bytes returned by
the
FETCH 


[Ovu poruku je menjao darko_sudarov dana 10.08.2007. u 15:11 GMT+1]
[ Mr. Rejn @ 10.08.2007. 14:50 ] @
Obrati pažnju na deo:
Citat:
darko_sudarov:Available in gpre

to je postupak deklarisanja blob kursora za upotrebu u tzv. Embedded SQL-u,koriste se za čitanje
BLOB segmenata.To je SQL pisan na poseban način koji se obrađuje pomoću gpre preprocesora
(imaš ga u /bin diru tvoje instalacije: gpre.exe),koji onda izbacuje C,C++,Pascal,Cobol ili koji već kod.
To nije raspoloživo u običnom SQL-u ili PSQL-u.
Npr. umesto tih kursora postoje posebne f-je za manipulaciju blobovima (BLOB_load, BLOB_dump,STORE itd.),
evo primera koji sam ja negde koristio (unos slike):

Code:

EXEC SQL WHENEVER SQLERROR GOTO ExitError;
EXEC SQL SET DATABASE DB1 = 'kupci';

EXEC SQL BEGIN DECLARE SECTION;
BASED ON BLOB_TEST.PKEY pkey;
BASED ON BLOB_TEST.OPIS opis;
BASED ON BLOB_TEST.PODACI podaci;
BASED ON BLOB_TEST.DATA blob_data;
EXEC SQL END DECLARE SECTION;

EXEC SQL CONNECT DB1 USER 'SYSDBA' PASSWORD 'masterkey';
EXEC SQL SET TRANSACTION;

/* BLOB_load primer */
STORE A IN BLOB_TEST USING A.OPIS = "neki opis",A.PODACI="neki podaci";
BLOB_load (&A.DATA, DB1, gds__trans, OpenPictureDialog1->FileName.c_str()); //ovde je 
                                  //unesena putanja slike iz dijaloga u C++ Builder-u
END_STORE;

EXEC SQL COMMIT;
EXEC SQL DISCONNECT DB1;

ExitError:
if (SQLCODE)
{
isc_print_sqlerror(SQLCODE, isc_status);
EXEC SQL ROLLBACK;
EXEC SQL DISCONNECT DEFAULT;
exit(1);
}

to se sačuva kao fajl.e i obradi gpre-om: gpre -c -either -manual -no fajl.e i on izbaci C kod koji onda
ugradiš u tvoj C/C++ program.