Арабские символы 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 будет загружен.