Declaration of variables in a cursor?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Post Reply
lopes_andre
Rank: Programador Sênior
Rank: Programador Sênior
Posts: 49
Joined: Mon, 13 Oct 2008 9:01 am
Location: Lisboa

Live,

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.

will function thus:

Select all

 
vDAT_ULT_EMPRE     m4t_fases_act.max(dat_ini_act_emp)%TYPE;                                  
vULT_DIA_mês         m4t_fases_act.last_day(to_date(pMES || pANO, 'MMYYYY'))%TYPE;
??


Thanks.
Trevisolli
Moderador
Moderador
Posts: 2016
Joined: Wed, 12 Jan 2005 3:25 pm
Location: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Try as follows:

Select all

 
vDAT_ULT_EMPRE m4t_fases_act.max%TYPE;  
vULT_DIA_mês m4t_fases_act.last_day%TYPE; 

Select all

VARIÁVEL TABELA.CAMPO%TYPE
Whatever, send us.
ederphil
Rank: Programador Sênior
Rank: Programador Sênior
Posts: 52
Joined: Wed, 15 Oct 2008 4:05 pm
Location: taquara-RS

Dae beauty ..

face I think you are confusing things ..
%type is used when you want to use the same type of column in variable ..

Select all

 
vDAT_ULT_EMPRE  m4t_fases_act.dat_ini_act_emp%TYPE;  
vULT_DIA_mês      m4t_fases_act.nome_coluna%TYPE; 

Select all

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.

Select all

 
where id_empregad = vEmpregado; 
falou.
lopes_andre
Rank: Programador Sênior
Rank: Programador Sênior
Posts: 49
Joined: Mon, 13 Oct 2008 9:01 am
Location: Lisboa

Viva

I changed the statement but is still giving an error. Errors are as follows:

Select all

Compilation errors for PROCEDURE M4APL.M4PR_DIFERENCIAL_CARREIRA_ 
 
Error: PLS-00302: component 'MAX' must be declared 
Line: 41 
Text: vDAT_ULT_EMPRE                   m4t_fases_act.max%TYPE; 
 
Error: PL/SQL: Item ignored 
Line: 41 
Text: vDAT_ULT_EMPRE                   m4t_fases_act.max%TYPE; 
 
Error: PLS-00302: component 'LAST_DAY' must be declared 
Line: 42 
Text: vULT_DIA_mês                     m4t_fases_act.last_day%TYPE; 
 
Error: PL/SQL: Item ignored 
Line: 42 
Text: vULT_DIA_mês                     m4t_fases_act.last_day%TYPE; 
 
Error: PLS-00320: the declaration of the type of this expression is incomplete or malformed 
Line: 81 
Text: FETCH TEMPO_NA_APL INTO vDAT_ULT_EMPRE, vULT_DIA_mês; 
 
Error: PL/SQL: SQL Statement ignored 
Line: 81 
Text: FETCH TEMPO_NA_APL INTO vDAT_ULT_EMPRE, vULT_DIA_mês; 
 
Error: PLS-00320: the declaration of the type of this expression is incomplete or malformed 
Line: 85 
Text: vNUM_DIAS_DE_APL := vULT_DIA_mês -  vDAT_ULT_EMPRE + 1; 
 
Error: PL/SQL: Statement ignored 
Line: 85 
Text: vNUM_DIAS_DE_APL := vULT_DIA_mês -  vDAT_ULT_EMPRE + 1; 
By the way, the procedure is this:

Select all

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; 
lopes_andre
Rank: Programador Sênior
Rank: Programador Sênior
Posts: 49
Joined: Mon, 13 Oct 2008 9:01 am
Location: Lisboa

Well, I already resolved ...

Select all

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

Thanks again.

was like this:

Select all

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.

Thanks.
Post Reply
  • Information
  • Who is online

    Users browsing this forum: No registered users and 1 guest