Inserir um Record em um Cursor

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
gabrielgomes
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 23 Ago 2016 9:11 am

Bom dia pessoal,
Estou com um problema/dúvida se alguém puder me ajudar ficarei muito agradecido.

Eu tenho um function que seu retorno é um CURSOR, mas pelo o que estou precisando fazer, eu estou trabalhando com TABLE RECORD.
Quero saber como eu posso passar esses dados da TABLE RECORD para um CURSOR.

Segue abaixo o código:

Selecionar tudo

  FUNCTION RETORNACFCDESC(...parametros...) RETURN TCURSOR IS
    CURSOR_DESCRED_CFC TCURSOR;
 TYPE MY_LISTA_REC IS RECORD(
    CAMPO1 VARCHAR2(112),
    CAMPO3 VARCHAR2(1000),
    CAMPO2 VARCHAR2(1000));
  TYPE A_LISTA IS TABLE OF MY_LISTA_REC INDEX BY BINARY_INTEGER;

  LISTA A_LISTA;

    CONTADOR NUMBER;
    QTD_CATEG_A              NUMBER;
    QTD_CATEG_B              NUMBER;
    CREDENCIADO_FLAG         NUMBER;
    CATEGORIA_VEIC           VARCHAR2(4);
    MOTIVO_DESCREDENCIAMENTO VARCHAR2(300);

BEGIN
  SELECT T.TB_VALOR_VARIAVEL
    INTO QTD_MIN_CATEG_A
    FROM TB_PARAMETROS_DO_SISTEMA T
    WHERE T.TB_NOME_VARIAVEL = 'QTD_MIN_CATEG_A';
  SELECT T.TB_VALOR_VARIAVEL
    INTO QTD_MIN_CATEG_B
    FROM TB_PARAMETROS_DO_SISTEMA T
    WHERE T.TB_NOME_VARIAVEL = 'QTD_MIN_CATEG_B';
    
  QTD_CATEG_A := 0;
  QTD_CATEG_B := 0;
           
  CONTADOR := 0;
  FOR REG2 IN (SELECT CFC.DT_PESSOA_CFC, 
                      VEIC.RE_VEI_PLACA PLACA,
                      CFC.TB_CFC_TIPO_EMPRESA TIPO_CFC
               FROM TB_CFC                CFC,
                    RE_VEICULO_ASSOCIACAO ASSOC,
                    RE_VEICULO            VEIC
               WHERE CFC.DT_PESSOA_CFC = ASSOC.DT_PESSOA_CFC
                 AND ASSOC.RE_VEI_PLACA = VEIC.RE_VEI_PLACA
                 AND UPPER(ASSOC.RE_VCF_SITUACAO) = 'S') LOOP
         CATEGORIA_VEIC := PKG_VEICULO.RETORNA_CATEGCNH_VEI(REG2.PLACA);
         
         IF CATEGORIA_VEIC = 'A' THEN
            QTD_CATEG_A := QTD_CATEG_A + 1;
         ELSIF CATEGORIA_VEIC = 'B' THEN
            QTD_CATEG_B := QTD_CATEG_B + 1;
         END IF;
         -- VERIFICA CATEGORIA A
         IF QTD_CATEG_A < TO_NUMBER(QTD_MIN_CATEG_A) THEN
            CREDENCIADO_FLAG := CREDENCIADO_FLAG + 1;
            MOTIVO_DESCREDENCIAMENTO := MOTIVO_DESCREDENCIAMENTO || 'CATEGORIA A MINIMO ' || 
                                        QTD_MIN_CATEG_A|| ' VEICULO(S);';
         END IF;
         -- VERIFICA CATEGORIA B
         IF QTD_CATEG_B < TO_NUMBER(QTD_MIN_CATEG_B) THEN
            CREDENCIADO_FLAG := CREDENCIADO_FLAG + 1;
            MOTIVO_DESCREDENCIAMENTO := MOTIVO_DESCREDENCIAMENTO||'CATEGORIA B MINIMO '||
                                        QTD_MIN_CATEG_B|| ' VEICULO(S); ';
         END IF;

         LISTA(CONTADOR).CAMPO1 := REG2.DT_PESSOA_CFC;
         LISTA(CONTADOR).CAMPO2 := CREDENCIADO_FLAG;
         LISTA(CONTADOR).CAMPO3 := MOTIVO_DESCREDENCIAMENTO;
         CONTADOR := CONTADOR + 1;
        
        QTD_CATEG_A := 0;
        QTD_CATEG_B := 0;
        MOTIVO_DESCREDENCIAMENTO := NULL;
--    END;
  END LOOP;
  CONTADOR := 0;

  IF CREDENCIADO_FLAG > 0 THEN
    /**
    AQUI EU IRIA INSERIR OS DADOS DO RECORD PARA O CURSOR E RETORNAR O CURSOR
    **/

  END IF;

  /* LIMPANDO TABELAS DE MEMÓRIA */
  LISTA.DELETE;

  RETURN CURSOR_DESCRED_CFC;
END RETORNACFCDESC;
Se alguém puder me ajudar, fico muito agradecido!
souldeath
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Qua, 25 Ago 2010 9:39 am
Localização: Limeira

gabrielgomes, você poderia tentar algo desse tipo:

Selecionar tudo

cursor_retorno TCURSOR;
...
OPEN cursor_retorno FOR 'SELECT * FROM TABLE(LISTA)';
RETURN cursor_retorno;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Google Adsense [Bot] e 10 visitantes