2009-12-15 71 views
3

取一个现有的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; 

我真的不知道这段代码如何适应任何数量的params。

如果任何人有任何这方面的经验,我会很感激您可以给的任何帮助。

感谢

+0

我这里有一些代码,这是专门为做甲骨文的存储过程调用通过DBI,它处理在/ OUT参数,装订,LOB的,等我要去看看我可以设法从它删除$ WORK特定的代码后发布它:) – hobbs 2009-12-16 03:22:01

回答

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; 
} 
+0

+1,很好完成 – DCookie 2009-12-16 00:17:03

+0

非常好,谢谢你的示例代码。非常感激。 – 2009-12-16 14:28:01

2

传递给$ dbh->准备什么是一个字符串,这样你就可以动态地调整字符串调用任何Oracle存储你想要的程序,提供需要尽可能多或尽可能少的参数。当你动态地创建它时,你可以为你放入字符串的每个参数调用bind_param。所以,是的,这很有可能。重点写一个Perl子例程,它将创建你需要的字符串

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

会产生一个字符串3个参数: { BEGIN :结果:= someOracleProc(值=>:参数1,值2 =>:参数2,值3 =>:参数3); END; }

然后将该字符串送入prepare方法并调用bind_parameter三次。

0

我和未命名参数做之前,与具有类似的查询:

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

,然后使@params执行。

如果您必须实际命名参数,但您可以使用类似的方法构建查询字符串,则每个方法都会调用bind_parameter,但这不起作用。