如何将常规文件(例如 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?的主要内容,如果未能解决你的问题,请参考以下文章