#sql #excel #stored-procedures #plsql #oracle11g
#sql #excel #хранимые процедуры #plsql #oracle11g
Вопрос:
у меня проблема с моей единственной процедурой, которая предполагает создание файла Excel, процедура такая:
CREATE OR REPLACE PROCEDURE GENERATE_REPORT_P(P_CONTRACT_NUM IN VARCHAR2 DEFAULT NULL,
P_CUSTOMER_NAME IN VARCHAR2 DEFAULT NULL,
P_CUSTOMER_NUM IN VARCHAR2 DEFAULT NULL,
P_UPDATE_DATE_START IN DATE DEFAULT NULL,
P_UPDATE_DATE_END IN DATE DEFAULT NULL,
P_ORDER_NUM IN VARCHAR2 DEFAULT NULL) IS
vRecords BOOLEAN := FALSE;
BEGIN
FOR i IN (SELECT
a.contract_num,
d.customer_abt_number,
d.customer_name,
c.doms_order_num order_num,
e.service_tag asset,
e.sku,
e.field,
e.previous_value,
e.new_value,
e.update_date, --to_char(i.update_date, 'DD-MON-RRRR HH12:MI:SS')
e.updated_by
FROM contracts a,
order_extension b,
orders c,
customers d,
abt_cisi_log e
WHERE a.id = b.contract_id
AND c.id = b.order_id
AND d.id = a.customer_id
AND c.id = e.order_id
--parameters
AND a.contract_num LIKE NVL(p_contract_num, a.contract_num)
AND d.customer_abt_number LIKE
NVL(p_customer_num, d.customer_abt_number)
AND d.customer_name LIKE
NVL(p_customer_name, d.customer_name)
AND e.update_date between
NVL(to_date(p_update_date_start, 'dd-mon-rrrr'), '01-JAN-1900') AND
NVL(to_date(p_update_date_end, 'dd-mon-rrrr'), '31-DEC-2199')
AND c.doms_order_num LIKE
NVL(p_order_num, c.doms_order_num)
ORDER BY a.contract_num,
c.doms_order_num,
e.service_tag,
e.sku) LOOP
IF NOT vRecords THEN
vRecords := TRUE;
owa_util.mime_header(ccontent_type => 'application/vnd.ms-excel');
htp.htmlopen;
htp.bodyopen;
htp.tableopen(cattributes => 'border=1');
htp.tablerowopen;
htp.p('<td><b>Contract</b></td>');
htp.p('<td><b>Customer Number</b></td>');
htp.p('<td><b>Customer</b></td>');
htp.p('<td><b>Order#</b></td>');
htp.p('<td><b>Asset</b></td>');
htp.p('<td><b>SKU</b></td>');
htp.p('<td><b>Field</b></td>');
htp.p('<td><b>Previous Value</b></td>');
htp.p('<td><b>New Value</b></td>');
htp.p('<td><b>Update Date</b></td>');
htp.p('<td><b>Updated By</b></td>');
htp.tablerowclose;
END IF;
htp.tablerowopen;
htp.p('<td>' || i.contract_num || '</td>');
htp.p('<td>' || i.customer_abt_number || '</td>');
htp.p('<td>' || i.customer_name || '</td>');
htp.p('<td>' || i.order_num || '</td>');
htp.p('<td>' || i.asset || '</td>');
htp.p('<td>' || i.sku || '</td>');
htp.p('<td>' || i.field || '</td>');
htp.p('<td>' || i.previous_value || '</td>');
htp.p('<td>' || i.new_value || '</td>');
htp.p('<td>' || to_char(i.update_date, 'DD-MON-RRRR HH12:MI:SS') ||
'</td>');
htp.p('<td>' || i.updated_by || '</td>');
htp.tablerowclose;
END LOOP;
IF vRecords THEN
htp.tableclose;
htp.bodyclose;
htp.htmlclose;
END IF;
END GENERATE_REPORT_P;
Но когда я выполняю эту процедуру с помощью
Начать
GENERATE_REPORT_P();
ЗАВЕРШЕНИЕ;
Я ВСЕГДА получаю эту ошибку:
Я пытался разобраться в этом, но до сих пор это не сильно удавалось, я попытался прокомментировать весь код в процедуре и просто вызвать owa_util.mime_header(ccontent_type => 'application/vnd.ms-excel');
, чтобы посмотреть, что произойдет, и проверил тип данных из моей таблицы, ну, почти все основные вещи.
Если кто-нибудь может мне помочь, подсказать, я действительно ценю это. С уважением!
Примечание: Я извлекаю процедуру из пакета и добавляю всего одну или две вещи, чтобы просто поместить в StackOverflow, поэтому я вижу сообщение об ошибке и выясняю это, моя ошибка!
Комментарии:
1. Кстати. вы уверены, что то, что вы отправляете на свой HTTP-вывод, действительно является содержимым
application/vnd.ms-excel
типа mime?2. я не уверен в этом @nop77svk у меня нет большого опыта в такого рода вещах, я пытаюсь разобраться, чтобы помочь разработчику из моей команды, как я могу это проверить?!
3. Хорошо, Юрий, проблема, которую я вижу, заключается именно в этом: содержимое, которое вы генерируете с помощью пакета HTP, является содержимым HTML, а не содержимым XLS. Увы, я не могу помочь вам с отправкой данных XLS вызывающему. Это «пахнет» промежуточным программным обеспечением Fusion или Oracle iAS, и я не знаю, как с ними работать.
Ответ №1:
Чтобы решить эту конкретную проблему, поместите этот фрагмент кода где-нибудь перед вызовом generate_report_p
:
owa.num_cgi_vars := NVL(owa.num_cgi_vars, 0);
Комментарии:
1. Спасибо за совет, я попробую это и посмотрю, что может произойти
2. Я попробовал, и это сработало, но не совсем, ошибка исчезла, но файл Excel не отображается! есть идеи? и, извините, что слишком долго отвечаю вам. @nop77svk