PL/pgSQL fv.

Sziasztok!

Egy PL/pgSQL függvényt próbálok írni, de eddig sajnos kevés sikerrel.

Az eredeti táblák több mezőt tartalmaznak, a problémát egyszerűsítve fogalmazom meg.

Adottak a T1, T2 és T3 táblák, melyek sémája különböző. Valamint van egy T tábla, melyben a Tn (n=1,2,3) táblák rekordjainak egy sorozata van tárolva (nem minden rekord szerepel benne, egy rekord többször is előfordulhat).
A T sémája:
id (primary key)
t (melyik Tn táblában van a rekord)
t_id (a rekord Tn táblabeli azonosítója)
elozo (az előző rekord T.id-je a sorozatban, első rekordnál 0)

Ebből szeretném lekérdezni a Tn táblabeli rekordokat a T táblában meghatározott sorrendben.

PL/pgSQL nélkül csak több query küldésével tudtam megoldani, ami nem szép:
1. lekérdezem a T-ből azt a rekordot, melyre az elozo=0
2. T.t táblából T.t_id-jű rekord lekérdezése (elágazás)
3. elozo=T.elozo; goto 1
Vége ha az 1. pontban szereplő lekérdezés eredménye üres.

Ezt szeretném egy PL/pgSQL függvénnyel helyettesíteni.
Cursor használatával próbáltam megoldani de nem sikerült.

Van javaslatotok arra, hogy a fenti táblaszerkezettel hogyan lehet ezt a lekérdezést szépen és hatékonyan megírni?

Előre is köszönöm a válaszokat!

Hozzászólások

hali
hat nem tudom, de rohadt mocsoknak tunik a szerkezete.
ha jol ertem, van 4 db tablad.
az egyik egy vezerlo vagy torzs tabla, vagy index-tabla, mert mintha azt a feladatot latna el.

a maradek harom tabla harom sima tabla annyi megkotessel, hogy egy azon primary key-t hasznaljak olyan megkotessel, hogy egy kulcs csak az egyik tablaban lehet, es magaban a tablaban nem lathato a vezerlo kulcsa, csak a sajat kulcsa, (ami nem pk)

a tablak az egyszeruseg miatt T a vezerlo tabla, es annak a harom tablaja A,B,C
es azt szeretned, hogy legyen egy fv-ed, amit ha meghivsz mondjuk
fv(1) -el, akkor adja ki neked a azt a tablat amiben a T tablaban az 1-es kulcshoz tartozo (A|B|C) tabla adott rekordjat mutassa meg.

nem lesz egyszeru. en meg ilyet nem csinaltam, es nem tudom lehet-e olyat csinalni, hogy egy fv-nek tobb tipusu kimenete legyen. szerintem nem.

egy bonyolult megoldast tudok, ha az jo.

kell csinalnod egy tipust, ABC_tip pl, ami az A, B, es C tablak tipusait tartalmazza. ez lehet egy view fele omlesztes, vagy row_tipusok is.

es a fv-en belul pedig eldontod, hogy melyik row_tipusnak adsz visszateresi erteket, a tobbit pedig null-ra allithatod.

A (id serial,nev text)

B (id serial,tipus int4)

C (id serial,datum timestamp)

//tudom, hogy ez hulyeseg, mert lehet 1ben is, de e csak pelda

CREATE TYPE tipusA (id int4, nev text)
CREATE TYPE tipusB ...
CREATE TYPE tipusC ...

CREATE TYPE tipusABC (A tipusA,B tipusB, C tipusC);

utana a plsql-ben
declare
recA record;
recB record;
recC record;

begin
recA:=null;
recB:=null;
recC:=null;
--kikeresed melyik kell, es recA nak vagy B vagy C-nek adod az ertek
return row(recA,recB,recC);
end;

select fv(1); pedig ezt adja kb
A | B | C
----------
{12,bla bla}| |

de ezt felhasznalhatod igy
select (A).*,(B).*, (C).* from fv(1);
select (A).nev,(B).tipus,(C).datum from fv(1);

remelem segitettem

A 3 táblában (A, B, C) 3 különböző típusú dolgok tulajdonságait tárolom. (Gondoltam arra is, hogy egy táblába összevonom, de az eltérő mezők miatt sok lenne a NULL érték.) A T táblában meg tulajdonképpen egy (visszafelé) láncolt lista van tárolva, melynek elemei az A, B, C táblákban vannak.
A fv.-t úgy szeretném megírni, hogy a láncolt lista minden elemét le tudjam kérdezni. (Az alkalmazásban fel is építem ezt a listát.)

Úgy képzeltem el, hogy a fv. egy olyan táblával tér vissza, melynek sémája az A, B, C táblák mezőinek uniója valamint egy mező, ami azt tartalmazza, hogy melyik táblából van a rekord. Ebben az esetben lesz sok NULL érték, de talán szebb megoldás, mint a 3 tábla összevonása.

Köszi a javasolt megoldást, megnézem részletesebben!

felejtsd el az a,b,c tablat.

cimkezz!
pl.

kod=1
nev=alma
tipus=kerek
szin=piros
allag=kasas

eseten ugye a tabla igy nezne ki:
kod,nev,tipus,szin,allag

de ha ugyanebben a methodusban akar az ember autot, vagy szamitogepet adni, akkor ugye nem biztos hogy illik ra jopar oszlop.

erre inkabb a cimkezos megoldas a jo.
valoszinu, hogy kod es nev mindben szerepel. ezert kell egy torzstabla, amiben szerepel a (kod (serial, pkey) ,nev varchar(50),szulo int4)

a masik pedig a parameter tabla
ami pedig a (kod int4, nev varchar(20), ertek text)

torzstabla tartalma ekkor:
1 | almam
2 | autom

parameter tabla pedig:
1 | szin | zold
1 | allag | kasas
1 | forma | kerek
1 | darab | 12334
2 | szin | piros
2 | tipus | mazda
2 | rndsz | ABC123
2 | forg erv | 2099.01.01
2 | alvazszam |ASDF1234A1234
2 | motorszam | MTFSW242SF2411

itt viszont az okoz gondot, hogy lekerdezeskor nehez rekordba tenni az adatokat.
de ha fix tipusok vannak, akkor lehet ra annyi view-t csinalni ahany tipusod van.

Szervusz !

két dologgal kell kezdenem:
1. nem igazán értem így elvontan a problémát
2. MySQL-t használok.

De: lehet, hogy JOIN-t kell használnod.
én pl RIGHT JOIN-t szoktam hasznáni, akár 3-4 láncolt táblából is összeszedi az információt.

Olvass! (manual, példaprogramok) Kísérletezz!

CSZ

Köszönöm mindkettőtöknek a választ!
A legjobb megoldást még nem volt időm megtalálni, de az általatok javasolt úton már el fogok tudni indulni.