Лучший способ решить вашу проблему - это чтобы ваша процедура возвращала наборы результатов. В Oracle мы используем REF CURSORS для достижения этой цели. Вам больше не нужно заполнять временные таблицы, но мы можем использовать одну из них для определения сигнатуры REF CURSOR.
create or replace package report_records as
type order_recs is ref cursor
return IFS_PR_DUMMY_TAB%rowtype;
end;
/
Эта процедура возвращает два курсора ссылки.
create or replace procedure dummy9_ifs_fr2_sales
(cdate in date
, c_released_orders in out report_records.order_recs
, c_reserved_orders in out report_records.order_recs
)
begin
open c_released_orders for
select contract
, district_code
,count(order_no)
,sum(customer_order_api.get_total_sale_price__(order_no))
from customer_order
where order_no
in (select distinct order_no
from customer_order_line
where state in ('Released') )
AND state in ('Released')
and to_char(date_entered,'MM/DD/YYYY')>=to_char(cdate,'MM/DD/YYYY')
and contract in ('CERA','SAN','WOD','QEM','PIP','COT','KIT','MAR','PROJ')
group by contract,district_code, date_entered ;
open c_released_orders for
select contract
, district_code
,count(order_no)
,sum(customer_order_api.get_total_sale_price__(order_no))
from customer_order
where order_no in (select distinct order_no
from customer_order_line
where state in ('Reserved') )
AND state in ('Reserved')
and to_char(date_entered,'MM/DD/YYYY')>=to_char(cdate,'MM/DD/YYYY')
and contract in ('CERA','SAN','WOD','QEM','PIP','COT','KIT','MAR','PROJ')
group by contract,district_code, date_entered ;
end;
/
Интересно, что если ваш столбец date_entered
имеет тип данных DATE, вам не следует использовать преобразование TO_CHAR (). Если вы хотите обрабатывать строки, содержащие элемент времени, есть более эффективные способы обработки этого.
Ссылочные курсоры подробно объясняются в Руководстве пользователя Oracle PL / SQL. Узнайте больше.
редактировать
Я не человек Crystal Reports. Похоже, Google выбрасывает довольно старую документацию (например, this ). Но все согласны с тем, что CR довольно ограничен во взаимодействии с хранимыми процедурами Oracle.
Очевидно, что для Crystal Reports необходимы параметры, объявленные как IN OUT. Также кажется, что он может обрабатывать только один такой параметр ref курсора. Кроме того, указатель ссылки должен быть аргументом first в сигнатуре процедуры. Наконец, на мой взгляд, совершенно невероятно, что «хранимая процедура не может вызвать другую хранимую процедуру». Мы привыкли разрабатывать шаблоны, которые утверждают, что вызывающим программам не нужно ничего знать о внутренностях вызываемой программы, но здесь мы, похоже, определяем, как внутренняя работа вызываемой программы определяется видом программы, которая ее вызывает. Это довольно отстойно.
Так что, в любом случае, вышеупомянутое решение не будет работать для Crystal Reports. Единственное решение - разбить его на две процедуры с такими подписями:
create or replace procedure dummy9_ifs_fr2_sales_released
(c_released_orders in out report_records.order_recs
, cdate in date
)
as ...
create or replace procedure dummy9_ifs_fr2_sales_reserved
(c_reserved_orders in out report_records.order_recs
, cdate in date
)
as ...
Эти процедуры могут быть объединены в пакет (при условии, что CR может справиться с этой конструкцией).
Если решение с двумя процедурами неприемлемо, то я думаю, что вы остаетесь с подходом Дэвида: полностью отказаться от хранимых процедур и просто использовать необработанный SQL в отчете.