Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #90705
    Anakim
    Participante

      Como eu faço para receber muitos valores em uma procedure?
      Exemplo, tenho que receber vários dados, seria uma linha com várias colunas, que eu iria receber, sendo que não queria colocar “1 milhão de parâmetros” na chamada da procedure.

      #90707
      diegolenhardt
      Participante

        Se todos forem campos de uma tabela faz um

        parametro emp%rowtype e passa ele como parametro,

        Se forem diferentes cria um TYPE e passa ele como parametro, mas daí terá de ser uma package.

        #90710
        Anakim
        Participante

          Pesquisando vi que o oracle trabalha com XML, também daria para fazer isso com XML? Teria algum exemplo? Qual a solução mais custosa para o banco?

          #90716
          diegolenhardt
          Participante

            Usei algumas vezes o xml,

            tem que ver se o banco possui o recurso instalado,
            select * from dba_registry

            eu acredito que o xml deva ser mais custoso, o rowtype acho que é o mais rápido, não se se poder ser aplicado nesse caso,

            para o XML você passará um parametro do tipo XMLTYPE,

            esse XML pode ser montado facilmente com um pacote não me recordo o nome, ele é capaz de construir um xml a partir de uma consulta SQL, retornando assim um XMLTYPE, ai do outro lado usa xml.extractValue para pegar os valores,

            acho que fica bem mais simples com um table of record (Type),

            #90769
            Anakim
            Participante

              É resolvi usar o type e fiz da seguinte maneira:

              Primeiramente criei um tipo:

              CREATE OR REPLACE TYPE CUSTOMER_TYPE IS OBJECT(
              T_NUMBER NUMBER,
              T_VALUE VARCHAR( 50 ),

              );

              Depois criei uma Collection deste tipo:


              CREATE OR REPLACE TYPE CUSTOMER_TYPE_LIST AS TABLE OF CUSTOMER_TYPE

              Para finalizar crei uma procedure aonde passo o tipo list que eu criei, mas da erro quando eu tento executar a procedure, o oracle fala que “function or procedure name not exist”.

              Estou chamando assim:
              call test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, 'test') ));

              #90770
              burga
              Participante

                [quote=”Anakim”:3lgnlpz5]Como eu faço para receber muitos valores em uma procedure?
                Exemplo, tenho que receber vários dados, seria uma linha com várias colunas, que eu iria receber, sendo que não queria colocar “1 milhão de parâmetros” na chamada da procedure.[/quote]

                Neste caso, se você só quer passar “uma linha com várias colunas” não existe a necessidade de passar como parâmetro pro procedimento um tipo “AS TABLE OF” (CUSTOMER_TYPE_LIST) e sim direto o CUSTOMER_TYPE e passar direto o objeto com os valores.

                [quote=”Anakim”:3lgnlpz5]Para finalizar crei uma procedure aonde passo o tipo list que eu criei, mas da erro quando eu tento executar a procedure, o oracle fala que “function or procedure name not exist”. [/quote]

                Se puder colocar o código da sua procedure aqui seria melhor pra avaliarmos o erro. Mas já da pra você ver algumas coisas… Se a procedure estiver dentro de um pacote, então você deve chamá-la da seguinte maneira:

                call pacote.test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, ‘test’) ));

                #90799
                fsitja
                Participante

                  Ou então tente:

                  BEGIN
                  test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, 'test') ));
                  END;

                  Se você tiver que passar uma lista muito grande de linhas, acrescente na sua procedure a diretiva NOCOPY após o parâmetro, para que seja feita passagem por referência em vez de por valor.


                  CREATE OR REPLACE PROCEDURE test_procedure (tab IN OUT NOCOPY CUSTOMER_TYPE_LIST) IS
                  BEGIN
                  NULL; -- seu código...
                  END;

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.