Cursor Toad DB2 always getting null error when variables ok

38 views Asked by At

Basically I have a cursor declared with a prepared query and when I try to open the cursor it always gives me the error 22004 which is about null values being passed to the cursor but I've put the variables in an auxiliar table and they are all ok and with values. I know that I_EXP_DATE,I_ESTADO_LOCAL_CC,I_ESTADO_LOCAL_CIRURGICO,I_ID_DETALHES_LOCAL all have values that are not null. What am I doing wrong here?

DECLARE query_stmt VARCHAR(8000) DEFAULT '';
DECLARE cursorResults_anular CURSOR;

SET query_stmt = 'SELECT DISTINCT LC.ID_LOCAL_ATENDIMENTO, LC.ID_ENTIDADE, LR.REDE, LR.SUB_REDE, 333, LR.DATA_ANULACAO, LR.DIRECTORIO_CLINICO, LR.ID_USER, LR.ID_CONTRATO_RIOS, LR.ID_CONTRATO_RIOS2, LR.INICIO_CONTRATO, LR.ID_DETALHES_LOCAL, LA.ID_ENTIDADE_DETENTORA, LC.PRACTICE_SEQ, LR.EXTERNO ' ||
                       'FROM ICARO.LOCAL_REDE LR JOIN ICARO.LOCAL_CORPO_CLINICO LC ON LC.ID_DETALHES_LOCAL = LR.ID_DETALHES_LOCAL ' ||
                       'JOIN ICARO.LOCAL_ATENDIMENTO LA ON LA.ID_LOCAL_ATENDIMENTO = LC.ID_LOCAL_ATENDIMENTO ' ||
                       'WHERE LR.DATA_ANULACAO = ? AND LR.ESTADO_CONTRATACAO in (?,?) AND LR.ID_CONTRATO_RIOS IS NOT NULL AND LC.ID_DETALHES_LOCAL = ?';   
PREPARE query_pstmt_anular FROM query_stmt;
OPEN cursorResults_anular USING I_EXP_DATE,I_ESTADO_LOCAL_CC,I_ESTADO_LOCAL_CIRURGICO,I_ID_DETALHES_LOCAL;
FETCH cursorResults_anular INTO I_ID_LOCAL,I_ID_ENTIDADE_CC,I_ID_REDE,I_SUB_REDE,I_ESTADO_CONTRATACAO,I_DATA_ANULACAO,I_DIRECTORIO_CLINICO,I_ID_USER,I_ID_CONTRATO_RIOS,I_ID_CONTRATO_RIOS2,I_INICIO_CONTRATO,I_ID_DETALHES_LOCAL,I_ID_ENTIDADE_DETENTORA,I_PRACTICE_SEQ_CC, I_EXTERNO;
        WHILE SQLCODE = 0 DO
  
   

FETCH cursorResults_anular INTO I_ID_LOCAL,I_ID_ENTIDADE_CC,I_ID_REDE,I_SUB_REDE,I_ESTADO_CONTRATACAO,I_DATA_ANULACAO,I_DIRECTORIO_CLINICO,I_ID_USER,I_ID_CONTRATO_RIOS,I_ID_CONTRATO_RIOS2,I_INICIO_CONTRATO,I_ID_DETALHES_LOCAL,I_ID_ENTIDADE_DETENTORA,I_PRACTICE_SEQ_CC,I_EXTERNO;
      END WHILE;
      CLOSE cursorResults_anular;   

The cursor runs within a procedure and it should retrieve all the values that match the conditions of the query.

1

There are 1 answers

0
Charles On

The cursor runs within a procedure and it should retrieve all the values that match the conditions of the query.

As I read that statement, you are expecting to get multiple records back, aka a results set.
But your code has this

FETCH cursorResults_anular INTO I_ID_LOCAL,I_ID_ENTIDADE_CC,I_ID_REDE,I_SUB_REDE,I_ESTADO_CONTRATACAO,I_DATA_ANULACAO,I_DIRECTORIO_CLINICO,I_ID_USER,I_ID_CONTRATO_RIOS,I_ID_CONTRATO_RIOS2,I_INICIO_CONTRATO,I_ID_DETALHES_LOCAL,I_ID_ENTIDADE_DETENTORA,I_PRACTICE_SEQ_CC, I_EXTERNO;
        WHILE SQLCODE = 0 DO
FETCH cursorResults_anular INTO I_ID_LOCAL,I_ID_ENTIDADE_CC,I_ID_REDE,I_SUB_REDE,I_ESTADO_CONTRATACAO,I_DATA_ANULACAO,I_DIRECTORIO_CLINICO,I_ID_USER,I_ID_CONTRATO_RIOS,I_ID_CONTRATO_RIOS2,I_INICIO_CONTRATO,I_ID_DETALHES_LOCAL,I_ID_ENTIDADE_DETENTORA,I_PRACTICE_SEQ_CC,I_EXTERNO;
      END WHILE;
      CLOSE cursorResults_anular;  

That's not how you return a results set from Db2.

Basically, to return a results set, simply declare you cursor as being returned (to CALLER or CLIENT), open the cursor then end your proc.

DECLARE query_stmt VARCHAR(8000) DEFAULT '';
DECLARE cursorResults_anular CURSOR WITH RETURN TO CLIENT;

SET query_stmt = 'SELECT DISTINCT LC.ID_LOCAL_ATENDIMENTO, LC.ID_ENTIDADE, LR.REDE, LR.SUB_REDE, 333, LR.DATA_ANULACAO, LR.DIRECTORIO_CLINICO, LR.ID_USER, LR.ID_CONTRATO_RIOS, LR.ID_CONTRATO_RIOS2, LR.INICIO_CONTRATO, LR.ID_DETALHES_LOCAL, LA.ID_ENTIDADE_DETENTORA, LC.PRACTICE_SEQ, LR.EXTERNO ' ||
                       'FROM ICARO.LOCAL_REDE LR JOIN ICARO.LOCAL_CORPO_CLINICO LC ON LC.ID_DETALHES_LOCAL = LR.ID_DETALHES_LOCAL ' ||
                       'JOIN ICARO.LOCAL_ATENDIMENTO LA ON LA.ID_LOCAL_ATENDIMENTO = LC.ID_LOCAL_ATENDIMENTO ' ||
                       'WHERE LR.DATA_ANULACAO = ? AND LR.ESTADO_CONTRATACAO in (?,?) AND LR.ID_CONTRATO_RIOS IS NOT NULL AND LC.ID_DETALHES_LOCAL = ?';   
PREPARE query_pstmt_anular FROM query_stmt;
OPEN cursorResults_anular USING I_EXP_DATE,I_ESTADO_LOCAL_CC,I_ESTADO_LOCAL_CIRURGICO,I_ID_DETALHES_LOCAL;