2009-12-15 62 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,但這不起作用。

相關問題