Problemas no update em uma procedure

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Leonardo da Costa Lopes
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 20 Ago 2008 1:07 pm
Localização: Brasília

Olá pessoal, meu nome Leonardo e estou com problemas em fazer com que a minha procedure faça atualização na tabela especificada, alguém poderia me dizer o porque?

grato,

Leonardo Lopes

Selecionar tudo

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

Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5026
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Cara...dificilmente alguém aqui vai ter tempo pra resolver um problema como esse.
Tipo, o forum é destinado a ajudar as pessoas com dificuldades específicas...
Mas no seu caso, está muito genérico! você basicamente disse assim: "Pessoal, estou com um problema, me ajudem"...

* Não disse ONDE está o problema (qual linha)
* se deu erro ou não
* não sabemos a estrutura das suas tabelas
* não sabemos o contexto nem o conteúdo das tabelas

Sugiro você debugar sua procedure e tentar um pouco mais... Enche ela de DBMS_OUTPUT ou alguma outra forma pra descobrir o problema! :shock:
Leonardo da Costa Lopes
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 20 Ago 2008 1:07 pm
Localização: Brasília

então já debugei, os dados vao certo para a linha
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;

so que a procedure não atualiza, dai por isso eu coloquei todo o codigo. O codigo compila direitinho. Parece como se executasse uma query e não commitasse. Alguma ideia?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5026
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Sugiro fazer um DBMS_OUTPUT das seguintes variáveis:

nrchamada (pra saber o valor que ele está fazendo o update)

acervoUnidade.CDBIBLIOTECA
acervoUnidade.CDUNIDADE
acervoUnidade.CDDR
acervoUnidade.NRCHAMADA

e também fazer um DBMS_OUTPUT.put_line (SQL%ROWCOUNT); depois do update.
:-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Bing [Bot], Google [Bot] e 1 visitante