Re: Res: RES: RES: RES: [oracle_br] Ajuda em procedure[URGENTE]

2008-11-26 Por tôpico Gabriel Herdt
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]

2008-11-26 Por tôpico Gabriel Herdt
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]

2008-11-26 Por tôpico Gabriel Herdt
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]

2008-11-26 Por tôpico jlchiappa
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]

2008-11-21 Por tôpico Gabriel Herdt
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]

2008-11-21 Por tôpico ithigvo
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]

2008-11-19 Por tôpico Wellerson Leite de Araújo
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