Táblanév változtatása paraméter alapján
2021-09-08T23:17:56+02:00
2021-09-23T12:24:38+02:00
2022-08-12T04:35:36+02:00
splash05
Sziasztok!

Van pár azonos szerkezetű táblám amelynek a neve a következő formátumú:

tablanev{kód}

ahol a kód 3 jegyű azonosító (cégszámot jelöl) tehát minden céghez van ugyanolyan szerkezetű/tematikájú tábla de nyilván a táblanév más, mert más céghez tartozik. 

Nos én ezeket unionnal szoktam összekapcsolni, hogy az összes cég adatait egyszerre jelenítse meg (és ebből csinálok view-t)

select * from tablanev105 union all select * from tablanev107 union all select * from tablanev115; --ez hozza az összes rekordot ami kell

Szóval azt szeretném elérni, hogy meghatározott paraméterlista alapján ({105,107,115})
előálljon a selectben a tablanev105, tablanev107 és tablanev115 nevű táblám (nyilván ezek léteznek és ezért meg tudom a paramétereket is mondani) majd unionolni őket, hogy mind a 3 cég tábláját lássam.

Van erre valami megoldás SQL-ben (oracle), hogy definiálok egy paraméterlistát és azokat egyenként beillesztem a táblanévbe?
Ha igen, konkrétan mi a szintaxisa?
Mutasd a teljes hozzászólást!
Szia.
Valami ilyesmit kellene procedure-ba terelni:
DECLARE v_tabla_list VARCHAR2 (1024); v_sql VARCHAR2 (1024); BEGIN v_tabla_list:= '105, 117, 133'; FOR x IN ( select TRIM(regexp_substr(v_tabla_list,'[^,]+', 1, level)) tbl_postfix from dual connect by regexp_substr(v_tabla_list, '[^,]+', 1, level) is not NULL) LOOP v_sql:= v_sql ||' select * from tablanev'||x.tbl_postfix || ' '||'UNION '; END LOOP; v_sql := SUBSTR (v_sql, 1, LENGTH(v_sql) - 6 ) || ';'; --utolsó UNION-t kivenni dbms_output.put_line (v_sql); -- ehelyett meg EXECUTE IMMEDIATE END;
Mutasd a teljes hozzászólást!

  • Ha egy RTFM szintű válasz kielégít, akkor javaslom a dynamic sql és a dbms_sql kifejezésekre keresést (tizenhárom+ éve nem láttam Oracle-t), de...

    Ilyet (tábla nevében adatot tárolni) nem szabad csinálni, pláne nem Oracle alatt!
    Annyira nem drága manapság a háttértár, hogy pár megabájttal így kelljen csökkenteni a táblák méretét.
    Lehet particionálni a táblát, ha jogosultsági okok miatt ilyen, akkor view-t létrehozni (Oracle alatt update-elhető view is létezik) és  azokra adni megfelelő jogokat stb., de ilyet TILOS.
    Ez szembe megy mindennel, amit az adatbázisok tervezéséről tanítanak.
    Mutasd a teljes hozzászólást!
  • Nem adatot akarok tárolni hanem tök simán csak a paramétert a tábla nevébe beilleszteni, mintha az lenne a neve!

    Tényleg csak egy név helyettesítés paraméterek alapján (amit meg lehet select előtt adni).

    Azt hittem ez tök egyszerű.

    tabla105 mint tábla név ahol a 105 egy paraméter amit egyénileg adok meg
    Mutasd a teljes hozzászólást!
  • Értem, hogy mit akarsz, de amit a tábla nevébe írsz sorszám/azonosító, az ebből a szempontból  adatnak számít (régi tananyagokból rémlik olyasmi, hogy normalizálás és hasonlók,  de az már nagyon rég volt)
    Ha ez nem valami ősrégi rendszer pofozgatása, akkor javasolnám az egészet egy (az azonosító alapján partícionált) táblába tenni, az azonosítóknak létrehozhatsz egy ú.n. clustert, ami gyakorlatilag indexben tárolt mező.

    1. normĂĄlforma (1NF) - ezt érdemes átnézni

    Tökegyszerű az is, amit erőszakkal próbálsz átnyomni rajta (lásd dynamic sql és  dbms_sql package), csak a doksit kéne elolvasni, mert én már nem emlékszem a részletekre.
    És persze annál bonyolultabb, mint egy shellben a változó behelyettesítése.
    Mutasd a teljes hozzászólást!
  • Aminek talán lenne értelme, az az lenne, hogy cégenként külön sémát hozol létre, hogy pl. ceg100, ceg105, és a akkor ilyesmi lenne az unió:

    select * from ceg105.tablanev union all select * from ceg107.tablanev union all select * from ceg115.tablanev;

    Persze így is dinamikus SQL kell hozzá, természetesen.

    PS: Bár azt nem mondtad, hogy ezt Pl/Sql-ben, Pro*C-ben, Sql*Plus-ban vagy miben képzeled el.
    Mutasd a teljes hozzászólást!
  • Szóval azt szeretném elérni, hogy meghatározott paraméterlista alapján ({105,107,115})
    előálljon a selectben a tablanev105, tablanev107 és tablanev115 nevű táblám

    Néhány évvel korábban valami hasonlóval már én is találkoztam, mert hasonló volt a DB szerkezete táblanevek szempontjából, de nem volt valami szép megoldás, az biztos. :) A lényeg valami olyasmi volt, hogy volt egy Oracle tárolt, ami paraméterben megkapta a tábla postfix-eket (azok varchar-ok voltak), és valahogy össze fűzte a tábla alapneveket a postfix-ekkel, és ezt az összeállított tábla nevet be lehetett illeszteni magába a tároltban található lekérdezésbe. Azt pedig meg lehetett futtatni.
    Mutasd a teljes hozzászólást!
  • Szia.
    Valami ilyesmit kellene procedure-ba terelni:
    DECLARE v_tabla_list VARCHAR2 (1024); v_sql VARCHAR2 (1024); BEGIN v_tabla_list:= '105, 117, 133'; FOR x IN ( select TRIM(regexp_substr(v_tabla_list,'[^,]+', 1, level)) tbl_postfix from dual connect by regexp_substr(v_tabla_list, '[^,]+', 1, level) is not NULL) LOOP v_sql:= v_sql ||' select * from tablanev'||x.tbl_postfix || ' '||'UNION '; END LOOP; v_sql := SUBSTR (v_sql, 1, LENGTH(v_sql) - 6 ) || ';'; --utolsó UNION-t kivenni dbms_output.put_line (v_sql); -- ehelyett meg EXECUTE IMMEDIATE END;
    Mutasd a teljes hozzászólást!
  • Én nem piszkálnám a tábla nevét változóparaméterekkel - ehelyett ugyanezt az információt +1 mezőbe tenném a táblán belül.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd