【问题标题】:IN parameter to Oracle FunctionOracle 函数的 IN 参数
【发布时间】:2017-08-19 07:49:30
【问题描述】:

我有一个 Oracle 函数,它接受少量的数字和 varchar2 数据类型的 IN 参数,它还返回一个数字数据类型。在函数中,我从表中选择 IN 参数应用于“WHERE”子句。通过这样做,此过滤器不会应用于选择查询,而是跳过该条件。我需要显式声明一个变量来存储来自 IN 参数的值,然后我需要在 WHERE 子句中使用这些变量。不知道为什么需要这样做。您能否在不使用其他变量的情况下帮助解决此问题。

下面是我正在使用的函数。

    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;

【问题讨论】:

    标签: oracle function parameters procedures


    【解决方案1】:

    您的函数参数和列具有相同的名称(例如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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多