首页 > 解决方案 > 调度查询以在 SQL Developer 中导出 CSV 的调度运行

问题描述

早上好,

我对 SQL 比较陌生,我已经在互联网上搜索试图找到解决我的问题的方法,但无济于事。我已经尝试通过 SQL Developer 界面创建过程、作业、程序、凭据和时间表,并按照我能找到的关于该主题的每篇文章的指示对其进行修改,但我似乎无法使其正常工作。

我想从周一到周五的 0600 到 1700 每 30 分钟运行一次以下 SQL 脚本,以便它每 30 分钟导出一个 CSV 文件。

当我在 SQL 开发人员中执行脚本时,它会查询数据库并按预期保存文件,但无论我试图让它按计划工作多少次,我似乎都无法做到正确。

在此先感谢您的帮助!

SPOOL C:\Users\X\Documents\SQL\Uploads\X.CSV
SET SQLFORMAT CSV


    SELECT

    NAME_OF_PERSON

    FROM DATABASE;

标签: sqloracleoracle-sqldeveloperoracle12c

解决方案


在低于 12c 的版本中,OracleDBMS_JOB和/或DBMS_SCHEDULER将安排存储过程的执行。它可以创建一个文件,但您必须使用UTL_FILEpackage 来执行此操作,而不是SPOOL.

当您使用 Oracle 12c 时,它DBMS_SCHEDULER现在提供了一种新的作业类型 - SQL_SCRIPT,它允许您安排一个 .SQL 脚本。这意味着您发布的代码应存储为文件。我无法在我的 11gXE 上创建示例,但这里有一个指向ORACLE-BASE站点的链接:https ://oracle-base.com/articles/12c/scheduler-enhancements-12cr1和从中复制的脚本显示了如何做那:

CONN test/test@pdb1

-- Create a job with a SQL*Plus script defined in-line,
-- including an explicit connect.
SET SERVEROUTPUT ON
DECLARE
  l_job_name VARCHAR2(30);
  l_script   VARCHAR2(32767);
BEGIN
  l_job_name := DBMS_SCHEDULER.generate_job_name;
  DBMS_OUTPUT.put_line('JOB_NAME=' || l_job_name);

  -- Notice the explicit database connection in the script.
  l_script := 'CONN test/test@pdb1
SPOOL /tmp/test.lst
SELECT SYSDATE, USER FROM dual;
SPOOL OFF';

  DBMS_SCHEDULER.create_job(
    job_name        => l_job_name,
    job_type        => 'SQL_SCRIPT',
    job_action      => l_script,
    credential_name => 'oracle_ol6_121',
    enabled         => TRUE
  );
END;
/

或者,您可以使用操作系统的调度程序(MS Windows 上的任务调度程序)并告诉它运行一个 .BAT 脚本,该脚本将建立 SQL*Plus 连接并运行一个包含SPOOL命令和该SELECT语句的 .SQL 脚本。

忘了说:我不会让 SQL Developer 参与其中。


推荐阅读