【问题标题】:SQLPLUS result set - output to file AND insert into tableSQLPLUS 结果集 - 输出到文件并插入到表中
【发布时间】:2015-11-07 06:36:04
【问题描述】:

我需要通过 SQLPLUS 将选择查询的结果输出到文件中,然后还将这些记录插入“已发送”表中。虽然我不知道如何重新使用该结果存储在“已发送”表中。我必须使用光标吗?我对游标不是很熟悉,但我想这可能是解决方案?还有其他方法吗?顺便说一句,这是在一个 shell 脚本中。

这是我目前所拥有的:

sqlplus -S <<ENDOFSQL  || eval 'echo "Error occurred during sqlplus command line $LINENO" 1>&2; exit 1'
$USER/$PW@//$IP_PORT/$DB
SET PAGESIZE 50000
set feedback off
SET MARKUP HTML ON SPOOL ON
SET NUM 24
SPOOL REPORT.xls

select * from SOMETABLE A WHERE not exists (select 1 from SENT_TABLE B where   A.ID = B.ID);

SPOOL OFF
SET MARKUP HTML OFF SPOOL OFF

(NOW USE RESULTS FROM SPOOL AND INSERT INTO THE "SENT" TABLE) 

ENDOFSQL

【问题讨论】:

  • 您必须使用SLLDR SQL Loader 脚本将文件加载到另一个表中。这是最快的方法。否则,您可以使用 UTL_FILE 包使用 file 操作并编写一个 PLSQL 块来加载文件。

标签: sql oracle shell sqlplus spool


【解决方案1】:

如果您不想保留REPORT.xls 的副本,则如下所示。但我建议您为此编写一个单独的 SQL Loader 脚本。

sqlplus -S <<ENDOFSQL  || eval 'echo "Error occurred during sqlplus command line $LINENO" 1>&2; exit 1'
$USER/$PW@//$IP_PORT/$DB
    SET PAGESIZE 50000
    set feedback off
    SET MARKUP HTML ON SPOOL ON
    SET NUM 24
    SPOOL report.sql

    select 'insert into SENT values('||column1||','||column2...||');' 
    from SOMETABLE A 
    WHERE not exists (select 1 
                        from SENT_TABLE B 
                        where   A.ID = B.ID);

    SPOOL OFF;
    @report.sql 
    COMMIT;
ENDOFSQL

上面的和-

一样好
INSERT INTO SENT
select *
    from SOMETABLE A 
    WHERE not exists (select 1 
                        from SENT_TABLE B 
                        where   A.ID = B.ID);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多