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