Era isso mesmo, obrigado pela dica!

Citando Erasmo <[EMAIL PROTECTED]>:

> Geofrey,
>
> Dentro de um bloco PLSQL, a execução de uma procedure necessita apenas
> do nome dela, o comando EXEC é um comando do SQLPLUS, retire o EXEC.
> Acredito que este seja o motivo do erro.
>
> Agora vai uma dica, notei que em todos os seus selects você declara
> cursores, mesmo buscando uma única linha, isso não é necessário, o
> Oracle trabalha com cursores implicitos, por exemplo:
>
> *           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;
> *
> Este bloco inteiro de código pode ser substituido por um select simples:
>
> *           select taco.taco_fator_conversao into **FatorConversao*
> *                   from   tabela_conversao  taco
>                    where  taco.taco_unma_cod_de = MATE_UNMA_COD
>                  and    taco.taco_unma_cod_para = MOIT_UNMA_COD;
> *
> Sds,
> Erasmo
>
> --
>
> Erasmo Bispo de Oliveira Junior
> Gerente de Pesquisa e Desenvolvimento
> Softway - Softcomex Informática Ltda.
> Pabx:   +55 (19) 3739.9200
> Direto: +55 (19) 3739.9361
> Fax:    +55 (19) 3739.9240
> e-mail: [EMAIL PROTECTED]
> web:    http://www.softcomex.com.br
>
>
> [EMAIL PROTECTED] wrote:
> > 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;
> >
> >
>
>
>



==============================================
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)
==============================================

Responder a