.
FELADAT: Adva van egy forrásrendszer, amire töménytelen mennyiségű, különböző komplexitású (pl.: inline view-s) lekérdezéseket írtak eddig üzleti felhasználók. Menetközben elkészült egy adattárház és hozzá egy riporting adatpiac (aminek ez a forrásrendszer csak az egyik forrása) úgy, hogy a forrásrendszer és az adatpiac között VAN egyértelmű leképezés (séma, tábla és mező-szinten, de nyilván más nevekkel). Hogyan könnyítsük meg az üzleti felhasználók életét a riporting adatpiacra való átállásban?
LEHETŐSÉGEK (amik nekem eszembe jutnak):
I. LEHETŐSÉG: CÉLIRÁNYOS SQL-PARSE LIBRARY
(A) ANTLR
http://www.antlr.org/download.html
http://www.antlr3.org/grammar/list.html
Előnye:
- open source (free)
- van oracle nyelvtan hozzá (több is)
Hátránya:
- Kérdés mennyire követődnek le az Oracle SQL-verziók, mennyire megbízhatóan. Éles enterprise könyezetben én szívesebben alapoznék támogatott, aktuálisan követett megoldást.
(B) http://www.sqlparser.com/
Ez ugyan pénzes, de az enterprise verzió is csak 90.000 forint. Nem éppen kibírhatatlan, ha egy Oracle Total Recallt könnyedén ki tudnak csengetni.
Az Oracle-verzió csak 30.000 forint (de az IBM DB2 miatt érdemes az enterprise-ban gondolkodni.
Ez supportos, karbantartott, jó cucc, csak használni kell.
(C) Oracle-specifikus:
Előnye, hogy "ingyen" van, hátránya, hogy azért küzdeni kell vele. ;)
CREATE GLOBAL TEMPORARY TABLE plans AS
SELECT * FROM TABLE(dbms_xplan.display_cursor());
DECLARE
c NUMBER;
i VARCHAR2(30);
l NUMBER;
stmt VARCHAR2(4000);
BEGIN
DELETE FROM plans;
stmt:='SELECT z.* FROM z, skew1 WHERE z.z=skew1.fillblocks';
l:=LENGTH(stmt);
c:=dbms_sql.open_cursor();
dbms_sql.parse (c, stmt,dbms_sql.native);
SELECT DISTINCT sql_id
INTO i
FROM v$open_cursor
WHERE
sid IN
(
SELECT sid
FROM v$mystat
) AND
SUBSTR(sql_text,1,l)=SUBSTR(stmt,1,l)
;
INSERT INTO plans
SELECT *
FROM TABLE(dbms_xplan.display_cursor(i));
dbms_output.put_Line ('sql_id:'||i);
END;
(D) Egyéb idevágó okosságok, ha ennyi nem lenne elég :)
Parser for Oracle SQL
II.LEHETŐSÉG: QUERY BUILDER-ES FRONT-END
Ha nem akarunk parse-olgatni, és pláne, ha KEVÉS tábla van, akkor lehetne írni egy checkbox klikkelgető kicsi front-end alkalmazást á lá "SQL-Builder". Ez lehetne limitált vagy teljes funkcionalitású.
Kirakjuk front-endre az ÖSSZES táblát. Be lehet pipálni ki legyen a join-ban, ebből már azonnal kiesik egy működő sql. Persze a front-end alkalmazásunk az oszlop-megfeleltetésekkel is tisztában lehet könnyedén, így a szükséges érdemi felhasználói "where feltételrendszer" is bele konstruálható az output SQL-be. Order by meg könnyedén konstruálható.
Group by-having-es, uniós, hierarchikus, analitikus, etc összetett lekérdezéseket meg rakják össze a felhasználók a front-endből kinyert mozaik darabkákból (feltéve, hogy költségesebb ezt implementálni és jellemzően nem ezek fedik le a felhasználói igények perdöntő részét) .
Teljes funkcionalitás megcélzása esetén, itt is lehet külső "query builder" könyvtárat bevetni, például : Active Query Builder
Ennek a II.lehetőség komoly hátránya, hogy from scratch zöldmezősen kell az sql-eket létrehozni, nem meglévő sql-eket fordít át.
Ilyen alkalmazás szerintem helyes programozási környezete: Free Pascal/Lazarus, és nem lehet túl nagy meló.
Megjegyzés: én alapból nem szeretem a query buidereket, de ennél a topiknál muszáj volt említeni, a minél jobb teljeskörűség érdekében.
III.LEHETŐSÉG: KOPASZ STRING-CSERE, MANUÁLIS PARSE-SZAL
Limited manuális parse (pláne, ha egyszerűek az SQL-ek), stringcserével pl.: tábláknál: "SOURCE" -> "TARGET", esetleg némi case whennel megspékelve.
Tábla alias alapján select-listát módosítása, oszlop-megfeleltetés közbeiktatásával.
Kiegészítve a plusz konstans wherekkel.
Pl.: WHERE DATE '2013-09-30' BETWEEN valid_from AND valid_to
Én ezt a metódust támogatnám legkevésbé, nem véletlen, hogy a végére hagytam..Ez csak erősen limitált tudna lenni, számomra értelmetlen erőforráspocsékolás, kétes várható eredménnyel.A komolyabb hozzáadott értékű korábbi megoldások, alig kerülnek többe.
KONKLÚZIÓ (ÉN SORRENDEM)
(1) www.sqlparser.com
(2) antlr
(3) dbms sql-parse
(4) korlátozott front-end, egyszerű zöldmezős sql-konstruálásra (join-where-ig csak)
(5) teljes active query builderes megoldás
(6) limited manuális SQL-parse
2013. november 23., szombat
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése