Bom Dia,, 

Para converter o clob em varchar utilizo o seguinte comando,,

select 
sys.dbms_lob.substr(dbms_metadata.get_ddl('USER',usuario),
sys.dbms_lob.getlength(dbms_metadata.get_ddl 'USER',usuario)))   DDL
from dual 

neste caso para gerar o DDL de criação de usuários...

mas nunca o utilizei dentro de uma procedure,,

Veja se da certo

Gustavo Veríssimo




--- Em oracle_br@yahoogrupos.com.br, "Gabriel Herdt"
<[EMAIL PROTECTED]> escreveu
>
> Sem problemas se eu conseguir passo aqui para a lista. mas vou poder 
> ver isso soh no final de semana. tem que estar pronto na quarta a 
> funcao =(. Vou passar uma funcao que trabalha com read_file do oracle.
> Ai se voce conseguir modificar ela para nosso objetivo ficaria grato.
> 
> PROCEDURE read_file
>  (pNomeTab in Varchar2,
>   pNomeCampo in VarChar2,
>   pNomeArq in VarChar2,
>   pNomeDire in VarChar2,
>   P_ERRO OUT VARCHAR2)
>  IS
>   src_file BFILE := bfilename(pNomeDire, pNomeArq);
>   dst_file BLOB;
>   lgh_file BINARY_INTEGER;
>   sNomeDire char; --create or replace directory DIRETO 
> as 'C:\Sistemas\Gerencial\Figuras';
> 
> BEGIN
> 
> -- Zera Campo Blob
>     EXECUTE IMMEDIATE 'UPDATE '|| pNomeTab ||' SET ' ||pNomeCampo|| ' 
> = EMPTY_BLOB()';
> -- Trava no dado do campo
>     EXECUTE IMMEDIATE 'Select ' || pNomeCampo ||' From ' || pNomeTab 
> ||' ' into dst_file ;
> -- Abre Arquivo
>     sys.dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
> -- Determina Tamando em bytes do arquivo
>     lgh_file := sys.dbms_lob.getlength(src_file);
> -- Ler arquivo
>     sys.dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
> -- Update no arquivo Blob
>     EXECUTE IMMEDIATE 'UPDATE '|| pNomeTab ||' SET ' ||pNomeCampo|| ' 
> = :dst_file'
>     USING dst_file;
>     COMMIT;
> -- Fecha Arquivo
>     sys.dbms_lob.fileclose(src_file);
> EXCEPTION
>   WHEN no_data_found THEN
>     rollback;
>     P_ERRO := '-20001, Não há dados';
>   WHEN others THEN
>     rollback;
>     P_ERRO := '-20003, Não foi Possivel Gravar Arquivo';
> END read_file;
> 
> --- Em oracle_br@yahoogrupos.com.br, Wellerson Leite de Araújo 
> <waraujo_bh@> escreveu
> >
> > Pessoal,
> > 
> > Neste caso eu acredito que o pacote DBMS_LOB possa ajudar. Nele 
> vocês podem utilizar o procedimento READ para ler "pedaços" de uma 
> variável do tipo LOB. Estes pedaços poderiam ser acumulados em uma 
> variável VARCHAR2 que poderia ser passada para o comando EXECUTE 
> IMMEDIATE.
> > Claro que se o DDL exceder  o tamanho máximo que um VARCHAR2 pode 
> amazenar, vocês podem ainda criar uma lógica que utilize um vetor, 
> acredito que para a maioria dos DDLs retornados uma única variável 
> será suficiente. O pacote DBMS_LOB também oferece a função GETLENGTH, 
> que pode ser utilizada para testar a quantidade de caracteres 
> presentes numa variável CLOB.
> > Só mais um comentário. Neste caso, eu recomendaria uma procedure. 
> Não é muito "elegante" utilizar parâmetros de OUT em uma function.
> > 
> > 
> > Att,
> > Wellerson
> >  
> > "Não vou deixar me embrutecer, eu acredito nos meus ideais. Podem 
> até maltratar o meu coração, que meu espírito ninguém vai conseguir 
> quebrar..."
> > (Legião Urbana)
> > 
> > 
> > "As idéias estão no chão, você tropeça e acha a solução..."
> > (Titãs)
> > 
> > 
> > 
> > 
> > ________________________________
> > De: Carlos martello <carlos.martello@>
> > Para: oracle_br@yahoogrupos.com.br
> > Enviadas: Quarta-feira, 19 de Novembro de 2008 17:14:31
> > Assunto: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
> > 
> > 
> > Ah sim.....
> > 
> > Então cara, vc não consegue pelo fato de um campo ou variável do 
> tipo clob ter suas "particularidades" . 
> > 
> > Eu sinceramente também não sei e até pesquisaria pra vc (até pq 
> também estava precisando dessa informação), mas o certo seria fazer 
> uma pesquisa no Google ou metalink sobre como converter clob em 
> varchar por exemplo. Assim o problema seria resolvido ;).
> > 
> > Assim que algum dos dois encontrar a "fórmula" encaminhamos, beleza?
> > 
> > Carlos Martello
> > 
> > DBA Oracle / Consultor de Tecnologia
> > 
> > TEL:  55+21+3094-6250
> > 
> > Choice Technologies S/A - Inteligência em Energia
> > 
> > e-mail: carlosmartello@ choice.com. br
> > 
> > De: [EMAIL PROTECTED] os.com.br [mailto:[EMAIL PROTECTED] 
> os.com.br] Em nome de Gabriel Herdt
> > Enviada em: quarta-feira, 19 de novembro de 2008 15:17
> > Para: [EMAIL PROTECTED] os.com.br
> > Assunto: Re: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
> > 
> > Eu não consigo passar o resultado do Get_dll para uma variavel e 
> > executar o conteudo dessa variavel. Tem outra forma de executar o 
> > Resultado do GET_DDL?
> > 
> > --- Em [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br> , "Carlos Eduardo P. Martello" 
> > <carlos.martello@ ...> escreveu
> > >
> > > Gabriel, até vi agora de uma forma mais atenta que vc já faz o 
> > execute
> > > immediate dentro da função.....
> > > 
> > > 
> > > 
> > > Não entendi o que você quer então....
> > > 
> > > 
> > > 
> > > É o execute immediate que não está funcionando?
> > > 
> > > 
> > > 
> > > 
> > > 
> > > Abs,
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > Carlos Martello
> > > 
> > > DBA Oracle / Consultor de Tecnologia
> > > 
> > > TEL: 55+21+3094-6250
> > > 
> > > Choice Technologies S/A - Inteligência em Energia
> > > 
> > > e-mail: carlosmartello@ ...
> > > 
> > > 
> > > 
> > > De: [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br> 
> > [mailto:[EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br> ] Em
> > > nome de Gabriel Herdt
> > > Enviada em: terça-feira, 18 de novembro de 2008 22:33
> > > Para: [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br> 
> > > Assunto: Re: RES: [oracle_br] Ajuda em procedure[URGENTE]
> > > 
> > > 
> > > 
> > > assim obrigado vou tentar, maas eu quero executar p dll gerado 
> pela 
> > > funcao. pode me dizer como?
> > > --- Em [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br>  <mailto:oracle_ br%
> > 40yahoogrupos. com.br>
> > > , "Carlos Eduardo P. Martello" 
> > > <carlos.martello@ > escreveu
> > > >
> > > > Gabriel,
> > > > 
> > > > 
> > > > 
> > > > Tente o seguinte:
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > Declare
> > > > 
> > > > Vsql varchar2(2000) :='';
> > > > 
> > > > Begin
> > > > 
> > > > Vsql := fn_compara;
> > > > 
> > > > Execute immediate vsql;
> > > > 
> > > > End;
> > > > 
> > > > 
> > > > 
> > > > Se ao invés de vc retornar um clob, retornar um varchar2, ajuda.
> > > > 
> > > > 
> > > > 
> > > > Abs,
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > Carlos Martello
> > > > 
> > > > DBA Oracle / Consultor de Tecnologia
> > > > 
> > > > TEL: 55+21+3094-6250
> > > > 
> > > > Choice Technologies S/A - Inteligência em Energia
> > > > 
> > > > e-mail: carlosmartello@
> > > > 
> > > > 
> > > > 
> > > > De: [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br>  <mailto:oracle_ br%
> > 40yahoogrupos. com.br> 
> > > [mailto:[EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br>  <mailto:oracle_ br%
> > 40yahoogrupos. com.br>
> > > ] Em
> > > > nome de Gabriel Herdt
> > > > Enviada em: segunda-feira, 17 de novembro de 2008 16:49
> > > > Para: [EMAIL PROTECTED] os.com.br <mailto:oracle_ br%
> 40yahoogrupos .com.br>  <mailto:oracle_ br%
> > 40yahoogrupos. com.br>
> > > 
> > > > Assunto: [oracle_br] Ajuda em procedure[URGENTE]
> > > > 
> > > > 
> > > > 
> > > > Pessoal como executar o resultado de DBMS_METADATA. get_ddl
> (. ..) 
> > em 
> > > > uma Function? Segue abaixo minmha Function
> > > > 
> > > > FUNCTION FN_COMPARA (
> > > > pr_usera IN VARCHAR2,
> > > > pr_userb IN VARCHAR2,
> > > > pr_erro OUT VARCHAR2
> > > > )
> > > > RETURN VARCHAR2
> > > > IS
> > > > vtable_name VARCHAR2 (30);
> > > > DDL CLOB;
> > > > i INTEGER;
> > > > a INTEGER;
> > > > x INTEGER;
> > > > --get dbms_metadata. get_ddl
> > > > (object_type, name,schema, version,model, transform) ;
> > > > -- variable_name datatype;
> > > > BEGIN
> > > > vtable_name := '';
> > > > i := 0;
> > > > x := 0;
> > > > -- grant select on all_tables to TCCB;
> > > > 
> > > > FOR tabela IN (SELECT table_name
> > > > FROM all_tables
> > > > WHERE owner IN (UPPER ('tcca'), UPPER ('TCCB'))
> > > > AND table_name NOT IN (SELECT table_name
> > > > FROM all_tables
> > > > WHERE owner = 'TCCB'))
> > > > LOOP
> > > > vtable_name := tabela.Table_ name;
> > > > 
> > > > DDL := DBMS_METADATA. get_ddl ('TABLE', vtable_name, pr_usera);
> > > > EXECUTE IMMEDIATE TO_CHAR (DDL);
> > > > 
> > > > COMMIT;
> > > > END LOOP;
> > > > 
> > > > RETURN TO_CHAR (DDL);
> > > > EXCEPTION
> > > > WHEN OTHERS
> > > > THEN
> > > > pr_erro := ('Erro: ' ||pr_erro||SQLERRM) ;
> > > > END;
> > > > 
> > > > 
> > > > 
> > > > 
> > > > 
> > > > [As partes desta mensagem que não continham texto foram 
> removidas]
> > > >
> > > 
> > > 
> > > 
> > > 
> > > 
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> > 
> >     
> > 
> > 
> >       Veja quais são os assuntos do momento no Yahoo! +Buscados
> > http://br.maisbuscados.yahoo.com
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>


Responder a