Passando parametro para o cursor na trigger

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
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Pessoal, estou passando parametro para o cursor mas está me dando erro de variável de ligação inválida. Alguém pode me ajudar? o código está à baixo.

Selecionar tudo

declare 

    CURSOR C_PEDIDOS (P_MAT_CD IN CHAR, P_PED_ORG_ID IN number) IS
    
        SELECT NUMERO_PEDIDO
              ,MAT_CD
              ,PEDIDO_QTD
              ,PED_ORG_ID
        FROM   PEDIDOS_SRP a
        WHERE  MAT_CD     = P_MAT_CD
        AND    PED_ORG_ID = P_PED_ORG_ID
        AND    PED_AGL_SEQUENCIAL IS NULL
        and    PRO_PRO_SEQUENCIAL IS NULL
        and    not exists (select 1 from PEDIDOS_SRP_aud p
                          where  p.numero_pedido    = a.numero_pedido
                           and   PED_AGL_SEQUENCIAL IS NOT NULL);

BEGIN

    IF INSERTING  THEN

/*       está me dando erro nesta linha, quando eu abro o cursor, eu coloquei o segundo parametro ":new.ped_org_id" aí ele me dá erro váriável de ligação inválida.*/
       OPEN C_PEDIDOS (:NEW.mat_cd, :new.ped_org_id);
       FETCH C_PEDIDOS INTO R_PEDIDOS;
.
.
.
.
.
.
.
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai Cleber beleza??

cara, você poderia colar aqui o codigo da trigger ou o código do erro que está aparecendo??

[]'s
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Amigão, aí está. esta trigger já funcionava perfeitamente, o que eu fiz foi incluir mais um parametro para o cursor juntamente com mais uma variável de ligação no insert e update ":new.PED_ORG_ID" aí é onde está o erro.


Selecionar tudo

CREATE OR REPLACE TRIGGER evo_lic_srp_trg_03
 BEFORE
  INSERT OR DELETE
 ON planilha_pedidos_srp
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
DECLARE

    CURSOR C_PEDIDOS (P_MAT_CD IN CHAR, P_PED_ORG_ID IN number) IS
    
        SELECT NUMERO_PEDIDO
              ,MAT_CD
              ,PEDIDO_QTD
              ,PED_ORG_ID
        FROM   PEDIDOS_SRP a
        WHERE  MAT_CD     = P_MAT_CD
        AND    PED_ORG_ID = P_PED_ORG_ID
        AND    PED_AGL_SEQUENCIAL IS NULL
        and    PRO_PRO_SEQUENCIAL IS NULL
        and    not exists (select 1
                             from PEDIDOS_SRP_aud p
                            where p.numero_pedido    = a.numero_pedido
                              and PED_AGL_SEQUENCIAL IS NOT NULL);

    R_PEDIDOS C_PEDIDOS%ROWTYPE;


BEGIN

    IF INSERTING  THEN

       OPEN C_PEDIDOS (:NEW.mat_cd, :NEW.ped_org_id);
       FETCH C_PEDIDOS INTO R_PEDIDOS;
       
           IF C_PEDIDOS%FOUND AND :NEW.ST_SOMA = 'S' THEN
              :new.numero_pedido := R_PEDIDOS.numero_pedido;
              BEGIN
                  UPDATE pedidos_SRP
                  SET    pedido_qtd    = pedido_qtd + :new.pedido_qtd
                  WHERE  mat_cd        = :new.MAT_CD
                  and    ped_org_id    = :new.PED_ORG_ID
                  AND    numero_pedido = :new.numero_pedido;
              END;
           ELSE
              BEGIN
                  INSERT INTO pedidos_srp
                  (
                   numero_pedido ,
                   pedido_qtd ,
                   mat_cd ,
                   mat_ds ,
                   pro_pro_sequencial ,
                   pro_pro_ano,
                   ped_org_id
                  )
                  VALUES
                  (
                   R_SEQ_PEDIDOS.NUMERO_PEDIDO ,
                   :NEW.PEDIDO_QTD,
                   :new.mat_cd ,
                   :new.mat_ds ,
                   null ,
                   null ,
                   :new.ped_org_id
                  );
              END;
           END IF;
           
       CLOSE C_PEDIDOS;
       
       
    END IF;
    
    END LOOP;
END;
/
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Cara, não conseguir ver erro na trigger não..
você chegou a tentar mudar o cursor, tirando os parametros dele e jogando direto os valores da trigger, tipo isso aqui..???

Selecionar tudo

    SELECT NUMERO_PEDIDO, MAT_CD, PEDIDO_QTD, PED_ORG_ID
      FROM PEDIDOS_SRP a
     WHERE MAT_CD     = :NEW.mat_cd
       AND PED_ORG_ID = :NEW.ped_org_id
         .
         .
         .
         .
         .
         .
[]'s
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

fiz o que você falou, aí o erro está sendo exatamente nessa linha:

Selecionar tudo

AND PED_ORG_ID = :NEW.ped_org_id 

dando variável de ligação inválida.
O nome está correto mas o erro persiste.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Por acaso a tabela planilha_pedidos_srp possui um campo com o nome PED_ORG_ID?

(À primeira vista parece ser esse o problema..)
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Uma coisa que achei estranho, talvez não seja o erro mas, poderia ser feito de outra forma:

No código:

Selecionar tudo

:new.numero_pedido := R_PEDIDOS.numero_pedido; 
BEGIN 
UPDATE pedidos_SRP 
SET pedido_qtd = pedido_qtd + :new.pedido_qtd 
WHERE mat_cd = :new.MAT_CD 
and ped_org_id = :new.PED_ORG_ID 
AND numero_pedido = :new.numero_pedido; 
Você diz que :NEW.NUMERO_PEDIDO recebe o valor do teu cursor (R_PEDIDOS.numero_pedido).

E depois utiliza este :NEW.NUMERO_PEDIDO na tua cláusula where:

Selecionar tudo

AND numero_pedido = :new.numero_pedido; 
Tenta passar direto no teu where:

Selecionar tudo

AND numero_pedido = R_PEDIDOS.numero_pedido;
Qualquer coisa, manda pra gente.
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Rafael,

quando você compila não é apresentado nenhum erro ORA-NNNNNN ???

[]'s
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Outra coisa que deve ser analisada neste código, brother, é o seguinte:

Você fecha um LOOP e, no teu cursor, não tem abertura deste LOOP.

Selecionar tudo

OPEN C_PEDIDOS (:NEW.mat_cd, :NEW.ped_org_id); 
FETCH C_PEDIDOS INTO R_PEDIDOS; 

IF C_PEDIDOS%FOUND AND :NEW.ST_SOMA = 'S' THEN 
....

Selecionar tudo

END IF; 

END LOOP; 
END; 
/ 
Editado pela última vez por Trevisolli em Ter, 06 Nov 2007 7:33 am, em um total de 1 vez.
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Não dar nenhum erro Ora.
O erro é o seguinte:

Selecionar tudo

PLS-00049: variável de ligação 'new.ped_org_id' inválida
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Na tabela planilha_pedidos_srp não possui um campo com o nome PED_ORG_ID.
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Poxa,
nem havia perguntado isso hehehe

[]'s
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

rESOLVIDO, O PROBLEMA ERA QUE NÃO TINHA O CAMPO ped_org_id NA TABELA planilha_pedidos_srp. estou dando manutenção em sistema e estou garimpando, é difícil mas está indo. valeu galera pelo apoio.
rafaelsouza
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 07 Nov 2007 2:04 pm
Localização: Santo Andre - SP

o erro que dava era a resposta exatamente a resposta que você procurava,
mais claro que isso , só se ele criar o campo automaticamente pra você :D
cleberzumba
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 223
Registrado em: Qui, 14 Dez 2006 10:45 am
Localização: Brasília-DF
Cleber Zumba de Souza

Relaxa meu rafaelsouza, da próxima vez dispenso sua ajuda e seus comentários.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes