отображать содержимое файла, разделенного символом разделителя - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь отобразить содержимое файла, разделенное символом разделителя.Точнее, начиная с этой темы , я пытаюсь отобразить результат как:

bbb
aaa
qqq
ccc

но источник данных должен быть взят из файла.

До сих пор я пытался:

DECLARE
    l_bfile bfile;
BEGIN
    l_bfile := bfilename(my_dir, my_file);
    dbms_lob.fileopen(l_bfile);

    FOR i IN
        (SELECT TRIM(regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) ) AS q
         FROM dual
         CONNECT BY regexp_substr(TO_CHAR(l_bfile),'[^;]+',1,level) IS NOT NULL
         ORDER BY level
        )
    LOOP
        dbms_output.put_line(i.q);
    END LOOP;

EXCEPTION
WHEN No_Data_Found THEN
    NULL;
END; 

В результате я получил

PL / SQL: ORA-00932: несовместимые типы данных: ожидается, ЧИСЛО получило ФАЙЛ

Может кто-нибудь дать мне подсказку, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Необходимо написать это как новый ответ, так как он слишком велик для комментария к @SmartDumb:

Имейте в виду, что регулярное выражение в форме '[^;]+' (обычно используется для анализа списков с разделителями) завершается неудачно, когда NULLэлементы находятся в списке.Пожалуйста, смотрите этот пост для получения дополнительной информации: https://stackoverflow.com/a/31464699/2543416

Вместо этого, пожалуйста, используйте эту форму вызова regexp_substr (обратите внимание, я удалил второй элемент):

SELECT TRIM(regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level, null, 1) ) AS q
     FROM dual
     CONNECT BY regexp_substr('bbb;;qqq;ccc','(.*?)(;|$)',1,level) IS NOT NULL
     ORDER BY level

Может или не можетВажно, чтобы в этом примере это зависело от того, имеет ли значение порядок элементов в строке для вас или вам нужно сохранить значение NULL.то есть, если вам нужно знать, что второй элемент - NULL, тогда это будет работать.

PS Выполните поиск внешних таблиц и посмотрите, можете ли вы использовать это решение.Это позволит вам запросить файл, как если бы он был таблицей.

0 голосов
/ 04 января 2019

Вы можете попробовать это, если ваш файл содержит одну строку (отсюда и вопрос о файловой структуре):

DECLARE

utlFileHandle  UTL_FILE.FILE_TYPE;
vLine varchar2(100);

BEGIN

utlFileHande := UTL_FILE.FOPEN(my_dir, my_file, 'r');
utl_file.get_line(utlFileHande, vLine);

FOR i IN
    (SELECT TRIM(regexp_substr(vLine,'[^;]+',1,level) ) AS q
     FROM dual
     CONNECT BY regexp_substr(vLine,'[^;]+',1,level) IS NOT NULL
     ORDER BY level
    )
LOOP
    dbms_output.put_line(i.q);
END LOOP;

utl_file.fclose(utlFileHande);

EXCEPTION
WHEN No_Data_Found THEN
   utl_file.fclose(utlFileHande);
   null;
END; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...