【问题标题】:Put Crystal Report calculation to Oracle procedure将 Crystal Report 计算放入 Oracle 程序
【发布时间】:2017-07-11 16:33:00
【问题描述】:

我有以下问题。

我有很少的 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 中,有人在 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 程序中运行上面的 Crystal Report 计算,该程序将调用 proc_1 和 proc_4 程序,所以在 Oracle 中计算而不是在 CR 中计算并将最终结果放入 CR, 你能帮我看看这个 oracle 程序怎么样?

谢谢,

【问题讨论】:

    标签: sql oracle stored-procedures oracle11g


    【解决方案1】:

    试试这个过程。

    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;
    

    我做了一些假设,如果您能够澄清它们,可能会影响存储过程:

    • 您的存储过程返回一个 NUMBER 值。
    • 您的存储过程符合以下格式。
    • IF 语句中不需要连续的日期范围。

    如果这里有什么不正确或者我遗漏了什么,请告诉我。

    【讨论】:

    • 嗨,bbrumm,感谢您的代码!我试过了,它在下面给出错误消息: [错误] PLS-00225 (25: 48): PLS-00225: 子程序或游标 'proc_1' 引用超出范围。 [错误] PLS-00225 (25: 48): PLS-00225: 子程序或游标 'proc_4' 引用超出范围
    • 你有一个叫做proc_1和proc_4的过程吗?他们使用相同的架构吗?您可能需要更新上面代码中的架构。
    • 是的,它们在同一个架构中。
    • 这些程序的参数是什么?您可能需要更改变量分配以使用 OUT 参数而不是返回值。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2015-06-22
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多