Pular para o conteúdo
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #86111
    auzenph
    Participante

      Gente, sou novo no forum….
      ..eu procurei muito na internet, mas não achei.

      Percebi esses dias que o ORACLE não guarda em seu dicionario de dados o codigo de funções/procedimentos que são definidos dentro de pacotes. Ele só mantem informações dos procedimentos/funções STANDALONE.

      Eu preciso pegar o CODIGO (source) de uma determinada função/procedimento que está declarada e definida dentro de um Package…como eu faço?

      eu fiz uma consulta que acha o nome de TODAS as funções/procedimentos que estao no pacote, mas achar o corpo da função, o codigo, é mais dificl, pq aparentemente preciso fazer um parser…

      vcs tem alguma ideia??

      #86116
      Ishii
      Participante

        Olá,

        Você já tentou:


        select text from user_source
        where name = upper ('nome da package')
        and type = 'PACKAGE BODY'
        order by line

        Veja se aparece o corpo da função.

        []s Ishii

        #86117
        David Siqueira
        Participante

          Cara qual a tua versão de Banco? Se for 9i ( ou superior) tu tem a opção de usar a DBMS_METADATA para extrair o SOURCE dos seus objetos, veja :

          set long 9000000
          set pagesize 0
          SET LONGCHUNK 1000000

          accep tp_obj prompt "Tipo do Objeto...:"
          accep nm_obj prompt "Nome do Objeto...:"
          accep schm prompt "Proprietario.....:"

          spool &nm_obj._bkp.sql
          select dbms_metadata.get_ddl('&tp_obj','&nm_obj','&schm') from dual;
          spool off;

          Crie um script com esse corpo acima que passei, e na hora de executar informe as definições pedidas, TIPO,NOME e Proprietario (Owner) do seu objeto.

          Abcs.

          David

          #86129
          auzenph
          Participante

            Ishii

            desse jeito só retorna o corpo do pacote e nao de uma função especifica q foi definida dentro do pacote.

            Drbs

            o banco que uso é 10g.
            valeu pela dica..mas nao funciona

            o ORACLE nao trata funções DEFINIDAS DENTRO DE UM PACKAGE como funções STANDALONE…isso signiica que se vc tem:

            uma função teste() dentro de um package chamado PKG_TESTE
            ele não considera teste() como uma função…pois nao aparece me user_sources, user_objects em canto nenhum.

            usando o nome teste também nao se encontra a DDL…causando erro de NOT FOUND:
            “*Cause: The specified object was not found in the database.”
            usando parametros: “FUNCTION”, “TESTE”, “USUARIO”

            e agora?

            #86131
            Ishii
            Participante

              Olá,

              Entendi, na verdade a Package é um único objeto do Oracle mesmo… ele apenas encapsula várias procedures e functions dentro de um único objeto… as declarações de cada procedure ou function ficam no corpo da package mesmo….

              Se você precisa apenas de uma procedure/function sugiro o uso de uma ferramenta como o TOAD ou o PL/SQL Developer para isso…

              []s Ishii

              #86139
              auzenph
              Participante

                mas é isso que estou preocupado, pq minha ferramenta que estou desenvolvendo é “concorrente” dessas outras. Estou fazendo em java e preciso de uma consulta ou de uma lógica de consultas/processamentos que capturem o corpo de uma função interna a um package.

                pelo visto vou ter q pegar o codigo e fazer buscas internas mesmo ne?

                abraço

                #86143
                David Siqueira
                Participante

                  Cara sua dúvida não está clara, porque se sua ferramenta é ou será concorrente dessas aqui citadas, acredito que qq uma das opções que demos lhe atende, porque o TOAD até certa versão extrai o DDL dos objetos fazendo querys via DBA_SOURCES e o SQLDeveloper também, já a ferramenta da propria Oracle usa a DBMS_METADATA a partir de bases 9i para extrair os DDL’s dos objetos, não sei o que tu precisa mais fica ai a dica, e a DBMS_METADATA funciona no meu database 9i e 10g perfeitamente.

                  Abcs.

                  David

                  #86144
                  auzenph
                  Participante

                    Oi Davi

                    então quer dizer que o METADATA retorna o codigo de funções que são declaradas e definidas DENTRO de PACKAGES?

                    se sim, vc poderia me exemplificar a parametrização para eu coletar tal dado?

                    pelo script que vc me enviou, eu não consegui.

                    Veja o seguinte exemplo:

                    Eu tenho o seguinte package:


                    create or replace
                    package body PKG_MATRICULA is

                    function myTest(testParam varchar2) return integer as
                    begin
                    return -1;
                    end;
                    begin
                    null;
                    end;

                    #86147
                    auzenph
                    Participante

                      desculpe…esse troço enviou a msg antes deu terminar..

                      IMAGINE o seguinte package:

                      create or replace
                      package body PKG_TESTE is

                      function myTest(testParam varchar2) return integer as
                      begin
                      return -1;
                      end;
                      begin
                      null;
                      end;

                      no usuario USUARIO_MARCELO.

                      qual seria a parametrização do seu script??

                      param1 “FUNCTIO”
                      param2 “MYTEST”
                      param3 “USUARIO_MARCELO” ??

                      se for…NAO funcionou no meu banco oracle.

                      ele NASO reconhece myTEST como uma função , logo nao acha ela no metadados.

                      se eu procurar pelo PAcKAGE (PKG_TESTE) eu encontrarei ele…mas nao a função…eu quero SOMENTE o CORPO da função.

                      fico no aguardo

                      #86148
                      David Siqueira
                      Participante

                        Agora eu entendi..rss..essa função existe apenas no corpo do package, pensei que a função existisse na base de dados mesmo e fosse mais um objeto do user Marcelo, mais na verdade ela compõe o package, isso realmente eu nunca fiz mesmo.

                        Abcs.

                        David

                        #86152
                        auzenph
                        Participante

                          Eh, realmente ngm nunca viu isso auhauha ja procurei na internet toda…

                          muito dificil fazer isso..mas ja consegui fazer um programa JAVA q extrai isso.
                          Usando String mesmo…na tora.

                          Muito complicado..pq o oracle nao mantem essas funções/procedimentos em separado…
                          elas sao simplesmente codigos …eu realmente nao imagino como o parser do oracle resolve uma chamada do tipo PKG_TESTE.myTest();

                          pq ele deveria saber exatamente aonde inicia o codigo da função, entao eu presumo que o oracle mantem algum controle…mas nao encontro em canto algum..nem em site nenhum…nem tutorial nem nada =/

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