【发布时间】:2020-04-01 13:18:14
【问题描述】:
我是 sqlplus 的新手,我需要帮助。我有下面的选择,我想添加一个 While 循环来为该期间的每一天生成一个 CSV 文件。
有人可以帮我吗?
谢谢!
set pagesize 0
set colsep '|'
set echo off
set feedback off
set linesize 1000
set trimspool on
set headsep off
define start_date = '01/01/2004'
define end_date = '02/01/2004'
define start_csv = TO_CHAR(TO_DATE('&start_date.','DD/MM/YYYY'), 'YYYY-MM-DD')
define end_csv = TO_CHAR(TO_DATE('&start_date.','DD/MM/YYYY'), 'YYYY-MM-DD')
spool 'C:\Extracted_&start_csv._&end_csv..csv'
SELECT <MY SELECT>
FROM <MY TABLES>
WHERE DATE BETWEEN '&start_date.' AND '&end_date.'
spool OFF;
SET echo ON
SET feedback ON
SET headsep ON
编辑 1:这是我在 PL/SQL 版本中的第一次尝试:
DECLARE
-- I pretend to use this variable later, that's why I sent the value to ACTUAL_DATE to run the looping
START_DATE DATE := '01/01/2004';
END_DATE DATE := '31/12/2009';
ACTUAL_DATE DATE := START_DATE;
DT VARCHAR2(10);
BEGIN
WHILE ACTUAL_DATE <= END_DATE LOOP
DT := TO_CHAR(TO_DATE(ACTUAL_DATE, 'DD/MM/YYYY'), 'YYYY-MM-DD');
--sqlplus only
--SPOOL 'C:\EXTRACTED_&DT..CSV'
SELECT <MY SELECT>
FROM <MY TABLES>
WHERE DATE = '&ACTUAL_DATE.'
--SPOOL OFF;
ACTUAL_DATE := ACTUAL_DATE + 1;
END LOOP;
END;
/
【问题讨论】:
-
循环是一个程序性的事情。因此,您需要改用 PL/SQL,这需要进行大量更改。或者写一个shell脚本。
-
感谢您的回答!我已经为 PL/SQL 创建了一个版本,但是通过这种方式,我的问题变成了生成假脱机,因为 PL/SQL 无法识别 SPOOL 命令
-
是的,这就是“一堆变化”,这就是我建议使用 shell 脚本的原因。在纯 SQL / SQL*Plus 中没有办法做到这一点,除非每天运行脚本。
-
这将如何在 shell 脚本中工作?有学习链接吗?
-
顺便说一句,让我指出您的“日期”不是日期,而是字符串,比较它们将是字符串比较,而不是日期比较。因此,“01/02/2020”出现在“12/01/1975”之前。不是你想要的。您的“DATE”列应为 DATE 类型,并且您的所有数据处理都应作为 DATE 而不是 VARCHAR。
标签: oracle loops csv date sqlplus