输入
包名(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)有什么想法吗?
发布于 2013-10-10 08:22:38
从all_arguments表中获取argument_name、data_type、in_out和职位
构建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-09-19 20:46:01
您可以通过立即执行来实现它。基本上,您可以构建以下形式的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组合,您需要一个单独的立即执行语句。要计算参数的数量及其方向,首先需要查询ALL_ARGUMENTS表。
您可以通过将整个表作为绑定参数传递而不是每个表元素的单独绑定参数来简化它。但我还没搞清楚你会怎么做。
接下来要考虑的是:您使用的表T的元素将有一个类型: VARCHAR、NUMBER等等。因此,当前的混合(同时包含数字和字符串)将无法工作。
顺便问一句:你为什么想要这样一个动态调用机制呢?
https://stackoverflow.com/questions/18904333
复制相似问题