【问题标题】:UTL_FILE.FGETATTR returns 0 for the block sizeUTL_FILE.FGETATTR 为块大小返回 0
【发布时间】:2020-12-16 01:53:39
【问题描述】:

当我使用 UTL_FILE.FGETATTR 时,块大小每次都返回 0。我可以获得文件长度等,但块大小返回 0。这可能是什么原因,我该如何解决这个问题? 操作系统:Windows 10 数据库: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

【问题讨论】:

  • 你能举个例子吗?因为如果文件存在,它应该返回块大小
  • 我相信这与Windows有关。因为我在 Linux 上做了同样的测试,它没有问题(相同的数据库版本)
  • 您是否尝试在另一个目录中?也许问题是 windows 10 ,它不是 windows server os 版本。我无法在我这边的 Windows 上进行测试 :(
  • 我认为这在 Windows 上仍然是预期的;请参阅 My Oracle Support 上的文档 ID 274466.1。它仅指 9i/10g,但看不出它可能已经改变。 (不过,如果是这样的话,这似乎是一个文档错误......)
  • @AlexPoole ,不错的收获。确实这就是原因 ;) 我只是与支持部门的一个人核实,该文档适用于每个 Oracle 版本,即使它说只有 9i/10g。

标签: windows oracle oracle19c utl-file


【解决方案1】:

我只是发布每个人都知道的答案,您可以将问题标记为已回答。这或多或少是对我们在 cmets 部分讨论的所有内容的回忆。

在 Windows 平台上,UTL_FILE.FGETATTR 过程返回 0 而不是 即使文件存在,正确的块大小也是如此。 Windows 平台没有提供任何系统子程序来获取文件系统 I/O 块大小,因此它返回 0,这是预期的行为。

虽然它是针对 9i/10g 进行预测和记录的,但该问题在 12c、18c 和 19c 上也可以重现。

Link to Support Note

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多