如何在 Oracle 中使用 DBMS_SCHEDULER 删除文件
Posted
技术标签:
【中文标题】如何在 Oracle 中使用 DBMS_SCHEDULER 删除文件【英文标题】:How to remove file with DBMS_SCHEDULER in Oracle 【发布时间】:2021-11-12 05:26:32 【问题描述】:我使用DBMS_SCHEDULER.PUT_FILE
将文件写入指定的远程主机。
是否有删除创建文件的程序?
【问题讨论】:
【参考方案1】:不幸的是,据我所知,DBMS_SCHEDULER
中没有用于使用调度程序代理删除远程主机中的文件的等效项。
PUT_FILE 过程
此过程将文件保存到一个操作系统的文件系统中 指定的远程主机或本地计算机。它不同于 等效的 UTL_FILE 过程,因为它使用凭证并且可以 将文件保存到只有调度程序代理的远程主机(而不是 Oracle 数据库)已安装。
但是,您可以通过创建一个远程作业来克服此限制,该作业运行utl_file.fremove
或安装在远程主机上的 shell 脚本以删除远程主机中作为参数传递的文件
使用EXTERNAL_SCRIPT
类型进行远程作业的示例
create or replace procedure my_delete_job ( pname in varchar2 , pfiletodelete in varchar2 )
is
v_job pls_integer;
begin
select count(*) into v_job from dba_scheduler where job_name = upper(pname);
if v_job = 1
then
dbms_scheduler.drop_job ( job_name => upper(pname) , force => true );
end if;
-- UNIX
DBMS_SCHEDULER.create_job(
job_name => 'MY_SH_DELETE',
job_type => 'EXTERNAL_SCRIPT',
job_action => '/path/my_delete_script.sh '||pfiletodelete||' ',
auto_drop => FALSE,
enabled => FALSE);
DBMS_SCHEDULER.set_attribute('MY_SH_DELETE', 'credential_name', 'MY_OS_REMOTE_CRED');
DBMS_SCHEDULER.set_attribute('MY_SH_DELETE', 'destination', 'host.domain:scheduleragentport');
DBMS_SCHEDULER.enable('MY_SH_DELETE');
END;
/
exec my_delete_job ( 'MY_DELETE_JOB' , '/home/user/file.txt' );
请记住,远程作业通常是分离的,因此您需要考虑一种处理异常的方法。
当然,您可以改为在远程数据库中创建一个过程来使用UTL_FILE
包。但是,使用外部脚本的优点是您可以在没有安装 Oracle 数据库的主机上运行远程作业。
这篇文章是关于如何处理远程作业异常的一个很好的例子。
Remote Jobs
【讨论】:
@enfix ,对此解决方法有任何反馈吗?【参考方案2】:是的,但不是DBMS_SCHEDULER
。请改用UTL_FILE.FREMOVE
。
假设您有足够的权限,此过程会删除磁盘文件。
【讨论】:
从 11g 开始,dbms_scheduler
中有一个用于远程调度程序代理的 put_file
过程。我认为这个问题是指这个
是的,我写信给远程调度程序代理。使用 UTL_FILE 如何管理调度程序上的文件?以上是关于如何在 Oracle 中使用 DBMS_SCHEDULER 删除文件的主要内容,如果未能解决你的问题,请参考以下文章