Oracle / Plsql мне нужно проверить, что файл сохранен? - PullRequest
2 голосов
/ 21 июня 2019

ORA-29280: ORA-06512: "SYS.UTL_FILE", строка 270 ORA-06512: "SYS.UTL_FILE", строка 1243 ORA-06512: линия 9

declare
  fhandle      UTL_FILE.FILE_TYPE;
begin


/*********************************************/
-- if statement  ( file1.txt check ???? )  

  utl_file.fcopy(src_location  => 'location1',
                 src_filename  => 'file1.txt',
                 dest_location => 'location2',
                 dest_filename => 'file1_backup.txt');
/*********************************************/

  fhandle := UTL_FILE.FOPEN('location1', 'file1.txt', 'W');

  utl_file.put_line(fhandle, 'some text');

  UTL_FILE.FCLOSE(fhandle);

end;

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вы должны написать имя каталога в верхнем регистре.

например

select * from dba_directories
where directory_name='DIR_VIKS'
-------------------------------------------------
SYS DIR_VIKS    /home/trs/viks/00001/XML/03_KRW


declare
  fhandle      UTL_FILE.FILE_TYPE;
begin


/*********************************************/
-- if statement  ( file1.txt check ???? )  

  utl_file.fcopy(src_location  => 'DIR_VIKS',
                 src_filename  => '120910X-001.xml',
                 dest_location => 'DIR_VIKS',
                 dest_filename => '120910X-001.xml.bak');
/*********************************************/

  /*fhandle := UTL_FILE.FOPEN('location1', 'file1.txt', 'W');

  utl_file.put_line(fhandle, 'some text');

  UTL_FILE.FCLOSE(fhandle);
  */

end;



before run script  
oracle@esmd:/home/trs/viks/00001/XML/03_KRW> ls -l
total 64
-rw-r--r-- 1 viks00001 users 29425 2012-09-11 12:43 120910X-001.xml
-rw-r--r-- 1 viks00001 users 29337 2012-11-08 08:26 120910X-002.xml
after run script  
esmd:/home/trs/viks/00001/XML/03_KRW # ls -l
total 96
-rw-r--r-- 1 viks00001 users    29425 Sep 11  2012 120910X-001.xml
-rw-r--r-- 1 oracle    oinstall 29425 Jun 21 10:17 120910X-001.xml.bak
-rw-r--r-- 1 viks00001 users    29337 Nov  8  2012 120910X-002.xml

Если имя каталога в нижнем регистре, мы получаем ошибку.

begin
/*********************************************/
-- if statement  ( file1.txt check ???? )  

  utl_file.fcopy(src_location  => 'dir_viks',
                 src_filename  => '120910X-001.xml',
                 dest_location => 'dir_viks',
                 dest_filename => '120910X-001.xml.bak');
/*********************************************/

  /*fhandle := UTL_FILE.FOPEN('location1', 'file1.txt', 'W');

  utl_file.put_line(fhandle, 'some text');

  UTL_FILE.FCLOSE(fhandle);
  */

end;

10:13:01  line 1: ORA-29280: invalid directory path
10:13:01  ORA-06512: at "SYS.UTL_FILE", line 270
10:13:01  ORA-06512: at "SYS.UTL_FILE", line 1243
10:13:01  ORA-06512: at line 9

Имя файла должно быть в том же регистре, что и в операционной системе. Если имя в процедуре не соответствует операционной системе, мы получаем ошибку.

declare
  fhandle      UTL_FILE.FILE_TYPE;
begin


/*********************************************/
-- if statement  ( file1.txt check ???? )  

  utl_file.fcopy(src_location  => 'DIR_VIKS',
                 src_filename  => '120910X-001.XML',
                 dest_location => 'DIR_VIKS',
                 dest_filename => '120910X-001.xml.bak2');
/*********************************************/

end;

10:36:13  line 1: ORA-29283: invalid file operation
10:36:13  ORA-06512: at "SYS.UTL_FILE", line 270
10:36:13  ORA-06512: at "SYS.UTL_FILE", line 1243
10:36:13  ORA-06512: at line 9
0 голосов
/ 21 июня 2019
I solved the problem

declare
  l_file      utl_file.file_type;
  l_file_name varchar2(20) := 'file1.txt';
  l_exists    boolean;
  l_length    number;
  l_blksize   number;
begin

  utl_file.fgetattr('location1',
                    l_file_name,
                    l_exists,  --OUT
                    l_length,
                    l_blksize);

  if (l_exists) then
    utl_file.fcopy(src_location  => 'location1',
                   src_filename  => 'file1.txt',
                   dest_location => 'location2',
                   dest_filename => 'file1_backup.txt');
  end if;

  fhandle := UTL_FILE.FOPEN('location1', 'file1.txt', 'W');

  utl_file.put_line(fhandle, 'some text');

  UTL_FILE.FCLOSE(fhandle);

end;
...