Nem tudom mi lenne a végleges kimenete, célja a lekérdezésnek, de ha maradnia kell ilyen struktúrában akkor lehetne egy függvényben vagy proc-ban megoldani:
create or replace function teszt_001(p_function_param_oszlop varchar2, p_function_param_felt varchar2) return number is
-- ...
l_sqlf := 'create or replace view user.tmp as '; l_sql := 'SELECT azonos_oszlop_1, azonos_oszlop_2, ' || p_function_param_oszlop || ' param_op, azonos_számítási_művelet FROM azonos_tábla WHERE ' || p_function_param_felt || ' AND azonos_feltétel GROUP BY azonos_oszlop_1';
FROM azonos_tábla WHERE (VÁLTOZÓ FELTÉTEL1 or VÁLTOZÓ FELTÉTEL2 or VÁLTOZÓ FELTÉTEL3)
AND azonos_feltétel GROUP BY azonos_oszlop_1;
az OR miatt meglesz mind a harom feltetelnek megfelelo sorod, a CASE miatt mindegyikben a megfelelo oszlop lesz a harmadik.
az az egy lehet problema, hogy ha az eredeti queryben a harom blokk adhatott azonos sorokat, akkor azok megjelentek tobbszorosen az UNION ALL miatt, a fenti query viszont csak egyszer fogja hozni oket es nem is tudod egyszeruen megoldani hogy tobbszor hozza. persze altalaban a VALTOZO FELTETEL tartalmazni szokja az AZONOS_OSZLOPok valamelyiket, ezert ez nem tortenet.
raadasul az a szuper valtozo feltetel az altalaban olyan, hogy az az OR-os logikai kifejezes eleg komolyan egyszerusitheto. lattam mar olyat hogy a szuper harom tagu UNION_ALL az kb az volt hogy az elso hozta a multbeli rekordokat, a kozepso a maiakat a harmadik meg jovobelieket, szoval vegul pont az osszes rekord kellett.
a case-t ismerem, de azzal ismét ugyanolyan kesze kusza lenne a kód.
épp ilyesmire - ismétlődő műveletek futtatására/számítására lenne való a függvény, illetve cursor az ismereteim szerint. (meg egyáltalán így lenne 'szép' és logikus..)
Az előbbi kódrészlet háromszorosan ismétlődik az ominózus view-ban..
Ötletet, tanácsot, útbaigazítást szeretnék kérni a következő dologgal kapcsolatban:
adott egy view, ami favágó módon az alábbi - két eltérő elem kivételével többszörösen, sok helyen ugyanazt a szerkezetet tartalmazza: (ez csak egy részlete aview-nak)
SELECT azonos_oszlop_1,
azonos_oszlop_2,
VÁLTOZÓ_OSZLOP,
azonos_számítási_művelet
FROM azonos_tábla WHERE VÁLTOZÓ FELTÉTEL
AND azonos_feltétel GROUP BY azonos_oszlop_1
UNION ALL
SELECT azonos_oszlop_1,
azonos_oszlop_2,
VÁLTOZÓ_OSZLOP,
azonos_számítási_művelet
FROM azonos_tábla WHERE VÁLTOZÓ FELTÉTEL
AND azonos_feltétel GROUP BY azonos_oszlop_1
UNION ALL
SELECT azonos_oszlop_1,
azonos_oszlop_2,
VÁLTOZÓ_OSZLOP,
azonos_számítási_művelet
FROM azonos_tábla WHERE VÁLTOZÓ FELTÉTEL
AND azonos_feltétel GROUP BY azonos_oszlop_1
A kérdés az, hogy függvény alkalmazásával megoldható lenne, hogy a függvény bemenő paraméterei legyenek pl változóba téve VÁLTOZÓ_OSZLOP és VÁLTOZÓ_FELTÉTEL?
A trunc(sysdate)-t nem kell "előre" végrehajtani, csak a execute immediate során, ezért a
... vusazon || ',' ||TRUNC(SYSDATE) || ',' || :P6_XVEVO2 ... helyett a ... vusazon || ',TRUNC(SYSDATE),' || :P6_XVEVO2 ... lesz jó.
Az execute immediate-ben futtatott string így néz ki: INSERT INTO EU_MEGR_B02 (meboazon,meusazon,mefelvdate,meveazon,meteazon,memenny) VALUES (1,2,TRUNC(SYSDATE),3,4,5)
Ezt asszem megfejtettem. Ezzel az a helyzet, hogy itt a trunc az idezojelen kivul van. Egyreszt emiatt szimpla karom kell a dd-hez. De pluszban igy az tortenik, hogy eloall a levagott datum, az stringge alakul az nls beallitasoknak megfeleloen, es ez a string konkatenalodik be az insert statement-be. Nem lesz korulotte karom, es egyebkent sem egeszseges implicit string-datum konverziora kenyszerinteni az insertet.
Ez jo kell legyen:
sql:='insert into table t (datum_mezo) values (trunc(sysdate))';
Ez is, de ilyet nem irnek:
sql:='insert into table t (datum_mezo) values ('''||trunc(sysdate))||'''';
page paraméterek. a lapon vannak input mezők, amik jó sok réteg után a logikának megírt pl/sql-ben így hivatkozhatóak. külön vicces hogy van vagy 4 féle szintaxis amivel hivatkozni lehet, van ahol így van ahol úgy.
Most kellene átmenni a p***.hu-ra, mert a formázatlan HTML-ben nem lehet forráskódot átlátni... (mondjuk én már ott elakadtam, hogy nem tudom, mi az az APEX; ha mondjuk Pro*C vagy OCI lenne, talán tudnék mondani valamit)
szerintem macskakorombe irtad a DD-t. a peldaban az nem macskakorom, hanem ketto darab aposztrof. oracle-ban a string az aposztrofban van: 'alma' . ha a stringbe akarsz aposztrofot irni, akkor ugy kell escapeelni hogy duplan irod. 'a gyors munka erdekeben brazil ''gepsort'' alkalmaztunk'
ORA-06550: line 17, column 64: PLS-00103: Encountered the symbol "DD" when expecting one of the following: ) , * & = - + < / > at in is mod remainder not rem=> <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol ", was inserted before "DD" to continue.
CREATE OR REPLACE TRIGGER "BI_EU_MEGR_B02" before insert on "EU_MEGR_B02" for each row begin if :NEW."MEAZON" is null then select "EU_MEGR_B02_SEQ".nextval into :NEW."MEAZON" from sys.dual; end if; end;