创建接受输入作为存储过程并动态产生结果的存储过程

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)

免责声明:此答案仅用于教育目的!!!

【讨论】:

以上是关于创建接受输入作为存储过程并动态产生结果的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

以列名作为输入参数的存储过程中的动态 sql

数据库存储过程和触发器

如何将用户定义的类型作为输入传递给存储过程?

如何在存储过程中动态传递表名 - ORACLE [重复]

如何创建一个接受查询字符串并返回查询结果集的 UDF

创建一个接受日期时间列表作为参数的存储过程