criar um curso para update em alguns campos

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
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Pessoal, antes havia criado esse tópico para criar um update.. http://glufke.net/oracle/viewtopic.php?t=7262

agora preciso fazer um cursor pois vou querer fazer o update em mais de 1 campo.. só que ainda tenho dificuldades na criação de cursor...

tenho que substituir o select

Selecionar tudo


  BEGIN
  
   select password,
   into v_coleta_user
   from sec_membershipusers
   where username = 'WSTSCC';
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN '1 - ERRO AO TENTAR TROCAR SENHA' || SQLERRM;
    
  END;

  BEGIN
    UPDATE sec_membershipusers
       SET password = v_coleta_user
     where username = p_NOME_USER;
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN 'ERRO - Erro na troca' || SQLERRM;
  END;

o esquema é o mesmo preciso pegar os campos do usuário 'WSTSCC' e fazer um update no mesmos campos do usuário que entra no parametro p_NOME_USER... só que agora não só com o campo password mas tembém com os campos ISLOCKEDOUT, CREATIONDATE, LASTLOGINDATE ... você poderiam dar uma ajuda???
nozes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 23 Dez 2010 2:06 pm
Localização: Mesquita-RJ
Emanuel "Nozes" Castro
Analista Programador

Eae cara...

Eu acabei de respodner teu outro topico...não sei se acertei...mas pelo o que entendi...da pra fazer de varias maneiras...eu já tinha uma mais ou menos montada...então segui esta linha...
veja se isso te resolve...utilizei um cursor, mas como é apenas os dados de um registro, poderia ser com um select into..mas...vamos ver o que da..
dando errado ou certo, da um retorno..ok?!

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NAME_USER in VARCHAR2) 
  return varchar2 IS 

 cursor c_user is 
  select PASSWORD,ISLOCKEDOUT, CREATIONDATE, LASTLOGINDATE 
   from sec_membershipusers 
   where username = 'WSTSCC';

BEGIN 

 For rs in C_USER Loop
  UPDATE sec_membershipusers
     SET PASSWORD      = rs.password,
         ISLOCKEDOUT   = rs.ISLOCKEDOUT
         CREATIONDATE  = rs.CREATIONDATE
         LASTLOGINDATE = rs.LASTLOGINDATE
   WHERE USERNAME = p_NAME_USER;
   
   
   IF SQL%ROWCOUNT = 0 THEN
      RETURN 'NENHUMA LINHA ALTERADA'; 
   ELSE 
   COMMIT;
   RETURN 'SENHA ALTERADA COM SUCESSO!'; 
   END IF;

END SC_FNC_TROCA_SENHA; 
abraços!;)
:-o
paulochagas
Moderador
Moderador
Mensagens: 86
Registrado em: Qua, 15 Mar 2006 2:46 pm
Localização: São Paulo - SP
Paulo Chagas Filho
__________________

Analista Funcional / Desenvolvedor Oracle EBS
MSN - paulochagas@hotmail.com
Gtalk - pachafi@gmail.com
Skype - paulochagas

Selecionar tudo

BEGIN
   FOR r1 IN (SELECT *
                FROM sec_membershipusers
               WHERE username = 'WSTSCC')
   LOOP
      UPDATE sec_membershipusers
         SET password = r1.password
       WHERE username = r1.username;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 'ERRO - Erro na troca' || SQLERRM;
END;
nozes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 23 Dez 2010 2:06 pm
Localização: Mesquita-RJ
Emanuel "Nozes" Castro
Analista Programador

malz aí...eskeci de colocar um tratamento caso de alguma merdinha...
tipo, não posso compilar aqui pra rodar com tranquilodade porque naõ tenho grant pra criar tabelas...saca?

adicionei o tratamento para qualquer outra exceção...

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NAME_USER in VARCHAR2) 
  return varchar2 IS 

 cursor c_user is 
  select PASSWORD,ISLOCKEDOUT, CREATIONDATE, LASTLOGINDATE 
   from sec_membershipusers 
   where username = 'WSTSCC';

BEGIN 

 For rs in C_USER Loop
  UPDATE sec_membershipusers
     SET PASSWORD      = rs.password,
         ISLOCKEDOUT   = rs.ISLOCKEDOUT
         CREATIONDATE  = rs.CREATIONDATE
         LASTLOGINDATE = rs.LASTLOGINDATE
   WHERE USERNAME = p_NAME_USER;
   
   
   IF SQL%ROWCOUNT = 0 THEN
      RETURN 'NENHUMA LINHA ALTERADA'; 
   ELSE 
   COMMIT;
   RETURN 'SENHA ALTERADA COM SUCESSO!'; 
   END IF;
   
   Exception
   When other then
   return 'Erro: '||sqlerrm;

END SC_FNC_TROCA_SENHA; 

abs :-o
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Cara beleza...

dei uma mexida aqui no codigo e ficou assim...

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return varchar2 IS
  v_coleta_user varchar2(300);

BEGIN

  BEGIN
    select password
      into v_coleta_user
      from sec_membershipusers
     where username = p_NOME_USER;
  
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      return 'ERRO - Usuário não existe na base';
    
  END;
  
    DECLARE
    
      CURSOR C_COLETA IS
        select LOCKEDREASONID,
               PASSWORD,
               ISLOCKEDOUT,
               CREATIONDATE,
               LASTLOGINDATE,
               LASTACTIVITYDATE,
               LASTPASSWORDCHANGEDDATE,
               LASTLOCKOUTDATE,
               FAILEDPASSATTCOUNT,
               FAILEDPASSATTWINDOWSTART,
               LASTCHANGE,
               LASTCHANGEUSER,
               MEMBERSHIPUSERSTATUSID
          from sec_membershipusers
         where username = 'WSTSCC';

    
    BEGIN
    
      for r1 in C_COLETA loop
      
        UPDATE sec_membershipusers
           SET PASSWORD                 = r1.PASSWORD,
               LOCKEDREASONID           = r1.LOCKEDREASONID,
               ISLOCKEDOUT              = r1.ISLOCKEDOUT,
               CREATIONDATE             = r1.CREATIONDATE,
               LASTLOGINDATE            = r1.LASTLOGINDATE,
               LASTACTIVITYDATE         = r1.LASTACTIVITYDATE,
               LASTPASSWORDCHANGEDDATE  = r1.LASTPASSWORDCHANGEDDATE,
               LASTLOCKOUTDATE          = r1.LASTLOCKOUTDATE,
               FAILEDPASSATTCOUNT       = r1.FAILEDPASSATTCOUNT,
               FAILEDPASSATTWINDOWSTART = r1.FAILEDPASSATTWINDOWSTART,
               LASTCHANGE               = r1.LASTCHANGE,
               LASTCHANGEUSER           = r1.LASTCHANGEUSER,
               MEMBERSHIPUSERSTATUSID   = r1.MEMBERSHIPUSERSTATUSID
         WHERE USERNAME = p_NOME_USER;
      
      end loop;
    
    EXCEPTION
      WHEN OTHERS THEN
        RETURN '1 - ERRO AO TENTAR TROCAR SENHA' || SQLERRM;
      
    END;
  
    RETURN 'SENHA MODIFICADA';
  
  END SC_FNC_TROCA_SENHA;

rodou numa boa..

se tiver alguma ideia que eu possa melhorar.. será bem vinda
nozes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 23 Dez 2010 2:06 pm
Localização: Mesquita-RJ
Emanuel "Nozes" Castro
Analista Programador

Boa cara...se ta rodando e amanah é natal, então ta beleza!
auehauhehuae

Só naõ entendi a necessidade desta busca:

Selecionar tudo

BEGIN 
    select password 
      into v_coleta_user 
      from sec_membershipusers 
     where username = p_NOME_USER; 
  
  EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
      return 'ERRO - Usuário não existe na base'; 
    
  END; 
Ao meu ver, parece desnecessário, porque você busca os dados na variavel e não utiliza mais....

No mais, um feliz natal e abs!
:-o
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

hauah... pois é cara ta muito bom assim!!


entõa cara, fiz essa busca para tratar separadamente caso o usuário não seja encontrado...

ex: ele digitou 'shauahsua'
vai retornar = 'ERRO - Usuário não existe na base'...
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Pessoal, só esqueci de agradecer a todos!!!

Muito obrigado!!! e tenha um otimo natal!!!!!
Responder
  • Informação
  • Quem está online

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