把水晶报表计算到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语句中的连续日期范围。

让我知道这里有什么是不正确的或我错过了什么。

+0

嗨bbrumm,感谢您的代码!我试过了,它给出下面的错误信息:[错误] PLS-00225(25:48):PLS-00225:子程序或光标'proc_1'引用超出范围。 [错误] PLS-00225(25:48):PLS-00225:子程序或光标'proc_4'引用超出范围 –

+0

您有一个名为proc_1和proc_4的过程吗?他们是否使用相同的模式?您可能必须更新上述代码中的模式。 – bbrumm

+0

是的,他们是在相同的模式。 –