» »

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

bedak ::

Dokumentacija s tem primerom

en END LOOP; imaš premalo

a se ti to skompajla?

killa bee ::

Ubistvu bi rad da loopa po cursorju in po arraju? Je to sploh možno?

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;

WizzardOfOZ ::

2x imaš loop, end loop pa samo enkrat

begin for loop1 loop2 end-loop2 end-begin

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 ::

Bom isprobal pa povem če dela.

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

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

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.

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
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:
(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!

killa bee ::

to pa deluje, samo mi je pa čudno da se štetje za array začne pri 1.


Vredno ogleda ...

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

oracle 12 identity (the old way)

Oddelek: Programiranje
6977 (782) detroit
»

SQL Parent key not found

Oddelek: Programiranje
7967 (890) Ciklamen
»

[ORACLE][Novinec]Resitev napake PLS-00428

Oddelek: Programiranje
5638 (548) smejko
»

SQL stavek?

Oddelek: Programiranje
7925 (830) milc
»

sql-t stored procedure

Oddelek: Programiranje
10990 (857) detroit

Več podobnih tem