Dados de tabelas diferentes

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.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

Olá a todos
tenho um package e dentro dela estou criando duas procedure
O primeiro verifica no banco senha e usuario eo segundo as permissões

minha duvida e a seguinte como faço para pegar um dado que esta na primeira procedure e usar na segunda ? exemplo.
tem esse parametros de entrada e saida

Selecionar tudo

(P_CD_SENHA          IN   VARCHAR2       ,
          P_DC_EMAIL_PESSOA   IN   VARCHAR2  ,
          P_CD_PESSOA        OUT   NUMBER ,--->quero utilizar essa parametro
          P_SQL_CODE         OUT   NUMBER     ,
          P_SQL_MSG          OUT  VARCHAR2 )
gostaria de utilizar o P_cd_pessoa que ira retorna um dado na minha segunda procedure isso e possivel ?
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

Sim !

você pode chamar a primeira procedure dentro da segunda sem nenhum problema, mais é claro que você precisaria de ter os parametros de entrado na segunda procedure também...

:D
Julian Campagnoli
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 26 Fev 2008 11:33 am
Localização: MG e SP

Pelo que entendi ... você quer chamar a segunda procedure e passar o parametro P_CD_PESSOA OUT NUMBER


Codigo
/* Dentro da PRIMEIRA_PROC chama a segunda normalmente e passa parametro que você quer usar */

Selecionar tudo

     SEGUNDA_PROC(p1 , p2 , pn);

Obs.: você esta retornando os parametro (P_CD_PESSOA OUT NUMBER , ... , ). não entendi a finalidade desse retorno se você quer chamar a segunda procedure estando dentro da primeira.

Abraço
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

esse parametro ira retorna um numero ex:3525252 o que eu quero e pegar esse parametro de saida e usa-lo na proc 2 para compara com a coluna "tal" que contem esse dado
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Você chama a proc2 dentro da proc1?
Elas estão dentro da mesma PACKAGE?

Caso negativo, você chama a primeira, guarda o valor desta variável OUT da primeira procedure.

Chama a segunda procedure, com essa variável de parâmetro.
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

Então não esta funcionando o que eu quero fazer segue a proc

Selecionar tudo

          
          SELECT USR_CD 
          INTO P_CD_PESSOA
          FROM T_AS_PMS_USR
          WHERE USR_CD = P_USR_CD
          AND  P_USR_CD =  P_CD_PESSOA
PS: E melhor inserir um IF nessa proc ?
muito obrigado mais um vez abraço
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

bom dia Travelli

As duas proc estão dentra da mesma package
estou chamando um parametro da proc 1 de da proc2 essa ea P_cd_pessoa
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Então, na variável que recebe o OUT na proc 1, faz um teste: Dá um DBMS_OUTPUT do valor dela, talvez esteja vindo nulo.

Na proc 2, é só fazer a chamada (IN) com essa variável.
qualquer coisa, coloque um trecho do código pra ente analisar.
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

aqui esta todo o codigo

Selecionar tudo

create or replace package body PKG_EC_LOGIN is
-- PACKAGE IRA SELECIONAR USUARIO E SENHA
-- CASO TENHA USUARIO E SENHA A PAGINA SERÁ DIRECIONADO 
-- CASO NÃO ENCONTRE IRA APARECER UMA MENSAGEM DE ERRO 
-- "USUARIO E SENHA INVALIDA"
--============================================================
PROCEDURE EC_LOGIN(P_CD_SENHA          IN   VARCHAR2                ,
                   P_DC_EMAIL_PESSOA   IN   VARCHAR2                ,
                   P_CD_PESSOA        OUT   NUMBER                  ,
                   P_SQL_CODE         OUT   NUMBER                  ,
                   P_SQL_MSG          OUT  VARCHAR2                 )
 IS
  BEGIN
     P_SQL_CODE := 0 ;
     P_SQL_MSG  := '';
     
       SELECT A.CD_PESSOA
       INTO   P_CD_PESSOA  
       FROM   T_EMAIL_PESSOA A,
              T_PESSOA       B 
       WHERE A.CD_PESSOA       = B.CD_PESSOA
       AND   B.CD_SENHA        = P_CD_SENHA
       AND   A.DC_EMAIL_PESSOA = P_DC_EMAIL_PESSOA
        ;
  EXCEPTION 
       WHEN OTHERS THEN 
         P_SQL_CODE :=SQLCODE;
         P_SQL_MSG  :='USUARIO OU SENHA INVALIDA !!';
          
END EC_LOGIN;
--==============================================================
--PACKAGE IRA VERIFICAR SE USUARIO TEM OU NÃO PERMISSÃO 
PROCEDURE EC_PERMISSAO(P_USR_CD           IN  VARCHAR2    ,
                       P_CD_PESSOA        IN   NUMBER     ,
                       P_SQL_CODE         OUT NUMBER      ,
                       P_SQL_MSG          OUT VARCHAR2    )
  IS
   BEGIN
     P_SQL_CODE := 0 ;
     P_SQL_MSG  := '';
     
          SELECT USR_CD
          INTO P_CD_PESSOA
          FROM T_AS_PMS_USR
          WHERE USR_CD = P_USR_CD
          ;     
     EXCEPTION
          WHEN OTHERS THEN
          P_SQL_CODE  := SQLCODE;
          P_SQL_MSG   := 'USUARIO SEM PERMISSAO!' ;                           
          
END EC_PERMISSAO; 
--==================================================================         
end PKG_EC_LOGIN;
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

Então Trevisolli

E como fica o select?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Segue abaixo um exemplo de como devem ser as chamadas:

Selecionar tudo

DECLARE 
  vcd_pessoa NUMBER(10);
  vsql_code  NUMBER(10);
  vsql_msg   VARCHAR2(1000); 
BEGIN 
  -- Chamada da primeira procedure
  PKG_EC_LOGIN.EC_LOGIN(P_CD_SENHA          => '123456'                   , 
                        P_DC_EMAIL_PESSOA   => 'paulotrevisolli@ig.com.br', 
                        P_CD_PESSOA         => vcd_pessoa                 , 
                        P_SQL_CODE          => vsql_code                  , 
                        P_SQL_MSG           => vsql_msg                   ) ;

  -- Chamada da segunda procedure com variável da primeira
 PKG_EC_LOGIN. EC_PERMISSAO(P_USR_CD           => 'Teste'      , 
                            P_CD_PESSOA        => vcd_pessoa   ,  -- variável OUT da procedure 1 
                            P_SQL_CODE         => vsql_code    , 
                            P_SQL_MSG          => vsql_msg    ) ;
                        
END;  
Só uma dica importante: Na tua primeira procedure "EC_LOGIN", você não tratou "NO_DATA_FOUND", seria interessante realizar essa validação, posto que você utiliza o retorno dela na segunda procedure, apenas para se situar.
Percebi que quando der NO_DATA_FOUND, vai cair no OTHERS e, não vai passar na chamada da segunda procedure, daí você não consegue identificar o porquê.
Qualquer coisa dá um alo.
eduardo.d2
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 67
Registrado em: Ter, 08 Jan 2008 9:13 pm
Localização: são paulo
Eduardo Andrade

Então fiz como você falou

coloque o NO_DATA_FOUND na proc1

Selecionar tudo

EXCEPTION 
       WHEN NO_DATA_FOUND THEN 
         P_SQL_CODE :=SQLCODE;
         P_SQL_MSG  :='USUARIO OU SENHA INVALIDA !!';
Alterei o parametro da proc2

Selecionar tudo

P_CD_PESSOA        OUT   NUMBER


mas agora esta retornando o seguinte erro

Selecionar tudo

Error: PLS-00323: o subprograma ou o cursor 'EC_PERMISSAO' está declarado em uma especificação de pacote e deve ser definido no texto
Valeu mais uma vez pela a ajuda

PS: Seria legal colocar o NO_DATA_FOUND, na proc2 também ?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Eu acho interessante, caso você saiba da situação que possa ocorrer, sempre tratá-la sim...
Acho, particularmente, que fica mais fácil a resolução dos problemas e, um código mais limpo e correto.
Mas, é apenas uma dica... eu costumo, nos SELECTS, sempre tratar o NO_DATA_FOUND.
qualquer coisa, manda pra gente.
Responder
  • Informação
  • Quem está online

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