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;