Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cursor en oracle

Estas en el tema de Cursor en oracle en el foro de Oracle en Foros del Web. Hola! Estoy teniendo problemas para hacer un cursor en oracle. Mi idea era crear una variable con la consulta que quiero exportar, y luego abrir ...
  #1 (permalink)  
Antiguo 01/09/2011, 12:58
 
Fecha de Ingreso: septiembre-2011
Ubicación: Capital Federal
Mensajes: 2
Antigüedad: 12 años, 7 meses
Puntos: 0
Cursor en oracle

Hola! Estoy teniendo problemas para hacer un cursor en oracle. Mi idea era crear una variable con la consulta que quiero exportar, y luego abrir el cursor con esa consulta, pero esto me arroja un error cuando lo llamo desde el php. No se si mi problema esta en la variable o en el "open for".
Esto es lo que tengo hecho hasta ahora:


CREATE OR REPLACE PROCEDURE detallesPracticas(
p_tipo IN number,
p_proceso IN number,
p_files IN Types.arraynumber,
p_usuario IN varchar2,
p_periodos IN Types.arraynumber,
p_beneficiario IN varchar2,
p_parentesco IN varchar2,
p_recordset OUT Types.cursor_type) AS

v_sqls varchar2(32000);


BEGIN

FOR i IN 1 .. p_files.COUNT LOOP
insert into tmp_numeros values( p_files(i) );
END LOOP;

FOR j IN 1 .. p_periodos.COUNT LOOP
insert into tmp_numeros2 values ( p_periodos(j) );
END LOOP;

COMMIT;


v_sqls := 'SELECT A.C_ANIO, A.C_MES, A.C_USUARIO, A.C_PRESTADOR, A.C_RED, A.C_FILE_UPLOAD, A.N_INSTALACION, A.C_MR_TCALC, A.ACEPTADO, A.MARCA_A_PROCESAR, B.N_PRESTACION, B.N_BENEFICIO, B.C_GRADO_PAREN,
c.f_practica, c.c_practica, C.Q_PRACTICA, c.c_modulo_pami, c.c_diag, c.n_mat_prof_act, c.d_validacion_efectores, C.C_MODALIDAD_PRESTACION, C.N_MOTIVO_CONSULTA, C.N_ORDEN_RECHAZO, C.N_LUGAR_ATENCION, b.f_prestacion
From nmp_pami.nmt_proceso_calculo_archivos a
Inner join nmp_pami.nmt_prestacion_ti b
On a.c_file_upload = b.c_file
Inner join nmp_pami.nmt_practica_prest_ti c
On b.c_file = c.c_file
And b.n_prestacion = c.n_prestacion
Where A.C_USUARIO = p_usuario
AND A.MARCA_A_PROCESAR=1
AND (A.C_ANIO*100 + A.C_MES) in (select tmp.numero from tmp_numeros2 tmp)';

if p_beneficiario = 'no' or p_parentesco = 'no' then

v_sqls := v_sqls || ' order by 1,2,3,6,7';

else

v_sqls := v_sqls || ' and b.n_beneficio = p_beneficiario
and b.c_grado_paren = p_parentesco
order by 1,2,3,6,7';

end if;


open p_recordset for v_sqls ;


COMMIT;
END detallesPracticas;

Muchas gracias!!!
  #2 (permalink)  
Antiguo 05/09/2011, 10:44
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: Cursor en oracle

Hola Meli, no es necesario que reinventes la rueda !!!

Creo tu problema necesita un replanteamiento.
Pienso que esta inquietud que propones es porque realmente quieres 'dinamizar' algo y no esta saliendo como piensas.

Existen otros metodos menos 'problematicos' y mas sencillos de implementar que el que propones y que llegaran ineludiblemente al mismo resultado.

Te paso algunos tips:

-- Puedes usar EXECUTE IMMEDIATE para ejecutar su SQL Dinamico
-- Puedes usar tambien el paquete DBMS_OUTPUT para redireccionar la salida de tu procedure
-- Puedes insertar el resultado en una tabla y luego levantarla cuando termine el procedure.
-- Puedes armar dos procedures: uno que decida que partes de la consulta quieres ejecutar, la ejecute con EXECUTE IMMEDIATE e inserte en una tabla que cuando finalice el procedure, puedas recorrer.

En fin... lo que te propongo es un 'replanteamiento' del metodo de resolucion de tu problema con la finalidad de lograr una solucion que logre lo que tu necesitas pero usando un metodo mas 'sencillo'.

Problamente 'sencillo' implique mas 'largo' pero al final de cuentas es mas 'sencillo' que el anterior.

Exitos y no olvides de contar como te fue.
Saludos,
Mario.
__________________
Y venció David al filisteo con honda y piedra; e hirió al filisteo y lo mató, sin tener David espada en su mano.
  #3 (permalink)  
Antiguo 05/09/2011, 12:31
 
Fecha de Ingreso: septiembre-2011
Ubicación: Capital Federal
Mensajes: 2
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Cursor en oracle

Mario:

Muchas gracias por tu ayuda!
Lo que hice fue agregar el exceute immediate v_qsls antes del for.
Y funciono perfectamente.

Muchas gracias.
Saludos

Etiquetas: cursor, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:57.