NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: oracle update, kdyz neexistuje, jinak insert

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.8.2022 13:43

Ahoj. Uz jsem se asi jednou ptal, jak se to resi v oraclu, kdyz chci neco updatovat (php/oracle). No, je tu dalsi problem.

Ten dotaz na update by mel byt tento:

MERGE INTO $table_oracle dest
  USING (SELECT $uniq_value_oracle AS $uniq_key_oracle FROM dual) src
     ON (dest.$uniq_key_oracle=src.$uniq_key_oracle)
 WHEN NOT MATCHED THEN
   INSERT (" . implode(", ", $keys) . ")
     VALUES ".implode(", ", $values_insert)."
 WHEN MATCHED THEN
   UPDATE SET " . implode(", ", $values_update) . "

No, ja to potrebuji rozsirit o podminky takove, ze proved update navic jen, pokud je nektery ze sloupcu odlisny. cili, neco jako

WHEN MATCHED AND
   soupec.src.NAZEV!==soupec_dest.NAZEV
   ....
        UPDATE SET " . implode(", ", $values_update) . "

Nazvy sloupcu jsou tyto:

'ID',
'CIS_PROJEKTU',
'NAZEV_KRATKY',
'NAZEV',
'URL',
'DAT_ZAHAJENI',
'DAT_UKONCENI'

S oracle nemam moc zkusenosti a uz se ztracim v tom, co presne dela tento dotaz. On snad nejak naklonuje sloupec, naplni ho daty z meho pole a pak nejak porovnava.
Mohl by jste se mi na to nekdo podivat?
Muzu poslat i kompletni sql dotaz, bez tes php $, jestli je to nutne.
Ja to samozrejme muzu nejak poresit pres php, oracle-select, ale rikal jsem si, ze by to mohlo jit elegantne pres sql dotaz. Ale, ty oraclove konstrukce mimo jednoduchy select, insert, update, jsou desne neprehledne.

Zkusil jsem: nic, teprve jsem v rozjimani

Chci docílit: .

 
Odpovědět
8.8.2022 13:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.8.2022 13:57

kdyz to rozvedu, tak muj tip je, ze by to mohlo fungovat s touto upravou. Ale nechci na vicemene ostre db zkouset jakesi radoby pokusne reseni, protoze pri kazdem updatu to bude delat update nebo nic. Hlavne pri opakovani to bude delat nic. A z toho nepoznam, zda je to ok nebo ne :)

WHEN MATCHED AND
   src.CIS_PROJEKTU<>dest.CIS_PROJEKTU AND
   src.NAZEV_KRATKY<>dest.NAZEV_KRATKY AND
   src.NAZEV<>dest.NAZEV AND
   src.URL<>dest.URL AND
   src.DAT_ZAHAJENI<>dest.DAT_ZAHAJENI AND
   src.DAT_UKONCENI<>dest.DAT_UKONCENI
   THEN
        UPDATE SET " . implode(", ", $values_update) . "
 
Nahoru Odpovědět
8.8.2022 13:57
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.8.2022 14:56

Asi jsem nasel reseni na strance
https://www.oracletutorial.com/…racle-merge/

MERGE INTO member_staging x
USING (SELECT member_id, first_name, last_name, rank FROM members) y
ON (x.member_id  = y.member_id)
WHEN MATCHED THEN
    UPDATE SET x.first_name = y.first_name,
                        x.last_name = y.last_name,
                        x.rank = y.rank
    WHERE x.first_name <> y.first_name OR -- tuto cast jsem tam chtel pridat
           x.last_name <> y.last_name OR          --
           x.rank <> y.rank                                      --
WHEN NOT MATCHED THEN
    INSERT(x.member_id, x.first_name, x.last_name, x.rank)
    VALUES(y.member_id, y.first_name, y.last_name, y.rank);
 
Nahoru Odpovědět
8.8.2022 14:56
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.8.2022 10:01

tak, asi s tim precijen potrebuji poradit, jeste :)

MERGE INTO DATA_WAREHOUSE.CIS_PROJEKTU_SU dest USING (SELECT ID, CIS_PROJEKTU, NAZEV_KRATKY, NAZEV, URL, DAT_ZAHAJENI, DAT_UKONCENI FROM dual) src ON (dest.ID=src.ID) WHEN MATCHED THEN UPDATE SET (CIS_PROJEKTU='2020-1', NAZEV_KRATKY='House and Work', NAZEV='House and Work', URL='https://projekty.slu.cz/evid3_app.php?what=form_export2&do=export_is2_view&idform_export2=102', DAT_ZAHAJENI='2021-09-01', DAT_UKONCENI='2024-01-31') WHERE src.CIS_PROJEKTU<>dest.CIS_PROJEKTU OR src.NAZEV_KRATKY<>dest.NAZEV_KRATKY OR src.NAZEV<>dest.NAZEV OR src.URL<>dest.URL OR src.DAT_ZAHAJENI<>dest.DAT_ZAHAJENI OR src.DAT_UKONCENI<>dest.DAT_UKONCENI WHEN NOT MATCHED THEN INSERT (ID, CIS_PROJEKTU, NAZEV_KRATKY, NAZEV, URL, DAT_ZAHAJENI, DAT_UKONCENI) VALUES (('102', '2020-1', 'House and Work', 'House and Work', 'https://projekty.slu.cz/evid3_app.php?what=form_export2&do=export_is2_view&idform_export2=102', '2021-09-01', '2024-01-31'))

 line=318 code=1747: ORA-01747: neplatná specifikace uživatel.tabulka.sloupec, tabulka.sloupec nebo sloupec

Tak ted nevim, kde a proc je problem. DATA_WAREHOUSE.CIS_PROJEKTU_SU tento zapis pro tabulku pouzivam pro select a ten mi data vypise. Ale, treba je chyba v jinem zapise, jinde.

 
Nahoru Odpovědět
9.8.2022 10:01
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.8.2022 15:56

Ha, tak uz se mi podarilo chytit kolegu pres oracle.
Cely ten dotaz musi byt jinak preskladany a navic tam musi byt nvl()
A navic je treba ty defaul datumy u nvl prevest pres to_date - to si tam kdyztak doplnne, neni to v tohle kodu jeste pridane.

MERGE INTO DATA_WAREHOUSE.CIS_PROJEKTU_SU dest USING (SELECT '152' AS
ID, '21-04364S' AS CIS_PROJEKTU, 'Civilistní tendence v české
meziválečné hudební kultuře' AS NAZEV_KRATKY, 'Civilistní tendence v
české meziválečné hudební kultuře' AS NAZEV,
'https://projekty.slu.cz/evid3_app.php?what=form_export2&do=export_is2_view&idform_export2=152'
AS URL, to_date ('2021-01-01', 'RRRR-MM-DD') AS DAT_ZAHAJENI, to_date
('2023-12-31', 'RRRR-MM-DD') AS DAT_UKONCENI FROM dual) src ON
(dest.ID=src.ID) WHEN MATCHED THEN UPDATE SET
CIS_PROJEKTU=src.CIS_PROJEKTU, NAZEV_KRATKY=src.NAZEV_KRATKY,
NAZEV=src.NAZEV, URL=src.URL, DAT_ZAHAJENI=src.DAT_ZAHAJENI,
DAT_UKONCENI=src.DAT_UKONCENI WHERE nvl (src.CIS_PROJEKTU, '0') <> nvl
(dest.CIS_PROJEKTU, '0') OR nvl (src.NAZEV_KRATKY, 'nevyplněno') <> nvl
(dest.NAZEV_KRATKY, 'nevyplněno') OR nvl (src.NAZEV, 'nevyplněno') <>
nvl (dest.NAZEV, 'nevyplněno') OR nvl (src.URL, '0') <> nvl (dest.URL,
'0') OR nvl (src.DAT_ZAHAJENI, '01.01.2100') <> nvl (dest.DAT_ZAHAJENI,
'01.01.2100') OR nvl (src.DAT_UKONCENI, '01.01.2100') <> nvl
(dest.DAT_UKONCENI, '01.01.2100') WHEN NOT MATCHED THEN INSERT (ID,
CIS_PROJEKTU, NAZEV_KRATKY, NAZEV, URL, DAT_ZAHAJENI, DAT_UKONCENI)
VALUES ('152', '21-04364S', 'Civilistní tendence v české meziválečné
hudební kultuře', 'Civilistní tendence v české meziválečné hudební
kultuře',
'https://projekty.slu.cz/evid3_app.php?what=form_export2&do=export_is2_view&idform_export2=152',
to_date ('2021-01-01', 'RRRR-MM-DD'), to_date ('2023-12-31', 'RRRR-MM-DD'))
 
Nahoru Odpovědět
9.8.2022 15:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.