包装器(通用)管道函数PL/SQL
我正在尝试使用PL/SQL创建类似于泛型函数的东西。骨架应该如下所示 这是包规范中的代码包装器(通用)管道函数PL/SQL,sql,oracle,plsql,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, co
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;
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;
我需要创建许多具有相同输入参数的函数p_I_a;p_i_b
,输出结果仅取决于它们。我的想法是将这里编写的代码作为泛型,以便其他函数可以使用它。例如:
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);
Func1('aa','bb')
应该调用函数Get\u result(p\u i\u a,p\u i\u b)
其中p_i_a='aa'
和p_i_b='bb'
及
Func2('cc','dd')
应该调用函数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);
你有什么想法吗。谢谢大家! 据我所知,您只想从另一个具有不同名称的函数调用您的泛型函数:
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
是一个类别(国家、人民),而col2
是该类别中的实际值,并且您需要一个隐藏该值的包装函数,那么这种模式可能有一定意义;但是这样,函数将被恰当地命名,并且不需要传递第一个参数;比如:
FUNCTION Get_country(
p_i_b IN VARCHAR2)
RETURN T_table Pipelined
AS
BEGIN
RETURN Get_result(p_i_a => 'country', p_i_b => p_i_b);
END;
但这似乎不是您想要的。软件包规格:
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 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;
我不明白。。。如果Func1和Func2只是调用Get\u result,为什么需要它们?您的意思是将
“aa”
等作为标识符用双引号括起来吗?如果是,其意义是什么?主要目的是保存代码。无论我调用Func1、Func2或其他函数,它们都应该使用指定的参数调用我们的泛型函数Get\u result。为什么不直接调用泛型函数?添加大量包装器函数如何节省代码?双引号是否意味着您试图指定游标返回的列名,而不是实际称为col1和col2的值?即使记录类型是(并且必须)基于这些固定列,调用Func1('aa','bb')
和Func2('cc','dd')
与调用Func1('cc','dd')
和Func2('aa','bb')
有何不同?他们最后都会调用Get_Result('aa','bb')
或Get_Result('cc','dd')
您能更好地描述您试图用这个或它应用的用例解决的问题吗?尝试包含一些示例表和数据以及预期结果。