проблема с owa_util.mime_header — Попытка извлечь файл Excel из запроса

#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