CREATE OR REPLACE DIRECTORY

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
zenfra
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 20 Jul 2007 12:49 pm
Localização: São Paulo - SP

Por que não consigo executar os procedimentos abaixo no SQL Plus?

o seguinte erro é emitido:

se deixo o ponto e virgula depois de

Selecionar tudo

CREATE OR REPLACE DIRECTORY RELAT AS 'C:\';
Erro

Selecionar tudo

CREATE OR REPLACE DIRECTORY RELAT AS 'C:\';
*
ERRO na linha 1:
ORA-00911: caractere inválido


Se tiro o ponto e virgula

DECLARE
*
ERRO na linha 2:
ORA-00901: comando CREATE inválido




Selecionar tudo

CREATE OR REPLACE DIRECTORY RELAT AS 'C:\';
DECLARE
ARQUIVO UTL_FILE.FILE_TYPE;
BEGIN
ARQUIVO:= UTL_FILE.FOPEN('RELAT','TESTE.TXT','W');
UTL_FILE.PUT_LINE(ARQUIVO,'TESTE');
UTL_FILE.FCLOSE(ARQUIVO);
END;
/
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Zenfra, tudo bem?

Bom, alguns passos devem ser seguidos para que o diretório seja criado com sucesso.

O primeiro deles é, ter permissão para isso;
O segundo, quanto à tua sintaxe, não vi problemas, uma dica seria tentar criá-lo sem o replace, para ver se dá tudo certo, conforme este exemplo abaixo:

Selecionar tudo

CREATE DIRECTORY DIRETORIO AS 'C:\Diretorio\';
Um terceiro passo à ser verificado e, não menos importante, é a permissão de acesso no diretório, após criado:

Selecionar tudo

GRANT READ, WRITE ON DIRECTORY DIRETORIO TO USUARIO;

Abaixo, segue um exemplo que pesquisei na net:

Selecionar tudo



SQL> show user
USER é "SYSTEM"
SQL> CREATE DIRECTORY DIRETORIO AS 'C:\CHIAPPA\';

Diretório criado.

SQL> GRANT READ, WRITE ON DIRECTORY DIRETORIO TO SCOTT;

Concessão bem-sucedida.

SQL> conn scott/tiger@o9ir2

SQL> set serveroutput on size 1000000

SQL>DECLARE
2 V_LINHA VARCHAR2(2000) := '';
3 V_ARQUIVO UTL_FILE.FILE_TYPE;
4 BEGIN
5 V_ARQUIVO := UTL_FILE.FOPEN('DIRETORIO', 'ARQUIVO.TXT', 'W');
6 FOR i in 1..5 LOOP
7 V_LINHA := 'LINHA ' || i || '!!';
8 UTL_FILE.PUT_LINE(V_ARQUIVO, V_LINHA);
9 END LOOP;
10 UTL_FILE.FCLOSE(V_ARQUIVO);
11 END;
12 /

Procedimento PL/SQL concluído com sucesso.

==> em uma janela dos, vamos ver como ficou...

C:\>dir c:\chiappa
O volume na unidade C é Sistema
O número de série do volume é 381C-AD01

Pasta de c:\chiappa

19/01/2005 15:57 <DIR> .
19/01/2005 15:57 <DIR> ..
19/01/2005 15:57 55 ARQUIVO.TXT
1 arquivo(s) 55 bytes
2 pasta(s) 1.488.038.400 bytes disponíveis

C:\>TYPE C:\CHIAPPA\ARQUIVO.TXT
LINHA 1!!
LINHA 2!!
LINHA 3!!
LINHA 4!!
LINHA 5!!

C:\>

==> voltando ao sql*plus, exemplo que lê :

SQL> DECLARE
2 V_LINHA VARCHAR2(2000) := '';
3 V_ARQUIVO UTL_FILE.FILE_TYPE;
4 BEGIN
5 V_ARQUIVO := UTL_FILE.FOPEN('DIRETORIO', 'ARQUIVO.TXT', 'R');
6 LOOP
7 Begin
8 UTL_FILE.GET_LINE(V_ARQUIVO, V_LINHA);
9 dbms_output.put_line('Linha lida=' || v_linha);
10 Exception
11 when no_data_found then
12 UTL_FILE.FCLOSE(V_ARQUIVO);
13 exit;
14 End;
15 END LOOP;
16 END;
17 /
Linha lida=LINHA 1!!
Linha lida=LINHA 2!!
Linha lida=LINHA 3!!
Linha lida=LINHA 4!!
Linha lida=LINHA 5!!

Procedimento PL/SQL concluído com sucesso.

SQL> 
Abaixo, segue mais um link com documentação interessante da própria Oracle:

http://download-west.oracle.com/docs/cd ... tm#2061960

qualquer coisa, manda ai.
zenfra
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 20 Jul 2007 12:49 pm
Localização: São Paulo - SP

Então Trivisolli

No serviço eu crio um arquivo txt com os comandos e coloco antes do begin
a linha de spool e o create or replace directory, depois disso eu começo a estrutura de declarações das variaves que vou utilizar e o corpo com o begin
roda normalmente...

Agora instalei o oracle 9i aqui em casa para treinar e começo o arquivo como utilizo no serviço e não funciona..

Só o create directory ele roda...

agora se faço um declare ele já mela!

não to entendendo o que pode ser... até a utilização do UTL_FILE ta dando erro!
zenfra
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 20 Jul 2007 12:49 pm
Localização: São Paulo - SP

Olha só que chato!
E se eu coloco comandos anteriores a esses aidna são gerados ourtros erros, como por exemplo o erro da criação do diretorio quando coloco antes de declare.

Não sei o que é... é necessário alguma configuração ?



Selecionar tudo


SQL*Plus: Release 9.0.1.0.1 - Production on Ter Nov 13 23:03:50 20

(c) Copyright 2001 Oracle Corporation.  All rights reserved.


Conectado a:
Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production
With the Partitioning option
JServer Release 9.0.1.1.1 - Production

SQL> DECLARE 
  2  ARQUIVO UTL_FILE.FILE_TYPE;
  3  BEGIN
  4  ARQUIVO:= UTL_FILE.FOPEN('RELATORIO','TESTE.TXT','W');
  5  UTL_FILE.PUT_LINE(ARQUIVO,'TESTE');
  6  UTL_FILE.FCLOSE(ARQUIVO);
  7  END;
  8  /
DECLARE
*
ERRO na linha 1:
ORA-06510: PL/SQL: exceção não-manipulada definida pelo usuário
ORA-06512: em "SYS.UTL_FILE", line 120
ORA-06512: em "SYS.UTL_FILE", line 204
ORA-06512: em line 4


SQL> 
[/b]
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Zenfra,

Coloca um EXCEPTION de:

Selecionar tudo

  EXCEPTION
  WHEN OTHERS THEN
     RAISE_APPLICATION_ERROR(-20001, 'Erro populando txt: ' || SQLERRM);
E passa esse código de erro pra gente analisar, pode ser?
zenfra
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Sex, 20 Jul 2007 12:49 pm
Localização: São Paulo - SP

olha só :


Selecionar tudo

Conectado a:
Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production
With the Partitioning option
JServer Release 9.0.1.1.1 - Production

SQL> SHOW USER
USER é "SYSTEM"
SQL> 
SQL> 
SQL> DECLARE
  2  ARQUIVO UTL_FILE.FILE_TYPE;
  3  BEGIN
  4   ARQUIVO := UTL_FILE.FOPEN('RELATORIO','TESTE.TXT','W');
  5   UTL_FILE.PUT_LINE(ARQUIVO,'WAGNER FRANZE');
  6   UTL_FILE.FCLOSE(ARQUIVO);
  7  EXCEPTION 
  8  WHEN OTHERS THEN
  9     RAISE_APPLICATION_ERROR(-20001,'ERRO POPULADO TXT:' ||  SQLERRM);
 10  END;
 11  /
DECLARE
*
ERRO na linha 1:
ORA-20001: ERRO POPULADO TXT:User-Defined Exception
ORA-06512: em line 9


SQL> 


Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Zenfra, bom dia.

Tente utilizar uma das exceptions abaixo, para se ter certeza do erro:

Um exemplo de tratamento de erros é:

Selecionar tudo

EXCEPTION
    WHEN NO_DATA_FOUND THEN
	DBMS_OUTPUT.PUT_LINE('Leitura depois do fim do arquivo.');
    WHEN UTL_FILE.INVALID_OPERATION THEN
	DBMS_OUTPUT.PUT_LINE('Não é possível escrever em arquivo
                                                   de apenas leitura.');
END;
Uma lista das exceptions que podem ser utilizadas, com suas descrições é dada a seguir:

NO_DATA_FOUND A procedure GET_LINE tentou ler além do fim do arquivo.
UTL_FILE.INTERNAL_ERROR Ocorreu um erro interno. A operação não foi completada.
UTL_FILE.INVALID_FILEHANDLE O filehandle especificado não é válido ou não foi aberto.
UTL_FILE.INVALID_MODE O modo fornecido em FOPEN não é válido.
UTL_FILE.INVALID_OPERATION Operação inválida pois o arquivo não existe ou a operação não é compatível ao modo para o qual o arquivo foi aberto.
UTL_FILE.INVALID_PATH O caminho fornecido não é acessível.
UTL_FILE.READ_ERROR Erro específico do sistema operacional na leitura do arquivo.
UTL_FILE.WRITE_ERROR Erro específico do sistema operacional na tentativa de se escrever para o arquivo.
VALUE_ERROR O texto lido com GET_LINE é grande demais para caber no buffer especificado.




Exemplo de utilização da package UTL_FILE

Selecionar tudo

DECLARE
	file_handle UTL_FILE.FILE_TYPE;
	nome VARCHAR2(30) ;
	retrieved_buffer VARCHAR2(100);
BEGIN

	-- abre o arquivo para escrita
	-- o arquivo init.ora deve ter o parametro utl_file_dir = C:\TEMP
	file_handle := UTL_FILE.FOPEN('c:\temp','teste.txt','W');

	-- insere uma linha no arquivo definido por file_handle
	UTL_FILE.PUT_LINE(file_handle, 'Linha 1 (um) ');
	SELECT GLOBAL_NAME INTO nome FROM GLOBAL_NAME;
	-- insere outra linha no arquivo definido por file_handle
	UTL_FILE.PUTF (file_handle,'Coluna Nome tem o valor %s \n', nome);

	-- fecha o arquivo
	UTL_FILE.FCLOSE(file_handle);

	-- abre o arquivo para leitura
	file_handle :=   UTL_FILE.FOPEN('c:\temp','teste.txt','R');


	-- inicio de um bloco para leitura
	BEGIN
		LOOP
			-- le uma linha do arquivo definido em file_handle e a exibe
			UTL_FILE.GET_LINE (file_handle, retrieved_buffer);
			DBMS_OUTPUT.PUT_LINE(retrieved_buffer);
		END LOOP;
	EXCEPTION
		-- quando for fim do arquivo
		WHEN NO_DATA_FOUND THEN
			-- fecha o arquivo
			UTL_FILE.FCLOSE(file_handle);
	END;


EXCEPTION
	WHEN UTL_FILE.INVALID_PATH THEN
		DBMS_OUTPUT.PUT_LINE('Caminho inválido.');
		UTL_FILE.FCLOSE(file_handle);
	WHEN UTL_FILE.READ_ERROR THEN
		DBMS_OUTPUT.PUT_LINE('Erro durante a leitura.');
		UTL_FILE.FCLOSE(file_handle);
	WHEN UTL_FILE.WRITE_ERROR THEN
		DBMS_OUTPUT.PUT_LINE('Erro durante a escrita.');
		UTL_FILE.FCLOSE(file_handle);
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('Erro!!');
		UTL_FILE.FCLOSE(file_handle);
END;

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes