在 blob Oracle 中查找工作表名称

Posted

技术标签:

【中文标题】在 blob Oracle 中查找工作表名称【英文标题】:Find worksheet name in blob Oracle 【发布时间】:2021-08-28 16:54:34 【问题描述】:

Oracle table1.data 中有一个blob test.xlsb 文件。在 test.xlsb 中有一个工作表“你好”。但是脚本

SELECT
    CASE DBMS_LOB.instr(t.data, UTL_RAW.cast_to_raw('Hello'))
    WHEN 0 THEN 'No such line' ELSE 'Okay' END res
FROM table1 t;

return '没有这样的行'。为什么?我们如何解决“*.xlsb 文件是否有一个带有特定 [sheet.name] 的工作表?”的问题?当然,我们假设不能只在 Excel 中打开文件,看看是否有这样的工作表。

【问题讨论】:

您可能无法找到该字符串,因为 .xlsb 文件基本上是压缩的 ZIP 文件。您必须解压缩文件并读取此 ZIP 文件中包含工作表名称的任何文件。但是,我不禁觉得数据库是做这种事情的错误地方。 @LukeWoodward,感谢您的意见。我会看看减压。但事情就是这样。并且需要通过工作表的名称过滤大量的.xlsb文件。 【参考方案1】:

试试这个

select *
  from table1
 where dbms_lob.instr (t1, -- the blob column of table
                   utl_raw.cast_to_raw ('Hello'), -- the search string 
                   1, -- starting pointoffset
                   1 -- the which occurance 
                 ) > 0; -- location of text

【讨论】:

您可以在记事本上打开文档而不是搜索您正在搜索的文本吗?我一直使用这个脚本没有任何问题。 我想在数据库级别进行所有检查。我很确定 test.xlsb 中有一个工作表“Hello”,上面的脚本不起作用。我想要一个可扩展的解决方案【参考方案2】:

答案类似于Find and replace string inside BLOB for Work or Excel File

DECLARE
    l_old_file       BLOB;
    l_new_file       BLOB;
    l_files          apex_zip.t_files;
    l_document       BLOB;
    l_clob           CLOB;
    l_dest_offsset   INTEGER;
    l_src_offsset    INTEGER;
    l_lang_context   INTEGER := DBMS_LOB.default_lang_ctx;
    l_warning        INTEGER;
BEGIN
    SELECT t.data INTO  l_old_file 
    FROM table1 t;

    -- Get a list of all the file names contained within the zip
    l_files := apex_zip.get_files (l_old_file);

    -- Loop through all the files adding each one to the new zip
    FOR i IN l_files.FIRST .. l_files.LAST
    LOOP
        l_document := apex_zip.get_file_content (l_old_file, l_files (i));
        DBMS_LOB.createTemporary (lob_loc => l_clob, cache => FALSE);
        l_dest_offsset := 1;
        l_src_offsset := 1;

        DBMS_LOB.converttoclob (dest_lob       => l_clob,
                                src_blob       => l_document,
                                amount         => DBMS_LOB.lobmaxsize,
                                dest_offset    => l_dest_offsset,
                                src_offset     => l_src_offsset,
                                blob_csid      => DBMS_LOB.default_csid,
                                lang_context   => l_lang_context,
                                warning        => l_warning);

            result := INSTR(l_clob, str)
            EXIT WHEN res > 0;

            l_dest_offsset := 1;
            l_src_offsset := 1;

            DBMS_LOB.CONVERTTOBLOB (dest_lob       => l_document,
                                    src_clob       => l_clob,
                                    amount         => DBMS_LOB.lobmaxsize,
                                    dest_offset    => l_dest_offsset,
                                    src_offset     => l_src_offsset,
                                    blob_csid      => DBMS_LOB.default_csid,
                                    lang_context   => l_lang_context,
                                    warning        => l_warning);
    END LOOP;

    DBMS_OUTPUT.put_line(res);
END;

【讨论】:

以上是关于在 blob Oracle 中查找工作表名称的主要内容,如果未能解决你的问题,请参考以下文章

Excel 根据名称查找工作表

oracle数据库用户删除和表空间

excel判断表数据是不是存在另一个表中

从一个工作簿中查找单元格并将其复制到另一个工作簿

在列表中查找多个值并在新工作表中对它们进行排序

遍历所有工作表并查找范围内的值。如果找到然后执行一些操作并转到