【问题标题】:While looping with dynamic CSV in sqlplus在 sqlplus 中使用动态 CSV 循环时
【发布时间】: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


【解决方案1】:

您可以使用 SQL 代码来生成脚本。例如,以下 SQL 语句将生成一个 SQL*Plus 脚本,用于将每天创建的 DBA_OBJECTS 假脱机到单独的 .csv 文件中:

with head as (select 0 ord, 'set echo off linesize 200 pagesize 2000 heading off feedback off' cmd from dual)
, main as
(
select rownum ord, cmd 
from 
(
select 'spool c:\temp\csv_'||to_char(trunc(created),'YYYY_MM_DD')||'.csv'
|| chr(13)||chr(10) ||
'select owner || '','' || object_type|| '','' || object_name from dba_objects where trunc(created) = to_date(''' || to_char(trunc(created),'YYYY_MM_DD') || ''', ''YYYY_MM_DD''' || ') order by owner, object_type, object_name ; '
|| chr(13)||chr(10) ||
'spool off ' 
|| chr(13)||chr(10) 
|| chr(13)||chr(10) as cmd
from DBA_objects
where created between sysdate-15 and sysdate
group by trunc(created)
order by trunc(created)
)
)
, script as (select * from head union select * from main)
select cmd from script order by ord
;

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 2018-06-02
    • 2013-10-29
    • 2018-07-03
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多