Арабские символы oracle apex не отображаются должным образом при экспорте CSV

У меня есть интерактивный отчет со столбцом, в котором арабские символы хорошо отображаются в отчете, однако я экспортирую отчеты в CSV, но арабские символы превращаются в ????? в файле csv, любые предложения или обходные пути, которым я могу следовать, либо на уровне интерактивного отчета, либо на уровне запроса, либо это то, что csv не поддерживает.

1 ответ

Я не совсем уверен, но думаю, что проблема может возникнуть из-за того, что функция сценария Java, связанная с Меню действий -> Загрузка, может не учитывать кодировку на стороне базы данных, а не на стороне клиента.

Обычно, когда я хочу управлять экспортом в CSV со страницы, я отключаю меню действий, чтобы пользователь не мог сделать это с помощью этого меню, вместо этого я предпочитаю создать процедуру PL/SQL, которая будет запускаться экспресс-процессом приложения..

Как это сделать?

Загрузить файл CSV с использованием процедуры PL/SQL и процесса приложения в Oracle Apex

Для этого следуйте инструкциям:

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 будет загружен.

Другие вопросы по тегам