如何在 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 删除文件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何在储过程中使用临时表

如何在Oracle中使用Java存储过程

如何使用 varray 在 oracle 函数中接收多个参数

如何在存储过程(Oracle)中使用 SELECT 请求?

如何通过oracle在c#中使用多个选择查询

oracle 中 sum 如何使用,