PDA

View Full Version : [PL/SQL] Matrice VARCHAR2


trallallero
06-03-2007, 16:04
Ho fatto una procedura che prende a blocchi di n records alla volta
dove n é passato come parametro e per adesso stampa a video.
Dovrei invece copiare i valori ottenuti in una matrice passata sempre
come parametro. Si puó ?


SET SERVEROUTPUT ON SIZE 1000000

CREATE OR REPLACE PROCEDURE MY_PROC( n IN number )
AS
c NUMBER;
d NUMBER;
n_tab DBMS_SQL.varchar2_Table;
indx NUMBER := 1;

BEGIN

c := DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(c, 'select distinct SS from MY_TABLE order by SS', 1);

DBMS_SQL.DEFINE_ARRAY(c, 1, n_tab, n, indx);

d := DBMS_SQL.EXECUTE(c);

LOOP
d := DBMS_SQL.FETCH_ROWS(c);

DBMS_SQL.COLUMN_VALUE(c, 1, n_tab);

FOR i in n_tab.FIRST .. n_tab.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(n_tab(i));
-- QUI ANDREBBERO COPIATI I VALORI IN MATRICE
END LOOP;

EXIT WHEN d != n;
END LOOP;

DBMS_SQL.CLOSE_CURSOR(c);

EXCEPTION
WHEN OTHERS THEN
IF dbms_sql.is_open(c) THEN
DBMS_SQL.CLOSE_CURSOR(c);
END IF;
END;
/


grazie :)

trallallero
06-03-2007, 16:45
trovato:
TYPE NUM_ARRAY IS TABLE OF VARCHAR2(n);

shinya
06-03-2007, 16:53
trovato:
TYPE NUM_ARRAY IS TABLE OF VARCHAR2(n);

Così non è una matrice. O meglio, è una matrice 1xN di varchar2(n).

Così a occhio eh...però forse non ho ben capito...:(

trallallero
06-03-2007, 18:24
Così non è una matrice. O meglio, è una matrice 1xN di varchar2(n).

Così a occhio eh...però forse non ho ben capito...:(
mi sa che hai ragione perchè mi riempie solo il primo elemento. Ormai sto a casa ma domani mi sa che ho bisogno di aiuto :stordita:
Grazie :)

trallallero
07-03-2007, 08:36
eccolo:
TYPE NUM_ARRAY IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
il (3) corrisponde alla larghezza della stringa e 3 mi basta.
Per dire che é una matrice basta aggiungere alla fine INDEX BY BINARY_INTEGER :)

shinya
07-03-2007, 13:36
eccolo:
TYPE NUM_ARRAY IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;
il (3) corrisponde alla larghezza della stringa e 3 mi basta.
Per dire che é una matrice basta aggiungere alla fine INDEX BY BINARY_INTEGER :)

Se metti index by binary_integer ( o pls_integer ) hai un "array" associativo. Se ti va bene puoi usare anche quello in effetti.
Per avere una matrice vera e propria dovresti fare qualcosa tipo:


type t_columns is table of varchar2(3);
type t_matrix is table of t_columns;

my_matrix t_matrix;

trallallero
07-03-2007, 14:13
Se metti index by binary_integer ( o pls_integer ) hai un "array" associativo. Se ti va bene puoi usare anche quello in effetti.
Per avere una matrice vera e propria dovresti fare qualcosa tipo:


type t_columns is table of varchar2(3);
type t_matrix is table of t_columns;

my_matrix t_matrix;


non l'ho capita :wtf:
varchar2 é giá un array quindi dicendo TABLE OF diventa un array di array = matrice, a intuito ovviamente.
Tu invece fai un doppio passaggio, perché ?
Comunque grazie :)