oracle apex阿拉伯语字符在csv导出中未正确显示

oracle apex阿拉伯语字符在csv导出中未正确显示,oracle,oracle-apex-20.1,Oracle,Oracle Apex 20.1,我有一个交互式报告,报告中有一列阿拉伯字符显示良好,但是我正在将报告导出到csv中,但在csv文件中,阿拉伯字符变成了?????,我可能会在交互式报告级别或查询级别遵循任何建议或解决方法,或csv不支持的内容。我不完全确定,但我认为可能会出现问题,因为与“操作”菜单-->下载关联的Java脚本函数可能没有考虑数据库端的编码,而不是客户端 通常,当我想要控制从页面导出到csv时,我会禁用actions菜单,以避免用户可以使用该菜单进行操作,相反,我更喜欢创建一个由application expre

我有一个交互式报告,报告中有一列阿拉伯字符显示良好,但是我正在将报告导出到csv中,但在csv文件中,阿拉伯字符变成了
?????
,我可能会在交互式报告级别或查询级别遵循任何建议或解决方法,或csv不支持的内容。

我不完全确定,但我认为可能会出现问题,因为与“操作”菜单-->下载关联的Java脚本函数可能没有考虑数据库端的编码,而不是客户端

通常,当我想要控制从页面导出到csv时,我会禁用actions菜单,以避免用户可以使用该菜单进行操作,相反,我更喜欢创建一个由application express进程触发的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;
/
你可以按照你想要的方式调整程序。我使用header,这就是第一次选择的原因。在我的示例中,分隔符是
,但是如果您愿意,可以使用另一个分隔符,甚至可以使用一个参数来代替它

2.在Oracle Apex中创建应用程序流程

在Oracle Apex中,单击
共享组件-->应用程序进程
,然后单击创建按钮。然后按照以下步骤操作:

然后按next并输入以下代码

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中的页面上创建按钮

现在在OracleApex的页面设计器中打开一个页面,您希望在其中添加一个按钮以下载CSV文件

然后在区域上单击鼠标右键,然后单击选项“创建”按钮

将操作设置为重定向到URL

在URL目标中粘贴以下URL

f?p=&APP_ID.:0:&SESSION.:APPLICATION_PROCESS=download_emp_csv:NO
请注意,我们正在调用应用程序进程download\u emp\u csv,这是我们在第二步中创建的


现在保存更改并运行页面。单击按钮,将下载CSV文件。

数据库的字符集是什么?使用浏览器的电脑中使用哪种语言?
NLS\u CHARACTERSET=AL32UTF8
NLS\u NCHAR\u CHARACTERSET=AL16UTF16
我在Chrome浏览器中从IR下载csv您是否在IR中使用从菜单操作下载csv??