Alguem pode me dar uma ajuda nessa procedure?
Nao estou conseguindo passar o resultado do get_dll para uma funcao e 
executar o dll segue a baixo a funcao. utilizo o oracle 10gr2

FUNCTION FN_COMPARA (
   pr_usera   IN       VARCHAR2,
   pr_userb   IN       VARCHAR2,
   pr_erro    OUT      VARCHAR2
)
   RETURN VARCHAR2
IS
   vtable_name   VARCHAR2 (30);
   vDLL varchar2(4000);
   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 := '';
   DDL := '';
   i := 0;
   x := 0;

   --  grant select on all_tables to TCCB;
   -- DBMS_lob.open(lob_loc,open_mode);
   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;
--      PRC_EXPORTA_CLOB(DBMS_METADATA.get_ddl ('TABLE', TO_CHAR
(vtable_name), TO_CHAR(pr_usera)), 'teste.txt','C:\sistemas\');
      Select to_char(DBMS_METADATA.get_ddl('TABLE',
                                TO_CHAR (vtable_name),
                                TO_CHAR (pr_usera)
                               )) into vDDL from dual;
      
      /*DDL :=
         DBMS_METADATA.get_ddl ('TABLE',
                                TO_CHAR (vtable_name),
                                TO_CHAR (pr_usera)
                               );
*/
     -- vDLL := to_char(DDL);
      EXECUTE IMMEDIATE (VDDL);
   --    COMMIT;
   END LOOP;

   RETURN TO_CHAR (DDL);
EXCEPTION
   WHEN OTHERS
   THEN
      pr_erro := ('Erro: ' || pr_erro || SQLERRM);
END;
--- Em oracle_br@yahoogrupos.com.br, "jlchiappa" <[EMAIL PROTECTED]> 
escreveu
>
> Aí fica mais fácil, né não ? Cfrme eu demonstrei, na versão 10gr2 vc
> JÁ PODE converter o CLOB pra CHAR diretamente via TO_CHAR, sem 
NENHUM
> problema, respeitando-se os limites naturais de strings (ie, 4000
> bytes no SQL, 32 Kb no PL/SQL), ok ? SE o SQL gerado passando-se os
> seus objetos pelo DBMS_METADATA respeita esses limites ok, vc PODE 
SIM
> usar diretamente o resultado num SQl dinãmico, SEM PROBLEMA NENHUM, 
ok
> ? Só se vc Realmente tiver algum SQL gerado maior que o limite de
> strings char aí sim, vc terá que partir pra alternativas tipo 
quebrar
> com DBMS_LOB, ou ainda usar o DBMS_SQL, que pode trabalhar com 
textos
> bem longos ...
> 
> []s
> 
> Chiappa
> 
> 
======================================================================
> Palestrante ENPO.BR - acesse http://www.enpo- br.org/
> Instrutor Workshops ENPO/TWS - acesse 
http://www.twstecnologia.com.br/
> 
======================================================================
> 
> "O dinheiro é o oposto do tempo. Ninguém fala a respeito, mas todos
>  fazem algo a respeito."  (Rebecca Johnson)
> 
> --- Em oracle_br@yahoogrupos.com.br, "Gabriel Herdt"
> <gabrielherdt@> escreveu
> >
> > Essa eh a minha versao
> > Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
> > PL/SQL Release 10.2.0.1.0 - Production
> > CORE        10.2.0.1.0      Production
> > TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
> > NLSRTL Version 10.2.0.1.0 - Production
> > 
> > --- Em oracle_br@yahoogrupos.com.br, "jlchiappa" <jlchiappa@> 
> > escreveu
> > >
> > > Colegas, acho que nessa discussão toda o pessoal não 
estabeleceu o
> > > ponto **** MAIS IMPORTANTE **** de tudo, qual seja, a VERSÃO DO 
> > BANCO
> > > EM USO, pois nas versões mais recentes as funções de string, 
como a
> > > TO_CHAR, JÁ FORAM atualizadas paara permitirem conversão a 
partir de
> > > CLOB (que é o datatype retornado pela DBMS em questão), yes ?? 
Então
> > > NÃO FAZ SENTIDO a tal "pesquisa no Google ou metalink sobre como
> > > converter clob em varchar", isso é NATIVO, é AUTOMÁGICO, ok ? 
Sim ??
> > > Obviamente, respeitando-se o LIMITE do CHAR, claro, mas bem
> > > dificilmente vc tem um DDL único que ocupa trocentos Kb ou Mb , 
SE
> > > tiver aí sim é usar a DBMS_LOB, provavelmente... 
> > >  O exemplo :
> > > 
> > > [EMAIL PROTECTED]:SQL>select * from v$version;
> > > 
> > > BANNER
> > > ----------------------------------------------------------------
> > > Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
> > > PL/SQL Release 10.2.0.4.0 - Production
> > > CORE    10.2.0.4.0      Production
> > > TNS for Solaris: Version 10.2.0.4.0 - Production
> > > NLSRTL Version 10.2.0.4.0 - Production
> > > 
> > > 
> > > [EMAIL PROTECTED]:SQL>variable x clob
> > > [EMAIL PROTECTED]:SQL>exec :x := DBMS_METADATA.get_ddl ('TABLE',
> > > 'DEF$_CALLDEST', user);
> > > 
> > > Procedimento PL/SQL concluído com sucesso.
> > > 
> > > ==> OK, vou trocar o nome da tabela :
> > > 
> > > [EMAIL PROTECTED]:SQL>exec :x := replace
(:x, 'DEF$_CALLDEST', 'TESTE');
> > > 
> > > Procedimento PL/SQL concluído com sucesso.
> > > 
> > > [EMAIL PROTECTED]:SQL>print x
> > > 
> > > X
> > > ----------------------------------------------------------------
----
> > ------------
> > > 
> > >   CREATE TABLE "SYSTEM"."TESTE" 
> > >    (    "ENQ_TID" VARCHAR2(22), 
> > >         "STEP_NO" NUMBE
> > > R, 
> > >         "DBLINK" VARCHAR2(128), 
> > >         "SCHEMA_NAME" VARCHAR2(30), 
> > >         "PACKAGE_NAME" VARC
> > > HAR2(30), 
> > >         "CATCHUP" RAW(16) DEFAULT '00', 
> > >          CONSTRAINT "TESTE_PRIMARY" PRIMAR
> > > Y KEY ("ENQ_TID", "DBLINK", "STEP_NO")
> > >   USING INDEX PCTFREE 10 INITRANS 2 MAXTR
> > > ANS 255 COMPUTE STATISTICS 
> > >   STORAGE(INITIAL 40960 NEXT 40960 MINEXTENTS 1 MAXE
> > > XTENTS 505
> > >   PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL 
DEFAULT)
> > > 
> > >  TABLESPACE "TOOLS"  ENABLE, 
> > >          CONSTRAINT "DEF$_CALL_DESTINATION" FOREIGN KEY (
> > > "DBLINK", "CATCHUP")
> > >           REFERENCES "SYSTEM"."DEF$_DESTINATION" 
("DBLINK", "CATCH
> > > UP") ENABLE
> > >    ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS 
LOGGIN
> > > G
> > >   STORAGE(INITIAL 40960 NEXT 40960 MINEXTENTS 1 MAXEXTENTS 505
> > >   PCTINCREASE 5
> > > 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
> > >   TABLESPACE "TOOLS" 
> > > 
> > > ==> tento executar ddiretamente :
> > > 
> > > [EMAIL PROTECTED]:SQL>BEGIN
> > >   2  execute immediate(:x);
> > >   3  END;
> > >   4  /
> > > execute immediate(:x);
> > >                  *
> > > ERRO na linha 2:
> > > ORA-06550: linha 2, coluna 18:
> > > PLS-00382: a expressão é do tipo incorreto
> > > ORA-06550: linha 2, coluna 1:
> > > PL/SQL: Statement ignored
> > > 
> > > ==> OK, a documentação nos diz que o IMMEDIATE espera um CHAR, 
não
> > > entende CLOB, converto então (** SEM ** usar nenhum "truque 
mágico, 
> > tá
> > > bem) :
> > > 
> > > [EMAIL PROTECTED]:SQL>BEGIN
> > >   2  execute immediate(to_char(:x));
> > >   3  END;
> > >   4  /
> > > BEGIN
> > > *
> > > ERRO na linha 1:
> > > ORA-02264: nome já usado por uma restrição existente
> > > ORA-06512: em line 2
> > > 
> > > ==> executou blz, mas já tinha a constraint que ele tenta 
criar, 
> > vou a
> > > alterar :
> > > 
> > > [EMAIL PROTECTED]:SQL>exec :x := replace(:x, 'DEF$_CALL_DESTINATION',
> > > 'TESTE_FK');
> > > 
> > > Procedimento PL/SQL concluído com sucesso.
> > > 
> > > [EMAIL PROTECTED]:SQL>print x
> > > 
> > > X
> > > ----------------------------------------------------------------
----
> > ------------
> > > 
> > >   CREATE TABLE "SYSTEM"."TESTE" 
> > >    (    "ENQ_TID" VARCHAR2(22), 
> > >         "STEP_NO" NUMBE
> > > R, 
> > >         "DBLINK" VARCHAR2(128), 
> > >         "SCHEMA_NAME" VARCHAR2(30), 
> > >         "PACKAGE_NAME" VARC
> > > HAR2(30), 
> > >         "CATCHUP" RAW(16) DEFAULT '00', 
> > >          CONSTRAINT "TESTE_PRIMARY" PRIMAR
> > > Y KEY ("ENQ_TID", "DBLINK", "STEP_NO")
> > >   USING INDEX PCTFREE 10 INITRANS 2 MAXTR
> > > ANS 255 COMPUTE STATISTICS 
> > >   STORAGE(INITIAL 40960 NEXT 40960 MINEXTENTS 1 MAXE
> > > XTENTS 505
> > >   PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL 
DEFAULT)
> > > 
> > >  TABLESPACE "TOOLS"  ENABLE, 
> > >          CONSTRAINT "TESTE_FK" FOREIGN KEY ("DBLINK", "CA
> > > TCHUP")
> > >           REFERENCES "SYSTEM"."DEF$_DESTINATION" 
> > ("DBLINK", "CATCHUP")
> > > ENABLE
> > > 
> > >   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS 
LOGGING
> > >   STORAGE(I
> > > NITIAL 40960 NEXT 40960 MINEXTENTS 1 MAXEXTENTS 505
> > >   PCTINCREASE 50 FREELISTS 1
> > >  FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
> > >   TABLESPACE "TOOLS" 
> > > 
> > > ==> olha aí :
> > > 
> > > [EMAIL PROTECTED]:SQL>BEGIN
> > >   2  execute immediate(to_char(:x));
> > >   3  END;
> > >   4  /
> > > 
> > > Procedimento PL/SQL concluído com sucesso.
> > > 
> > > [EMAIL PROTECTED]:SQL>@desc teste
> > >  Nome                                      Nulo?    Tipo
> > >  ----------------------------------------- --------
> > > ----------------------------
> > >  ENQ_TID                                   NOT NULL VARCHAR2(22)
> > >  STEP_NO                                   NOT NULL NUMBER
> > >  DBLINK                                    NOT NULL VARCHAR2
(128)
> > >  SCHEMA_NAME                                        VARCHAR2(30)
> > >  PACKAGE_NAME                                       VARCHAR2(30)
> > >  CATCHUP                                            RAW(16)
> > > 
> > > []s
> > > 
> > >   Chiappa
> > > 
> > > 
> > 
======================================================================
> > > Palestrante ENPO.BR - acesse http://www.enpo-br.org/
> > > Instrutor Workshops ENPO/TWS - acesse 
> > http://www.twstecnologia.com.br/
> > > 
> > 
======================================================================
> > > 
> > > "O mundo precisa de mais gênios humildes e modestos - 
infelizmente
> > > somos muito poucos"
> > > 
> > > --- Em oracle_br@yahoogrupos.com.br, "Carlos martello"
> > > <carlos.martello@> escreveu
> > > >
> > > > 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@
> > > > 
> > > >  
> > > > 
> > > > De: oracle_br@yahoogrupos.com.br
> > > [mailto:[EMAIL PROTECTED] Em nome de Gabriel Herdt
> > > > Enviada em: quarta-feira, 19 de novembro de 2008 15:17
> > > > Para: oracle_br@yahoogrupos.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 oracle_br@yahoogrupos.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: oracle_br@yahoogrupos.com.br
> > > <mailto:oracle_br%40yahoogrupos.com.br>  
> > > > [mailto:oracle_br@yahoogrupos.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: oracle_br@yahoogrupos.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 oracle_br@yahoogrupos.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: oracle_br@yahoogrupos.com.br
> > > <mailto:oracle_br%40yahoogrupos.com.br>  <mailto:oracle_br%
> > > > 40yahoogrupos.com.br> 
> > > > > [mailto:oracle_br@yahoogrupos.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: oracle_br@yahoogrupos.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]
> > > >
> > >
> >
>


Responder a