将任意数量的参数传递给perl中的Oracle函数

时间:2009-12-15 23:13:50

标签: perl oracle

使用现有的perl代码调用具有两个参数的Oracle函数;

my $func = $dbh->prepare
(q
    {
        BEGIN
            :result := myStoredProc(value1 => :Param1, value2 => :Param2);
        END;
    }                       
);
$func->bind_param(":Param1", $opt_a);
$func->bind_param(":Param2", $opt_b);
$func->bind_param_inout(":result", \$result, 20);
$func->execute();

如果我现在想扩展此功能以允许调用任何存储过程(名称作为参数传递给我认为的perl脚本)。

是否可以将任意数量的参数传递给函数调用?

Perl绝不是我的强项,所以我不知道这个问题有多难。

我认为这里提出问题的部分是实际的SQL;

BEGIN
    :result := myStoredProc(value1 => :Param1, value2 => :Param2);
END;

我不确定这段代码如何适应任何数量的参数。

如果有人对此有任何经验,我真的很感激你能给予的任何帮助。

由于

3 个答案:

答案 0 :(得分:6)

这样的事情会起作用:

sub callStoredFunction
{
    my ($funcName, @parameters) = @_;

    my $paramStr = join(', ',
        map { "value$_ => Param$_" }
            (1 .. scalar(@parameters));

    my $func = $dbh->prepare(sprintf("\n{\nBEGIN\n:result := $funcName( %s );\nEND;", $paramStr));

    for my $paramNum (1 .. scalar(@parameters))
    {
        $func->bind_param(":Param${paramNum}", $parameters[$paramNum]);
    }

    my $result;
    $func->bind_param_inout(":result", \$result, 20);
    $func->execute();
    return $result;
}

答案 1 :(得分:2)

传递给$ dbh-> prepare的是一个字符串,因此您可以动态调整字符串以调用所需的任何Oracle存储过程,从而提供所需的参数数量。当您动态创建字符串时,可以为每个参数调用bind_param。所以,是的,这很有可能。专注于编写将创建所需字符串的perl子例程

例如:     我的$ procString =& mysub('someOraclProc',3);

会生成一个包含3个参数的字符串:     {         开始                 :result:= someOracleProc(value1 =>:Param1,value2 =>:Param2,value3 =>:Param3);         结束;     }

然后将该字符串提供给prepare方法并调用bind_parameter 3次。

答案 2 :(得分:0)

我之前使用未命名的参数完成此操作,查询具有类似的内容:

join(", ", map { "?" } @params)

然后传递@params来执行。

如果您必须实际命名参数,这不起作用,但您可以使用类似的东西构建查询字符串,然后为每个参数调用bind_parameter