2017-03-26 9 views
0

私は、numberおよびvarchar2データ型のINパラメータをほとんど受け入れず、数値データ型を返すOracle関数を持っています。関数内では、INパラメータを持つ表から選択していますが、 'WHERE'節に適用されています。これにより、このフィルタは選択されたクエリに適用されず、代わりにその条件がスキップされます。私は明示的にINパラメータからの値を格納する変数を宣言する必要がありますし、WHERE句でこれらの変数を使用する必要があります。なぜこれが必要なのか分かりません。追加の変数を使用せずにこれを解決するのを手伝ってください。Oracle関数へのINパラメータ

以下は私が使用している関数です。

create or replace FUNCTION AGG_NC8B_FN (
    FACTORY_ID  NUMBER, 
    REPORTING_PERIOD NUMBER, 
    GRANULARITY_TYPE_TXT VARCHAR2, 
     GRANULAROTY_LEVEL_TXT VARCHAR2, 
    CONDITION_ID  NUMBER) 
    RETURN NUMBER 
IS 
    CAL_VALUE OCT_DMA_MOMIS.FCT_KSTACK_AGGREGATION.AGGREGATE_VALUE_DEC%TYPE; 
    -- temporary variables --not sure why this is required? 
    A number; 
    B number; 
    C varchar2(100); 
    D varchar2(100); 
    E number; 
BEGIN 
A:=FACTORY_ID; 
B:=REPORTING_PERIOD; 
C:=GRANULARITY_TYPE_TXT; 
D:=GRANULAROTY_LEVEL_TXT; 
E:=CONDITION_ID; 

    SELECT DECODE(B.AGGREGATE_VALUE_DEC,0,0,((A.AGGREGATE_VALUE_DEC/B.AGGREGATE_VALUE_DEC)*100)) 
    INTO CAL_VALUE 
    FROM (SELECT AGGREGATE_VALUE_DEC 
      FROM OCT_DMA_MOMIS.FCT_KSTACK_AGGREGATION 
      WHERE FK_FIGURE_ID  =30121 
      AND FK_FACTORY_ID  =A 
      AND LK_REPORTING_PERIOD =B 
      AND GRANULARITY_TYPE_TXT=C 
        AND GRANULAROTY_LEVEL_TXT=D 
      AND FK_CONDITION_ID  =E) A , 
     (SELECT AGGREGATE_VALUE_DEC 
      FROM OCT_DMA_MOMIS.FCT_KSTACK_AGGREGATION 
      WHERE FK_FIGURE_ID  =30122 
      AND FK_FACTORY_ID  =A 
      AND LK_REPORTING_PERIOD =B 
      AND GRANULARITY_TYPE_TXT=C 
        AND GRANULAROTY_LEVEL_TXT=D 
      AND FK_CONDITION_ID  =E 
      ) B ; 


    RETURN CAL_VALUE; 
END AGG_NC8B_FN; 

答えて

0

関数のパラメータと列の名前は同じです(例:GRANULARITY_TYPE_TXT)。異なる名前を使用するか、関数のパラメータを関数の名前で修飾します。

-- wrong: 
declare 
    function f(object_name in varchar2) return number is 
    l_id number; 
    begin 
    select object_id 
     into l_id 
     from all_objects 
    where object_name = object_name -- equals to (object name is not null) 
     and object_type = 'VIEW'; 

    return l_id; 
    end; 
begin 
    dbms_output.put_line(f('USER_OBJECTS')); 
end; 

> ORA-01422: exact fetch returns more than requested number of rows 

-- right way: 
declare 
    function f(object_name in varchar2) return number is 
    l_id number; 
    begin 
    select object_id 
     into l_id 
     from all_objects 
    where object_name = f.object_name -- subprogram_name.parameter_name 
     and object_type = 'VIEW'; 

    return l_id; 
    end; 
begin 
    dbms_output.put_line(f('USER_OBJECTS')); 
end; 

> 12345 
関連する問題