powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl DBI - как передать именованные параметры списком?
7 сообщений из 7, страница 1 из 1
Perl DBI - как передать именованные параметры списком?
    #38996661
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как можно передать список именованных параметров в метод do?
Синтаксис метода такой:
Код: php
1.
$rows = $dbh->do($statement, \%attr, @bind_values)


Мне нужно выполнить SQL-запрос (в переменной $sql), в котором используется параметр ':scope' (он в переменной $scope).

Код: php
1.
$dbh->do($sql, undef, $scope)


Выдает ошибку "Can't bind unknown placeholder ':p1' (1)" (то есть ожидаем не именованных, а позиционных параметров).

Код: php
1.
$dbh->do($sql, undef, ':scope'=>$scope)


Код: php
1.
$dbh->do($sql, undef, [':scope'=>$scope])


Выдают ошибку "DBD::Oracle::db do failed: called with 2 bind variables when 1 are needed".

Код: php
1.
$dbh->do($sql, undef, {':scope'=>$scope})


Выдает ошибку "Can't bind a reference".

Обычно я использовал prepare/bind_param/execute.
А можно ли одной командой обойтись?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #38997420
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Можно. Читая документацию к bind_param так-же узнаешь что у нее нету имени переменной.

Вы когда-нибудь будите читать хотя-бы начальные книги по Перлу, а не городить отсебятену?
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #38997479
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarstoneЧитая документацию к bind_param так-же узнаешь что у нее нету имени переменной.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
my $q = $dbh->prepare($sql);
if ($params && ref($params) eq 'HASH')
{
	$q->bind_param(":$_", $params->{$_}) foreach keys(%{$params});
}
if ($params && ref($params) eq 'ARRAY')
{
	$q->bind_param($_+1, $params->[$_]) foreach (0..$#$params);
}
my $ret = $q->execute();
...


Это код, который работает у меня не первый год.
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #39000128
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Вы продолжаете не хотеть читать документацию. Это, видно, врожденное...

http://search.cpan.org/~pythian/DBD-Oracle-1.74/lib/DBD/Oracle.pm#bind_param

Вот тут действительно написано что в DBD::Oracle это есть.

Однако do реализован, внезапно, в DBI, у которого нету символьных параметров и который работает "по другому".

По этому или вы читаете документацию или не читаете. Но нельзя быть немного беременным... Подход "это работает" неприменим. Или тогда "с do это не работает" и вот вам ответ.
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #39000185
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за потраченное время, конечно.
Но как ни странно, документацию я читаю.
Более того, и исходный код я также просматриваю:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
# строка 1630 файла DBI.pm
    sub do {
	my($dbh, $statement, $attr, @params) = @_;
	my $sth = $dbh->prepare($statement, $attr) or return undef;
	$sth->execute(@params) or return undef;
	my $rows = $sth->rows;
	($rows == 0) ? "0E0" : $rows;
    }


Например метод do — это по сути обертка для метода execute, который (сюрприз) реализован в DBD.
Вернее непосредственно метод описан в файле DBI::DBD::SqlEngine.pm, однако видимо он где-то переопределяется, поскольку для DBD::Oracle поведение, к примеру, bind_param не соответствует тому, что написано в исходном коде:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
sub bind_param ($$$;$)
{
    my ( $sth, $pNum, $val, $attr ) = @_;
    if ( $attr && defined $val )
    {
        my $type = ref $attr eq "HASH" ? $attr->{TYPE} : $attr;
        if (    $type == DBI::SQL_BIGINT()
             || $type == DBI::SQL_INTEGER()
             || $type == DBI::SQL_SMALLINT()
             || $type == DBI::SQL_TINYINT() )
        {
            $val += 0;
        }
        elsif (    $type == DBI::SQL_DECIMAL()
                || $type == DBI::SQL_DOUBLE()
                || $type == DBI::SQL_FLOAT()
                || $type == DBI::SQL_NUMERIC()
                || $type == DBI::SQL_REAL() )
        {
            $val += 0.;
        }
        else
        {
            $val = "$val";
        }
    }
    $sth->{sql_params}[ $pNum - 1 ] = $val;
    return 1;
}    # bind_param


Здесь, к примеру, bind_param присваивает значение параметров массиву параметров, т.е. именованный параметр данный код обработать не может в принципе. Однако у меня именованные параметры успешно назначаются (без исключения в предпоследней строке), значит где-то в DBD::Oracle этот метод переопределяется.

Но вот как метод переопределяется и как это все работает в целом я понять не смог, поэтому и спрашиваю на форуме.
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #39007218
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, что долго не отвечал... Затянуло...

Посмотрите где execute и как он работает. Дальше проверьте что my ($a, $b, @c) = @_ в @c будет все оставшееся и после этого вы +- поймете как вам надо вызвать так, чтобы заработало и может-ли это работать.


Однако я настоятельно рекомендую вам этого не делать и пользоваться неименованными плейсхолдерами. А для реализации того, что хотите вы - пользоваться какими-нибудь SQL генераторами.
...
Рейтинг: 0 / 0
Perl DBI - как передать именованные параметры списком?
    #39007256
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо за ответ.
Разбираться с такими модулями как DBI нецелесообразно — времени потрачу слишком много.
Сделал обертку (процедуру), в которой параметры задаю через bind_param.
Такое под мою задачу вполне подходит.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl DBI - как передать именованные параметры списком?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]