【问题标题】:spool to .csv file using for loop使用 for 循环假脱机到 .csv 文件
【发布时间】:2021-07-13 23:47:35
【问题描述】:

需要使用循环将输出假脱机到 .csv 文件中,仅供参考...我在 4 个 diff 分区中有数据。

但不知道如何继续。

代码是这样的。

begin
FOR var_1 in 1 .. 4
LOOP
set linesize 1000
set feedback off
set underline off
spool C:\Users\file.csv replace
        SELECT cust_no FROM customer PARTITION (customer_PR'||var_1||')
        WHERE city='ba' AND first_name='john'
        AND salary=1000;
spool off;
END LOOP;
END;
/

结果:-

Error report -
ORA-06550: line 4, column 5:
PL/SQL: ORA-00922: missing or invalid option
ORA-06550: line 4, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

不确定我的假脱机是否正确,还请检查我的 select 语句中正确使用的 for 循环的索引变量。

【问题讨论】:

    标签: sql oracle plsql sqlplus


    【解决方案1】:

    您不需要 4 个不同的查询,只需在查询中列出所有分区:

    set linesize 1000
    set feedback off
    set underline off
    spool C:\Users\file.csv replace
    SELECT cust_no FROM customer PARTITION (customer_PR1, customer_PR2, customer_PR3, customer_PR4)
            WHERE city='ba' AND first_name='john'
            AND salary=1000;
    spool off;
    

    【讨论】:

      【解决方案2】:

      Spool 是一个 SQL*Plus 命令,PL/SQL 不能“理解”它。如果必须是 PL/SQL,您宁愿切换到 UTL_FILE 包。

      不过,如果这是您仅有的代码,我建议您简单地使用 4 个单独的 SELECT 语句,每个语句使用自己的分区,然后将结果存储到 CSV 文件中。

      如果你这样做了,你会在几个小时前完成。

      【讨论】:

      • 能否请您说明我如何在此处使用 UTL_FILE..?
      【解决方案3】:

      spool 是一个 SQL*Plus 命令,它可以与包含诸如 SYS_REFCURSOR 之类的游标的嵌入式 PL/SQL 代码与动态 SQL as 结合使用

      rec=$(sqlplus -S /nolog << EOF
       conn hr/hr
       whenever sqlerror exit sql.sqlcode
       SET LINESIZE 1000
       SET FEEDBACK OFF
       SET UNDERLINE OFF
       SET SERVEROUTPUT ON
       SPOOL file.csv REPLACE
       DECLARE
        v_cursor SYS_REFCURSOR;
        v_sql    VARCHAR2(32767); 
        cust     customer.cust_no%TYPE;
       BEGIN
        FOR var_1 in 1..4 
        LOOP
          v_sql := 
           'SELECT cust_no
              FROM customer PARTITION(customer_pr'||var_1||')
             WHERE city = :ct
               AND first_name = :fn
               AND salary = :sl';           
          OPEN v_cursor FOR v_sql USING 'ba','john',1000; 
          LOOP
            FETCH v_cursor INTO cust;
            DBMS_OUTPUT.PUT_LINE(cust);
            EXIT WHEN v_cursor%NOTFOUND;
          END LOOP;
        END LOOP;  
        CLOSE v_cursor;
       END;
       /
       SPOOL OFF
      EOF
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 2021-10-11
        • 2021-09-29
        • 2020-08-06
        • 1970-01-01
        • 2016-12-27
        相关资源
        最近更新 更多