包装器(通用)管道功能PL / SQL

时间:2016-02-25 17:09:33

标签: sql oracle plsql

我正在尝试使用PL / SQL创建类似通用函数的东西。骨架应该是这样的。

这是包规范中的代码

Type r_record
IS
  Record
  (
    col_1 Table.col_1 %Type ,
    col_2 Table.col_1 %Type );
Type T_table
IS
  TABLE OF r_record;
  CURSOR cur (p_i_a IN VARCHAR2, p_i_b IN VARCHAR2)
  IS
    SELECT col_1, col_2 
    FROM Table
    WHERE col_1= p_i_a 
    AND col_2= p_i_b 

  FUNCTION Get_result(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN T_table Pipelined;

这是包体中的代码:

  FUNCTION Get_result(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN T_table Pipelined
AS
    Vrow R_list;
      BEGIN
        FOR rec IN cursor(p_i_a, p_i_b)
        LOOP
          Vrow.col_1 := Rec.col_1 ;
          Vrow.col_2 := Rec.col_2 ;
          pipe row (vRow);
        END LOOP;
      END Get_result;

我需要创建许多具有相同输入参数p_i_a; p_i_b的函数,输出结果仅取决于它们。我的想法是这里编写的代码作为通用,以便其他函数可以使用它。例如:

Func1('aa', 'bb')应调用FUNCTION Get_result(p_i_a, p_i_b)

其中p_i_a = 'aa'p_i_b = 'bb'

和.....

Func2('cc', 'dd')应调用FUNCTION Get_result(p_i_a, p_i_b)

其中p_i_a = 'cc'p_i_b = 'dd'

例如:

FUNCTION Get_result(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN T_table Pipelined
AS
    Vrow R_list;
      BEGIN
        FOR rec IN cursor(p_i_a, p_i_b)
        LOOP
          Vrow.col_1 := Rec.col_1 ;
          Vrow.col_2 := Rec.col_2 ;
          pipe row (vRow);
        END LOOP;
      END Get_result;

FUNCTION Func1(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN Get_result(p_i_a, p_i_b);

FUNCTION Func2(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN Get_result(p_i_a, p_i_b);

你有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

据我所知,您只想从另一个具有不同名称的函数调用您的泛型函数:

OneWayToSource

但这似乎微不足道,所以也许我仍然不明白你真正想做什么问题。让包装器函数采用相同的参数并将它们传递给泛型函数似乎是不必要和冗余的,因为调用者需要知道所有的参数值。

如果您的BindsTwoWayByDefault属于某个类别(国家/地区,人员),而FUNCTION Func1( p_i_a IN VARCHAR2, p_i_b IN VARCHAR2) RETURN T_table Pipelined AS BEGIN RETURN Get_result(p_i_a => p_i_a, p_i_b => p_i_b); END; 是该类别中的实际值,那么此模式可能会有所帮助一个隐藏它的包装函数;但是然后函数将被恰当地命名,并且不需要传递第一个参数;类似的东西:

col1

但这似乎不是你想要的。

答案 1 :(得分:0)

包装规格:

Type r_record
IS
  Record
  (
    col_1 Table.col_1 %Type ,
    col_2 Table.col_1 %Type );
Type T_table
IS
  TABLE OF r_record;
  CURSOR cur (p_i_a IN VARCHAR2, p_i_b IN VARCHAR2)
  IS
    SELECT col_1, col_2 
    FROM Table
    WHERE col_1= p_i_a 
    AND col_2= p_i_b 

  FUNCTION Func1()
    RETURN T_table Pipelined;

  FUNCTION Func2()
    RETURN T_table Pipelined;

包体:

  FUNCTION Get_result(
      p_i_a IN VARCHAR2,
      p_i_b IN VARCHAR2)
    RETURN T_table Pipelined
AS
    Vrow R_list;
      BEGIN
        FOR rec IN cursor(p_i_a, p_i_b)
        LOOP
          Vrow.col_1 := Rec.col_1 ;
          Vrow.col_2 := Rec.col_2 ;
          pipe row (vRow);
        END LOOP;
      END Get_result;

  FUNCTION Func1()
    RETURN T_table Pipelined
AS
    Vrow R_list;
      BEGIN
        FOR rec IN cursor('aa', 'bb')
        LOOP
          Vrow.col_1 := Rec.col_1 ;
          Vrow.col_2 := Rec.col_2 ;
          pipe row (vRow);
        END LOOP;
      END Func1;

  FUNCTION Func2()
    RETURN T_table Pipelined
AS
    Vrow R_list;
      BEGIN
        FOR rec IN cursor('cc', 'dd')
        LOOP
          Vrow.col_1 := Rec.col_1 ;
          Vrow.col_2 := Rec.col_2 ;
          pipe row (vRow);
        END LOOP;
      END Func2;