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]