0

目前我这样做是为了将 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(或任何目录)?我不能完全从医生那里得知。

4

1 回答 1

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 取决于您的客户。

于 2021-12-22T21:30:34.067 回答