Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
Gustavo, não consegui rodar esse seu Select. Realmente vou precisar trabalhar com DBMS_LOB. Por já que to exportando Procedure e Function é comum ter mais de 4000 chars. VOu passar minha funcao como está. e outra que uso para ler arquivo e salvar ele em uma tabela. Pode ajudar alguem que tenha esse problema. Obs: Chipa dei uma arrumada no codigo, para nao ficar tao feio hehe. OBrigado pela ajuda pessoal... continuo na luta PROCEDURE PR_AUTODDL (pr_usera IN VARCHAR2, pr_userb IN VARCHAR2) IS vtable_nameVARCHAR2 (80); vddl VARCHAR2 (32767); vobject_name VARCHAR2 (80); vobject_type VARCHAR2 (80); vddl_objectVARCHAR2 (32767); vCamTabNameVARCHAR2 (80); vColName VARCHAR2 (80); vNotNull VARCHAR2 (80); vData_Type VARCHAR2 (80); vdata_length VARCHAR2 (10); vdata_preci VARCHAR2 (1); vddl_pro long; i INTEGER; a INTEGER; x INTEGER; BEGIN vtable_name := ''; vddl := ''; vobject_name := ''; vddl_object := ''; i := 0; x := 0; --Tabelas FOR tabela IN (SELECT table_name FROM user_tables WHERE table_name NOT IN (SELECT table_name FROM all_tables WHERE owner = pr_userb)) LOOP vtable_name := tabela.table_name; SELECT REPLACE (TO_CHAR (DBMS_METADATA.get_ddl ('TABLE', vtable_name, pr_usera ) ), pr_usera, pr_userb ) INTO vddl FROM DUAL; EXECUTE IMMEDIATE (vddl); END LOOP; --Campos FOR campo IN (SELECT dba_tab_columns.table_name, dba_tab_columns.column_name, dba_tab_columns.data_type, dba_tab_columns.data_length, dba_tab_columns.data_precision, dba_tab_columns.nullable FROM dba_tab_columns WHERE owner = pr_usera AND column_name NOT IN (SELECT column_name FROM dba_tab_columns WHERE owner = pr_userb)) LOOP vCamTabName := campo.table_name; vColName:= campo.column_name; vData_Type := campo.data_type; vdata_length := campo.data_length; If campo.data_precision is not null Then vdata_preci := ','||campo.data_precision; end if; If campo.nullable = 'Y' Then vNotNull:= 'NOT NULL'; End IF; EXECUTE IMMEDIATE 'ALTER TABLE '||pr_userb||'.'||vCamTabName||' ADD ('||vColName||' '||vData_Type||'('||vdata_length||vdata_preci||') '|| vNotNull||' )'; END LOOP; --FUNCOES FOR funcao IN (SELECT object_name, object_type FROM user_objects WHERE object_type = 'FUNCTION' AND status = 'VALID') LOOP vobject_name := funcao.object_name; vobject_type := funcao.object_type; SELECT REPLACE (TO_CHAR (DBMS_METADATA.get_ddl (vobject_type, vobject_name, pr_usera ) ), pr_usera, pr_userb ) INTO vddl_object FROM DUAL; EXECUTE IMMEDIATE (TO_CHAR (vddl_object)); END LOOP; vobject_name := ''; vobject_type := ''; vddl_object := ''; --Processo FOR processo IN (SELECT object_name, object_type FROM user_objects WHERE object_type = 'PROCEDURE' AND status = 'VALID') LOOP vobject_name := processo.object_name; vobject_type := processo.object_type; SELECT REPLACE (TO_CHAR (DBMS_METADATA.get_ddl (vobject_type, vobject_name, pr_usera ) ), pr_usera, pr_userb ) INTO vddl_pro FROM DUAL; EXECUTE IMMEDIATE (vddl_pro); END LOOP; vobject_name := ''; vobject_type := ''; vddl_object := ''; FOR visao IN (SELECT object_name, object_type FROM user_objects WHERE object_type = 'VIEW' AND status = 'VALID') LOOP vobject_name := visao.object_name; vobject_type := visao.object_type;
Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
Ops, Desculpa me exspressei mal. na verdade seu exemplo só arrumei um () e acerto. mas tentei colocar meu caso e retorno um erro == ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor ORA-06512: em line 1 select sys.dbms_lob.substr(dbms_metadata.get_ddl ('PROCEDURE','PR_AUTODDL', 'TCCA'), sys.dbms_lob.getlength(dbms_metadata.get_ddl ('PROCEDURE','PR_AUTODDL', 'TCCA'))) DDL from dual --- Em oracle_br@yahoogrupos.com.br, ithigvo [EMAIL PROTECTED] escreveu 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 gabrielherdt@ 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
Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
na verdade esse comando SUBSTR só aceita até 4000 de byte. Alguem tem alguma solução? Como dar um execute EXECUTE IMMEDIATE em um CLOB com mais de 4000 Caractere?? --- Em oracle_br@yahoogrupos.com.br, Gabriel Herdt [EMAIL PROTECTED] escreveu Ops, Desculpa me exspressei mal. na verdade seu exemplo só arrumei um () e acerto. mas tentei colocar meu caso e retorno um erro == ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor ORA-06512: em line 1 select sys.dbms_lob.substr(dbms_metadata.get_ddl ('PROCEDURE','PR_AUTODDL', 'TCCA'), sys.dbms_lob.getlength(dbms_metadata.get_ddl ('PROCEDURE','PR_AUTODDL', 'TCCA'))) DDL from dual --- Em oracle_br@yahoogrupos.com.br, ithigvo ithigvo@ escreveu 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 gabrielherdt@ 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:
Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
Colega Gabriel, vou tentar ** DE NOVO **, again, vamos ver se consigo passar a mensagem - mais ou menos como os ingleses vitorianos, que achavam que qquer um entende inglês se vc falar alto o suficiente :0 Faça como o seu xará Sylar, vamos à fonte das coisas :0, vamos lá , começando por estabelecer que : == o limite de 4000 bytes é para strings NA LINGUAGEM SQL, na linguagem PL/SQL é de 32 Kb == vc vai chamar o EXECUTE IMMEDIATE do PL/SQL == again, de novo, mais uma vez, no banco 10g as funções de caracter (tal como SUBSTR) foram aumentadas para trabalharem com CLOBs tendo esses pontos aceites (porque são a verdade absoluta) passa a NÂO FAZER O MENOR SENTIDO as tuas perguntas de como quebrar em 400 bytes, em PL/SQL não é esse o limite, E passa também a não fazer O MENOR SENTIDO as respostas que te deram, de usar o DBMS_LOB.SUBSTR pra algo dentro do limite de strings 32 Kb, de usar alguma MÀGICA pra converter para CHAR a string longa (e poder usar no EXECUTE IMMEDIATE), é tudo tão lógicco quanto a amputação de polegares ou pulear da cama ás segundas-feiras, ok ?/ Simplesmente ignore, é PURA BOBEIRA, desnecessária, yes ? Vamos à demonstração no banco 10g : primeiro, veja que tenho uma procedure maior que 4000 bytes - demonstrado num bd 10.2.0.4 EE no meu note novinho e lindão, mas usando a caca do Vista : [EMAIL PROTECTED]:SQLselect length(text), line from user_source where name='PROC_MAIOR_4K_MENOR_Q_32K'; LENGTH(TEXT) LINE -- -- 39 1 13 2 6 3 9 4 6 5 1000 6 1000 7 1001 8 1001 9 1001 10 1 11 6 12 11 13 11 14 4 15 15 linhas selecionadas. [EMAIL PROTECTED]:SQLselect sum(length(text)) from user_source where name='PROC_MAIOR_4K_MENOR_Q_32K'; SUM(LENGTH(TEXT)) -- 5109 == OK, vamos ter um PL/SQL aonde recebo um CLOB do metadata (pode ver na documentação, é CLOB o que ele retorna), e simplesmente converto pra characterstring via TO_CHAR : SEM mágicas, nenhuma, tá bem ??? [EMAIL PROTECTED]:SQLDECLARE 2 v_clob clob; 3 BEGIN 4 v_clob := dbms_metadata.get_ddl('PROCEDURE', 'PROC_MAIOR_4K_MENOR_Q_32K'); 5 execute immediate(to_char(replace(v_clob, 'PROC_MAIOR_4K_MENOR_Q_32K', 'TESTE1'))); 6 END; 7 / Procedimento PL/SQL concluído com sucesso. == veja lá que REALMENTE criou o cara : [EMAIL PROTECTED]:SQL@desc teste1 PROCEDURE teste1 [EMAIL PROTECTED]:SQLselect sum(length(text)) from user_source where name='TESTE1'; SUM(LENGTH(TEXT)) -- 5103 [EMAIL PROTECTED]:SQLselect length(text), line from user_source where name='TESTE1'; LENGTH(TEXT) LINE -- -- 31 1 13 2 6 3 9 4 6 5 1000 6 1000 7 1001 8 1001 9 1001 10 1 11 6 12 11 13 11 14 5 15 1 16 16 linhas selecionadas. É isso, SEM MÁGICAS, forget about o montão de coisas que foi falado nessa thread, inhé ?? Só mesmo se vc ** REALMENTE ** tiver CLOBs com DDLs maiores que 32 Kb é que aí vc VAI (tal como eu tinha dito naa minha msg anterior) ter que SUBSTITUIR * o EXECUTE IMEMDIATE por DBMS_SQL, ok ? VEJAm repito, *** NÂO ADIANTA DE COISA ALGUMA vc querer quebrar o clob com dll em pedaços de 4000 bytes, o limite do EXECUTE IMMEDIATE é 32 kb no total, tá bem ? REPITO, se realmente vc vai ter DDLs tão absurdamente longos (o que é, ou deveria ser, bem raro!!), vc terá que passar a usar o DBMS_SQL, certo ? SE realmente vc ver que vai cair nesse ultra-raro caso, estude a documentação do DBMS_SQL, e qquer coisa manda um alô pra gente que a gente pode tentar cozinhar algum exemplinho pra ti... []s Chiappa == Palestrante ENPO.BR - acesse http://www.enpo- br.org/ Instrutor Workshops ENPO/TWS - acesse http://www.twstecnologia.com.br/ == O inteligente se aborrece com a burrice que grassa no mundo, o sábio se diverte com ela --- Em
Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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
Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
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
Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]
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 [EMAIL PROTECTED] 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