2009-12-15 6 views
3

Возьмите существующий фрагмент кода perl, который вызывает функцию Oracle с двумя параметрами;Передача произвольного количества параметров функции Oracle в 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; 

Я не совсем уверен, как этот код можно было бы адаптировать для любого количества параметров.

Если у кого-то есть опыт, я бы очень признателен за любую помощь, которую вы могли бы дать.

Благодаря

+0

Я некоторый код здесь, что это специально для выполнения Oracle sproc звонки через DBI, который обрабатывает связывание в/из Params, LOBs и т.д. Я буду видеть, если Я могу освободить его после удаления из него кода, специфичного для WORK. – hobbs

ответ

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

+0

Отлично, спасибо за образец кода. Очень признателен. –

2

Что вы передаете $ dbh-> подготовить это строка, так что вы можете динамически изменять строку для вызова любой Oracle хранимой процедуры вы хотите, обеспечивая, как много или как мало параметров, которые необходимы. Вы вызываете bind_param для каждого параметра, который вы вставляете в строку, когда вы создали ее динамически. Итак, да, это вполне возможно. Сосредоточьтесь на написании подпрограммы perl, которая создаст нужную строку.

Например: my $ procString = & mysub ('someOraclProc', 3);

будет производить строку с 3 параметрами: { НАЧАТЬ : результат: = someOracleProc (значение1 =>: Param1, значение2 =>: param2, value3 =>: param3); END; }

Затем введите эту строку в метод подготовки и вызовите bind_parameter 3 раза.

0

Я сделал это с безымянными параметрами ранее, с запросом иметь что-то вроде:

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

а затем переходя @params выполнить.

Это не работает, если вы действительно должны указывать параметры, но вы можете построить строку запроса с помощью чего-то подобного, а затем вызвать bind_parameter для каждого.

Смежные вопросы