Oracle
Mám aplikaci v javě, obsahující DB dotazy. Aplikace bohužel musí fungovat na různých DB (MS SQL, ACCESS, Oracle, MySQL...) a dotazy by tedy měly být napsané univerzálně tak, aby fungovaly když ne všude, tak alespoň ve výše uvedených DB. Následující dotaz mi však v Oracle nefunguje :
SELECT GU2C.CPID AS CPID,
E.CPID AS ECPID,
E.EID AS EID,
E.TOTALSTUDYTIME AS STUDY_LENGTH,
E.ABSOLVED AS STATUS,
E.ENDLEARN AS ABSOLVATION_DATE,
TR.TID AS TID,
TR.ATTEMPT AS ATTEMPT,
TR.SCORE AS RESULT,
TR.MINSCORE AS MINSCORE,
TR.MAXSCORE AS MAXSCORE,
TR.CREATED AS DATE_WHEN_ABSOLVATED_TEST,
E.TIME_IN_COURSE AS TIME_IN_COURSE,
E.LAST_OPENED AS LAST_OPENED,
E.PRINTCOUNT AS PRINTCOUNT,
E.LASTPRINT AS LASTPRINT,
GU2C.VALIDFROM AS VALIDFROM,
GU2C.VALIDTO AS VALIDTO
FROM (((GU2C LEFT JOIN ENROLLMENTS AS E ON
(E.CPID = GU2C.CPID AND E.USRID = ?)) LEFT JOIN
TESTRESULTS AS TR ON (E.CPID = TR.CPID AND E.USRID = TR.USRID)) LEFT JOIN
NOMINATION AS N ON (N.CPID = GU2C.CPID AND N.USRID = ?)) LEFT JOIN
TERMS AS TM ON (N.TERMID = TM.TERMID)
WHERE (GU2C.USRID = 2) AND (GU2C.CPID IN (4, 3))
Oracle vypíše:
...FROM (((GU2C ...
*
ERROR na řádku 17:
ORA-00928: missing SELECT keyword
Když mu tam to vytoužené SELECT dopíšu, tak začne řvát o kousíček dál:
...FROM (((SELECT GU2C LEFT JOIN...
*
ERROR na řádku 17:
ORA-00923: FROM keyword not found where expected
Poraďte prosím co s tím
Musis dodrzet poradi:
SELECT neco FROM odnekud
No dyť to je dodržený: SELECT milión sloupců FROM kopa tabulek a jejich spojení... Navíc v ostatních DB to funguje, jen v Oraclu ne
A protože všechny ty tabulky mohou obsahovat fůru záznamů (řádově desetitisíce), tak by dotaz měl být napsán tak, abych se výsledku dočkala v rozumné době
Kde to mas dodrzeno ?
I když tam to select dopíšu, tak to hodí tu další chybu, co tam píšu.
Navíc teď jsem zjistila, že zákazníkův Oracle vůbec LEFT JOIN ani LEFT OUTER JOIN nezná, ale zná jen tuto syntaxi (zjednodušená verze dotazu):
Průšvih je v tom (+), protože to zas neznaj ostatní DB
Takže nezbývá než to rozsekat do x jednodušších dotazů a ty pak v javě pospojovat dohromady anebo pro zákazníka napsat extra třídu, ve které se mu ty dotazy přepíšou pomocí (+)
no na taketo zvrhe selecty ktore su naviac tazko
portovatelne medzi databazami by sa dali vyuzit storovane procedury..
pripadne by bolo mozne zvazit v aplikacii pouzitie nejakeho
persistencneho frameworku, napriklad Hibernate.
Aha, že by jako v každé DB byla stored procedura napsaná na míru oné DB a v javě by se jen volaly ty procedury? Ale jsme zas u problému, že se mi nechce vymýšlet jak jednu věc napsat x různými způsoby pro x DB...
Snažím se přijít na to jaký smysl vlastně mají poslední 2 řádky v klauzuli FROM:
když se žádné sloupce z NOMINATION ani TERMS neselektují (dotaz není moje dílo, já ho mám "jen" rozchodit i v Oraclu). Běz těch posledních dvou řádků bych to dokázala přepsat do plusové notace Oraclu, ale s nimi ne a musela bych vymýšlet úplně jiné dotazy
Nešlo by použít na práci s tabulkami nějaký ORM framework (Hibernate, OJB apod.)? Pak bude stačit změnit driver pro databázi. Jinak optimalizovat dotazy pro "všechny" databáze je blbost, většinou zákazník používá nějakou konkrétní platformu které to přizpůsobíš. Výjimkou může být nějaký "balíkový" soft, ale tam by nemělo být problém vytvořit lokalizace pro danou databázi... má Oracle, dobře dostane lokalizaci A, má PostgreSQL, pak dostane lokalizaci B.
V každém případě bych ale zvážil ORM, logika bude v aplikační vrstvě a je jedno jakou zákazník používá databázi, protože se změní jen driver.