PLSQL 过程中的类型转换

Type Conversion inside procedure in PLSQL

我在 Oracle 中有两个 table。其中之一是 GPU_INV,第二个是 GPU_FILE_HIST。我在 GPU_FILE_HIST 中使用 GPU_INV 的记录,这是结果的最终 table。

我的问题是我在 GPU_INV 中定义了 2 列,它们是 BILL_DATE(日期)和 DUE_DATE(日期)。如您所见,这些是日期类型,但我想让它们 BILL_DATE NUM ( 6 NUM) 格式:YYYYMM 和 DUE_DATE NUM(8) 格式:YYYYMMDD 写入 GPU_FILE_HIST.

那么如何在我的程序中进行此更改?

我正在下面添加我的脚本,从现在开始我愿意接受任何建议谢谢。

请注意:我将 GPU_INV 的记录存储在 GPU_FILE_HIST 内的 FILE_CONTENT 列内。

    create table GPU_FILE_HIST
(
  file_name    VARCHAR2(50),
  file_content CLOB,
  cdate        DATE,
  cuser        VARCHAR2(100)
);

GPU_FILE_EXTRACTOR 程序脚本

CREATE OR REPLACE PROCEDURE GPU_FILE_EXTRACTOR is



vs_FILE_NAME varchar2(50);
  vb_output_is_UNIX_FILE boolean := true;
  vs_header1 varchar2(20) := 'FCBS';
  vs_header2 varchar2(250) := 'BILLNO|INVOICEID|BILLDATE|BILLACCTID|PARENTBILLACCTID|DUEDATE|CMPGID|AMOUNT|GRANDAMOUNT|PRODNUM|DISTID';
  vs_footer varchar2(100);
  vs_rowdata varchar2(1000);
  vn_RECORD_COUNT number;
  vl_FILE_CLOB CLOB;
  vs_newline varchar2(2);
BEGIN
  if vb_output_is_UNIX_FILE then
    vs_newline := CHR(10);
  else
    vs_newline := CHR(13)||CHR(10);
  end if;

 SELECT 'FCBS_INVOICE_'||to_char(sysdate,'YYYYMMDD_HHMISS') ||'.txt' into vs_FILE_NAME FROM dual;

 vl_FILE_CLOB := empty_clob();
 dbms_lob.createtemporary(lob_loc => vl_FILE_CLOB, cache => true, dur => dbms_lob.session);


  dbms_lob.writeappend(vl_FILE_CLOB, length(vs_header1),vs_header1);
   dbms_lob.writeappend(vl_FILE_CLOB, length(vs_newline),vs_newline);

  dbms_lob.writeappend(vl_FILE_CLOB, length(vs_header2),vs_header2);
    dbms_lob.writeappend(vl_FILE_CLOB, length(vs_newline),vs_newline);

 select count(1) into vn_RECORD_COUNT from FCBSADM.GPU_INV;
 for rec in (select * from FCBSADM.GPU_INV)
   loop
    vs_rowdata := rec.BILL_NO||'|'||rec.INV_ID||'|'||to_char(rec.BILL_DATE,'YYYYMM')||'|'||rec.BILL_ACCT_ID||'|'||rec.PARENT_BILL_ACCT_ID||'|'||to_char(rec.DUE_DATE,'YYYYMMDD')||'|'||rec.CMPG_ID||'|'||rec.net_AMT||'|'||rec.DUE_AMT||'|'||rec.PROD_NUM||'|'||rec.DST_ID;
     dbms_lob.writeappend(vl_FILE_CLOB, length(vs_rowdata), vs_rowdata);
        dbms_lob.writeappend(vl_FILE_CLOB, length(vs_newline),vs_newline);
   end loop;
   vs_footer := vn_RECORD_COUNT||'|'||vs_FILE_NAME;

  dbms_lob.writeappend(vl_FILE_CLOB,  length(vs_footer),vs_footer );
     dbms_lob.writeappend(vl_FILE_CLOB, length(vs_newline),vs_newline);

insert into FCBSADM.GPU_FILE_HIST(Cdate, File_Name, File_Content,CUSER) values (sysdate,vs_file_name, vl_FILE_CLOB, USER);
commit;
END;

你只需要改变这个

vs_rowdata := rec.BILL_NO||'|'||rec.INV_ID||'|'||to_number(to_char(rec.BILL_DATE,'YYYYMM'))||'|'||rec.BILL_ACCT_ID||'|'||rec.PARENT_BILL_ACCT_ID||'|'||to_number(to_char(rec.DUE_DATE,'YYYYMMDD')|)|'|'||rec.CMPG_ID||'|'||rec.net_AMT||'|'||rec.DUE_AMT||'|'||rec.PROD_NUM||'|'||rec.DST_ID;