创建接受输入作为存储过程并动态产生结果的存储过程
Posted
技术标签:
【中文标题】创建接受输入作为存储过程并动态产生结果的存储过程【英文标题】:Create stored procedure which accepts input as stored procedure and produce results dynamically 【发布时间】:2021-09-05 06:19:44 【问题描述】:我想实现以下要求:
示例程序 #1:
Procedure Proc1(Input1 VARCHAR2,
Input2 NUMBER,
Input3 VARCHAR2,
Output Sys_RefCursor)
IS
BEGIN
..................
..................
..................
END;
示例程序 #2:
Procedure Proc2(Ipval1 VARCHAR2,
Ipval2 NUMBER,
Ipval3 VARCHAR3
Output Sys_RefCursor)
IS
Begin
..................
..................
..................
End;
现在的要求是,我想创建一个存储过程,它应该接受过程名称作为输入。
所以根据输入的过程名,应该动态产生结果。
Procedure GenProc(InputProcedureName VARCHAR2,
InputListVal VARCHAR2,
OutputCur SYS_REFCURSOR)
IS
Begin
................Dynamic Code ............... To produce result set as per input procedurename
END;
知道如何编写动态代码来满足这个要求吗?
让我们在这里说:
InputProcedureName -- 可以是 Proc1 或 Proc2 , InputListVal -- 输入过程名称的逗号分隔值列表, OutputCur -- 应该根据输入过程名动态生成输出列表【问题讨论】:
您是说要创建一个SP,它以SP名称和参数作为输入,并返回命名SP的结果? 好的,但是 - 为什么要打扰?调用 Proc1 或 Proc2 并将参数直接传递给它们并直接从中获取输出不是更简单吗? @Littlefoot .. 是的,但这是我要处理的方案.. 我将获得任何 proc 名称作为输入... 不限于其中 2 个.. @NickW ..是的,你是对的。 我认为这是一项技术/家庭作业。 @littlefoot 我同意这在现实世界中毫无意义 【参考方案1】:类似这样的:
create or replace procedure Proc1 (
par1 varchar2,
par2 number,
par3 varchar2,
rc out sys_refcursor) is
begin
open rc for
select 'executing Proc1('||par1||','||par2||','||par3||')' result from dual;
end;
/
create or replace procedure execProc (
procname varchar2,
args sys.odciVarchar2List,
rc out sys_refcursor) is
begin
execute immediate 'begin '||procname||q'[(:s1, :n2, :s3, :rc); end;]'
using args(1), to_number (args(2)), args(3), out rc;
end;
/
执行和结果:
set autoprint on
var rc refcursor
exec execProc ('Proc1', sys.odciVarchar2List ('abc', 123, 'def'), :rc)
RESULT
--------------------------------
executing Proc1(abc,123,def)
免责声明:此答案仅用于教育目的!!!
【讨论】:
以上是关于创建接受输入作为存储过程并动态产生结果的存储过程的主要内容,如果未能解决你的问题,请参考以下文章