Chiappa,

Muito obrigado pela resposta e excelente explicação.
Como sempre as tuas respostas são uma aula sobre Oracle.

Abraço,
Roberto

Em 16/12/2011 18:47, José Laurindo escreveu:
>
> Colega, seguinte : primeiro de tudo, como mostrado em 
> http://askanantha.blogspot.com/2007/09/read-file-names-using-plsql.html , 
> essa técnica de popular a X$ após uma chamada à DBMS_BACKUP_RESTORE é 
> **** TOTALMENTE ****, ** ABSOLUTAMENTE ***, ** COMPLETAMENTE *** NÃO 
> SUPORTADA : não só Todas as tabelas X$ são internas e não-documentadas 
> (veja os manuais Oracle que vc vai ver que não existem refs à elas), 
> mas também a própria package DBMS_BACKUP_RESTORE é em si 
> não-documentada, reservada para uso INTERNO do RMAN, ok ? Senso assim, 
> a Qualquer momento , a Qualquer versão do banco, Qualquer package 
> interna e/ou tabela X$ podem ser removidas, alteradas, aí o seu código 
> vai pra cucuia se isso acontecer, e a Oracle não vai dar nem pelota 
> pra vc, já que vc estava usando algo sem Suporte, interno....
> Vou no próximo parágrafo falar sobre as técnicas SUPORTADAS e 
> Documentadas de se obter uma lista de arquivos num diretório do 
> servidor, mas cfrme abaixo, no 10.2.0.5 a X$ existe sim, então suponho 
> que seja problema de versão, a x$ deve ter sido introduzida depois do 
> 10.2.0.1 :
>
>
> Conectado a:
> Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
> With the Partitioning, Oracle Label Security, OLAP, Data Mining 
> Scoring Engine
> and Real Application Testing options
>
> SYS@O10GR2:SQL>grant execute on dbms_backup_restore to system
> 2 /
>
> Concessão bem-sucedida.
>
> SYS@O10GR2:SQL>CREATE OR REPLACE VIEW "SYS"."X_$KRBMSFT"
> 2 (
> 3 "ADDR",
> 4 "INDX",
> 5 "INST_ID",
> 6 "FTYPE_KRBMSFT",
> 7 "FLAGS_KRBMSFT",
> 8 "DBID_KRBMSFT",
> 9 "DBNAME_KRBMSFT",
> 10 "FNAME_KRBMSFT",
> 11 "FNO_KRBMSFT",
> 12 "ROWNO_KRBMSFT",
> 13 "RECID_KRBMSFT",
> 14 "STAMP_KRBMSFT",
> 15 "SIZE_KRBMSFT"
> 16 )
> 17 AS
> 18 SELECT "ADDR",
> 19 "INDX",
> 20 "INST_ID",
> 21 "FTYPE_KRBMSFT",
> 22 "FLAGS_KRBMSFT",
> 23 "DBID_KRBMSFT",
> 24 "DBNAME_KRBMSFT",
> 25 "FNAME_KRBMSFT",
> 26 "FNO_KRBMSFT",
> 27 "ROWNO_KRBMSFT",
> 28 "RECID_KRBMSFT",
> 29 "STAMP_KRBMSFT",
> 30 "SIZE_KRBMSFT"
> 31 FROM SYS.X$KRBMSFT
> 32 /
>
> View criada.
>
> SYS@O10GR2:SQL>GRANT SELECT ON SYS.X_$KRBMSFT TO system
> 2 /
>
> Concessão bem-sucedida.
>
> ==> ok ??
>
> Mas eu Realmente aconselho vc a Esquecer coisas não-documentadas como 
> essa e ir pras opções Documentadas, que seriam :
>
> a) usar o DBMS_SCHEDULER pra rodar um comando/shell script/programa 
> externo ao database que liste os arquivos - talvez até com a opção de 
> baixa tecnologia ls -l /pathdesejado/*.* > output.txt, aí vc lê via 
> UTL_FILE ou external table o output.txt ... 
> http://avdeo.com/2008/04/03/oracle-database-10g-scheduler-basics/ tem 
> um pequeno exemplo, no caso chamando um shell script, mas seria algo 
> perto disso
>
> ou
>
> b) SE vc tiver Java nos dois databases, escrever um pequeno 
> programinha Java que lê o conteúdo dum diretório : 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:439619916584
>  
> e 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:952229840241#9852536116390
>  
> tem exemplinhos e detalhes adicionais
>
> ou
>
> c) escrever no servidor Oracle, usando uma linguagem de programação 
> que permita listar conteúdo de diretório, conectar no database e 
> receber do database comando de disparo (via arquivo texto, pipes, 
> alerts ou outro modo qquer) : 
> http://www.oracletips.info/Running_System_Commands_from_PL_SQL_Using_Pipes.htm
>  
> mostra um feito com pro*C , mas dá pra fazer até via shell script e 
> sqlplus, só depende da tua habilidade em programação
>
> É claro, sempre há maneiras não-online de se obter isso (por exemplo, 
> um simples cron que a cada X minutos dispara e monta um arquivo com a 
> lista de conteúdo do diretório via ls -l > output.txt, e aí o RDBMS 
> l~e o arquivo output.txt), e há variações sobre esses temas todos que 
> mostrei, como por exemplo usar external procedures ao invés de Java ou 
> scheduler pra rodar um programinha/shell script externo, mas em 
> princípio as possibilidades principais são essas que listei acima...
>
> []s
>
> Chiappa
>
>
> --- Em oracle_br@yahoogrupos.com.br 
> <mailto:oracle_br%40yahoogrupos.com.br>, Roberto Warstat 
> <ro.warstat@...> escreveu
> >
> > Pessoal,
> >
> > Preciso listar os arquivos que estão em um diretório no servidor. Para
> > fazer isso estou usando o seguinte código:
> >
> > - como sys executo o script abaixo
> > grant execute on dbms_backup_restore to usuario
> > /
> >
> > CREATE OR REPLACE FORCE VIEW "SYS"."X_$KRBMSFT"
> > (
> > "ADDR",
> > "INDX",
> > "INST_ID",
> > "FTYPE_KRBMSFT",
> > "FLAGS_KRBMSFT",
> > "DBID_KRBMSFT",
> > "DBNAME_KRBMSFT",
> > "FNAME_KRBMSFT",
> > "FNO_KRBMSFT",
> > "ROWNO_KRBMSFT",
> > "RECID_KRBMSFT",
> > "STAMP_KRBMSFT",
> > "SIZE_KRBMSFT"
> > )
> > AS
> > SELECT "ADDR",
> > "INDX",
> > "INST_ID",
> > "FTYPE_KRBMSFT",
> > "FLAGS_KRBMSFT",
> > "DBID_KRBMSFT",
> > "DBNAME_KRBMSFT",
> > "FNAME_KRBMSFT",
> > "FNO_KRBMSFT",
> > "ROWNO_KRBMSFT",
> > "RECID_KRBMSFT",
> > "STAMP_KRBMSFT",
> > "SIZE_KRBMSFT"
> > FROM SYS.X$KRBMSFT
> > /
> >
> > GRANT SELECT ON SYS.X_$KRBMSFT TO usuario
> > /
> >
> > - com o usuário eu executo o bloco PL/SQL abaixo
> > DECLARE
> > caminho_xml VARCHAR2 (1024);
> > ns VARCHAR2 (1024);
> > vIndex NUMBER (3) := 0;
> >
> > TYPE vArquivo IS RECORD (id_arq NUMBER (3), nm_arquivo VARCHAR2
> > (100));
> >
> > TYPE tArquivo
> > IS
> > TABLE OF vArquivo
> > INDEX BY BINARY_INTEGER;
> >
> > vArqXML tArquivo;
> > BEGIN
> > SELECT d.directory_path
> > INTO caminho_xml
> > FROM sys.ALL_DIRECTORIES d, sys.ALL_OBJECTS o
> > WHERE o.OWNER = d.OWNER
> > AND o.OBJECT_NAME = d.DIRECTORY_NAME
> > AND o.object_type = 'DIRECTORY'
> > AND o.owner = 'SYS'
> > AND d.directory_name = 'DIR_XML';
> >
> > SYS.DBMS_BACKUP_RESTORE.searchFiles (caminho_xml, ns);
> >
> > FOR each_file IN (SELECT FNAME_KRBMSFT AS name
> > FROM X_$KRBMSFT
> > WHERE FNAME_KRBMSFT LIKE '%.xml')
> > LOOP
> > DBMS_OUTPUT.PUT_LINE (each_file.name);
> > END LOOP;
> > END;
> >
> > Quando executo o bloco acima em um banco 10.2.0.1 em um servidor linux,
> > ele fala que a tabela ou view não existe para X_$KRBMSFT. Mas se eu
> > executar isso em um banco 11.2.0.1 em uma máquina com Windows XP, 
> funciona.
> > Alguém teria alguma sugestão do que posso fazer para funcionar nos 2 
> bancos?
> > Basicamente o quê quero é listar todos os arquivos que estão em
> > diretório. O diretório em questão eu pego do directory DIR_XML, que foi
> > informado no primeiro select.
> >
> > Abraço,
> > Roberto
> >
>
> 


[As partes desta mensagem que não continham texto foram removidas]

Responder a