Problema na criação do código plsql para tabela rotativo.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 23 Jun 2014 8:14 pm

Olá Pessoal,
Estou a um tempo tentando fazer no Oracle um código plsql para resolver os cálculos de um sistema para estacionamento rotativo. Eu fiz uma tabela chamada utilização_r e outra chamada valor rotativo, onde vocês podem ver as duas tabelas e os scripts da trigger para gerar a hora da entrada e da função para retornar o valor a pagar abaixo. O que eu queria e que meu código é que eu colocasse valores na tabela de valor_rotativo para poder dar valore diferente de acordo com o tempo de permanência, pois na minha função o valor e dado direto dentro da função, e eu queria que os primeiros cinco minutos não fosse cobrado e a cada meia hora, fosse cobrado o valor estipulado na tabela valor_rotativo, mais não to conseguindo fazer essa transação. Se alguém poder me ajudar, agradeço.
Abraço.

Selecionar tudo

CREATE TABLE  "UTILIZACAO_R" 
   (	"IDUTILR" NUMBER, 
	"IDVROT" NUMBER,
	"HORA_ENTRADA" TIMESTAMP (6), 
	"HORA_SAIDA" TIMESTAMP (6), 
	"VALOR_PAGO" FLOAT(126), 
	"PLACA" VARCHAR2(80), 
	 CONSTRAINT "UTILIZACAO_R_PK" PRIMARY KEY ("IDUTILR")
  USING INDEX  ENABLE
   )
/
ALTER TABLE  "UTILIZACAO_R" ADD CONSTRAINT "UTILIZACAO_R_ VALOR_ROTATIVO_FK" FOREIGN KEY ("IDVROT")
	  REFERENCES  " VALOR_ROTATIVO" ("IDVROT") ENABLE
/

------------------------x-----------------------------------  

CREATE TABLE  "VALOR_ROTATIVO" 
   (	"IDVROT" NUMBER, 
	"VALOR" FLOAT(126), 
	"DATA_INICIO" DATE, 
	"DATA_FIM" DATE, 
	 CONSTRAINT "VALOR_ROTATIVO_PK" PRIMARY KEY ("IDVROT")
  USING INDEX  ENABLE
   )
/

---------------------------x--------------------------------

CREATE OR REPLACE TRIGGER  "DATAENTRADA" 
  before  insert 
         ON utilizacao_r
         FOR EACH ROW
         DECLARE
    begin
    
        :new.hora_entrada:= LOCALTIMESTAMP;--SYSDATE;                
    end;
/
ALTER TRIGGER  "DATAENTRADA" ENABLE
/
-------------------------x----------------------------

DECLARE
V_VALOR_PAGO UTILIZACAO_R.VALOR_PAGO%TYPE;
begin
if :P7_HORA_SAIDA is not null and :P7_HORA_ENTRADA is not null then
V_VALOR_PAGO := ROUND(
(
to_date(:P7_HORA_SAIDA,'DD/MM/YYYY HH24:MI:SS') - to_date(:P7_HORA_ENTRADA,'DD/MM/YYYY HH24:MI:SS')
) * 24 * 6,
2);
end if;
--return NVL(V_VALOR_PAGO, 0);
apex_util.set_session_state('P7_VALOR_PAGO', NVL(V_VALOR_PAGO, 0));
end;

Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu acho que você poderia criar informações assim na tabela VALOR_ROTATIVO:

Selecionar tudo

MIN_INI   MIN_FIM   VALOR   DESCRICAO
0           5           0   ATÉ 5 MINUTOS GRATIS
5           30         10   MEIA HORA - R$ 10,00
30          60         15   ATÉ UMA HORA - R$ 15,00
60         120         25   ATÉ DUAS HORAS - R$ 25,00
120        180         30   ATÉ TRES HORAS - R$ 30,00
180       1440         50   DIARIA - R$ 50,00
Dessa forma, basta você calcular quantos minutos levou entre a entrada e a saída. (DATAHORA_FIM - DATAHORA_INI) e procurar nessa tabela onde esse valor se encaixa.

Dessa forma fica bem flexível os valores.
Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 23 Jun 2014 8:14 pm

Obrigado Vou tentar fazer como você falou.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes