Insert nebo update – Oracle – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Insert nebo update – Oracle – Fórum – Programujte.comInsert nebo update – Oracle – Fórum – Programujte.com

 

peter
~ Anonymní uživatel
4014 příspěvků
9. 8. 2022   #1
-
0
-

Ahoj. V oracle se moc nevyznam, tak se snazim dat dokupy nejake reseni podle googlu.
Mam tabulku. V ni nejake hodnoty. A potrebuji do ni vlozit nove radky nebo updatovat stavajici. Ale nesmi se updatovat, pokud nenastane zmena, protoze se automaticky uklada cas aktualizace a nechci, aby se menil, kdyz neni treba data opravit.

Nasel jsem nejaka 2 reseni, ale, pac se v oraclu nevyznam, tak to mozna dela uplne neco jineho, nez se z toho pokousim dostat.
 

-- domnivam se, ze tohle asi udela insert ok, a update natvrdo, nehlede na to, zda je treba nebo ne (coz muze byt pro vetsinu aplikaci ok, ale ne pro mne)

UPSERT
  INTO DATA_WAREHOUSE.CIS_PROJEKTU_SU 
  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=900: ORA-00900: neplatný příkaz SQL

-- verze 2, kde se uplne ztraci, takze to mozna je uplne spatne

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 
(kod jsem preformatoval z jednoradkoveho zapisu, pro forum)
Nahlásit jako SPAM
IP: 2001:718:2601:258:45c0:3357:95ac:adeb...–
gna
~ Anonymní uživatel
1891 příspěvků
9. 8. 2022   #2
-
0
-

Myslím si, že ti to řve při parsovaní toho SETu kvůli závorkám kolem přiřazení. Ale nemám to kde vyzkoušet a nevím, jestli je tam Oracle dovoluje.

Pak ti to nejspíš ještě zařve za běhu, protože v `dual` neexistují ty selectované/matchované sloupce. A i pokud toto projde, tak ti to nic nevrátí a nezmerguje.

Merge funguje takhle:

dst.id
1
2

src.id
2
3

merge on id
dst src op
1       (nic)
2   2   matched then update ...
    3   not matched then insert ...

Ten "trik" s tabulkou `dual` spočívá v tom, že je v ní jeden záznam, který se bude mergovat, ale jeho obsah nás nezajímá. Zajímá nás jen cílová tabulka pro rozhodnutí, jestli to bude nebo nebude jako match:

MERGE INTO dst D
  USING dual
  ON (D.id = 'XXX')
  WHEN MATCHED THEN
    UPDATE ...
  WHEN NOT MATCHED THEN
    INSERT ...
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
10. 8. 2022   #3
-
0
-

dik, vyreseno. Vcera se mi podarilo sehnat kolegu, ktery dela s oraclem jinde. Tech problemu tam bylo vic. Vysledek je neco takoveho. Jen je treba jeste pridat u nvl s datumy prevod stringu pomoci to_date.

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

Ted uz mi ten dotaz dava vetsi smysl.
- Tam mne matlo, ze mi tam schazel ta zdrojova data, to je ten prvni SELECT.
- WHERE podminky, ze mam pridat k UPDATE jsem vcera jeste vygoogloval na jinem priklade
- ale, uz mne nenapadlo je upravit o nvl() (ale, mozna, ze by to stacilo pridat k te casti se SELECT)
- a jeste je teda treba pridat ty konverze string-datum na to_date() u UPDATU

Podle vseho to asi ted funguje tak, jak by asi melo. Nicmene, mozna to budeme delat uplne jinak. Udelame pomocnou tabulku, do ktere nasoukame vsechna data z mysql a pak je pomoci jednodussiho merge updatujene do te druhe, kde hlidame datumy. Tam je hlavne podstatne, aby do externiho systemu neslo prilis dat, kdyz nemusi. Jinak bychom to tam posilali cele. A tez bude mit kolega vetsi kontrolu nad tim, co jde do toho externiho programu. Pac do mych php nevidi, ale do db ma pristup a umi si to opravit podle potreby.

Ta chyba mohla byt temi apostrofy, ozavorkovanim nebo kolega jeste narazil na limit delky pole NAZEV, tak jej rozsiril. No, po jeho opravach ten dotaz zatim nehlasi zadne chyby, tak snad to pobezi, az se to spusti naostro :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:743e:808b:5d17:2d47...–
peter
~ Anonymní uživatel
4014 příspěvků
10. 8. 2022   #4
-
0
-

Tech zavorek jsem tam mel vic, protoze jsem tam puvodne chtel natlacit vsechny radky. Ale, proste, tak, jak jsem to mel, tak to resit neslo. Jak pises, musim tam mit radek u toho SELECT. Ktery jsem tam cpal sice z dual nebo dest nebo, jak to funguje, ale bylo mi zahadou, ze si veme nekde potom ta data do hornich radku.Proste, jak to popisujes, a jak mi to predelal kolega, tak je mi to uz jasne a nejspis bych to dokazal pak uz dosestavit i sam :)
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:743e:808b:5d17:2d47...–
gna
~ Anonymní uživatel
1891 příspěvků
10. 8. 2022   #5
-
0
-

V insert-values taky můžeš použít tu zdrojovou tabulku a nemusíš ty hodnoty uvádět dvakrát.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
10. 8. 2022   #6
-
0
-

jo, no. Napadlo mne to. Ale nechtelo se mi experimontovat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:743e:808b:5d17:2d47...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý