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;
|