- Este tópico contém 10 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 11 meses atrás por
auzenph.
-
AutorPosts
-
7 de abril de 2009 às 5:56 pm #86111
auzenph
ParticipanteGente, 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??
7 de abril de 2009 às 6:11 pm #86116Ishii
ParticipanteOlá,
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
7 de abril de 2009 às 6:11 pm #86117David Siqueira
ParticipanteCara 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 1000000accep 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
7 de abril de 2009 às 6:52 pm #86129auzenph
ParticipanteIshii
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 funcionao 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?
7 de abril de 2009 às 7:02 pm #86131Ishii
ParticipanteOlá,
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
7 de abril de 2009 às 7:52 pm #86139auzenph
Participantemas é 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
7 de abril de 2009 às 8:49 pm #86143David Siqueira
ParticipanteCara 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
7 de abril de 2009 às 8:54 pm #86144auzenph
ParticipanteOi 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 isfunction myTest(testParam varchar2) return integer as
begin
return -1;
end;
begin
null;
end;7 de abril de 2009 às 8:58 pm #86147auzenph
Participantedesculpe…esse troço enviou a msg antes deu terminar..
IMAGINE o seguinte package:
create or replace
package body PKG_TESTE isfunction 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
7 de abril de 2009 às 9:01 pm #86148David Siqueira
ParticipanteAgora 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
7 de abril de 2009 às 9:11 pm #86152auzenph
ParticipanteEh, 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 =/
-
AutorPosts
- Você deve fazer login para responder a este tópico.