Colega, com absoluta certeza um simples erro de datatype *** não *** 
invalida uma stored procedure, o que deixa uma procedure de banco 
inválida é QUALQUER alteração nos objetos de que ela depende, seja 
DDL nesses objetos, seja alteração por outros meios. O que vc ** TEM 
** que estar ciente, e que é algo amplamente comentado nos manuais de 
PL/SQL, é a dependência em cascata, ie, se uma alteração qquer deixa 
um objeto X inválido, em X ficando inválido AUTOMATICAMENTE ** todos 
** que dependem de X ficam inválidos também. Exemplo (em banco 9ir2 
EE mas é o mesmo pro XE, iirc) :


[EMAIL PROTECTED]:SQL>create function F_CONTA_TAB_P return number is
  2     x number;
  3  BEGIN
  4     select count(*) into x from TAB_P;
  5     return x;
  6  END;
  7  /

Função criada.

[EMAIL PROTECTED]:SQL>create or replace procedure P2 is
  2     y   number;
  3  BEGIN
  4     y := F_CONTA_TAB_P;
  5  .
[EMAIL PROTECTED]:SQL>create or replace procedure P2 (P_DATA in date) is
  2     y   number;
  3  BEGIN
  4     y := F_CONTA_TAB_P;
  5  END;
  6  /

Procedimento criado.

[EMAIL PROTECTED]:SQL>create or replace procedure P1 (P1_DATA in DATE) is
  2   BEGIN
  3      P2(P1_DATA);
  4  END;
  5  /

Procedimento criado.

==> ok, verificando o status :

[EMAIL PROTECTED]:SQL>select object_type, object_name, status from 
all_objects where object_name in ('P1', 'P2', 'F_CONTA_TAB_P');

OBJECT_TYPE        OBJECT_NAME                    STATUS
------------------ ------------------------------ -------
FUNCTION           F_CONTA_TAB_P                  VALID
PROCEDURE          P1                             VALID
PROCEDURE          P2                             VALID

==> executo sem erros :

[EMAIL PROTECTED]:SQL>exec P1(sysdate);

Procedimento PL/SQL concluído com sucesso.

[EMAIL PROTECTED]:SQL>select object_type, object_name, status from 
all_objects where object_name in ('P1', 'P2', 'F_CONTA_TAB_P');

OBJECT_TYPE        OBJECT_NAME                    STATUS
------------------ ------------------------------ -------
FUNCTION           F_CONTA_TAB_P                  VALID
PROCEDURE          P1                             VALID
PROCEDURE          P2                             VALID

==> agora vou executar e receberei erro de datatype , já que não 
existe dia 32 :

[EMAIL PROTECTED]:SQL>exec P1(to_date('32/12/2007', 'dd/mm/yyyy'));
BEGIN P1(to_date('32/12/2007')); END;

*
ERRO na linha 1:
ORA-01847: dia do mês deve ser um valor entre 1 e o último dia do mês
ORA-06512: em line 1

==> ora veja, o status *** NÃO MUDOU ***, como nNÂO FAZ SENTIDO ter 
mudado :

[EMAIL PROTECTED]:SQL>select object_type, object_name, status from 
all_objects where object_name in ('P1', 'P2', 'F_CONTA_TAB_P');

OBJECT_TYPE        OBJECT_NAME                    STATUS
------------------ ------------------------------ -------
FUNCTION           F_CONTA_TAB_P                  VALID
PROCEDURE          P1                             VALID
PROCEDURE          P2                             VALID


==>>> AGORA vou fazer uma ** ALTERAÇÃO ** numa dependência indireta :

[EMAIL PROTECTED]:SQL>drop table TAB_P;

Tabela eliminada.

==> PRONTO, F_CONTA_TAB_P precisava do objeto TAB_P, não existe mais 
(ou não tem acesso, enfim, não conseguiu mais resolver a 
dependência) , F_CONTA_TAB_P ficou inválido. Isso acontecendo, temos 
que P2 precisava de F_CONTA_TAB_P, com F_CONTA_TAB_P inválido P2 
ficou inválido, e vaid daí que P1 precisava de P2, P2 ficando 
inválido automaticamente P1 não tema mais o que precisa, invalida 
também.... Veja só :

[EMAIL PROTECTED]:SQL>select object_type, object_name, status from 
all_objects where object_name in ('P1', 'P2', 'F_CONTA_TAB_P');

OBJECT_TYPE        OBJECT_NAME                    STATUS
------------------ ------------------------------ -------
FUNCTION           F_CONTA_TAB_P                  INVALID
PROCEDURE          P1                             INVALID
PROCEDURE          P2                             INVALID

===>>> OK ??? Então é isso, com quase ABSOLUTA certeza, alguém (seja 
um humano, seja um proggrama - via job, trigger ou execução direta, 
não importa), seja middleware mal-comportado, enfim, , alguém/algo 
está invalidando  um componente que era preciso pros seus 
programas... Pra vc saber, já que é algo 100% ** ESPECÍFICO ** do seu 
ambiente, a única opção é mesmo um trabalho de DEBUG, ie, com tudo 
válido vc executar passo-a-passo a tal rotina, consultando o status 
como eu fiz acima, pra vc descobrir quem/o que é. Pelo jeito, talvez 
alguma das rotinas que a tua proc chama faça DDL, aí quando vc não 
passa um datatype correto o DDL falha e deixa tudo como invalid, acho 
que é por aí.....

[]s

 Chiappa
 
--- Em oracle_br@yahoogrupos.com.br, Elias Magalhães da Paixão Junior 
<[EMAIL PROTECTED]> escreveu
>
> Pessoal,
> 
>  
> 
> Reparei que as procedures estão ficando inválidas sozinhas. A única 
coisa q
> fiz, foi executa-las e tomei alguns erros normais. String onde era 
inteiro,
> data inválida, esses lances. Minha pergunta é: Tomar um erro numa 
procedure
> Válida a faz se tornar inválida? Se não, o que faz então?
> 
>  
> 
> Elias Magalhães da Paixão Junior
> 
> ___________________________________
> 
> Análise de Sistemas e Banco de Dados
> 
> Consultoria e desenvolvimento de programas, sistemas e websites
> 
> Tel.: (0XX21) 8262-7955
> 
>  
> 
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a