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.