Variavel de cursor Dinamico

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
HenriqueMachado
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Seg, 29 Mai 2006 1:24 pm
Localização: Blumenau - SC
Abraços,
Henrique Machado Muller

Estou com dois problemas,
1 - quero montar uma função e mandar um parametro que é uma variavel de cursor. A função me retorna uma string com todos os campos daquela variavel separados por ';'

2 - Os cursos que passo como parametro podem variaval

Vou dar um exemplo para que fique mais claro

Selecionar tudo

  FUNCTION fc_SepararCampos (
    r_record -- Aqui seria um cursor dinamico ou coisa asssim
    p_Separador   CHAR DEFAULT ';'
  )
    RETURN VARCHAR2 IS

    vLinha   VARCHAR2 (4000);
  BEGIN
    vLinha := '';
    For (Para cada coluna do cursor) LOOP
      vLinha := vLinha || p_Separador || r_record.Coluna ; 
    END FOR;
    Return vLinha; 
  END;
Bom mais eu ia chamar com 4 cursores diferente, vou dar exemplo para ver se fica mais claro

Selecionar tudo

  CURSOR c_LinhaA IS 
    Select * from imovel;
  CURSOR c_LinhaB IS 
    Select * from imovel_unidade;
  CURSOR c_LinhaC IS 
    Select * from imovel_lancamento;
  CURSOR c_LinhaD IS 
    Select * from imov_lanc_compomente;
Dai eu queria chamar a função assim

Selecionar tudo

    For rgLinhaA IN c_LinhaA LOOP
       vLinhaSeparada := fc_SepararCampos (rgLinhaA);
       UTL_FILE.Put_Line (arquivo_saida, vLinhaSeparada);
    END LOOP;

    For rgLinhaB IN c_LinhaB LOOP
       vLinhaSeparada := fc_SepararCampos (rgLinhaB);
       UTL_FILE.Put_Line (arquivo_saida, vLinhaSeparada);
    END LOOP;

    For rgLinhaC IN c_LinhaC LOOP
       vLinhaSeparada := fc_SepararCampos (rgLinhaC);
       UTL_FILE.Put_Line (arquivo_saida, vLinhaSeparada);
    END LOOP;

    For rgLinhaD IN c_LinhaD LOOP
       vLinhaSeparada := fc_SepararCampos (rgLinhaD);
       UTL_FILE.Put_Line (arquivo_saida, vLinhaSeparada);
    END LOOP;
Bom como pode perceber no código acima. O objetivo é gravar os campos em um arquivo, para intregação com outro sistema.

alguém tem alguma idéia como fazer isso ? :shock: :shock:
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Olá

Viix...Eu acredito que não pois as colunas de um record são referenciadas pelo nome e não por numero, a menos que você montar as colunas com allias numericas por exemplo A1,A2,A3. passar como parametro de entrada a quantidade de colunas, e ter alguma forma de ler o valor do record em modo script pois neste caso você conseguiria concatenar 'A'||contadorloop.


fica a seguinte duvida então, tem como ler um vetor em modo script?
mais ou menos como o execute_imediate.?
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Mais um detalhe complicado, todos os cursores teriam que ter as mesmas colunas pois o type do parametro de entrada da função é fixo.
muttley
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 24
Registrado em: Qua, 15 Nov 2006 10:02 am
Localização: Cotia - SP
A Benção de Deus enriquece e não acrescenta dores

com o código abaixo não resolveria teu problema ?, basta passar a query , se é que entendi teu problema :-o :D

Selecionar tudo

  /******************************************************************
  *  OBJETIVO : Gerar Arquivo Texto Separarado Por um Delimitador
  ******************************************************************/
  FUNCTION fcn_query_to_csv(p_query     IN VARCHAR2,
                            p_separator IN VARCHAR2 DEFAULT ';',
                            p_dir       IN VARCHAR2,
                            p_filename  IN VARCHAR2) RETURN NUMBER
  --AUTHID CURRENT_USER
   IS
    l_output      UTL_FILE.file_type;
    l_thecursor   INTEGER DEFAULT DBMS_SQL.open_cursor;
    l_columnvalue VARCHAR2(2000);
    l_status      INTEGER;
    l_colcnt      NUMBER DEFAULT 0;
    l_separator   VARCHAR2(10) DEFAULT '';
    l_cnt         NUMBER DEFAULT 0;
  BEGIN
    l_output := UTL_FILE.fopen(p_dir, p_filename, 'w');
    DBMS_SQL.parse(l_thecursor, p_query, DBMS_SQL.native);
    FOR i IN 1 .. 255
    LOOP
      BEGIN
        DBMS_SQL.define_column(l_thecursor, i, l_columnvalue, 2000);
        l_colcnt := i;
      EXCEPTION
        WHEN OTHERS THEN
          IF (SQLCODE = -1007)
          THEN
            EXIT;
          ELSE
            RAISE;
          END IF;
      END;
    END LOOP;
    DBMS_SQL.define_column(l_thecursor, 1, l_columnvalue, 2000);
    l_status := DBMS_SQL.EXECUTE(l_thecursor);
    LOOP
      EXIT WHEN(DBMS_SQL.fetch_rows(l_thecursor) <= 0);
      l_separator := '';
      FOR i IN 1 .. l_colcnt
      LOOP
        DBMS_SQL.COLUMN_VALUE(l_thecursor, i, l_columnvalue);
        UTL_FILE.put(l_output, l_separator || l_columnvalue);
        l_separator := p_separator;
      END LOOP;
      UTL_FILE.new_line(l_output);
      l_cnt := l_cnt + 1;
    END LOOP;
    DBMS_SQL.close_cursor(l_thecursor);
    UTL_FILE.fclose(l_output);
    RETURN l_cnt;
  END fcn_query_to_csv;
[/code]
HenriqueMachado
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Seg, 29 Mai 2006 1:24 pm
Localização: Blumenau - SC
Abraços,
Henrique Machado Muller

Valeu amigo, seria este mesmo o meu problema.

Resolve e fica bem melhor do que estava imaginando.

Otima procedure :-o :-o :-o
Ros
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 19 Mar 2008 9:57 am
Localização: Porto Alegre - RS

Vou aproveitar o gancho e pedir uma ajuda tb...

estou passando pelo mesmo problema, a diferença é que não posso mandar uma consulta como está no exemplo, eu irei enviar um cursor.

Pois bem, estou desenvolvendo um testador de pls e o retorno pode ser o mais variado. O único problema é que se o retorno for um cursor.

Grata pela atenção.
Responder
  • Informação