[ GORSHTAK @ 26.05.2011. 21:00 ] @
Cilj mi je da rezultat kursora, a na kraju i neki update, odradim pomoću nekog niza (type) pošto verujem da će se tako brže izvršiti nego da obrađujem podatak jedan po jedan i tako svaki put otvaram i zatvaram kursor.

Code:

create or replace procedure proc_test is 
    type t_loc is table of varchar2(30);
    lt_loc t_loc;

    -- Cilj mi je da izvedem ovako nesto
    cursor cr1 (cp_tab in t_loc) is  
        select *
        from tabela
        where id in cp_tab;   
    r1 cr1%rowtype;
    
    --  Kursor koji sada koristim
    cursor cr2 (cp_id in number) is 
        select *
        from tabela
        where id = cp_id;  
    r2 cr2%rowtype;

begin
    lt_loc := new t_loc();

/*
 Ovde formiram sadrzaj u lt_loc
*/

    for r1 in cr1(lt_loc) loop
     ---   NESTO RADIM SA RECORDIMA
    end loop;
    
    --  Na kraju mi je cilj ovako nesto
    update tabela
      set kolona1 = 'neki podatak'
      where id in lt_loc;
    
end proc_test;


Da li je izvodljivo ovako nešto?
[ darkosos @ 27.05.2011. 07:51 ] @
Trebalo bi da moze sa FORALL. Evo ti primer iz PL/SQL reference-a:
Code:

CREATE TABLE employees_temp AS SELECT * FROM employees;
DECLARE
   TYPE NumList IS VARRAY(10) OF NUMBER;
   depts NumList := NumList(5,10,20,30,50,55,57,60,70,75);
BEGIN
   FORALL j IN 4..7  -- use only part of varray
      DELETE FROM employees_temp WHERE department_id = depts(j);
   COMMIT;
END;
/

Using the FORALL statement
[ brzak @ 27.05.2011. 08:17 ] @
Probaj ovako nesto:

create or replace TYPE t_loc aS TABLE OF VARCHAR2 (30);

---

DECLARE
-- TYPE t_loc IS TABLE OF VARCHAR2 (30);

lt_loc t_loc;

-- Cilj mi je da izvedem ovako nesto
cursor cr1 (
cp_tab IN t_loc
)
IS
SELECT *
FROM tabela
WHERE ID IN (select * from TABLE (CAST (cp_tab AS t_loc)));

r1 cr1%ROWTYPE;

-- Kursor koji sada koristim
/* CURSOR cr2 (
cp_id IN NUMBER
)
IS
SELECT *
FROM tabela
WHERE ID = cp_id;

r2 cr2%ROWTYPE;*/
BEGIN
lt_loc := new t_loc();

/*

Ovde formiram sadrzaj u lt_loc

*/
FOR r1 IN cr1 (lt_loc)
LOOP
--- NESTO RADIM SA RECORDIMA
END LOOP;


-- Na kraju mi je cilj ovako nesto
UPDATE tabela
SET kolona1 = 'neki podatak'
WHERE ID IN (select * from TABLE (CAST (lt_loc AS t_loc)));
END;


[ brzak @ 27.05.2011. 08:58 ] @
Mozda ne mora cast, samo select * from TABLE (lt_loc )
[ GORSHTAK @ 27.05.2011. 21:14 ] @
Citat:
brzak: Probaj ovako nesto:
create or replace TYPE t_loc aS TABLE OF VARCHAR2 (30);


Više bih hteo da izbegnem kreiranje tipa, ali ako nemam drugog izbora, onda nema veze, niz stringova može i kasnije da posluži na nešto.

varray... moram unapred da definišem neki niz, a ne znam koliko podataka mogu da dobijem za obradu...
forall i depts(j) imam osećaj kao da radi jedan po jedan, ko zna možda i jeste brže.

Svejedno, u toku sledeće nedelje ću moći da testiram, pa javljam da li je ubrzalo...
Hvala na odgovorima
[ GORSHTAK @ 03.06.2011. 21:21 ] @
Uradio sam test, izvršilo se 5x brže nego da otvaram i zatvaram kursore.
Još ako postoji način bez kreiranja tipa, neka mi neko javi :)
Hvala