1

输入
包名 (IN)
过程名(或函数名) (IN)
以整数索引的表,它将包含将用于执行过程的值(IN/OUT)。

例如
,假设我们要执行下面的过程

utils.get_emp_num(emp_name IN VARCHAR
                  emp_last_name IN VARCHAR
                  emp_num OUT NUMBER
                  result  OUT VARCHAR);

我们将创建的过程将作为输入:

package_name = utils
procedure_name = get_emp_num
table = T[1] -> name
        T[2] -> lastname
        T[3] -> 0   (any value) 
        T[4] -> N   (any value)

run_procedure(package_name,
              procedure_name,
              table)

主过程应返回与输入中设置的相同的表,但带有过程的执行结果

table =  T[1] -> name
         T[2] -> lastname
         T[3] -> 78734 (new value)
         T[4] -> F     (new value)

任何想法 ?

4

2 回答 2

1

您可以使用 EXECUTE IMMEDIATE 来实现它。基本上,您构建以下形式的 SQL 语句:

sql := 'BEGIN utils.get_emp_num(:1, :2, :3, :4); END;';

然后你执行它:

EXECUTE IMMEDIATE sql USING t(1), t(2), OUT t(3), OUT t(4);

现在,棘手的部分来了:对于每个数量的参数和 IN/OUT 组合,您需要一个单独的 EXECUTE IMMEDIATE 语句。并且要弄清楚参数的数量和它们的方向,你需要先查询 ALL_ARGUMENTS 表。

您可以通过将整个表作为绑定参数而不是每个表元素的单独绑定参数来简化它。但我还没有完全弄清楚你会如何做到这一点。

接下来你应该考虑的事情是:你使用的表 T 的元素将有一个类型:VARCHAR、NUMBER 等。因此,你同时拥有数字和字符串的当前混合将不起作用。

BTW:你为什么想要这样一个动态调用机制呢?

于 2013-09-19T20:46:01.993 回答
0

从 all_arguments 表中获取 argument_name、data_type、in_out 和 position

构建 PLSQL 块

DECLARE
    loop over argument_name and create the declare section
    argument_name data_type if in_out <> OUT then := VALUE OF THE INPUT otherwise NULL
BEGIN

--In the case of function create an additional argument 
function_var:= package_name.procedure_name( loop over argument_name);

--use a table of any_data, declare it as global in the package

if function then
    package_name.ad_table.EXTEND;
    package_name.ad_table(package_name.ad_table.LAST):= function_var;
end if

--loop over argument_name IF IN_OUT <> IN
package_name.ad_table.EXTEND;
package_name.ad_table(package_name.ad_table.LAST):= 

if data_type = VARCHAR2 then := ConvertVarchar2(argument_name)
else if NUMBER then ConvertNumber 
else if DATE then ConvertDate
...

END;

结果存储在表中。要获得价值,请使用 Access* 函数

于 2013-10-10T08:22:38.917 回答