miércoles, 2 de enero de 2013

PROCEDIMIENTO PARA PARQUEO (ORACLE)




create or replace procedure park(lv_dia number,lv_mes number,lv_anio number)
is
    cursor cr
is
--Este es el cursor
    select * from parkeo
--entrada es el campo de la tabla, (ddmmyyyy) eso es el formato de fecha
        where to_char(entrada,'ddmmyyyy')  like '%'||(to_char(decode(lv_dia,0,null,
--el decode funciona como que fuera un if, esto me sirbe para el query, ejemplo si la fecha que se manda
--como parametro es 1/1/2012, entonces lo que hace es esto 01/01/2012, podes darte cuenta que le pone
--un cero adelante del dia y del mes, esto lo hice así pq el like no funciona si lo dejo así 1/1/2012
                                                                            1, '0'||lv_dia,
                                                                            2, '0'||lv_dia,
                                                                            4, '0'||lv_dia,
                                                                            5, '0'||lv_dia,
                                                                            6, '0'||lv_dia,
                                                                            7, '0'||lv_dia,
                                                                            8, '0'||lv_dia,
                                                                            9, '0'||lv_dia,                            
                                                                                    lv_dia))
                                                   ||to_char(decode(lv_mes,0,null,
                                                                           1, '0'||lv_mes,
                                                                           2, '0'||lv_mes,
                                                                           3, '0'||lv_mes,
                                                                           4, '0'||lv_mes,
                                                                           5, '0'||lv_mes,
                                                                           6, '0'||lv_mes,
                                                                           7, '0'||lv_mes,
                                                                           8, '0'||lv_mes,
                                                                           9, '0'||lv_mes,                                                                                                        
                                                                                   lv_mes))                                                                                
                                                   ||TO_CHAR(lv_anio)||'%');
mreg cr%rowtype;
contador number:= 1;
existencia number:=0;

begin
--vacio la tabla park2, que es donde pongo el conteo
    delete PARK2 ;
    open cr;
        loop fetch cr into mreg;
        exit when cr%notfound;
            --aqui obtengo la hora de la fecha de entrada
            contador:= to_number(to_char(mreg.entrada, 'HH24'));
            --aqui digo que si la hora de entrada es menor que la hora de salida, entonces
    --que haga el insert o el update, depende del if
    --ejemplo: si ya tengo un carro ingresado a de 1:00 - 2:00 (esto es en el campo rango), entonces    
               hace el update
    --sino se va a la parte del insert
    --cualquiera de las variantes le agrega uno al contador.
while contador <= to_number(to_char(mreg.salida, 'HH24'))          
            loop
                select count(*) into existencia                
                from park2
                where rango = contador||':00 - '||contador||':59';
                if ( existencia = 0 ) then
    --insert
                    insert into PARK2  values (contador||':00 - '||contador||':59',1);
                    COMMIT;
                else
                    --update
                    update park2 set cuenta = (select cuenta + 1 from park2
                           where rango = contador||':00 - '||contador||':59')
                    where rango = contador||':00 - '||contador||':59';
                    COMMIT;
                end if ;            
                contador:= contador + 1;              
            end loop;
        end loop;
    close cr;
end;

Que tal compañero, aquí te dejo el code para el parqueo! Saludos y suerte en el exa.!