Импорт данных из файла file.txt в таблицу Oracle SQL с использованием PL / SQL - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь прочитать файл типа txt из c: \ Dir и вставить содержимое в таблицу Oracle Sql

set SERVEROUTPUT ON
CREATE OR REPLACE DIRECTORY MYDIR AS ' C:\dir';

DECLARE
  vInHandle  utl_file.file_type;
  eNoFile    exception;
  PRAGMA exception_init(eNoFile, -29283);
BEGIN
  BEGIN
    vInHandle := utl_file.Fopen('MYDIR','attachment.txt','R');
    dbms_output.put_line('The File exists');
  EXCEPTION
    WHEN eNoFile THEN
      dbms_output.put_line('The File not  exists');
  END;
END fopen;
/

У меня есть файл не существует, но у меня есть этот файл

1 Ответ

0 голосов
/ 05 марта 2020

Я не знаю, имеет ли место пробел перед именем каталога в первом опубликованном вами утверждении, имеет значение (или это просто опечатка), но - тем не менее, вот как это обычно делается.

Создать каталог на жестком диске:

C:\>mkdir c:\dir

Подключиться к базе данных как SYS (поскольку она владеет базой данных, а также каталогами); создайте каталог (Oracle объект) и предоставьте привилегии пользователю, который будет использовать этот каталог:

C:\>sqlplus sys as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on ╚et O×u 5 18:34:43 2020

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> create or replace directory mydir as 'c:\dir';

Directory created.

SQL> grant read, write on directory mydir to scott;

Grant succeeded.

SQL>

Вам это не нужно, поскольку у вас уже есть файл; Я создам его путем спулинга содержимого таблицы.

SQL> connect scott/tiger
Connected.
SQL> spool c:\dir\example.txt
SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> spool off;
SQL> $dir c:\dir\*.txt
 Volume in drive C is OSDisk
 Volume Serial Number is 7635-F892

 Directory of c:\dir

05.03.2020.  18:39               539 example.txt
               1 File(s)            539 bytes
               0 Dir(s)  290.598.363.136 bytes free

SQL>

Наконец, повторное использование написанного вами кода:

SQL> set serveroutput on
SQL>
SQL> DECLARE
  2    vInHandle  utl_file.file_type;
  3    eNoFile    exception;
  4    PRAGMA exception_init(eNoFile, -29283);
  5  BEGIN
  6    BEGIN
  7      vInHandle := utl_file.Fopen('MYDIR','example.txt','R');
  8      dbms_output.put_line('The File exists');
  9    EXCEPTION
 10      WHEN eNoFile THEN
 11        dbms_output.put_line('The File not  exists');
 12    END;
 13  END fopen;
 14  /
The File exists

PL/SQL procedure successfully completed.

SQL>

Работает правильно (поздравляю, вы написали код, который действительно работает! ).


Итак, что вы сделали не так?

  • , как я уже сказал, место перед базой данных c:\dir: CREATE OR REPLACE DIRECTORY MYDIR AS ' C:\dir';
  • не на вашем компьютере, но на отдельном сервере базы данных
    • это означает, что вы, вероятно, создали каталог, но он указывает на каталог c:\dir на сервере базы данных, а не на ваш собственный P C!

Как прокомментировал Boneist, можно создать каталог (объект Oracle) на компьютере, который НЕ является сервером базы данных, но это обычно не то, что мы обычно делаем. Если вы решите выбрать эту опцию, вам придется использовать UN C (Universal Naming Convention) при создании каталога.


Другой вариант, который вы можете рассмотреть, - это использовать SQL Loader . Это утилита операционной системы, устанавливаемая вместе с базой данных или (полным, а не мгновенным) клиентским программным обеспечением. Его преимущество в том, что он работает на вашем локальном компьютере P C (т.е. вам не нужно иметь доступ к серверу базы данных) и работает очень быстро. Вы бы создали управляющий файл, который сообщает Oracle, как загружать данные, хранящиеся в исходном (.txt) файле.

Другой вариант, который - в фоновом режиме - использует SQL Loader, - это использование внешней таблицы . Это еще один объект Oracle, который указывает на исходный файл (.txt) и позволяет получить к нему доступ с помощью простого оператора SQL SELECT. Возможный недостаток: для него по-прежнему требуется доступ к каталогу Oracle (так же, как ваш параметр UTL_FILE).

...