Despite not being a programmer I can already do some things in Oracle, including cursors. However I am faced with a new doubt and that I do not know how to research information to solve it.
The doubt is as follows. I created a cursor ...
The question now is how to declare as variable the "Max (DAT_INI_ACT_EMP)" and "Last_Day (SMEs | | cloth, 'mmyyyy')) "As variable.
CURSOR TEMPO_NA_DDL IS
select
max(dat_ini_act_emp),
last_day(to_date(pMES || pANO, 'MMYYYY')) --pMes /pAno é parametro??
from
m4t_fases_act
where
id_empregad = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
The That you can do is to declare a variable or a parameter inside or outside the cursor and pass the WHERE clause.
create or replace procedure M4PR_DIFERENCIAL_CARREIRA_
(
pMES NUMBER,
pANO NUMBER
)
is
cQUE_EMPREGADOS_EXISTEM M4T_EMPREGAD%ROWTYPE;
CURSOR QUE_EMPREGADOS_EXISTEM IS
select * from m4t_empregad;
CURSOR CONTAGENS_TEMPO_APOSENTA IS
select * from m4t_contagens_tempo;
CURSOR CONTAGENS_TEMPO_ORGAN_PORTUA IS
select * from m4t_contagens_tempo
WHERE
ID_TIPO_CONTAGEM = 'OP'
AND
ID_EMPREGAD = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
CURSOR TEMPO_NA_APL IS
select
max(dat_ini_act_emp),
last_day(to_date(pMES || pANO, 'MMYYYY'))
from
m4t_fases_act
where
id_empregad = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
cCONTAGENS_TEMPO_APOSENTA m4t_contagens_tempo%ROWTYPE;
cCONTAGENS_TEMPO_ORGAN_PORTUA m4t_contagens_tempo%ROWTYPE;
vDAT_ULT_EMPRE m4t_fases_act.max%TYPE;
vULT_DIA_mês m4t_fases_act.last_day%TYPE;
vID_EMPREGAD VARCHAR2(10);
vNUM_DIAS_DE_APL NUMBER(14,0);
begin
OPEN QUE_EMPREGADOS_EXISTEM;
LOOP
FETCH QUE_EMPREGADOS_EXISTEM INTO cQUE_EMPREGADOS_EXISTEM;
EXIT WHEN QUE_EMPREGADOS_EXISTEM%NOTFOUND;
OPEN CONTAGENS_TEMPO_APOSENTA;
LOOP
FETCH CONTAGENS_TEMPO_APOSENTA INTO cCONTAGENS_TEMPO_APOSENTA;
EXIT WHEN CONTAGENS_TEMPO_APOSENTA%NOTFOUND;
vID_EMPREGAD := cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
IF (cCONTAGENS_TEMPO_APOSENTA.ID_EMPREGAD = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD
AND
cCONTAGENS_TEMPO_APOSENTA.ID_TIPO_CONTAGEM = 'APR'
AND
cCONTAGENS_TEMPO_APOSENTA.ANOS >= 30) THEN
dbms_output.put_line(cCONTAGENS_TEMPO_APOSENTA.ID_EMPREGAD || ' ' || cCONTAGENS_TEMPO_APOSENTA.ID_TIPO_CONTAGEM || ' ' ||cCONTAGENS_TEMPO_APOSENTA.ANOS);
OPEN CONTAGENS_TEMPO_ORGAN_PORTUA;
LOOP
FETCH CONTAGENS_TEMPO_ORGAN_PORTUA INTO cCONTAGENS_TEMPO_ORGAN_PORTUA;
EXIT WHEN CONTAGENS_TEMPO_ORGAN_PORTUA%NOTFOUND;
OPEN TEMPO_NA_APL;
LOOP
FETCH TEMPO_NA_APL INTO vDAT_ULT_EMPRE, vULT_DIA_mês;
EXIT WHEN TEMPO_NA_APL%NOTFOUND;
/*NÚMERO DE DIAS QUE O EMPREGADO TEM DE APL*/
vNUM_DIAS_DE_APL := vULT_DIA_mês - vDAT_ULT_EMPRE + 1;
IF cCONTAGENS_TEMPO_ORGAN_PORTUA.ANOS >= 15 THEN
dbms_output.put_line(cCONTAGENS_TEMPO_ORGAN_PORTUA.ANOS);
NULL;
END IF;
END LOOP;
CLOSE TEMPO_NA_APL;
END LOOP;
CLOSE CONTAGENS_TEMPO_ORGAN_PORTUA;
END IF;
END LOOP;
CLOSE CONTAGENS_TEMPO_APOSENTA;
END LOOP;
CLOSE QUE_EMPREGADOS_EXISTEM;
commit;
end;
CURSOR TEMPO_NA_APL IS
select
dat_ini_act_emp
from
m4t_fases_act
where
id_empregad = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD
and
dat_ini_act_emp = (select
max(dat_ini_act_emp)
from
m4t_fases_act
where
id_empregad = 78);
vDAT_ULT_EMPRE m4t_fases_act.dat_ini_act_emp%TYPE;
I tried to put the Max () function on a place that does not give a headache.
In relation to the other column that was in the cursor placed it outside the SELECT
create or replace procedure M4PR_DIFERENCIAL_CARREIRA_
(
pMES NUMBER,
pANO NUMBER
)
is
cQUE_EMPREGADOS_EXISTEM M4T_EMPREGAD%ROWTYPE;
CURSOR QUE_EMPREGADOS_EXISTEM IS
select * from m4t_empregad;
CURSOR CONTAGENS_TEMPO_APOSENTA IS
select * from m4t_contagens_tempo;
CURSOR CONTAGENS_TEMPO_ORGAN_PORTUA IS
select * from m4t_contagens_tempo
WHERE
ID_TIPO_CONTAGEM = 'OP'
AND
ID_EMPREGAD = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
CURSOR TEMPO_NA_APL IS
select
dat_ini_act_emp
from
m4t_fases_act
where
id_empregad = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD
and
dat_ini_act_emp = (select
max(dat_ini_act_emp)
from
m4t_fases_act
where
id_empregad = 78);
cCONTAGENS_TEMPO_APOSENTA m4t_contagens_tempo%ROWTYPE;
cCONTAGENS_TEMPO_ORGAN_PORTUA m4t_contagens_tempo%ROWTYPE;
vDAT_ULT_EMPRE m4t_fases_act.dat_ini_act_emp%TYPE;
vID_EMPREGAD VARCHAR2(10);
vNUM_DIAS_DE_APL NUMBER(14,0);
vULT_DIA_mês date;
begin
OPEN QUE_EMPREGADOS_EXISTEM;
LOOP
FETCH QUE_EMPREGADOS_EXISTEM INTO cQUE_EMPREGADOS_EXISTEM;
EXIT WHEN QUE_EMPREGADOS_EXISTEM%NOTFOUND;
OPEN CONTAGENS_TEMPO_APOSENTA;
LOOP
FETCH CONTAGENS_TEMPO_APOSENTA INTO cCONTAGENS_TEMPO_APOSENTA;
EXIT WHEN CONTAGENS_TEMPO_APOSENTA%NOTFOUND;
vID_EMPREGAD := cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD;
IF (cCONTAGENS_TEMPO_APOSENTA.ID_EMPREGAD = cQUE_EMPREGADOS_EXISTEM.ID_EMPREGAD
AND
cCONTAGENS_TEMPO_APOSENTA.ID_TIPO_CONTAGEM = 'APR'
AND
cCONTAGENS_TEMPO_APOSENTA.ANOS >= 30) THEN
dbms_output.put_line(cCONTAGENS_TEMPO_APOSENTA.ID_EMPREGAD || ' ' || cCONTAGENS_TEMPO_APOSENTA.ID_TIPO_CONTAGEM || ' ' ||cCONTAGENS_TEMPO_APOSENTA.ANOS);
OPEN CONTAGENS_TEMPO_ORGAN_PORTUA;
LOOP
FETCH CONTAGENS_TEMPO_ORGAN_PORTUA INTO cCONTAGENS_TEMPO_ORGAN_PORTUA;
EXIT WHEN CONTAGENS_TEMPO_ORGAN_PORTUA%NOTFOUND;
OPEN TEMPO_NA_APL;
LOOP
FETCH TEMPO_NA_APL INTO vDAT_ULT_EMPRE;
EXIT WHEN TEMPO_NA_APL%NOTFOUND;
vULT_DIA_mês := last_day(to_date(pMES || pANO, 'MMYYYY'));
/* NÚMERO DE DIAS QUE O EMPREGADO TEM DE APL */
vNUM_DIAS_DE_APL := vULT_DIA_mês - vDAT_ULT_EMPRE + 1;
IF cCONTAGENS_TEMPO_ORGAN_PORTUA.ANOS >= 15 THEN
dbms_output.put_line(cCONTAGENS_TEMPO_ORGAN_PORTUA.ANOS);
NULL;
END IF;
END LOOP;
CLOSE TEMPO_NA_APL;
END LOOP;
CLOSE CONTAGENS_TEMPO_ORGAN_PORTUA;
END IF;
END LOOP;
CLOSE CONTAGENS_TEMPO_APOSENTA;
END LOOP;
CLOSE QUE_EMPREGADOS_EXISTEM;
commit;
end;
Now just end the code ... And it is still far from complete.