Problemas com UPDATE

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
zuquinha123
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 05 Dez 2007 2:53 pm
Localização: Lisboa

Olá a todos,

sou novato nestas andanças,

estou com um problema numa query pl/sql que me está a deixar à beira de um ataque de nervos.
A query é a seguinte:

Selecionar tudo

UPDATE BS_R3_INTEGRATION R3
SET (DEBIT, CREDIT, DEVOLUTION_AMOUNT, LAST_UPDATE_DATE, LAST_UPDATE_USER ) =
(SELECT AMOUNT_DEBIT + R3.DEBIT, AMOUNT_CREDIT + R3.CREDIT, Q.DEVOLUTION_AMOUNT + R3.DEVOLUTION_AMOUNT, SYSDATE, USER
FROM (SELECT to_date(to_char(e.date_04, 'YYYYMMDD'), 'YYYYMMDD') PAYMENT_CONFIRMATION_DATE,
E.MARKET_ID MARKET_ID,
e.number_12 OP_SAIDA,
e.number_16 OP_ENTRADA,
nvl(e.number_34,0) TRANSACTION_PAYMENT_METHOD,
(CASE
WHEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) > 0
THEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17))
ELSE 0
END
) AMOUNT_DEBIT,
(CASE
WHEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) < 0
THEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17))
ELSE 0
END
) AMOUNT_CREDIT,
SUM(DECODE(E.NUMBER_22, 1, E.NUMBER_23, E.NUMBER_13)) DEVOLUTION_AMOUNT
FROM bs_events e
WHERE e.transaction_type = 10
AND e.unique_id = e.unique_id + 0
AND e.market_id IN (1,2)
AND e.seqno = 0
-- AND e.unique_id > loLastUniqueId
-- AND e.unique_id <= loMaxUniqueId
AND e.number_07 != 9 /*BILLING_STATUS != ANULADA */
GROUP BY to_date(to_char(e.date_04, 'YYYYMMDD'), 'YYYYMMDD'),
e.market_id, e.number_12, e.number_16, nvl(e.number_34, 0)
) Q
WHERE to_date(to_char(R3.PAYMENT_CONFIRMATION_DATE, 'YYYYMMDD'), 'YYYYMMDD') = Q.PAYMENT_CONFIRMATION_DATE
AND R3.MARKET_ID = Q.MARKET_ID
AND R3.OPERATOR = Q.OP_SAIDA
AND R3.OPERATOR_1 = Q.OP_ENTRADA
AND R3.TRANSACTION_PAYMENT_METHOD = Q.TRANSACTION_PAYMENT_METHOD
);
O que se passa é que ao tentar correr esta query dá-me sempre um erro e diz que não posso actualizar o campo LAST_UPDATE_DATE com null, quando no código se vê implicitamente que o mesmo campo está a ser actualizado com a data de sistema (sysdate).
O mesmo se passa com o campo LAST_UPDATE_USER, que apesar de estar a ser actualizado com USER também dá erro e diz que não posso actualizar este campo com NULL.
Agradecia que me ajudassem na resolução deste problema, é mesmo muito importante.

PS: Estou a usar o Oracle SQL Developer para desenvolver o meu trabalho.
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

Bom dia, brother.

Pelo que passou, provavelmente, estes dois campos devem ser NOT NULL, por isso o erro do teu Update.

As informações do teu SELECT, responsáveis por este Update, devem estar vindo Nulas para estes dois campos.

Uma dica para debugar e localizar onde ocorre o erro:

Rode/execute o teu select separadamente do Update, e veja em qual linha estas informações vêm nulas.

Selecionar tudo

(SELECT AMOUNT_DEBIT + R3.DEBIT, AMOUNT_CREDIT + R3.CREDIT, Q.DEVOLUTION_AMOUNT + R3.DEVOLUTION_AMOUNT, SYSDATE, USER 
FROM (SELECT to_date(to_char(e.date_04, 'YYYYMMDD'), 'YYYYMMDD') PAYMENT_CONFIRMATION_DATE, 
E.MARKET_ID MARKET_ID, 
e.number_12 OP_SAIDA, 
e.number_16 OP_ENTRADA, 
nvl(e.number_34,0) TRANSACTION_PAYMENT_METHOD, 
(CASE 
WHEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) > 0 
THEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) 
ELSE 0 
END 
) AMOUNT_DEBIT, 
(CASE 
WHEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) < 0 
THEN SUM(decode(e.number_22,1,e.number_23 + e.number_26,e.number_13 + e.number_17)) 
ELSE 0 
END 
) AMOUNT_CREDIT, 
SUM(DECODE(E.NUMBER_22, 1, E.NUMBER_23, E.NUMBER_13)) DEVOLUTION_AMOUNT 
FROM bs_events e 
WHERE e.transaction_type = 10 
AND e.unique_id = e.unique_id + 0 
AND e.market_id IN (1,2) 
AND e.seqno = 0 
-- AND e.unique_id > loLastUniqueId 
-- AND e.unique_id <= loMaxUniqueId 
AND e.number_07 != 9 /*BILLING_STATUS != ANULADA */ 
GROUP BY to_date(to_char(e.date_04, 'YYYYMMDD'), 'YYYYMMDD'), 
e.market_id, e.number_12, e.number_16, nvl(e.number_34, 0) 
) Q 
WHERE to_date(to_char(R3.PAYMENT_CONFIRMATION_DATE, 'YYYYMMDD'), 'YYYYMMDD') = Q.PAYMENT_CONFIRMATION_DATE 
AND R3.MARKET_ID = Q.MARKET_ID 
AND R3.OPERATOR = Q.OP_SAIDA 
AND R3.OPERATOR_1 = Q.OP_ENTRADA 
AND R3.TRANSACTION_PAYMENT_METHOD = Q.TRANSACTION_PAYMENT_METHOD 
)

Qualquer coisa, manda ai.
zuquinha123
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 05 Dez 2007 2:53 pm
Localização: Lisboa

Por incrivel que pareça fazendo o select não aparece nenhuma linha onde o campo LAST_UPDATE_DATE esteja null.
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 amigo, tudo beleza?

acredito que o problema esteja relacionado a criterio dos selects, no caso o select interno não esteja trazendo algum resultado..
Não sei se consegui me expressar, aqui vai um exemplo do q estou tentando falar.

Selecionar tudo

SQL> desc mens_erro;
 Name                            Null?    Type
 ------------------------------- -------- ----
 DESCRICAO                                VARCHAR2(50)
 DT_INICIO                       NOT NULL DATE

SQL> select * from mens_erro;

DESCRICAO                                          DT_INICIO
-------------------------------------------------- ---------
JOSE                                               03-DEC-07
MARIA                                              11-DEC-07
CRISTIANO                                          05-OCT-07

SQL> UPDATE mens_erro a
  2     SET (a.descricao, a.dt_inicio) =
  3            (SELECT b.descricao, sysdate
  4               FROM mens_erro b
  5              WHERE b.descricao = a.descricao
  6                AND b.dt_inicio >= TO_DATE ('05/12/2007', 'DD/MM/YYYY'))
  7   WHERE dt_inicio IS NOT NULL
  8  /
   SET (a.descricao, a.dt_inicio) =
                     *
ERROR at line 2:
ORA-01407: cannot update ("ANCAPP"."MENS_ERRO"."DT_INICIO") to NULL
Como podemos ver deu erro no update, e o campo q ele apresentou o erro foi justamente em um campo q é preenchido com sysdate, porem o select interno teve uma restricao na consulta, trazendo registros somente maior ou igual a 05/12, dessa forma eu forcei ele a não trazer os dados de um dos registros..

bem, não sei se fui claro, mas qualquer duvida estamos aqui.

[]'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 dica também, caso o teu SELECT não retornou nenhuma linha NULL, faça o contrário...

Coloque o teu SELECT num LOOP e, coloque o update dentro deste loop, daí tb mata a charada e, creio que fica mais fácil identificar o problema.
Responder
  • Informação
  • Quem está online

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