如何使用Oracle程序生成带有|分隔值的CSV

如何使用Oracle程序生成带有|分隔值的CSV,oracle,csv,processing,procedure,bulk,Oracle,Csv,Processing,Procedure,Bulk,我正在尝试这个程序。我想使用oracle程序表生成csv,该表包含超过500k条记录。数据库=Oracle 12c SELECT * FROM test_date; CREATE OR REPLACE PROCEDURE genratedata ( to_date NVARCHAR2, curr SYS_REFCURSOR ) AS BEGIN OPEN cur

我正在尝试这个程序。我想使用oracle程序表生成csv,该表包含超过500k条记录。数据库=Oracle 12c

    SELECT
        *
    FROM
        test_date;

    CREATE OR REPLACE PROCEDURE genratedata (
        to_date   NVARCHAR2,
        curr      SYS_REFCURSOR
    ) AS
    BEGIN
        OPEN curr FOR SELECT
                          product_name   AS "PRODUCT",
                          expiry_date    AS "END DATE"
                      FROM
                          test_date
                      WHERE
                          expiry_date <= to_date;

    END;
选择
*
从…起
测试日期;
创建或替换过程数据(
迄今为止,
当前系统参考光标
)作为
开始
打开当前选择
产品名称为“产品”,
到期日为“结束日期”
从…起
测试日期
哪里
到期日您可以使用SQL*Plus(从12.2开始)功能执行此操作:

SQL> select * from t;

     X Y          Z
---------- ---------- --------------------
     1 A          a
   100 A Z        a z

SQL> set markup csv on delimiter | quote off;
SQL> set heading off 
SQL> select * from t;
1|A|a
100|A Z|a z

SQL> 
您可以使用SQL*Plus(从12.2开始)功能执行此操作:

SQL> select * from t;

     X Y          Z
---------- ---------- --------------------
     1 A          a
   100 A Z        a z

SQL> set markup csv on delimiter | quote off;
SQL> set heading off 
SQL> select * from t;
1|A|a
100|A Z|a z

SQL> 

您必须使用SQL*Plus来完成另一个答案中给出的任务,但如果使用该过程有限制,则您必须
concat
每列如下所示:

...
...
BEGIN
    OPEN CURR FOR SELECT '"'
                         || PRODUCT_NAME
                         || '"|"'
                         || EXPIRY_DATE
                         || '"|"'
                         || OTHER_COLUMNS
                         || '"' AS CSV_LINES
                    FROM TEST_DATE
                   WHERE EXPIRY_DATE <= TO_DATE;

END;
。。。
...
开始
为选择“打开当前”
||产品名称
|| '"|"'
||有效期
|| '"|"'
||其他专栏
||“”作为CSV_行
从测试日期开始

如果到期日您必须使用SQL*Plus完成另一个答案中给出的任务,但如果使用该过程有限制,则您必须
concat
每列如下:

...
...
BEGIN
    OPEN CURR FOR SELECT '"'
                         || PRODUCT_NAME
                         || '"|"'
                         || EXPIRY_DATE
                         || '"|"'
                         || OTHER_COLUMNS
                         || '"' AS CSV_LINES
                    FROM TEST_DATE
                   WHERE EXPIRY_DATE <= TO_DATE;

END;
。。。
...
开始
为选择“打开当前”
||产品名称
|| '"|"'
||有效期
|| '"|"'
||其他专栏
||“”作为CSV_行
从测试日期开始

失效日期在哪里?为什么要“使用oracle过程”生成csv?在程序中创建csv是要求的一部分吗?如果不是,就不要这样呈现。告诉我们要求创建csv(即,通过任何方式)。然后你可以告诉我们你现在的想法是通过一个程序来完成。提示:在标准SQL查询中,很可能(几乎可以肯定)可以更高效地完成您的请求-即使您还需要更多的工作来获取输出并将其保存到.csv文件中。是的,要求每天在系统中使用批量数据生成csv。我没有问是否需要生成csv。我问这个需求是否包括如何生成它——也就是说,如果你被要求在一个过程中,而不是以任何其他方式生成它。你为什么要“使用oracle过程”生成csv?在程序中创建csv是要求的一部分吗?如果不是,就不要这样呈现。告诉我们要求创建csv(即,通过任何方式)。然后你可以告诉我们你现在的想法是通过一个程序来完成。提示:在标准SQL查询中,很可能(几乎可以肯定)可以更高效地完成您的请求-即使您还需要更多的工作来获取输出并将其保存到.csv文件中。是的,要求每天在系统中使用批量数据生成csv。我没有问是否需要生成csv。我问你的要求是否包括如何生成它——也就是说,你是否需要在一个过程中,而不是以任何其他方式来完成它。我不确定我是否理解你的说明,Tejash。我是甲骨文。你到底为什么建议任何人在列名中使用双引号?从我的观点来看,这是我强烈建议永远不要做的事情。@Littlefoot:我们正在尝试使用(管道)分隔符生成csv,如果实际数据中存在管道,那么如果不存在双引号,csv将被损坏。这就是为什么使用双引号。啊哈。这是有道理的,这是我没有想到的。谢谢你的解释。也许你想把它添加到你的答案中,以避免混淆。如果它把我弄糊涂了,我想它也会把其他人弄糊涂。我不确定我是否理解你的笔记,特贾什。我是甲骨文。你到底为什么建议任何人在列名中使用双引号?从我的观点来看,这是我强烈建议永远不要做的事情。@Littlefoot:我们正在尝试使用(管道)分隔符生成csv,如果实际数据中存在管道,那么如果不存在双引号,csv将被损坏。这就是为什么使用双引号。啊哈。这是有道理的,这是我没有想到的。谢谢你的解释。也许你想把它添加到你的答案中,以避免混淆。如果它把我弄糊涂了,我想它也会把别人弄糊涂。