【问题标题】:Type Conversion inside procedure in PLSQLPLSQL中过程内部的类型转换
【发布时间】:2021-09-22 07:56:19
【问题描述】:

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

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

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

我在下面添加我的脚本,我愿意接受任何建议,谢谢你。

请注意:我将 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;
  • 因此您会将这两个值转换为数字,顺便说一句,我认为将日期视为数字或 varchar2 不是一个好主意

标签: oracle plsql


【解决方案1】:

你只需要改变这个

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;

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 1970-01-01
    • 2022-10-22
    • 2020-10-17
    • 2011-05-08
    • 2015-06-27
    • 2012-12-03
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多