Posted By: medved (A~z na v~eky Mikov~ce.) on 'CZdatabases'
Title:     Re: Embedded SQL, Ccko a Select z neznameho 1
Date:      Fri Dec 10 17:00:56 1999

> vidim problemy: ten pocet sloupcu neni predem dany (sice by se dal nejak 
> omezit, ale proc to delat, IMHO to musi jit i bez toho): no a ja potrebuji 
> mit k dispozici nastroj, ktery bude delat select podle libovolne (vhodnym 
> zpusobem predane) query. 

V tuto chvili se pohybuji na nejiste pude, neb programovani v C je mi DOST 
cizi (delam v kodu neustale nejake preklepy a to me STVE ;-).

Mne napada vytvorit si nekolik funkci na osetreni ruznych kombinaci sloupcu a 
ty pote testovat nad konkretnim selectem. 

> Takze dostanu pozadavek na vyber 5.,7.,10., sloupce, vytvorim pozadovanou 
> query, otevru kurzor a zacnu nacitat. Jenze. Jenze pro kazdy sloupec musim 
> mit vyhrazenou prislusnou promennou. A tady narazim na problem: ESQL 
> standardne vyzaduje, aby jmeno promenne bylo znamo pri kompilaci. Existuji 
> sice dynamicke metody, ktere umozni takoveto nacitani, jake jsem ukazal, ale
> fakt netusim, jak vypadaji v Ccku (a navic prenositelne). Nepomuze nekdo?
> 
> Narazim minimalne na 2 problemy: na pocet tech promennych (kdyz si je
> vyhradim 
> dopredu - pak bych musel omezit dopredu max. pocet sloupcu) a dal na jejich 
> typ. Nemuzu nacitat real do intu atp. Jak to tedy udelat?

Jak jsem rekl - spousta funkci pro osetreni ruznych kombinaci a poctu 
navracenych sloupcu (sloupcu result setu) 

> > > Mimochodem, umoznuje ESQL vyber urciteho sloupce (jako standardni vec,
> tj.
> > > "vyber 3. sloupec")? Nebo je to jen zalezitost kazde konkretni databaze?
> 
> > Ted Ti nerozumim. Muzes provest dotaz do databaze nad tabulkou s 50ti
> > soulpci 
> > tak aby se Ti vratil treba 5., 7. a 13. sloupec (provedes SELECT <jmeno 5.
> > sloupce>, <7. sloupce>, <13. sloupce> from ...).
> 
> No slo mi o to, abych si nemusel udrzovat tu "pomocnou" tabulku. Protoze 
> pozadavky na cteni budu dostavat maximalne v tom smyslu, abych precetl 
> 5.,7.,13. sloupec. Jak to zatim vidim ja, budu si muset vyzvednout z te 
> pomocne tabulky nazvy tech sloupcu a teprve z toho sestavit query. Ale to
> neni 
> moc problem. 

Kvuli pozadovane univerzalite to musis hnat pres pomocnou tabulku. Anebo si 
vytvor pomocny view nad systemovymi tabulkami (ten view bude samozrejme mit 
jinou syntaxi pro Oracle a jinou pro PostgreSQL) 

> > Vysledek, tzv. result set, je x radku, kazdy o 3 sloupcich. Postupne musis
> > jednotlive radky nacitat do kurzoru (to je ten fetch) a muzes se odkazovat
> 
> Jo, to je ten fetch. Tak jak ho znam ja, musim pro kazdy sloupec vyhradit 
> jednu promennou.
> 
> Tj. mam FETCH cursor INTO :var1, :var2, ... :varn,
>   kde navic neznam typ, ktery budu potrebovat (takze to nelze "zfouknout" s
>   kompilaci) -
> ale mne by se hodilo spis FETCH cursor INTO :text.
> 
> A nebo pokud to nejde, jak mohu dosadit do kurzoru za behu programu ruzne 
> promenne (budu asi v tom pripade nucen je dynamicky alokovat, ne?). Zatim
> jak 
> tak koukam, nevyhnu se DESCRIBE a USING DESCRIPTOR:-| - to ale neovladam. 

Jo to je ten princip (v PowerBuilderu to je DescriptionArea objekt - takze 
neco takoveho).

> > na dejme tomu 3. sloupec v danem radku result setu (ktery odpovida 13. 
> > sloupci v tabulce). 
> 
> No odkazovat se na to muzu jedine tak, ze prectu obsah promenne, do ktere
> jsem 
> FETCHnul, ne? Nebo mohu FETCHovat po jednotlivych promennych? (tj. v ramci 
> radky navic jeste po sloupcich) 

Jo presne tak.

> > Nektere databaze Ti jeste umozni nechat si do result setu nacpat treba jen
> > prvnich 10 radku vysledku, ale to opravdu jak ktera databaze. 
> 
> Co je presne result set? Je to nejaka struktura v SQLDA?

Result set = mnozina radek, kterou Ti vrati databaze.

Posles select sloupec from table where ... a vrati se Ti Result Set s jednim 
sloupcem 'sloupec' a x radky. 
Soucasne se nastavi kurzor na prvni radek result setu a pri provedeni fetche 
se jeho hodnoty nactou do promenych a ukazovatko se nastavi na dalsi radek 
(vedle toho lze delat i fetch_first, fetch_last, fetch_previous... ale zavisi 
to na databazovem klientu, co podporuje) 

> > > dve veci od sebe oddelim? Na druhou stranu pro moje potreby by mi
> stacilo 
> > > odlisovat pouze mezi dvema datovymi typy: int a real. 
> > 
> > Testovat ve spravnem poradi :-)
> > Nejdrive Int a kdyz se to do nej nevejde, tak je to real...
> 
> No jo, ale kdy? Az po FETCHi? A do ceho to mam teda pak FETCHnout? Pokud to 
> mam delat pri FETCHi, musel bych FETCHovat 2x - a to nejde. 

Nejdrive fetchnout do INTu a v pripade chyby do Realu.

Pokud daatabaze nepodporuje fetch previous, tak budes muset opakovat posledni 
select. 

> snake

Bye

Medved

Si vis pacem, para bellum.

Search the boards