使用现有的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;
我不确定这段代码如何适应任何数量的参数。
如果有人对此有任何经验,我真的很感激你能给予的任何帮助。
由于
答案 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
。