如何在 oracle 12c 中创建导出表作业

Posted

技术标签:

【中文标题】如何在 oracle 12c 中创建导出表作业【英文标题】:how to create a export table job in oracle 12c 【发布时间】:2022-01-15 18:49:00 【问题描述】:

我想创建一个导出表作业,但我不明白为什么它不起作用。

我的桌子是部门

create table department (id number, name varchar2(200));

我想在每天晚上 9:00 导出一个 csv 文件。我需要创建它。

我只知道: 0.创建目录

    创建一个PROCEDURE 创建一个DBMS_SCHEDULER.CREATE_PROGRAM 创建一个DBMS_SCHEDULER.CREATE_SCHEDULE 创建一个DBMS_SCHEDULER.CREATE_JOB 执行任务

谢谢

【问题讨论】:

【参考方案1】:

我按照下面的步骤,成功了……

    创建目录(导出文件的路径):
    CREATE OR REPLACE DIRECTORY CSVDIR AS 'D:\';
    创建过程:
Create Or Replace Procedure exp_emp_data Is
    
    today varchar2(200);
    fileName varchar2(200);
    
    n_file     utl_file.file_type;
    v_string   Varchar2(4000);
  Cursor c_emp Is
    Select
        id, name
    From
        department;
        
Begin

    select to_char(sysdate,'yyyymmdd','nls_calendar=persian') into today from dual;
    
    fileName := 'empdata' || today || '.csv';

    n_file := utl_file.fopen('CSVDIR', fileName, 'w', 4000);
    v_string := 'ID, Name';
    utl_file.put_line(n_file, v_string);
    -- open the cursor and concatenate fields using comma
    For cur In c_emp Loop
        v_string := cur.id
                    || ','
                    || cur.name;
        
        -- write each row
        utl_file.put_line(n_file, v_string);
    End Loop;
    -- close the file
    utl_file.fclose(n_file);
Exception
    When Others Then
        -- on error, close the file if open
        If utl_file.is_open(n_file) Then
            utl_file.fclose(n_file);
        End If;
End;
/
-------- Test
Begin
    exp_emp_data;
End;
/
    创建程序:
    BEGIN
    DBMS_SCHEDULER.CREATE_PROGRAM (
     program_name      => 'PROG_EXPORT_TABLE',
     program_action     => 'exp_emp_data',
     program_type      => 'STORED_PROCEDURE');
    END; 
    /
    创建工作:
     BEGIN
     DBMS_SCHEDULER.CREATE_JOB (
     job_name           =>  'JOB_EXPORT_TABLE',
     job_type           =>  'STORED_PROCEDURE',
     job_action         =>  'PROG_EXPORT_TABLE',
     start_date         =>  '16-nov-2021 11:50:00 pm',
     repeat_interval    =>  'FREQ=DAILY;BYHOUR=23;BYMINUTE=59',
     enabled            =>  true
    );
     END;
     /
    并启用它:
    exec dbms_scheduler.enable('JOB_EXPORT_TABLE');

【讨论】:

【参考方案2】:

是的,您可以通过这种方式创建使用DBMS_SCHEDULER

DECLARE
  v_job_name VARCHAR2(32) := 'jb_exp_emp_data';
BEGIN
  DBMS_SCHEDULER.CREATE_JOB(job_name        => v_job_name,
                            job_type        => 'STORED_PROCEDURE',
                            job_action      => 'exp_emp_data',
                            start_date      => TO_DATE('11-12-2021 21:00:10',
                                                       'DD-MM-YYYY HH24:MI:SS'),
                            repeat_interval => 'FREQ=DAILY; BYHOUR=21;',
                            auto_drop       => false,
                            comments        => 'Exports the content of the department table every day at 9:00PM o''clock ');

  DBMS_SCHEDULER.ENABLE(v_job_name);
END;
/

start_date 参数定义的时间开始,然后在未来的每个未来几天晚上 9 点重复。

【讨论】:

以上是关于如何在 oracle 12c 中创建导出表作业的主要内容,如果未能解决你的问题,请参考以下文章

在 Obiee 12c 中创建一个新用户

Oracle 12c怎么创建表啊,今天刚装的,啥都不懂,求各位大神指教!!1

如何在 Oracle 数据库中创建临时表?

如何在oracle10G中创建表空间

如何使用触发器在 oracle 中创建镜像表?

从 Oracle 12c 函数返回多个值