Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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 :.(

Předmět Autor Datum
Musis dodrzet poradi: SELECT neco FROM odnekud
Jan Fiala 03.10.2006 15:13
Jan Fiala
No dyť to je dodržený: SELECT milión sloupců FROM kopa tabulek a jejich spojení... Navíc v ostatních…
Anicka 03.10.2006 15:30
Anicka
Kde to mas dodrzeno ? (((SELECT GU2C LEFT JOIN...
Jan Fiala 03.10.2006 15:49
Jan Fiala
I když tam to select dopíšu, tak to hodí tu další chybu, co tam píšu. Navíc teď jsem zjistila, že z…
Anicka 03.10.2006 16:48
Anicka
no na taketo zvrhe selecty ktore su naviac tazko portovatelne medzi databazami by sa dali vyuzit sto…
emem 03.10.2006 19:04
emem
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…
Anicka 03.10.2006 19:57
Anicka
Nešlo by použít na práci s tabulkami nějaký ORM framework (Hibernate, OJB apod.)? Pak bude stačit zm… poslední
stepa 05.10.2006 16:18
stepa

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ě

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):

SELECT GU2C.CPID, 
       GU2C.VALIDFROM, 
       GU2C.VALIDTO 
FROM GU2C, ENROLLMENTS
WHERE (GU2C.USRID = 2) AND (GU2C.CPID IN (4, 3) AND 
       GU2C.CPID = ENROLLMENTS.CPID(+))

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í (+) :.(

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:

... LEFT JOIN NOMINATION AS N ON (N.CPID = GU2C.CPID AND N.USRID = ?)) 
    LEFT JOIN TERMS AS TM ON (N.TERMID = TM.TERMID)

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.

Zpět do poradny Odpovědět na původní otázku Nahoru