- Este tópico contém 9 respostas, 2 vozes e foi atualizado pela última vez 16 anos atrás por
Anônimo.
-
AutorPosts
-
18 de fevereiro de 2010 às 6:37 pm #92676
Anônimo
Olá amigos tudo bem…
Seguinte to com um problema aqui em directorias no Oracle, estou precisando selecionar qualquer diretoria onde o Oracle está instalado pois sei que tem uma forma de fazer isso com C dentro do Oracle mas estou com grandes problemas pois não sei como farei isso.
create directory não tem como eu fazer pois isso teria que ser feito para todas as diretorias e não seria uma falha de segurança no servidor.
Preciso de alguma função em C, Java ou algo que atraves do Oracle eu consiga usar essa função ou procedimento para entrar na diretoria criar ficheiros importar ficheiros para tabelas.
Alguém pode me dar uma ajuda.Obrigado!
18 de fevereiro de 2010 às 7:27 pm #92679diegolenhardt
Participantefiz uma pesquisa com
create or replace library,encontrei esse post:
http://glufke.net/oracle/viewtopic.php?t=73
acho que já resolve,
poderia criar um directory no oracle, e no linux criar links simbolicos pra dentro desse directory, dessa forma soh precisaria colocar um unico diretorio no UTL_FILE_DIR, com as devidas permissoes,
18 de fevereiro de 2010 às 8:02 pm #92681Anônimo
Ok eu acho que agora resolvo esse problema.
Obrigado
22 de fevereiro de 2010 às 3:19 pm #92727Anônimo
Bom caro Diego estou com um problema em abrir os ficheiros link do unix, fiz as configurações todos para criar o link que aponta onde o ficheiro vai estar em outros diretorios para que eu não tenha que criar no Oracle varios directories.
Mas usando o dbms_lob.open ou fileopen me retorna um erro dizendo que diretorio errado ou ficheiro não existe, já usei o FILEEXISTS e me retorna 1 com isso tira a minha duvida se está realmente encontrando o ficheiro e se o diretorio e ficheiro existe.
Desta forma não sei o que pode ser pois quandchega na linha que tem dbms_lob.open rebenta e me envia o tal erro:
ORA-22288: file or LOB operation FILEOPEN failedSerá que pode me dar uma luz o que poderia eu fazer para contornar isso.
Abraços
22 de fevereiro de 2010 às 10:09 pm #92740diegolenhardt
Participanteveja o codigo abaixo,
DECLARE
f_lob BFILE := BFILENAME('BARRAGENS','TAIO_P03_28102009_10_15.JPG');
b_lob BLOB;
Lob BLOB;
Length INTEGER;BEGIN
SELECT X INTO b_lob
FROM mydocs
WHERE A = 1
FOR UPDATE;-- Open the LOBs.
dbms_lob.open(f_lob, dbms_lob.file_readonly);
dbms_lob.open(b_lob, dbms_lob.lob_readwrite);
dbms_lob.loadfromfile
(b_lob, f_lob, dbms_lob.getlength(f_lob));
-- Close the LOBs.
dbms_lob.close(b_lob);
dbms_lob.close(f_lob);COMMIT;
-- Select the LOB:
-- SELECT X INTO Lob FROM mydocs;/*
-- Opening the LOB is optional.
DBMS_LOB.OPEN (Lob, DBMS_LOB.LOB_READONLY);
-- Get the length of the LOB.
length := DBMS_LOB.GETLENGTH(Lob);
IF length IS NULL THEN
DBMS_OUTPUT.PUT_LINE('LOB is null.');
ELSE
DBMS_OUTPUT.PUT_LINE('The length is '|| length);
END IF;
-- Closing the LOB is mandatory if you have opened it.
DBMS_LOB.CLOSE (Lob);*/END;
22 de fevereiro de 2010 às 11:39 pm #92741Anônimo
Olá Diego,
Desta maneira eu não conseguiria pois hoje aqui na empresa já tem ferramentas que enviam e-mail e procedimentos do oracle que usa um script em perl para enviar os email de qualquer diretoria sendo assim eu teria que criar vários diretorios no oracle e isso estava fora de cogitação pois teria que rever muito codigo e programas de report e log então a solução seria abrir de qualquer diretorio carregar em uma variavel e depois escrever o corpo do email anexando o ficheiro independente do formato.
Para conseguir fazer isso tive que usar uma biblioteca em C dentro do oracle onde eu executar comando unix e com isso criava links dos ficheiros usando bfilename ou utl_file só que com o bfilename estava gerando um erro ao abrir o ficheiro e quando usava o utl_file eu conseguia um bom resultado com utl_file.get_raw e foi assim que consegui carregar o ficheiro de qualquer directoria.Caso alguém tenha algum problema em carregar ficheiros de qualquer diretoria eu tento passar o codigo comentado.
Obrigado.
22 de fevereiro de 2010 às 11:47 pm #92742diegolenhardt
ParticipanteNão precisa passar como parametro o DIRECTORY, pode passar o caminho direto também..
23 de fevereiro de 2010 às 3:01 pm #92745Anônimo
Oi Diego,
Como assim poderia passar o caminho direto?
quer dizer que posso fazer isso?
f_lob BFILE := BFILENAME(‘/aplic/mat/docs/’,’teste.pdf’);mesmo que eu não tenha criado um objecto directory com essa diretoria
pois eu fiz um teste aqui e diz que o caminho não foi encontrado.23 de fevereiro de 2010 às 5:24 pm #92751diegolenhardt
ParticipanteAssim também funciona sim, veja se as permissões estão corretas, e se o parametro UTL_FILE_DIR tem esse valor incluido:
/aplic/mat/docs
tira a barra (/) do final,
f_lob BFILE := BFILENAME(‘/aplic/mat/docs’,’teste.pdf’);
24 de fevereiro de 2010 às 5:36 pm #92775Anônimo
Pois justamente Diego,
Se eu tiver UTL_FILE_DIR com esse valor consigo declarando o caminho direto mas o meu problema é que nem sempre as diretorias tinha um objeto oracle criado (directory) e nem sempre eu tinha privs de leitura no directorio criado no oracle sendo assim não conseguia selecionar os ficheiros em determinados diretorios.
O que eu tinha que fazer era criar uma API onde independente de onde estivesse o ficheiro eu teria que conseguir carregalo para o oracle mesmo que eu não tenha UTL_FILE_DIR ou um Directory criado.
A solução foi criar links (ln -s) atravez de um diretorio onde ficaria especifico para o oracle ler e gravar esses links pois assim mesmo que a pessoa que fosse selecionar um ficheiro que não estava criado em objeto oracle ele criaria um link até aquele ficheiro e desta forma usando UTL_FILE eu consigo carregar qualquer ficheiro em qualquer diretoria mesmo que não exista em Oracle.
Não sei se conseguiram entender 🙂Mas a intensão de tudo isso é porque eu tenho que enviar e-mail com anexos e sempre que o usuario quiser enviar um e-mail ele não teria que saber se tem ou não uma diretoria criada no oralce ou se ele tem privs para entrar nessa diretoria.
Simplesmente iria dizer qual diretoria e o nome do ficheiro que está nessa diretoria sem se preocupar com mais nada. -
AutorPosts
- Você deve fazer login para responder a este tópico.