把水晶报表计算到Oracle程序
问题描述:
我有以下问题。把水晶报表计算到Oracle程序
我有很少的oracle程序(例如proc_1,proc_4),每一个检索一行只有几列。
我并没有把所有的程序语句,因为他们是大,只是一些让你知道的程序先声明的例子,他们是PROC_1和proc_4相同:
CREATE OR REPLACE PROCEDURE proc_1 (
proc_1_cursor IN OUT Reports.rep_type,
date_parameter IN system_days.daytime%TYPE)
AS
BEGIN
OPEN proc_1_cursor FOR
select * from -----
然后在Crystal Reports人bult报告和使用结果从CR公式这些不同的程序:
if {?DATE_PARAMETER}>= DateTime (2012, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2012, 12, 31, 00, 00, 00) then
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})+({proc_4.DRY_GAS_FLARE_MTD_KNM3})
else
if {?DATE_PARAMETER}>= DateTime (2015, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2015, 12, 31, 00, 00, 00) then
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})-({proc_4.DRY_GAS_FLARE_MTD_KNM3})
else
if {?DATE_PARAMETER}>= DateTime (2016, 01, 01, 00, 00, 00)and {?DATE_PARAMETER}<= DateTime (2016, 12, 31, 00, 00, 00) then
({proc_1.DRY_GAS_MTD_KSM3}/1.07322+{proc_1.TOTAL_DRY_GAS_MTD_KNM3})+({proc_4.DRY_GAS_FLARE_MTD_KNM3})-({proc_1.GAS_TO_LPG_M_MTD_KSM3})-
({proc_1.GAS_TO_T_FIELD_M_MTD_KSM3}/1.07322)})
我想是运行水晶报表计算上面的Oracle程序将调用PROC_1和proc_4程序,所以在Oracle中计算的,而不是在CR计算和pu t到CR只是最终结果, 你能帮助我如何这个oracle程序会喜欢吗?
感谢, 小号
答
试试这个方法。
CREATE OR REPLACE PROCEDURE calc_proc (
date_parameter IN DATE,
gas_result OUT NUMBER)
IS
dry_gas_mtd_ksm3 NUMBER;
total_dry_gas_mtd_knm3 NUMBER;
dry_gas_flare_mtd_knm3 NUMBER;
gas_to_lpg_m_mtd_ksm3 NUMBER;
gas_to_t_field_m_mtd_ksm3 NUMBER;
BEGIN
dry_gas_mtd_ksm3 := proc_1.DRY_GAS_MTD_KSM3;
total_dry_gas_mtd_knm3 := proc_1.TOTAL_DRY_GAS_MTD_KNM3;
dry_gas_flare_mtd_knm3 := proc_4.DRY_GAS_FLARE_MTD_KNM3;
IF (date_parameter >= TO_DATE('2012-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2012-12-31', 'YYYY-MM-DD')) THEN
gas_result:=(dry_gas_mtd_ksm3/1.07322) +
total_dry_gas_mtd_knm3 + dry_gas_flare_mtd_knm3;
ELSIF (date_parameter >= TO_DATE('2015-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2015-12-31', 'YYYY-MM-DD')) THEN
gas_result:=(dry_gas_mtd_ksm3/1.07322) +
total_dry_gas_mtd_knm3 + dry_gas_flare_mtd_knm3;
ELSIF (date_parameter >= TO_DATE('2016-01-01', 'YYYY-MM-DD') AND date_parameter <= TO_DATE('2016-12-31', 'YYYY-MM-DD')) THEN
gas_result:=(dry_gas_mtd_ksm3/1.07322+total_dry_gas_mtd_knm3)
+ dry_gas_flare_mtd_knm3 - gas_to_lpg_m_mtd_ksm3 -
(gas_to_t_field_m_mtd_ksm3/1.07322);
END IF;
END;
我做了一些假设,如果你能澄清他们可能影响存储过程:
- 你存储的特效返回一个数值。
- 您存储的procs符合以下格式。
- 您不需要IF语句中的连续日期范围。
让我知道这里有什么是不正确的或我错过了什么。
嗨bbrumm,感谢您的代码!我试过了,它给出下面的错误信息:[错误] PLS-00225(25:48):PLS-00225:子程序或光标'proc_1'引用超出范围。 [错误] PLS-00225(25:48):PLS-00225:子程序或光标'proc_4'引用超出范围 –
您有一个名为proc_1和proc_4的过程吗?他们是否使用相同的模式?您可能必须更新上述代码中的模式。 – bbrumm
是的,他们是在相同的模式。 –