Foros del Web » Programando para Internet » PHP »

Problema con Php y Oracle

Estas en el tema de Problema con Php y Oracle en el foro de PHP en Foros del Web. Buenas tardes: Me presento, me llamo Fernando, soy nuevo en el foro. Vi muchísimos post que hicieron aquí y muchos me ayudaron, pero ésta es ...
  #1 (permalink)  
Antiguo 29/08/2011, 12:12
Avatar de fernandoggaitan  
Fecha de Ingreso: agosto-2011
Mensajes: 11
Antigüedad: 12 años, 7 meses
Puntos: 2
Problema con Php y Oracle

Buenas tardes:

Me presento, me llamo Fernando, soy nuevo en el foro. Vi muchísimos post que hicieron aquí y muchos me

ayudaron, pero ésta es la primera vez que yo hago una pregunta.

Resulta que en mi trabajo estoy haciendo consultas a Oracle con php para generar un excel, pero siempre me

omite el primer registro, al principio pense que los titulos lo estaban tapando pero debugeando pareciera que

directamente no tengo ese primer registro.

Si realizo la consulta directamente con un cliente como el toad me devuelve 36 rows, mientras que el mismo

procedimiento a traves de mi aplicacion php me devuelve solo 35 suprimiendome el primero.

Código PHP:
GenerarExcel::prestadoresTerapiaRadiante('name.xls''UP3069986282300''05/2011',); 
Código PHP:
static public function prestadoresTerapiaRadiante($nombre$usuario$periodos$debug false) {

        
self::$_nombre $nombre;
        
$usuario implode(','self::formatearUsuarios($usuario));
        
$periodos self::formatearPeriodo($periodos);

        
$sql "BEGIN prestadoresTerapiaRadiante(:p_usuario, :p_periodos , :salida); END;";
        
$conex Conexion::getInstancia(USUARIO2PASSWORD2BASE2SERVIDOR2);
        
$stid oci_parse($conex$sql);

        
oci_bind_by_name($stid':p_usuario'$usuario, -1SQLT_CHR);
        
oci_bind_array_by_name($stid':p_periodos'$periodoscount($periodos), -1SQLT_INT);

        
$salida oci_new_cursor($conex);
        
oci_bind_by_name($stid":salida"$salida, -1OCI_B_CURSOR);
        
oci_execute($stid);
        
oci_execute($salida);
        return 
self::generar($salida$debug);
    } 
Código PHP:
static private function generar($stid$debug) {

        
$rows oci_fetch($stid);
        if (
$rows && !$debug) {
            
$filename self::$_nombre;
            
$workbook = new Spreadsheet_Excel_Writer();
            
$workbook->send($filename);

            
$workbook->setVersion(8);
            
$workbook->setTempDir(self::$_temporal);

            
$worksheet = & $workbook->addWorksheet('Items');
            
$worksheet->setInputEncoding('UTF-8');
            
$worksheet->setMargins(0.25);
            
$worksheet->centerHorizontally(1);

            
$worksheet->activate();

            
$format_header = & $workbook->addFormat();
            
$format_header->setBold();
            
$format_header->setSize(12);

            
$format_row = & $workbook->addFormat();
            
$format_row->setSize(12);

            
$i 0;
            
$j 1;
            while (
$row oci_fetch_array($stidOCI_ASSOC OCI_RETURN_LOBS)) {
                foreach (
$row as $key => $valor) {
                    if (
$j == 1) {
                        
$worksheet->write(0$i$key$format_header);
                    }
                    
//$worksheet->writeString($j, $i, $valor, $format_row);
                    
$i++;
                }
                
$i 0;
                
$j++;
            }

            
$workbook->close();
            exit;
        }
        return 
$rows;
    } 
Y el procedimiento oracle que ejecuta
Código:
CREATE OR REPLACE PROCEDURE NMP_PAMI_LIQUIDACION.prestadoresTerapiaRadiante(
p_usuario IN  varchar2,
p_periodos IN  Types.arraynumber,
p_recordset OUT Types.cursor_type) AS 

BEGIN 
FOR i IN 1 .. p_periodos.COUNT LOOP
    insert into tmp_numeros values ( p_periodos(i) );
END LOOP;
COMMIT;

  OPEN p_recordset FOR
    select  t.c_usuario, t.c_anio, t.c_mes, t.n_instalacion, r.*, s.*
        from nmp_pami.nmt_proceso_calculo_archivos t
        inner join 
                (select pca.c_anio, pca.c_mes, pca.c_usuario, pca.n_instalacion, max(pca.c_file_upload) 

c_file_upload, c_mr_tcalc 
                 from nmp_pami.nmt_proceso_calculo_archivos pca
                 where pca.marca_a_procesar = 1
                     and (pca.c_anio * 100 + pca.c_mes) in (select numero from tmp_numeros)
                     and pca.c_mr_tcalc = 'CAP'
                     and pca.c_usuario = p_usuario
                 group by pca.c_anio, pca.c_mes, pca.c_usuario, pca.n_instalacion, c_mr_tcalc) j
            on t.c_file_upload = j.c_file_upload
                and t.c_mr_tcalc = j.c_mr_tcalc 
        inner join  nmp_pami.nmt_prestacion_ti r
            on r.c_file = t.c_file_upload
        inner join nmp_pami.nmt_practica_prest_ti s
            on r.c_file = s.c_file
                and r.n_prestacion = s.n_prestacion        
                and s.c_modulo_pami in (30,31,32,33)
        where exists (select a.n_beneficio,a.c_grado_paren, d.c_usuario, sum(q_practica)
                            from nmp_pami.nmt_prestacion_ti a
                            inner join nmp_pami.nmt_practica_prest_ti c
                                on a.c_file = c.c_file
                                and a.n_prestacion = c.n_prestacion
                                and c.c_modulo_pami in (30,31,32,33)
                            inner join nmp_pami.nmt_proceso_calculo_archivos d
                                on a.c_file = d.c_file_upload
                                and d.marca_a_procesar = 1
                                and (d.c_anio * 100 + d.c_mes) in (select numero from tmp_numeros)
                                and d.c_mr_tcalc = 'CAP'
                            where t.c_usuario = d.c_usuario
                                and r.n_beneficio = a.n_beneficio
                                and r.c_grado_paren = a.c_grado_paren
                                group by a.n_beneficio,a.c_grado_paren, d.c_usuario
                            having sum(q_practica) >1)
        order by t.c_usuario,r.n_beneficio,r.c_grado_paren,s.c_modulo_pami,r.c_file,s.c_practica;

delete tmp_numeros;
commit;

END prestadoresTerapiaRadiante;
/
Bueno, gracias y Saludos
  #2 (permalink)  
Antiguo 29/08/2011, 12:17
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Problema con Php y Oracle

yo tengo un problema similar, el cursor me devuelve 1 row menos :/ pero no tengo idea que puede estar pasando
  #3 (permalink)  
Antiguo 30/08/2011, 13:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Problema con Php y Oracle

El problema es tu primer función oci_fetch dentro de static private function generar($stid, $debug), ya que eso obtiene el primer resultado, por eso no te genera todas las filas.

Saludos.
  #4 (permalink)  
Antiguo 31/08/2011, 08:25
Avatar de fernandoggaitan  
Fecha de Ingreso: agosto-2011
Mensajes: 11
Antigüedad: 12 años, 7 meses
Puntos: 2
Respuesta: Problema con Php y Oracle

GatorV, sí ya lo solucioné. De todas formas muchas gracias por responder.

Saludos

Etiquetas: oracle, registro, sql, usuarios
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:52.