Forum » Programiranje » PL SQL problem
PL SQL problem
killa bee ::
Zanima me zakaj ta sql ni praviln in kako jo popravim?
Declare sequenceValue Number; type old_value is table of varchar2(50); var_table_varchar_old_value old_value; cursor c1 is SELECT * FROM EMPLOYEES; BEGIN var_table_varchar_old_value := old_value('22090', '23438', '30755', '34235'); FOR field_id_rec in c1 FOR elem in 1 .. var_table_varchar_old_value.count loop LOOP select HISTORY_ID_SEQ.NEXTVAL into sequenceValue from dual; // do something END LOOP; END;
- spremenilo: killa bee ()
killa bee ::
Ubistvu bi rad da loopa po cursorju in po arraju? Je to sploh možno?
Sepravi nekaj takega:
Sepravi nekaj takega:
Declare sequenceValue Number; type old_value is table of varchar2(50); var_table_varchar_old_value old_value; cursor c1 is SELECT * FROM EMPLOYEES; BEGIN var_table_varchar_old_value := old_value('22090', '23438', '30755', '34235'); FOR field_id_rec in c1 AND elem in 1 .. var_table_varchar_old_value.count loop ??? LOOP select HISTORY_ID_SEQ.NEXTVAL into sequenceValue from dual; // do something END LOOP; END;
bedak ::
...
DECLARE sequenceValue Number; type old_value is table of varchar2(50); var_table_varchar_old_value old_value; cursor c1 is SELECT * FROM EMPLOYEES; BEGIN var_table_varchar_old_value := old_value('22090', '23438', '30755', '34235'); FOR x in c1 LOOP FOR e in var_table_varchar_old_value.FIRST .. var_table_varchar_old_value.LAST LOOP dbms_output.put_line(var_table_varchar_old_value(e)); END LOOP; END LOOP; END;
killa bee ::
ja samo ta je narobe ker bo ustvaril 4 vnose namesto 2eh.
Za vsak row it kursorja bo šel 2x.
Jst bi rad da gre za vsak row iz kursorja 1x in da vzame vrednost iz array-a
4x bo šel skozi, 2 krat za kursor pa 2x za notranji loop namest da bi šel skozi samo 2x
Za vsak row it kursorja bo šel 2x.
Jst bi rad da gre za vsak row iz kursorja 1x in da vzame vrednost iz array-a
4x bo šel skozi, 2 krat za kursor pa 2x za notranji loop namest da bi šel skozi samo 2x
Zgodovina sprememb…
- spremenilo: killa bee ()
OracleDev ::
Pišeš o številkah, ki ne grejo skozi če gledamo tvojo kodo, 2x za kursor in 2x za notranji loop???. Cursor ne vemo kolk ima zapisov (niti nas ne zanima), array imaš pa velikosti 4. Povej bolj točno kaj bi rad, tudi iz kode nam ni jasno kaj naj bi naredila.
killa bee ::
sql od cursorja vrne 2 rowa, imamo 2 elementa v arrayu.
Če bi bil insert znotraj notranjega for lopa bi to rezultiralo v 4 inserte. Jst bi pa rad da se insertata 2 row-a.
Torej se rabi samo en FOR in še ta mora imeti pogoj(nekaj takega):
Je sedaj jasno kaj hočem doseč?
Če bi bil insert znotraj notranjega for lopa bi to rezultiralo v 4 inserte. Jst bi pa rad da se insertata 2 row-a.
Torej se rabi samo en FOR in še ta mora imeti pogoj(nekaj takega):
FOR x in c1 AND e in var_table_varchar_old_value.FIRST .. var_table_varchar_old_value.LAST LOOP
Je sedaj jasno kaj hočem doseč?
Zgodovina sprememb…
- spremenilo: killa bee ()
killa bee ::
Sepravi rabim FOR ki bo tekel po vrednostih od cursorja IN po vseh vrednostih iz array-a.
In ne rabim še enega nestanega FOR-a.
In ne rabim še enega nestanega FOR-a.
Zgodovina sprememb…
- spremenilo: killa bee ()
killa bee ::
aha šele zdj vidim da sem se zmotil.
Da se popravim recimo da select s cursorjem vrne 4 row-e in da imamo 4 elemente v arrayu.
Če imamo tak FOR
In recimo da imamo znotraj FOR-a insert statement v katerega dajemo hkrati vrednosti iz kursorja in arraya. In to se vstavlja v bazo.
Problem je da ne vem kako bi naredil tak FOR da bi to delalo.
Koda ki jo je prej bedak predlagal ne deluje pravilno.
Da se popravim recimo da select s cursorjem vrne 4 row-e in da imamo 4 elemente v arrayu.
Če imamo tak FOR
FOR x in c1 AND e in var_table_varchar_old_value.FIRST .. var_table_varchar_old_value.LAST LOOP
In recimo da imamo znotraj FOR-a insert statement v katerega dajemo hkrati vrednosti iz kursorja in arraya. In to se vstavlja v bazo.
Problem je da ne vem kako bi naredil tak FOR da bi to delalo.
Koda ki jo je prej bedak predlagal ne deluje pravilno.
Zgodovina sprememb…
- spremenilo: killa bee ()
OracleDev ::
glede na to kaj hočeš dosežt predvidevam da ne rabiš podatkov iz cursorja ampak te zanima samo count. Zato enostavno preštej zapise, poglej kolk je var_table_varchar_old_value.count in naredi loop čez vsoto tega (FOR field_id_rec in 1..stevilo_zapisov_tabele + var_table_varchar_old_value.count LOOP)
killa bee ::
rabim podatke iz kursorja in hkrati podatke iz array-a v istem FOR loop-u
Torej to ni pravilno:
Torej to ni pravilno:
(FOR field_id_rec in 1..stevilo_zapisov_tabele + var_table_varchar_old_value.count LOOP)
Zgodovina sprememb…
- spremenilo: killa bee ()
OracleDev ::
Še vedno čisto ne razumem ampak ok. A ti to kaj pomaga? Bo crknlo seveda če bo število zapisov v cursorju drugačno od število zapisov v arrayu. To morš še doddatno preverjat...
Declare sequenceValue Number; type old_value is table of varchar2(50); var_table_varchar_old_value old_value; x number := 1; cursor c1 is SELECT * FROM EMPLOYEES; BEGIN var_table_varchar_old_value := old_value('22090', '23438', '30755', '34235'); FOR field_id_rec in c1 LOOP -- tako dobiš prvo vrednost iz arraya in z vsakim loopom naslednjo. Vse podatke cursorja pa tudi imaš v loopu dbms_output.put_line(var_table_varchar_old_value(x)); x := x +1; END LOOP; END;
MrStein ::
Za CURSOR C1 stavek je najbrž smiselno dodati ORDER BY, da ne bo na random uparjal podatke. (odvisno od problema, just saying)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1067 (872) | detroit |
» | SQL Parent key not foundOddelek: Programiranje | 1071 (994) | Ciklamen |
» | [ORACLE][Novinec]Resitev napake PLS-00428Oddelek: Programiranje | 719 (629) | smejko |
» | SQL stavek?Oddelek: Programiranje | 994 (899) | milc |
» | sql-t stored procedureOddelek: Programiranje | 1065 (932) | detroit |