grato,
Leonardo Lopes
PROCEDURE TESTE
IS
nrchamada VARCHAR2(20);
contador NUMBER;
maiorCodigo NUMBER;
codigo NUMBER;
tamanho NUMBER;
ultimo NUMBER;
testes BOOLEAN;
codigoUnidade NUMBER;
acervo TB_BIBLIOTECA%ROWTYPE;
acervoUnidade TB_BIBLIOTECA%ROWTYPE;
aux TB_BIBLIOTECA%ROWTYPE;
BEGIN
DECLARE
BEGIN
testes:=TRUE;
codigoUnidade:=null;
WHILE testes
LOOP
maiorCodigo:=0; -- Pega valor do maior
testes:=false;
FOR acervo IN (SELECT COUNT (CDBIBLIOTECA),CDUNIDADE , NRCHAMADA FROM TB_BIBLIOTECA where cdunidade=642 GROUP BY CDUNIDADE,NRCHAMADA HAVING COUNT (CDBIBLIOTECA)>1)
LOOP
--Verificando se o codigo da unidade alterou para começar o contador novamente
if codigoUnidade is null
then
codigoUnidade:=acervo.CDUNIDADE;
contador:=0;-- Conta se é o primeiro com essa chamada
ultimo:=0;-- Pega o valor do maior nrchamada depois da
elsif codigoUnidade<> acervo.CDUNIDADE then
codigoUnidade:=acervo.CDUNIDADE;
contador:=0;-- Conta se é o primeiro com essa chamada
ultimo:=0;-- Pega o valor do maior nrchamada depois da
end if;
testes:=true;
FOR acervoUnidade IN (SELECT * FROM TB_BIBLIOTECA WHERE CDUNIDADE=acervo.CDUNIDADE AND NRCHAMADA=acervo.NRCHAMADA ORDER BY CDBIBLIOTECA)
LOOP
IF contador='0' THEN
contador:=contador+1;
ELSE
IF ultimo='0' THEN
SELECT * INTO aux FROM TB_BIBLIOTECA WHERE CDBIBLIOTECA= (SELECT MAX(CDBIBLIOTECA) FROM TB_BIBLIOTECA WHERE CDUNIDADE=acervoUnidade.CDUNIDADE);
ultimo:=aux.CDBIBLIOTECA;
maiorCodigo:= TO_NUMBER(SUBSTR(TO_CHAR (aux.NRCHAMADA),1,4));
maiorCodigo:= maiorCodigo +1;
tamanho:= LENGTH (TO_CHAR(maiorCodigo));
IF (tamanho='1')THEN
nrchamada:='000'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSIF (tamanho='2') THEN
nrchamada:='00'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSIF (tamanho='3') THEN
nrchamada:='0'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSE
nrchamada:=TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
END IF;
UPDATE TB_BIBLIOTECA SET TB_BIBLIOTECA.NRCHAMADA= nrchamada WHERE TB_BIBLIOTECA.CDBIBLIOTECA=acervoUnidade.CDBIBLIOTECA AND TB_BIBLIOTECA.CDUNIDADE= acervoUnidade.CDUNIDADE AND TB_BIBLIOTECA.CDDR=acervoUnidade.CDDR AND TB_BIBLIOTECA.NRCHAMADA= acervoUnidade.NRCHAMADA;
COMMIT;
EXIT;
ELSE
SELECT * INTO aux FROM TB_BIBLIOTECA WHERE CDBIBLIOTECA= ultimo;
maiorCodigo:= TO_NUMBER(SUBSTR(TO_CHAR (aux.NRCHAMADA),1,4));
maiorCodigo:= maiorCodigo +1;
tamanho:= LENGTH (TO_CHAR(maiorCodigo));
IF (tamanho='1')THEN
nrchamada:='000'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSIF (tamanho='2') THEN
nrchamada:='00'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSIF (tamanho='3') THEN
nrchamada:='0'||TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
ELSE
nrchamada:=TO_CHAR (maiorCodigo)||SUBSTR(acervoUnidade.NRCHAMADA,5,7);
END IF;
--UPDATE TB_BIBLIOTECA SET TB_BIBLIOTECA.NRCHAMADA= nrchamada WHERE TB_BIBLIOTECA.CDBIBLIOTECA=acervoUnidade.CDBIBLIOTECA AND TB_BIBLIOTECA.CDUNIDADE= acervoUnidade.CDUNIDADE AND TB_BIBLIOTECA.CDDR=acervoUnidade.CDDR AND TB_BIBLIOTECA.NRCHAMADA= acervoUnidade.NRCHAMADA;
--COMMIT;
EXIT;--SAINDAO DO TERCEIRO LOOP
END IF;
END IF;
END LOOP;
EXIT;--SAINDO DO SEGUNDO LOOP
END LOOP;
UPDATE TB_BIBLIOTECA SET TB_BIBLIOTECA.NRCHAMADA= nrchamada WHERE TB_BIBLIOTECA.CDBIBLIOTECA=acervoUnidade.CDBIBLIOTECA AND TB_BIBLIOTECA.CDUNIDADE= acervoUnidade.CDUNIDADE AND TB_BIBLIOTECA.CDDR=acervoUnidade.CDDR AND TB_BIBLIOTECA.NRCHAMADA= acervoUnidade.NRCHAMADA;
COMMIT;
END LOOP;
END;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line ('ERRO');
END TESTE; -- Procedure