sql - 调度查询以在 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;
解决方案
在低于 12c 的版本中,OracleDBMS_JOB
和/或DBMS_SCHEDULER
将安排存储过程的执行。它可以创建一个文件,但您必须使用UTL_FILE
package 来执行此操作,而不是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 参与其中。
推荐阅读
- c# - 如何使用可以删除该项目的按钮添加项目 c# winforms
- php - ImageMagick - 转换 -auto-orient 无法正常工作,PHP
- c - 定义宏时使用逗号运算符
- android - 如何使用匕首(GithubBrowserSample)在应用程序类中注入存储库?
- javascript - groupBy to arrays by value, includes(), custom structure
- excel - Excel:如何根据列中的特定值计算行数?
- sql - 如何在 Laravel Eloquent 中使用 Postgresql DISTINCT ON
- c# - Unity Player 抛出异常:System.ArgumentException: Get Method not found for 'hideFlags'
- c - 可以使 C _start 函数调用 main 以外的入口点函数吗?
- reactjs - React Material Table 操作按钮标记覆盖多个操作