使用 UTL_FILE导出TAB和逗号分割数据

Oracle导出数据到文件
本文介绍使用PL/SQL过程将Oracle数据库中的特定查询结果导出到文本文件的方法。包括设置查询语句、利用UTL_FILE包进行文件操作及通过游标循环读取并写入数据的具体步骤。
DECLARE
  row_result varchar2(4000);
  selectsql  varchar2(4000);
  qrycursor  SYS_REFCURSOR;
  txt_handle UTL_FILE.file_type;
BEGIN
  selectsql  := 'select USER_ID||chr(9)||EXTERNAL_ID||chr(9)||ACCOUNT_ID||chr(9)||CERTIFY_STATUS||chr(9)||USER_STATUS||chr(9)||RUNTIME_STATUS||chr(9)||USER_NAME||chr(9)||REAL_NAME||chr(9)||COUNTRY||chr(9)||GENDER||chr(9)||PROFESSION||chr(9)||ADDRESS||chr(9)||PHONE||chr(9)||MOBILE||chr(9)||EMAIL||chr(9)||CERT_TYPE||chr(9)||CERT_NO||chr(9)||LICENSE_VALID_TIME||chr(9)||REGISTER_FROM||chr(9)||ORIGIN_REGISTER_FROM||chr(9)||RAW_ADD_TIME||chr(9)||RAW_UPDATE_TIME||chr(9)||BANK_CARD_NO||chr(9)||BANK_CARD_TYPE||chr(9)||NAME||chr(9)||BANK_CERT_NO from yhcheck.til_per';
  txt_handle := UTL_FILE.FOPEN('TESTDIR', 'b.txt', 'w',32767);
  open qrycursor for selectsql;
  loop
    fetch qrycursor
      into row_result;
    exit when qrycursor%notfound;
    UTL_FILE.PUT_LINE(txt_handle, row_result);
  end loop;
  --关闭游标    
  close qrycursor;
  UTL_FILE.FCLOSE(txt_handle);
end;

逗号分隔
DECLARE
  row_result varchar2(4000);
  selectsql  varchar2(4000);
  qrycursor  SYS_REFCURSOR;
  txt_handle UTL_FILE.file_type;
BEGIN
  selectsql  := 'select id || '','' || name || '','' || dti
  from testdump
 where name = ''gaopeng''
   and dti > to_date(''2015-03-17 00:00:00'', ''yyyy-mm-dd hh24:mi:ss'')';
  txt_handle := UTL_FILE.FOPEN('DATA_PUMP_DIR', 'b.txt', 'w', 32767);
  open qrycursor for selectsql;
  loop
    fetch qrycursor
      into row_result;
    exit when qrycursor%notfound;
    UTL_FILE.PUT_LINE(txt_handle, row_result);
  end loop;
  --关闭游标    
  close qrycursor;
  UTL_FILE.FCLOSE(txt_handle);
end;



注意点 1:'w'可以更改为'a'为追加
         2:32767为每行的宽度,默认为1024
         3:TESTDIR为大写是 CREATE DIRECTORY建立的目录
         4: chr(9) 为TAB分割
CREATE OR REPLACE PROCEDURE dump_table_to_csv (p_tname IN VARCHAR2, p_dir IN VARCHAR2, p_filename IN VARCHAR2) IS l_output UTL_FILE.file_type; l_theCursor INTEGER DEFAULT DBMS_SQL.open_cursor; l_columnValue VARCHAR2 (4000); l_status INTEGER; l_query VARCHAR2 (1000) DEFAULT 'select * from ' || p_tname; l_colCnt NUMBER := 0; l_separator VARCHAR2 (1); l_descTbl DBMS_SQL.desc_tab; BEGIN l_output := UTL_FILE.fopen (p_dir, p_filename, 'w'); EXECUTE IMMEDIATE 'alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss'' '; DBMS_SQL.parse (l_theCursor, l_query, DBMS_SQL.native); DBMS_SQL.describe_columns (l_theCursor, l_colCnt, l_descTbl); FOR i IN 1 .. l_colCnt LOOP DBMS_SQL.define_column (l_theCursor, i, l_columnValue, 4000); END LOOP; l_status := DBMS_SQL.execute (l_theCursor); WHILE (DBMS_SQL.fetch_rows (l_theCursor) > 0) LOOP l_separator := ''; FOR i IN 1 .. l_colCnt LOOP DBMS_SQL.COLUMN_VALUE (l_theCursor, i, l_columnValue); UTL_FILE.put (l_output, l_separator || l_columnValue); l_separator := ','; END LOOP; UTL_FILE.new_line (l_output); END LOOP; DBMS_SQL.close_cursor (l_theCursor); UTL_FILE.fclose (l_output); EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' '; EXCEPTION WHEN OTHERS THEN EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-yy'' '; RAISE; END; 这个是oracle的存储过程,我想要把它给转成postgreSql的。其中我postgreSql的数据库里所有的表名字段都是小写的,但是我转成postgreSql的这个存储过程的名字我还是希望保留着大写的。还有就是你还要给出我这两种数据库的存储过程的运行方法以及查询结果方法,像 “ postgreSQL: CALL "SP_CREATE_RP_GRPSVRWORK_CNT"('2024-03-04'::timestamp, '2024-03-05'::timestamp); -- 或者指定具体日期范围 SELECT * FROM rp_grpsvrworkcnt WHERE offhktm BETWEEN '2024-03-04' AND '2024-03-05' ORDER BY offhktm DESC; oracle: BEGIN SP_CREATE_RP_GRPSVRWORK_CNT(TO_DATE('2024-03-04', 'YYYY-MM-DD'), TO_DATE('2024-03-05', 'YYYY-MM-DD')); END; SELECT * FROM RP_GRPSVRWORKCNT WHERE OFFHKTM BETWEEN TO_DATE('2024-03-04', 'YYYY-MM-DD') AND TO_DATE('2024-03-05', 'YYYY-MM-DD') ORDER BY OFFHKTM DESC; ”这样
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值