利用存储过程将SQL查询出来的数据转成CSV文件
CREATE OR REPLACE PROCEDURE p_wsm_sql2csv
(
P_QUERY IN VARCHAR2, -- PLSQL文
P_DIR IN VARCHAR2, -- 导出的文件放置目录
P_FILENAME IN VARCHAR2 -- CSV名
)
IS
L_OUTPUT UTL_FILE.FILE_TYPE;
L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
L_COLUMNVALUE VARCHAR2(4000);
L_STATUS INTEGER;
L_COLCNT NUMBER := 0;
L_SEPARATOR VARCHAR2(1);
L_DESCTBL DBMS_SQL.DESC_TAB;
P_MAX_LINESIZE NUMBER := 32000;
BEGIN
--OPEN FILE
L_OUTPUT := UTL_FILE.FOPEN(P_DIR, P_FILENAME, 'W', P_MAX_LINESIZE);
--DEFINE DATE FORMAT
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS''';
--OPEN CURSOR
DBMS_SQL.PARSE(L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS(L_THECURSOR, L_COLCNT, L_DESCTBL);
--DUMP TABLE COLUMN NAME
FOR I IN 1 .. L_COLCNT LOOP
UTL_FILE.PUT(L_OUTPUT,L_SEPARATOR || '"' || L_DESCTBL(I).COL_NAME || '"'); --输出表字段
DBMS_SQL.DEFINE_COLUMN(L_THECURSOR, I, L_COLUMNVALUE, 4000);
L_SEPARATOR := ',';
END LOOP;
UTL_FILE.NEW_LINE(L_OUTPUT); --输出表字段
--EXECUTE THE QUERY STATEMENT
L_STATUS := DBMS_SQL.EXECUTE(L_THECURSOR);
--DUMP TABLE COLUMN VALUE
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 || '"' ||
TRIM(BOTH ' ' FROM REPLACE(L_COLUMNVALUE, '"', '""')) || '"');
L_SEPARATOR := ',';
END LOOP;
--UTL_FILE.NEW_LINE(L_OUTPUT);
UTL_FILE.put(l_output,chr(13)||chr(10));
END LOOP;
--CLOSE CURSOR
DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
--CLOSE FILE
UTL_FILE.FCLOSE(L_OUTPUT);
EXCEPTION
WHEN OTHERS THEN
null;
END;
上传CSV文件使用的存储过程
FUNCTION login(p_host IN VARCHAR2,
p_port IN VARCHAR2,
p_user IN VARCHAR2,
p_pass IN VARCHAR2) RETURN UTL_TCP.connection IS
l_conn UTL_TCP.connection;
BEGIN
g_reply.delete;
l_conn := UTL_TCP.open_connection(p_host, p_port);
get_reply(l_conn);
send_command(l_conn, 'USER ' || p_user);
send_command(l_conn, 'PASS ' || p_pass);
RETURN l_conn;
END;
-- -------------------------------------------------------------------------- 分界线
PROCEDURE binary(p_conn IN OUT NOCOPY UTL_TCP.connection) AS
BEGIN
send_command(p_conn, 'TYPE I', TRUE);
g_binary := TRUE;
END;
-- --------------------------------------------------------------------------
PROCEDURE put(p_conn IN OUT NOCOPY UTL_TCP.connection,
p_from_dir IN VARCHAR2,
p_from_file IN VARCHAR2,
p_to_file IN VARCHAR2) AS
BEGIN
IF g_binary THEN
put_remote_binary_data(p_conn => p_conn,
p_file => p_to_file,
p_data => get_local_binary_data(p_from_dir,
p_from_file));
ELSE
put_remote_ascii_data(p_conn => p_conn,
p_file => p_to_file,
p_data => get_local_ascii_data(p_from_dir,
p_from_file));
END IF;
get_reply(p_conn);
END;
-- --------------------------------------------------------------------------
PROCEDURE logout(p_conn IN OUT NOCOPY UTL_TCP.connection,
p_reply IN BOOLEAN := TRUE) AS
BEGIN
send_command(p_conn, 'QUIT', p_reply);
END;
-- --------------------------------------------------------------------------
存储过程引用实例
create or replace procedure p_wsm_wsmsd12(SHIP_HEAD_ID number) as
v_data_line varchar2(200);
v_data_line_name varchar2(200);
l_conn UTL_TCP.connection;
begin
--20181228
select to_char(sysdate,'yyyyMMddHHmmss') into v_data_line --获取当前时间
from dual;
p_wsm_sql2csv('select pasc.part_security_code,sv.customer_name,pasc.entry_date
from ivm_security_code_txn sct,wsm_ship_head sh,wsm_ship_detail sd,cmm_customer_v sv,ivm_part_security_code pasc,wsm_product p
where sct.source_pk = sh.ship_head_id
and sh.organization_id = 8411
and sh.ship_head_id = sd.ship_head_id
and sh.customer_id = sv.customer_id
and sv.language_id =2
and sct.source_pk = sd.ship_head_id
and pasc.part_security_code_id = sct.part_security_code_id
and sd.product_id = p.product_id
and pasc.part_id = p.part_id
and sh.ship_head_id = '|| SHIP_HEAD_ID ||'
group by pasc.part_security_code,sv.customer_name,pasc.entry_date','QRCODEFILES_DIR','storeproduct-'||v_data_line||'-request.csv'); --将sql查询出来的数据转成SCV文件
--20181228
v_data_line_name := 'storeproduct-'|| v_data_line ||'-request.csv'; --获取CSV文件名
l_conn := wsm_ftp.login('FTP地址', '端口号', '账号', '密码');--获取FTP地址和账号密码
wsm_ftp.binary(p_conn => l_conn);
wsm_ftp.put(p_conn => l_conn,
p_from_dir => 'QRCODEFILES_DIR', --CSV文件的目录地址
p_from_file => v_data_line_name, --CSV文件名
p_to_file => '/Pos/UploadResourceLocation/'||v_data_line_name||''); --FTP目标目录地址,后缀追加文件名
wsm_ftp.logout(l_conn); --写入文件
utl_tcp.close_all_connections;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
参数QRCODEFILES_DIR为database服务器目录地址,查询 sql :select * from dba_directories
创建语句:create or replace directory test_dir as ‘/home/oracle/database/utl_file’;