Oracle - Cursores dinamicos

 
Vista:

Cursores dinamicos

Publicado por José Ramón (2 intervenciones) el 21/08/2006 04:39:41
Buenas tardes, me podrían auxiliar por favor tengo un problema necesito manejar un select * from tabla con cursores dinámicos, me podrían indicar como solucionar este problema, y poder leer todas las columnas que regresa la consulta, esto lo voy aplicar en un programa que procese varias tablas de forma dinámica por eso no podemos manejar estructuras fijas de las tablas.

Anexo codigo que ya genere pero no puedo traer los datos para procesarlos.

Me es urgente su ayuda

Mucho agradecere sus comentarios y soluciones

DECLARE
v_cursor2_ID INTEGER;
v_select_stmt VARCHAR2(500);
v_dummy INTEGER;
wn_keyemp INTEGER;
wn_salida varchar2(1000);
v_select_stmt_1 VARCHAR2(500);
/* variable para le manejo de los campos */
vcolumn_name varchar2(50);
vdata_type varchar2(20);
vcolumn_id INTEGER;
/* variables del proceso */
tabla_procesar varchar2(100);
sqlstm_campos VARCHAR2(500);
/* cursor para el manejo de los campos */
curcampos types.cursortype;
/* cursor para el manejo de las tablas*/
curtablas types.cursortype;
Vtabla varchar2(30);
VNOM_TABLA VARCHAR2(30);
sqlstm_tabla VARCHAR2(500);

prim_char INTEGER;
prim_num INTEGER;

BEGIN

sqlstm_tabla:= 'SELECT TABLE_NAME FROM ALL_TABLES WHERE TRIM(SUBSTR(TABLE_NAME,1,4)) =' ||'''ESP_''' || ' ORDER BY TABLE_NAME';
OPEN curtablas FOR sqlstm_tabla;
LOOP
FETCH curtablas INTO tabla_procesar;
EXIT WHEN curtablas%notfound;
dbms_output.put_line(tabla_procesar);
/*SE AGREGO MANEJO DINAMICO */
v_cursor2_ID := DBMS_SQL.OPEN_CURSOR;
v_select_stmt := 'SELECT * FROM ' || tabla_procesar ;
/*analiza la consulta*/
DBMS_SQL.PARSE(v_cursor2_ID, v_select_stmt, DBMS_SQL.V7);
v_dummy:= DBMS_SQL.EXECUTE(v_cursor2_ID);
LOOP
IF DBMS_SQL.FETCH_ROWS(v_cursor2_ID) = 0 THEN
EXIT;
END IF;
prim_char := 0;
prim_num := 0;
sqlstm_campos:= 'SELECT COLUMN_NAME, DATA_TYPE, COLUMN_ID FROM ALL_TAB_COLUMNS WHERE TABLE_NAME =''' || tabla_procesar || ''' ORDER BY COLUMN_ID' ;
DBMS_OUTPUT.PUT_LINE(sqlstm_campos);
OPEN curcampos FOR sqlstm_campos;
LOOP
FETCH curcampos INTO vcolumn_name, vdata_type, vcolumn_id;
EXIT WHEN curcampos%notfound;
DBMS_OUTPUT.PUT_LINE(vcolumn_name);
DBMS_OUTPUT.PUT_LINE(vdata_type);
DBMS_OUTPUT.PUT_LINE(vcolumn_id);

/* SE ANALIZA EL TIPO DE DATO PARA DEFINIR EL TIPO DE VARIABLE A UTILIZAR */
IF vdata_type = TRIM('CHAR') OR vdata_type = TRIM('VARCHAR2') OR vdata_type = TRIM('DATE') THEN
DBMS_SQL.DEFINE_COLUMN(v_cursor2_ID, vcolumn_id , wn_salida,1000);
DBMS_SQL.COLUMN_VALUE(v_cursor2_ID, vcolumn_id, wn_salida);
DBMS_OUTPUT.PUT_LINE('wn_salida :'|| wn_salida);
END IF;

IF vdata_type = TRIM('NUMBER') OR vdata_type = TRIM('INTEGER') OR vdata_type = TRIM('FLOAT') THEN
DBMS_SQL.DEFINE_COLUMN(v_cursor2_ID, vcolumn_id, wn_keyemp);
DBMS_SQL.COLUMN_VALUE(v_cursor2_ID, vcolumn_id, wn_keyemp);
DBMS_OUTPUT.PUT_LINE('wn_keyemp :'|| wn_keyemp);
END IF;
/* FIN */

END LOOP;
CLOSE curcampos;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor2_ID);
END LOOP;
CLOSE curtablas;
END;
/
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder