我有一个交互式报告,其中列的阿拉伯字符在报告中显示良好,但是我将报告导出到 csv 中,但阿拉伯字符?????
在 csv 文件中转换,我可以在交互式报告级别或查询级别遵循任何建议或解决方法或这是csv不支持的东西。
1 回答
我不完全确定,但我认为问题可能会发生,因为与 Actions Menu --> Download 关联的 Java 脚本函数可能没有考虑数据库端的编码,而不是客户端的编码。
通常,当我想控制从页面导出到 csv 时,我禁用操作菜单以避免用户可以使用该菜单执行此操作,相反我更喜欢创建一个 PL/SQL 过程以由应用程序快速进程触发.
怎么做 ?
在 Oracle Apex 中使用 PL/SQL 过程和应用程序进程下载 CSV 文件
为此,请按照说明进行操作:
1.创建一个PL/SQL过程
创建一个将 CSV 作为 CLOB 数据返回的数据库过程。
create or replace procedure tab_to_csv(o_Clobdata OUT CLOB) IS
l_Blob BLOB;
l_Clob CLOB;
BEGIN
Dbms_Lob.Createtemporary(Lob_Loc => l_Clob,
Cache => TRUE,
Dur => Dbms_Lob.Call);
SELECT Clob_Val
INTO l_Clob
FROM (SELECT Xmlcast(Xmlagg(Xmlelement(e,
Col_Value || Chr(13) ||
Chr(10))) AS CLOB) AS Clob_Val,
COUNT(*) AS Number_Of_Rows
FROM (SELECT 'your columns for the header split by the separator' AS Col_Value
FROM Dual
UNION ALL
SELECT col1||',' ||col2||','|| col3||','|| col4||','|| col5||','|| col6 as Col_Value
FROM (SELECT col1,col2,col3,col4,col5,col6 from yourtable)));
o_Clobdata := l_Clob;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
您可以按照您想要的方式调整该程序。我使用标题,所以这就是第一次选择的原因。在我的示例中,分隔符是,
,但您可以根据需要使用另一个分隔符,甚至可以使用参数代替。
2.在 Oracle Apex 中创建应用程序进程
在 Oracle Apex 中,单击Shared Components --> Application Process
,然后单击创建按钮。然后按照以下步骤操作:
然后按下一步并输入以下代码
DECLARE
L_BLOB BLOB;
L_CLOB CLOB;
L_DEST_OFFSET INTEGER := 1;
L_SRC_OFFSET INTEGER := 1;
L_LANG_CONTEXT INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
L_WARNING INTEGER;
L_LENGTH INTEGER;
BEGIN
-- create new temporary BLOB
DBMS_LOB.CREATETEMPORARY(L_BLOB, FALSE);
--get CLOB
tab_to_csv( L_CLOB);
-- tranform the input CLOB into a BLOB of the desired charset
DBMS_LOB.CONVERTTOBLOB( DEST_LOB => L_BLOB,
SRC_CLOB => L_CLOB,
AMOUNT => DBMS_LOB.LOBMAXSIZE,
DEST_OFFSET => L_DEST_OFFSET,
SRC_OFFSET => L_SRC_OFFSET,
BLOB_CSID => NLS_CHARSET_ID('WE8MSWIN1252'),
LANG_CONTEXT => L_LANG_CONTEXT,
WARNING => L_WARNING
);
-- determine length for header
L_LENGTH := DBMS_LOB.GETLENGTH(L_BLOB);
-- first clear the header
HTP.FLUSH;
HTP.INIT;
-- create response header
OWA_UTIL.MIME_HEADER( 'text/csv', FALSE, 'AL32UTF8');
HTP.P('Content-length: ' || L_LENGTH);
HTP.P('Content-Disposition: attachment; filename="yourfile.csv"');
HTP.P('Set-Cookie: fileDownload=true; path=/');
OWA_UTIL.HTTP_HEADER_CLOSE;
-- download the BLOB
WPG_DOCLOAD.DOWNLOAD_FILE( L_BLOB );
-- stop APEX
-- APEX_APPLICATION.STOP_APEX_ENGINE;
EXCEPTION
WHEN OTHERS THEN
DBMS_LOB.FREETEMPORARY(L_BLOB);
RAISE;
END;
之后单击“下一步”按钮,然后在下一个屏幕上单击“创建”按钮以完成向导。您的申请流程已创建。
3.在Oracle Apex的页面上创建一个按钮
现在在 Oracle Apex 的页面设计器中打开一个页面,您要在其中添加一个按钮来下载 CSV 文件。
然后右键单击区域并单击选项创建按钮。
将操作设置为重定向到 URL。
将以下 URL 粘贴到 URL 目标中。
f?p=&APP_ID.:0:&SESSION.:APPLICATION_PROCESS=download_emp_csv:NO
请注意,我们正在调用我们刚刚在第二步中创建的应用程序进程 download_emp_csv。
现在保存更改并运行该页面。单击按钮后,将下载 CSV 文件。