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] > > > > > > > > > >