UTL_FILE.FGETATTR возвращает 0 для размера блока

#windows #oracle #oracle19c #utl-file

#Windows #Oracle #oracle19c #utl-файл

Вопрос:

Когда я использую UTL_FILE.FGETATTR, размер блока каждый раз возвращает 0. Я могу получить длину файла и т.д., Но размер блока возвращает 0. В чем может быть причина этого и как я могу это решить? ОС: Windows 10 DB: 19c

 DECLARE
    v_fexists       BOOLEAN;
    v_file_length   NUMBER;
    v_block_size    BINARY_INTEGER;
BEGIN
    UTL_FILE.FGETATTR ('TEST_DIR','temp file.txt',v_fexists,v_file_length,v_block_size);
    IF v_fexists THEN
        DBMS_OUTPUT.PUT_LINE('The file exists');
        DBMS_OUTPUT.PUT_LINE('Its length is     :'||v_file_length);
        DBMS_OUTPUT.PUT_LINE('Its block size is :'||v_block_size);
    ELSE
        DBMS_OUTPUT.PUT_LINE('The file does not exist!');
    END IF;
END;
  

 PL/SQL procedure successfully completed.

The file exists
Its length is     :2794
Its block size is :0
  

Комментарии:

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

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

3. вы пробовали в другом каталоге? Возможно, проблема в Windows 10, которая не является версией ОС Windows Server. Я не могу протестировать Windows на своей стороне:(

4. Я думаю, что это все еще ожидается в Windows; смотрите Документ ID 274466.1 в моей службе поддержки Oracle. Это относится только к 9i / 10g, но не видно, что это, вероятно, изменилось. (Похоже, ошибка документации, если это так, хотя …)

5. @AlexPoole , хороший улов. Действительно, это причина 😉 Я просто уточняю у одного парня из службы поддержки, и документ применяется к каждой версии Oracle, хотя в нем указано только 9i / 10g.

Ответ №1:

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

На платформах Windows процедура UTL_FILE.FGETATTR возвращает 0 вместо правильного размера блока, даже если файл существует. Платформа Windows не предоставляет никакой системной подпрограммы для получения размера блока ввода-вывода файловой системы, в результате она возвращает 0, что является ожидаемым поведением.

Хотя это предсказано и задокументировано для 9i / 10g, проблема также воспроизводима на 12c, 18c и 19c.

Ссылка на примечание службы поддержки