2009-12-15 3 views
3

두 개의 매개 변수를 사용하여 Oracle 함수를 호출하는 기존의 perl 코드를 가져옵니다. (이름이 내가 생각 펄 스크립트에 매개 변수로 전달되는과) perl의 오라클 함수에 임의의 수의 매개 변수 전달

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은 결코 내 강점이 아니므로 문제가 얼마나 어려운지 잘 모릅니다.

여기에서 문제가되는 부분은 실제 SQL입니다.

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

나는이 코드가 어떤 수의 매개 변수를 취하는 데 어떻게 적용될 수 있는지 잘 모르겠습니다.

누구든지 이와 관련하여 경험이 있다면 정말 도움을 주시면 감사하겠습니다. 동적 오라클이 필요한만큼 또는 작은 매개 변수를 제공, 당신이 원하는 저장 프로 시저를 어떤 호출하는 문자열을 조정할 수 있도록

감사

당신이 $ dbh-> 준비에 전달 무엇
+0

내가 한 $ WORK 특정 코드를 제거한 후 릴리스 할 수 있습니다. – hobbs

답변

6

뭔가 작동합니다 :

오라클의 sproc 일을 위해 특별히입니다 여기에 몇 가지 코드 등 내가 있는지거야/아웃 PARAMS에 바인딩 핸들 DBI, LOB를 통해 호출
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

+0

샘플 코드를 사용해 주셔서 감사합니다. 매우 감사. –

2

은 문자열입니다. 문자열을 동적으로 만들 때 문자열에 넣는 각 매개 변수에 대해 bind_param을 호출합니다. 그래서, 가능합니다. 필요한 문자열을 생성하는 perl 서브 루틴 작성에 중점을 두십시오.

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

은 3 개 개의 매개 변수 문자열을 생산할 것이다 : someOracleProc = (값 => : Param1을, 값 2 =>과 Param2, VALUE3 => 3 당겨)를 결과 : { 가 를 BEGIN; END; }

그런 다음 문자열을 prepare 메소드에 제공하고 bind_parameter를 3 회 호출하십시오. 실행 @params를 통과 한 후

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

그리고 :

0

나는 쿼리가 같은 것을 갖는 전에 이름이 매개 변수를 사용하여 이런 짓을했습니다.

매개 변수 이름을 실제로 지정해야하는 경우에는 작동하지 않지만 유사한 문자열을 사용하여 쿼리 문자열을 작성한 다음 각각에 대해 bind_parameter을 호출하십시오.

는 이 같은