如何将常规文件(例如 cwallet.sso )上传到 oracle db 中的 data_pump_dir?

Posted

技术标签:

【中文标题】如何将常规文件(例如 cwallet.sso )上传到 oracle db 中的 data_pump_dir?【英文标题】:how to upload a regular file (eg cwallet.sso ) to data_pump_dir in oracle db? 【发布时间】:2022-01-20 18:54:12 【问题描述】:

目前我这样做是为了将 cwallet.sso(即“正常”文件,而不是导出等)上传到 Oracle 自治数据库......

BEGIN
 DBMS_CLOUD.GET_OBJECT(
    object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/p/Uasdfadsfasdf7Icmer6HMkv/n/sadf/b/paul/o/cwallet.sso',
    directory_name => 'DATA_PUMP_DIR');
END;
/

我宁愿不依赖对象存储,因为我在本地拥有 cwallet.sso,所以这似乎是一个不必要的额外步骤。是否有一个简单的 PL/SQL 命令可以将文件从本地位置上传到 DATA_PUMP_DIR(或任何目录)?我无法从文档中完全分辨出来。

【问题讨论】:

OCI 中的自治数据库无法访问底层操作系统。您可以访问没有个目录对象。 感谢@pmdba 我看到 DBMS_CLOUD(正如我在问题中提到的)和 DBMS_CLOUD_ADMIN 操作具有 directory_name => 'DATA_PUMP_DIR' 建议 'DATA_PUMP_DIR' 和其他目录可以写入和读取。您是否知道这些目录存在的位置,更重要的是是否可以使用 UTL_FILE 或其他任何东西来写入它们(我的问题中的 DBMS_CLOUD.GET_OBJECT 方式)?谢谢阿甘。 【参考方案1】:

自治数据库确实提供对“目录”和“文件”的访问。在幕后,这些是作为虚拟文件系统实现的,存储来自您的数据库,因此它作为数据库配额向您收费。 这有点尴尬,但如果您能够将输入加载到 BLOB 中,则可以使用 PL/SQL 过程将文件放入此文件系统:

  PROCEDURE write_file(
        directory_name   IN  VARCHAR2,
        file_name        IN  VARCHAR2,
        contents         IN  BLOB
  )
  IS
    l_file      UTL_FILE.file_type;
    l_data_len  INTEGER;
    l_buffer    RAW(32000);
    l_pos       INTEGER := 1;
    l_amount    INTEGER := 32000;
  BEGIN
    -- Get the data length to write
    l_data_len := DBMS_LOB.getlength(contents);

    -- Write the contents to local file
    l_file := UTL_FILE.FOPEN(directory_name, file_name, 'wb', l_amount);
    WHILE l_pos < l_data_len
    LOOP
      DBMS_LOB.read(contents, l_amount, l_pos, l_buffer);
      UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
      l_pos := l_pos + l_amount;
    END LOOP;
    UTL_FILE.FCLOSE(l_file);
  EXCEPTION
    WHEN OTHERS THEN
      UTL_FILE.FCLOSE(l_file);
      RAISE;
  END write_file;

如何将数据放入 BLOB 取决于您的客户。

【讨论】:

这是你的第一篇很棒的文章 :) 和巨大的帮助(显然它有效)。谢谢!

以上是关于如何将常规文件(例如 cwallet.sso )上传到 oracle db 中的 data_pump_dir?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Maven构建将常规文件夹添加到我的存储库中?

如何在 iOS 设备上编译 ARM 程序集文件和在 iOS 模拟器上使用常规 C 之间进行选择

如何检查文件是否是C ++中的常规文件?

如何防止数据透视图成为工作表副本上的常规图表?

如何从 lxc 挂载文件夹

通过网络播种选择性下载种子