» »

Oracle PL/SQL pomoč

Oracle PL/SQL pomoč

Camel ::

Zdravo,

Prosil bi za pomoč pri naslednjem sql-u:

select x as naziv_x,
y as naziv_y,
count(z) as naziv_z
from tabela
group by x, y

rezultat:
naziv_x naziv_y naziv_z
x1 y1 z1
x1 y2 z2
x1 y3 z3
x2 y1 z4
x2 y2 z5

Kako bi moral spisat sql, da bi dobil naslednji rezultat:

naziv_x y1 y2 y3
x1 z1 z2 z3
x2 z4 z5 /

Upam, da sem problem opisal dovolj razumljivo.

jernejl ::

Če je množica y znana (y1, y2, y3,...), potem lahko. V Oracle 11g lahko uporabiš PIVOT, ali pa narediš poizvedbo z uporabo DECODE ali UNION.
Če se množica y spreminja oz. je odvisna od podatkov, potem to v sql ni mogoče. Takšno pivotiranje se (zaradi potrebe po taki obliki prikaza) običajno naredi v aplikaciji.

Tukaj je nekaj možnih rešitev:
http://oracletuts.net/sql/three-ways-to...

Tody ::

Mogoče ti tole pride prov

http://www.techonthenet.com/oracle/func...

Camel ::

Hvala za pomoč, sem rešil s funkcijo DECODE.

LP
Dolce far niente

Nesta ::

Da ne uporabim nove teme.

Želim izvesti update na cca 10.000 vrsticah.

Imam narejene update z NimbleTextom. Problem pa je da to traja celo vecnost.

Obstaja kako loop zanka da znotraj izvedem teh 10.000 vrstic updata brez da bi se mi usu PL sql developer?

Hvala

Tody ::

10.000 vrstic niti ni tok hud.

Kaj je nimble text nevem, vprašanje je tudi kak update. Oracle pravi da če lahko uporabiš SQL potem ni hitrejše varjante kot to.

Drugače pa če poveš kak update rabiš... lažje pomagamo :)

Nesta ::

Nekaj v tem smislu:

update poslovnipartner p set p.hisna_stevilka_pk=(SELECT h.hisna_stevilka_pk FROM hisna_stevilka h where h.hisna_stevilka=0 and h.ulica_pk=(SELECT u.ulica_pk FROM ulica u where upper (u.naziv_ulice)= upper('ZADOBRAVA')
and u.naselje_pk=(SELECT n.naselje_pk FROM naselje n where upper(n.naziv_naselja)=upper('Celje')and rownum=1)) and h.hisna_stevilka_dodatek is null) where p.sifra_poslovnega_partnerja=4746 and p.lastnistvo=21;

update poslovnipartner p set p.hisna_stevilka_pk=(SELECT h.hisna_stevilka_pk FROM hisna_stevilka h where h.hisna_stevilka=1 and h.ulica_pk=(SELECT u.ulica_pk FROM ulica u where upper (u.naziv_ulice)= upper('KOROŠKA ULICA')
and u.naselje_pk=(SELECT n.naselje_pk FROM naselje n where upper(n.naziv_naselja)=upper('Slovenj Gradec')and rownum=1)) and h.hisna_stevilka_dodatek is null) where p.sifra_poslovnega_partnerja=1582 and p.lastnistvo=21;

update poslovnipartner p set p.hisna_stevilka_pk=(SELECT h.hisna_stevilka_pk FROM hisna_stevilka h where h.hisna_stevilka=1 and h.ulica_pk=(SELECT u.ulica_pk FROM ulica u where upper (u.naziv_ulice)= upper('ŠENTILJ POD TURJAKOM')
and u.naselje_pk=(SELECT n.naselje_pk FROM naselje n where upper(n.naziv_naselja)=upper('Mislinja')and rownum=1)) and h.hisna_stevilka_dodatek is null) where p.sifra_poslovnega_partnerja=158 and p.lastnistvo=21;

.
.
.
.
.

smacker ::

Če so stolpci, po katerih selectaš (tisti v WHERE pogojih) indeksirani, bi ta update moralo zmlet v minutki.

GupeM ::

Mislim, da je problem v uporabi UPPER(...) funkcije, saj ne zagrabi indexa.

Nesta ::

Traja za cca 300 updatov naenkrat da izvede cca 5 min... In poj vsake 5 min izvedem 300 updatov... Kar je precej nadlezno :( Ce izbere prevec updatov naenkrat se sesuje po dolocenem casu :(

MrStein ::

PLAN please, bi rekli eni...

Če je iskanje problem, lahko naredi index na vrednosti
 upper (u.naziv_ulice)
ter podobno za upper(n.naziv_naselja)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

OracleDev ::

Izvedi en update za vse naenkrat in je to to. Verjetno je neka skupna logika, če vse zgleda isto.

MrStein ::

Zgleda kot da ima neko tekstovno "tabelo", s spiskom kot:
sifra_poslovnega_partnerja, lastnistvo  -> hisna_stevilka, naziv_ulice, naziv_naselja


Iz podatkov ki so na voljo, bi jaz naredil takole:
- Shrani UPDATE ukaze v en fajl.
- poženi fajl z SQL*Plus
- po potrebi: Vsakih 300 vrstic dodaj vrstico : COMMIT;
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

Tody ::

ne ne to se ne dela tako :)

To se naredi pl/sql procedura.

najprej narediš cursor

declare
cursor moji_podatki is

select polje_ki_ga_rabim1, polje_ki_ga_rabim2, polje_ki_ga_rabim3, polje_ki_ga_r6abim4 from tabela where pogoji ki so skos enaki kakor vidim

begin
for r1 in moji_podatki loop
update tabelo ki jo rabiš set polje_ki_ga_updata=moji_podatki.polje_ki_ga_rabim1 where (dodatni pogoji če so potrebni);
end loop;
commit;
end;

Tole rabi max 15 min za 10.000 recordov

Zgodovina sprememb…

  • spremenil: Tody ()

MrStein ::

Tody je izjavil:

where pogoji ki so skos enaki kakor vidim

Narobe vidiš. Vedno so drugačni.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Tody ::

Seveda so vrednosti drugačne ampak pomoje se bi dal vir lepo preuredit da bi moja teorija bila tudi praksa. Unikatni ključi in podobne zadeve, tukaj je kup enih nepotrebnih sql stavkov.

MrStein ::

Performančno bi bilo verjetno najbolje podatke iz text fajla vpeti v bazo kot external table. Potem pa z enim UPDATE (ali mogoče MERGE) SQL ukazom obdelati vse.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[SQL] teževa pri iskanju zapisov

Oddelek: Programiranje
102108 (1698) lopow
»

podatkovne baze pomoč

Oddelek: Programiranje
193053 (2606) kr?en
»

[C#,SQL]

Oddelek: Programiranje
51241 (1154) JanOlMajti
»

[Oracle] Osnovno povpraševanje problem

Oddelek: Programiranje
151912 (1553) zdravc
»

problem kje v strežniku ali v SQL-u ali PHP kodi?

Oddelek: Izdelava spletišč
111138 (995) Yohan del Sud

Več podobnih tem