Передача произвольного количества параметров в функцию Oracle в Perl - PullRequest
3 голосов
/ 16 декабря 2009

Возьмите существующий фрагмент кода 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;

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

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

Спасибо

Ответы [ 3 ]

6 голосов
/ 16 декабря 2009

Примерно так будет работать:

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;
}
2 голосов
/ 16 декабря 2009

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

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

выдаст строку с 3 параметрами: { НАЧАТЬ : результат: = someOracleProc (значение1 =>: параметр1, значение2 =>: параметр2, значение3 =>: параметр3); КОНЕЦ; }

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

0 голосов
/ 16 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...