Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Процедура не видит файл/директорию


Автор: darkvivi 13.10.2013, 12:14
 Здравствуйте! Не получается загрузить картинку в blob, вызывается ошибка, якобы не существует файл или директория, хотя на самом деле они есть, вот код: 

Сначала создаю таблицу, затем саму процедуру с параметрами, потом делаю execute. Дело в том, что пока я не добавил параметр "dir in varchar2" всё работало достаточно гладко..подскажите, плииз, в чём может быть ошибка?

Код

create table temp_photo0 
 (
 ID    NUMBER(3)     NOT NULL,
 PHOTO_NAME      VARCHAR2(50),
 PHOTO    BLOB
 );
 
 create or replace PROCEDURE load_file0(
 p_id number, dir in varchar2,
 p_photo_name in varchar2) IS
 src_file BFILE;
 dst_file BLOB;
 lgh_file BINARY_INTEGER;
 BEGIN
  src_file := bfilename(dir, p_photo_name);
  -- insert a NULL record to lock
  INSERT INTO temp_photo0
  (id, photo_name, photo)
  VALUES
  (p_id , p_photo_name ,EMPTY_BLOB())
  RETURNING photo INTO dst_file;
  -- lock record
  SELECT photo 
  INTO dst_file
  FROM temp_photo0
  WHERE id = p_id
  AND photo_name = p_photo_name
  FOR UPDATE;
  -- open the file
  dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
  -- determine length
  lgh_file := dbms_lob.getlength(src_file);
  -- read the file
  dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
  -- update the blob field
  UPDATE temp_photo0 
  SET photo = dst_file
  WHERE id = p_id
  AND photo_name = p_photo_name;
  -- close file
  dbms_lob.fileclose(src_file); 
 END load_file0;
/ 

execute load_file0(1,'c:\photo_dir','rdht4.jpg') ; 


Вот ошибка:
Error report:
ORA-22285: non-existent directory or file for FILEOPEN operation
ORA-06512: at "SYS.DBMS_LOB", line 805
ORA-06512: at "NIKITA.LOAD_FILE0", line 23
ORA-06512: at line 1
22285. 00000 -  "non-existent directory or file for %s operation"
*Cause:    Attempted to access a directory that does not exist, or attempted
           to access a file in a directory that does not exist.
*Action:   Ensure that a system object corresponding to the specified
           directory exists in the database dictionary, or
           make sure the name is correct.

Автор: Zloxa 13.10.2013, 17:18
Цитата(darkvivi @  13.10.2013,  13:14 Найти цитируемый пост)
bfilename(dir, p_photo_name);

rtfm  http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions012.htm
Цитата

'directory' is a database object that serves as an alias for a full path name on the server file system where the files are actually located.


rtfm http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5007.htm#i2061958

Добавлено через 1 минуту и 17 секунд
Цитата(darkvivi @  13.10.2013,  13:14 Найти цитируемый пост)
c:\photo_dir

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

Автор: darkvivi 13.10.2013, 17:33
  То есть, лучше всего указать dir как directory, а не varchar2?
 А разве из directory нельзя сделать параметрическую переменную? :( Мне выдаёт ошибку...
Error(3,18): PLS-00201: identifier 'DIRECTORY' must be declared

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)