A procedure está em Oracle!

O erro que eu reportei a vocês já foi resolvido, eu estava fazendo a chamada da
procedure no lugar errado. É pq a procedure precisa ser recursiva.
Porém estou com um novo erro na hora da compilação:

PLS-00103: Encountered the symbol "P_CALCULA_SALDO_ESTOQUE" when expecting one
of the following:       := . ( @ % ;  The symbol ":=" was substituted for
"P_CALCULA_SALDO_ESTOQUE" to continue.

Parece q ainda tem alguma coisa errada na chamada da procedure.

(Leonardo, estou enviando uma cópia em anexo)

Citando leonardo braga <[EMAIL PROTECTED]>:

> TEM COMO VC ME MANDAR UMA CÓPIA DA TUA PROCEDURE?
>
>
> Leonardo Braga
> Programador
> [EMAIL PROTECTED]
> Site: Volta Redonda RJ
> (24) 3342-8743
> CPM S/A Tecnologia criando valor.
> http://www.cpm.com.br
>
> ----- Original Message -----
> From: <[EMAIL PROTECTED]>
> To: "Lista Centura" <sqlwin@virtualand.net>
> Sent: Tuesday, April 11, 2006 2:58 PM
> Subject: [sqlwin] procedure no Oracle
>
>
> Amigos,
>
> Na procedure que estou tentando criar retorna o seguinte erro:
>
> ORA-06550: line 1, column 32:
> PLS-00201: identifier 'MOVI_COD' must be declared
> ORA-06550: line 1, column 7:
> PL/SQL: Statement ignored
>
> Mas a variável MOVI_COD, que eu passo por parâmetro, já está declarada! Por
> isso
> não sei como proceder.
> Tentei utilizar o comando 'SHOW ERRORS procedure' para detalhar o erro, mas
> curiosamente esse comando me retorna a mensagem: No errors for PROCEDURE.
>
> alguém teria um exemplo de uma procedure com passagem de parâmetros?
> pois pelos exemplos que disponho não encontrei nenhum erro de sintaxe.
>
> grato.
>
>
>
>
>
>
>
>
>
> ==============================================
> Lista de Centura SQLWindows
> Administrador : [EMAIL PROTECTED]
> [ http://www.centuraexplorer.com ]
> Para sair desta lista mande mensagem para:
> [EMAIL PROTECTED] sem nada no Subject e
> com o comando a seguir no corpo da msg:
> "unsubscribe sqlwin" (sem as aspas)
> ==============================================
>
> ==============================================
> Lista de Centura SQLWindows
> Administrador : [EMAIL PROTECTED]
> [ http://www.centuraexplorer.com ]
> Para sair desta lista mande mensagem para:
> [EMAIL PROTECTED] sem nada no Subject e
> com o comando a seguir no corpo da msg:
> "unsubscribe sqlwin" (sem as aspas)
> ==============================================
>



-- COM PARAMETRO
CREATE  OR REPLACE PROCEDURE P_CALCULA_SALDO_ESTOQUE (pnMoviCod 
NUMBER,pdMoviData date,pnMoviTimoCod NUMBER, 
                                                      psTimoTipoEntsai 
VARCHAR2,pnMoitQtd NUMBER, 
                                                      pnMoitValorUnitario 
NUMBER, pnMoitMateCod NUMBER, 
                                                      pnMoitAlmoCod NUMBER, 
pnMoitCod NUMBER, 
                                                      pnFatorConversao NUMBER) 
IS 
MaxMoviCod NUMBER(8);
MaxMoviCod1 NUMBER(8);
MaxMoviCod2 NUMBER(8);
MaxMoviData DATE;
MoitQtdEnt NUMBER(14,3);
MoitQtdSaida NUMBER(14,3);
MoitSaldo NUMBER(14,3);
MoitCustoMedio NUMBER(14,4);
VarAuxMoviMesmaData NUMBER(1);
NovoCustoMedio NUMBER(14,4);

CURSOR C_DATA_MAX IS
SELECT MAX(MOVI_DATA), DECODE(MAX(MOVI_DATA),pdMoviData, 1,null,null,0) 
                            
FROM   MOVIMENTACAO,
       MOVIMENTACAO_ITEM

WHERE  MOVI_COD = MOIT_MOVI_COD
AND    (MOVI_DATA < pdMoviData
OR     (MOVI_DATA = pdMoviData and MOVI_COD < pnMoviCod) )
AND    MOIT_MATE_COD = pnMoitMateCod
AND    MOIT_ALMO_COD = pnMoitAlmoCod
AND    MOIT_QTD != 0
AND    MOIT_QTD IS NOT NULL;

BEGIN

 BEGIN

  OPEN C_DATA_MAX;
  FETCH C_DATA_MAX INTO  MaxMoviData, VarAuxMoviMesmaData;
  CLOSE C_DATA_MAX;
 
 END;
 
 DECLARE CURSOR C_MAX_COD1 IS
 SELECT MAX(MOVI_COD)
 FROM   MOVIMENTACAO,
       MOVIMENTACAO_ITEM
 WHERE  MOVI_COD = MOIT_MOVI_COD
 AND    MOVI_DATA = MaxMoviData
 AND    MOVI_COD < pnMoviCod
 AND    MOIT_MATE_COD = pnMoitMateCod
 AND    MOIT_ALMO_COD = pnMoitAlmoCod
 AND    MOIT_QTD != 0
 AND    MOIT_QTD IS NOT NULL;

 BEGIN
 
 OPEN C_MAX_COD1;
        FETCH C_MAX_COD1        INTO MaxMoviCod1;
 CLOSE C_MAX_COD1;
 
 END;
 
 
 DECLARE CURSOR C_MAX_COD2 IS
 SELECT MAX(MOVI_COD)
 
 FROM   MOVIMENTACAO,
        MOVIMENTACAO_ITEM
 
 WHERE  MOVI_COD = MOIT_MOVI_COD
 AND    MOVI_DATA = MaxMoviData
 AND    MOIT_MATE_COD = pnMoitMateCod
 AND    MOIT_ALMO_COD = pnMoitAlmoCod
 AND    MOIT_QTD != 0
 AND    MOIT_QTD IS NOT NULL;

 BEGIN
 
  OPEN C_MAX_COD2;
  FETCH C_MAX_COD2      INTO MaxMoviCod2;
  CLOSE C_MAX_COD2;
    
 END;
  
  MaxMoviCod := null;

  IF VarAuxMoviMesmaData = 1 then
         MaxMoviCod := MaxMoviCod1;
  ELSE
         MaxMoviCod := MaxMoviCod2;
  END IF;

 DECLARE CURSOR C_CUSTO IS
  SELECT 
       MOIT_CUSTO_MEDIO
 FROM   MOVIMENTACAO,
       MOVIMENTACAO_ITEM
 WHERE  MOVI_COD = MOIT_MOVI_COD
 AND    MOVI_COD = MaxMoviCod
 AND    MOIT_MATE_COD = pnMoitMateCod
 AND    MOIT_ALMO_COD = pnMoitAlmoCod
 AND    MOIT_QTD != 0
 AND    MOIT_QTD IS NOT NULL;
 BEGIN
 
  OPEN C_CUSTO;
         FETCH C_CUSTO
         INTO  
                MoitCustoMedio;
  CLOSE C_CUSTO;
  
 END; 
                
 DECLARE CURSOR C_SALDO IS
 SELECT SUM(MOIT_QTD)
 FROM   TIPO_MOVIMENTACAO,
       MOVIMENTACAO,
       MOVIMENTACAO_ITEM
 WHERE  TIMO_COD = MOVI_TIMO_COD
 AND    MOVI_COD = MOIT_MOVI_COD
 AND    MOIT_MATE_COD = pnMoitMateCod
 AND    MOIT_ALMO_COD = pnMoitAlmoCod
 AND    TIMO_TIPO_ENTSAI   = 'E'
 AND    MOIT_QTD != 0
 AND    MOIT_QTD IS NOT NULL
 AND    (MOVI_DATA < MaxMoviData
 OR     (MOVI_DATA = MaxMoviData and MOVI_COD <= MaxMoviCod) );
 
 BEGIN
 
  OPEN C_SALDO; 
        FETCH C_SALDO   INTO MoitQtdEnt;
  CLOSE C_SALDO; 
 
 END;

 DECLARE CURSOR C_SALDO2 IS
 SELECT SUM(MOIT_QTD)
 FROM   TIPO_MOVIMENTACAO,
       MOVIMENTACAO,
       MOVIMENTACAO_ITEM
 WHERE  TIMO_COD = MOVI_TIMO_COD
 AND    MOVI_COD = MOIT_MOVI_COD
 AND    MOIT_MATE_COD = pnMoitMateCod
 AND    MOIT_ALMO_COD = pnMoitAlmoCod 
 AND    TIMO_TIPO_ENTSAI   = 'S'
 AND    MOIT_QTD != 0
 AND    MOIT_QTD IS NOT NULL
 AND    (MOVI_DATA < MaxMoviData
 OR     (MOVI_DATA = MaxMoviData and MOVI_COD <= MaxMoviCod) );
 
 BEGIN
        
  OPEN C_SALDO2;
        FETCH C_SALDO2  INTO MoitQtdSaida;
  CLOSE C_SALDO2;

  IF MoitQtdEnt is NULL then 
              MoitQtdEnt := 0;
  END IF; 
    
  IF MoitQtdSaida is NULL then
              MoitQtdSaida := 0;
  END IF;
     
  IF MoitCustoMedio is NULL then
              MoitCustoMedio := 0;
  END IF;

  IF pnMoviTimoCod = 2 or pnMoviTimoCod = 6 or pnMoviTimoCod = 10 or 
pnMoviTimoCod = 8 then
  
       MoitSaldo := MoitQtdEnt - MoitQtdSaida;
    
             IF ( MoitSaldo < 0 ) or ( MoitSaldo is NULL ) then
                     MoitSaldo := 0;
       END IF;
       
             IF ( MoitSaldo + pnMoitQtd ) = 0 then
                     NovoCustoMedio := 0;
              
       ELSE
                     NovoCustoMedio := ((MoitSaldo * MoitCustoMedio) + 
(pnMoitQtd * pnFatorConversao * pnMoitValorUnitario)) / (MoitSaldo + pnMoitQtd);
      
       END IF;
      
          UPDATE MOVIMENTACAO_ITEM
            SET MOIT_CUSTO_MEDIO = NovoCustoMedio
            WHERE MOIT_COD = pnMoitCod;

                  UPDATE ESTOQUE
                  SET ESTO_CUSTO_MEDIO = NovoCustoMedio
                  WHERE ESTO_MATE_COD = pnMoitMateCod
                  AND ESTO_ALMO_COD = pnMoitAlmoCod;
    
  ELSE
      
      UPDATE MOVIMENTACAO_ITEM
            SET MOIT_CUSTO_MEDIO = MoitCustoMedio
            WHERE MOIT_COD = pnMoitCod;

            UPDATE ESTOQUE
                  SET ESTO_CUSTO_MEDIO = MoitCustoMedio
                WHERE ESTO_MATE_COD = pnMoitMateCod
                  AND ESTO_ALMO_COD =  pnMoitAlmoCod; 
      
  END IF;

 END;
 
 DECLARE CURSOR C_MOVIMENTACAO IS 
   SELECT  MOVI_COD,
           MOVI_DATA,
                 MOVI_TIMO_COD,
                 TIMO_TIPO_ENTSAI,
           MOIT_QTD, 
           MOIT_VALOR_UNITARIO,
                 MOIT_MATE_COD,
                 MOIT_ALMO_COD,
                 MOIT_COD,
                 MOIT_UNMA_COD,
                 MATE_UNMA_COD
   FROM    TIPO_MOVIMENTACAO,
                 MOVIMENTACAO,
                 MOVIMENTACAO_ITEM,
                 MATERIAL
   WHERE         MOVI_COD = MOIT_MOVI_COD
   AND     TIMO_COD = MOVI_TIMO_COD
   AND     MATE_COD = MOIT_MATE_COD

   ORDER BY MOVI_DATA, MOVI_COD;
 
  MOVI_COD NUMBER(8);
        MOVI_DATA DATE;
        MOVI_TIMO_COD NUMBER(5);
        TIMO_TIPO_ENTSAI VARCHAR2(1);
        MOIT_QTD NUMBER(14,3);
        MOIT_VALOR_UNITARIO NUMBER(14,4);
        MOIT_MATE_COD NUMBER(10);
        MOIT_ALMO_COD NUMBER(8);
        MOIT_COD NUMBER(8);
        cont NUMBER(8);
        MOIT_UNMA_COD NUMBER(3);
        MATE_UNMA_COD NUMBER(3);
        FatorConversao NUMBER(14,5);
  
  BEGIN
  
   OPEN C_MOVIMENTACAO;

   cont := 1;
  
   LOOP
   
       FETCH C_MOVIMENTACAO
       INTO  MOVI_COD,
             MOVI_DATA,
             MOVI_TIMO_COD,
             TIMO_TIPO_ENTSAI,
             MOIT_QTD, 
       MOIT_VALOR_UNITARIO,
             MOIT_MATE_COD,
             MOIT_ALMO_COD,
             MOIT_COD,
             MOIT_UNMA_COD,
             MATE_UNMA_COD;
   
   IF MOIT_UNMA_COD <> MATE_UNMA_COD THEN
   
      DECLARE CURSOR C_FATORCONVERSAO IS
   
      select taco.taco_fator_conversao
            from   tabela_conversao  taco 
            where  taco.taco_unma_cod_de = MOIT_UNMA_COD
            and    taco.taco_unma_cod_para = MATE_UNMA_COD;
  
      BEGIN
    
       OPEN  C_FATORCONVERSAO;
       FETCH C_FATORCONVERSAO INTO FatorConversao;
       CLOSE C_FATORCONVERSAO;
       
      END;
      
      IF FatorConversao = NULL OR FatorConversao = 0 THEN
     
           DECLARE CURSOR C_FATORCONVERSAO2 IS
           
           select taco.taco_fator_conversao
                                   from   tabela_conversao  taco 
                                   where  taco.taco_unma_cod_de = MATE_UNMA_COD
                             and    taco.taco_unma_cod_para = MOIT_UNMA_COD;
         
         BEGIN
           
           OPEN C_FATORCONVERSAO2;
           FETCH C_FATORCONVERSAO2 INTO FatorConversao;
           CLOSE C_FATORCONVERSAO2;
           
         END;
         
         IF FatorConversao <> NULL AND FatorConversao <> 0 THEN
        
                                FatorConversao := 1/FatorConversao;
                        
         END IF;
           
    END IF;  

   ELSE 
    
     FatorConversao := 1;
  
   END IF;
   
   EXEC P_CALCULA_SALDO_ESTOQUE( 
MOVI_COD,MOVI_DATA,MOVI_TIMO_COD,TIMO_TIPO_ENTSAI,MOIT_QTD,MOIT_VALOR_UNITARIO,MOIT_MATE_COD,MOIT_ALMO_COD,MOIT_COD,FatorConversao);
   
   cont :=cont + 1;
   
   EXIT WHEN C_MOVIMENTACAO%NOTFOUND;

 END LOOP;

  CLOSE C_MOVIMENTACAO;
   
 END;

END;
/

--EXEC P_CALCULA_SALDO_ESTOQUE;
--EXEC P_CALCULA_SALDO_ESTOQUE( 
MOVI_COD,MOVI_DATA,MOVI_TIMO_COD,TIMO_TIPO_ENTSAI,MOIT_QTD,MOIT_VALOR_UNITARIO,MOIT_MATE_COD,MOIT_ALMO_COD,MOIT_COD,FatorConversao);
SHOW ERRORS procedure P_CALCULA_SALDO_ESTOQUE;

Responder a