【问题标题】:Generating CSV file from Oracle DB从 Oracle DB 生成 CSV 文件
【发布时间】:2021-10-07 22:08:53
【问题描述】:

我正在尝试从我的 oracle DB 生成 CSV 文件并通过 mail 将其作为附件发送。我对生成的 CSV 文件有疑问。我可以看到表中的某些值没有正确读取。就像描述列中的值写入 CSV 文件中的两个不同单元格而不是单个单元格一样。

您可以看到一个值写入两个单元格而不是一个单元格作为其余值。这里的“测试请忽略邮件”应被视为单个值,并且应位于同一单元格中。

我注意到表格中的值如下:

这可能是因为我的代码无法读取多行中的值吗?

这是我创建 CSV 文件的代码,FC_ED_DESC 字段导致了问题,我在我为邮件编写的代码的附件部分包含“l_clob”。

   DECLARE
        l_clob CLOB;
        l_attach_text VARCHAR2 (32767);
        l_attach_text_h VARCHAR2 (32767);
        FC_SV_STATUS_DESC VARCHAR2(200) := 'open';
    
        -- select query from table to get the values needed
        CURSOR c1 IS 
           select FC_ED_RECORD_ID,to_char(FC_ED_UPLOADTIME,'DD.MM.YY')FC_ED_UPLOADTIME,FC_ED_USER_ID ,FC_ED_BROKER,FC_ED_ACT_NUM,FC_ED_POLICY_NUM,FC_ED_AMOUNT,FC_ED_TRANS_TYPE,FC_ED_CURRENCY,to_char(FC_ED_DUE_DATE,'DD.MM.YY')FC_ED_DUE_DATE,FC_ED_SENDER_NAME,FC_ED_DESC,to_char(FC_ED_CREDIT_DATE,'DD.MM.YY')FC_ED_CREDIT_DATE from  MYTABLE where FC_ED_EXPCASH_STATUS = 1 ;   
        
    BEGIN   
        -- csv file columns are these
        l_attach_text_h :=
        'FC_ED_RECORD_ID ,FC_ED_UPLOADTIME ,FC_ED_USER_ID ,FC_ED_BROKER ,FC_ED_ACT_NUM ,FC_ED_POLICY_NUM ,FC_ED_AMOUNT ,FC_SV_STATUS_DESC ,FC_ED_TRANS_TYPE ,FC_ED_CURRENCY ,FC_ED_DUE_DATE ,FC_ED_SENDER_NAME ,FC_ED_DESC ,FC_ED_CREDIT_DATE';   
        
        FOR employee_rec in c1    
        LOOP
            DBMS_OUTPUT.put_line('Before loop COUNT Boss ...'||c1%ROWCOUNT);
            -- each value is read using loop   
            l_attach_text :=                                  
            employee_rec.FC_ED_RECORD_ID ||','||
            employee_rec.FC_ED_UPLOADTIME ||','||
            employee_rec.FC_ED_USER_ID ||','||
            employee_rec.FC_ED_BROKER ||','||
            employee_rec.FC_ED_ACT_NUM ||','||
            employee_rec.FC_ED_POLICY_NUM ||','||
            employee_rec.FC_ED_AMOUNT ||','||
            FC_SV_STATUS_DESC ||','||
            employee_rec.FC_ED_TRANS_TYPE ||','||
            employee_rec.FC_ED_CURRENCY ||','||
            employee_rec.FC_ED_DUE_DATE ||','||
            employee_rec.FC_ED_SENDER_NAME ||','||
            employee_rec.FC_ED_DESC ||','||
            employee_rec.FC_ED_CREDIT_DATE ||chr(13);
   
            l_clob := l_clob || l_attach_text;    
        END LOOP;

        -- adding values
        l_clob := l_attach_text_h ||chr(13)|| l_clob; 

谁能帮我解决这个问题?

【问题讨论】:

标签: oracle csv plsql


【解决方案1】:

问题是您没有用双引号括起您的字段。任何包含回车的内容都将被读取为 CSV 文件中的新记录。

由于您使用的是 SQL Developer,因此生成 CSV 文件的最简单方法是在查询中使用 /*csv*/ 提示。这将正确引用所有字段。

将此代码放入 SQL Developer 并使用 F5 执行它以在脚本模式下运行它,您应该在 DBMS_OUTPUT 中获得正确引用的 CSV 输出。

SELECT /*csv*/
       FC_ED_RECORD_ID,
       TO_CHAR (FC_ED_UPLOADTIME, 'DD.MM.YY')      FC_ED_UPLOADTIME,
       FC_ED_USER_ID,
       FC_ED_BROKER,
       FC_ED_ACT_NUM,
       FC_ED_POLICY_NUM,
       FC_ED_AMOUNT,
       FC_ED_TRANS_TYPE,
       FC_ED_CURRENCY,
       TO_CHAR (FC_ED_DUE_DATE, 'DD.MM.YY')        FC_ED_DUE_DATE,
       FC_ED_SENDER_NAME,
       FC_ED_DESC,
       TO_CHAR (FC_ED_CREDIT_DATE, 'DD.MM.YY')     FC_ED_CREDIT_DATE
  FROM MYTABLE
 WHERE FC_ED_EXPCASH_STATUS = 1;

另一个选项是在 SQL Developer 中运行您想要的查询,然后突出显示您要导出的结果(或按 Control + A),然后右键单击并选择导出并选择格式为 CSV

更新

要修复您现有的代码,请在要组合到 l_attach_text 变量中的每个字段周围加上双引号。请参阅下面的示例。

    l_attach_text :=       '"' ||                           
            employee_rec.FC_ED_RECORD_ID ||'","'||
            employee_rec.FC_ED_UPLOADTIME ||'","'||
            employee_rec.FC_ED_USER_ID ||'","'||
            employee_rec.FC_ED_BROKER ||'","'||
--          ...(the rest of your fields here)
            employee_rec.FC_ED_DESC ||'","'||
            employee_rec.FC_ED_CREDIT_DATE || '"' || chr(13);

【讨论】:

  • 感谢您的回答....但是在这里我正在生成一个 CSV 文件并将其附加到邮件中。我已经为邮件编写了单独的代码,并且从我上面的代码中,我在附件部分包含了“l_clob”.....所以我通过邮件获得了一个 CSV 文件作为附件
  • “问题是你没有用双引号括起你的字段。任何包含回车的内容都将在你的 CSV 文件中被读取为新记录” - 你能告诉我应该进行哪些更改我愿意
  • 刚刚添加了更新。请参阅已编辑答案的底部。
  • 并且每列在添加引号之前都应该用replace(column_, '"', '""')处理以避免意外的字段刹车
  • @TJ32 在用引号括住每一列之前。只需尝试将单元格内带有换行符、引号、分号(或您使用的任何分隔符)的任何电子表格导出为 CSV。然后检查导出的文件是如何格式化的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2011-05-17
相关资源
最近更新 更多