首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以执行任何过程/函数的通用过程。

可以执行任何过程/函数的通用过程。
EN

Stack Overflow用户
提问于 2013-09-19 20:28:17
回答 2查看 627关注 0票数 1

输入

包名(IN)

过程名(或函数名) (IN)

一个按整数索引的表,它将包含用于执行过程(IN/OUT)的值。

例如

让我们假设我们希望执行下面的过程

代码语言:javascript
运行
复制
utils.get_emp_num(emp_name IN VARCHAR
                  emp_last_name IN VARCHAR
                  emp_num OUT NUMBER
                  result  OUT VARCHAR);

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

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
table =  T[1] -> name
         T[2] -> lastname
         T[3] -> 78734 (new value)
         T[4] -> F     (new value)

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-10 08:22:38

从all_arguments表中获取argument_name、data_type、in_out和职位

构建PLSQL块

代码语言:javascript
运行
复制
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*函数

票数 0
EN

Stack Overflow用户

发布于 2013-09-19 20:46:01

您可以通过立即执行来实现它。基本上,您可以构建以下形式的SQL语句:

代码语言:javascript
运行
复制
sql := 'BEGIN utils.get_emp_num(:1, :2, :3, :4); END;';

然后你执行它:

代码语言:javascript
运行
复制
EXECUTE IMMEDIATE sql USING t(1), t(2), OUT t(3), OUT t(4);

现在来了一个棘手的部分:对于每个参数和IN/OUT组合,您需要一个单独的立即执行语句。要计算参数的数量及其方向,首先需要查询ALL_ARGUMENTS表。

您可以通过将整个表作为绑定参数传递而不是每个表元素的单独绑定参数来简化它。但我还没搞清楚你会怎么做。

接下来要考虑的是:您使用的表T的元素将有一个类型: VARCHAR、NUMBER等等。因此,当前的混合(同时包含数字和字符串)将无法工作。

顺便问一句:你为什么想要这样一个动态调用机制呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18904333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档