Dùvida Procedure

25/03/2020

0

Bom dia pessoal,

Eu tenho as seguintes tabelas:

Create table FUNCIONARIOS (num number, nome varchar2(30), custo_hora number);
Create table PROJETOS (cod number, nome varchar2(15), custo_acc number(10,2), horas_acc(10,2));
Create table ALOCACAO_REAL (semana number, horas_trab number, cod_proj number, num_func number);
Create table ALOCACAO_PREV (horas_prev_sem number, cod_proj number, num_func number);
Preciso criar uma procedure que: verifique e aponte quais funcionários estão trabalhando em cada projeto na média das 4 últimas semanas, acima da quantidade de horas previstas para aquele funcionário dentro daquele Projeto.


Cheguei neste ponto, mas está dando um erro:

create or replace procedure func_horas_excedentes as
/* set serveroutput on; */
begin
    for x in (select * from ALOCACAO_PREV)
    loop
        x.num_func;
        x.cod_proj;
        x.horas_prev_sem;
        select max semana into ult_semana from ALOCACAO_REAL where num_func = x.num;
        select avg (horas_trab) into media from ALOCACAO_REAL where semana > (ult_semana -4);
        select * from ALOCACAO_REAL where num_func = x.num_func and cod_proj = x.cod_proj and media > x.horas_prev_sem;
        /* dbms_output.put_line ('Func: ','Projeto: ','Media Horas Trabalhadas: ','Horas Previstas: ',|| x.num_func, x.cod_proj, media, x.horas_prev_sem); */
    end loop;
    commit;
end;
/


Erro:

Errors: PROCEDURE FUNC_HORAS_EXCEDENTES
Line/Col: 12/13 PL/SQL: SQL Statement ignored
Line/Col: 12/17 PL/SQL: ORA-00922: missing or invalid option
Line/Col: 13/104 PLS-00103: Encountered the symbol "|" when expecting one of the following:

   ( - + case mod new not null <an identifier>
   <a double-quoted delimited-identifier> <a bind variable>
   continue avg count current exists max min prior sql stddev
   sum variance execute forall merge time timestamp interval
   date <a string literal with character set specification>
   <a number> <a single-quoted SQL string> pipe
   <an alternatively-quoted string literal with character set specification>
   <an alternatively


Com "set server..." antes do begin, da mais erro.

Alguém tem uma sugestão?

Abraços.
Caitano

Caitano

Responder

Posts

25/03/2020

Emerson Nascimento

não entendi muito bem a tua necessidade, mas acredito que seja possível resolver numa query:
select
	AP.num_func,
	AP.cod_proj,
	avg(AR.horas_trab) media,
	AP.horas_prev_sem
from
	ALOCACAO_PREV AP
left join
	(select num_func, cod_proj, max(semana) ult_semana -- ultima semana por projeto
	from ALOCACAO_REAL
	group by num_func, cod_proj) US on US.num_func = AP.num_func and US.cod_proj = AP.cod_proj
left join
	ALOCACAO_REAL AR on AR.num_func = AP.num_func and AR.cod_proj = AP.cod_proj and AR.semana > (US.ult_semana - 4)
group by
	AP.num_func,
	AP.cod_proj,
	AP.horas_prev_sem
having
	avg(AR.horas_trab) > AP.horas_prev_sem
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar