Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl DBI - как передать именованные параметры списком? / 7 сообщений из 7, страница 1 из 1
01.07.2015, 11:37
    #38996661
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
Подскажите, как можно передать список именованных параметров в метод 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
02.07.2015, 02:41
    #38997420
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
Alibek B.,

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

Вы когда-нибудь будите читать хотя-бы начальные книги по Перлу, а не городить отсебятену?
...
Рейтинг: 0 / 0
02.07.2015, 08:44
    #38997479
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
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
06.07.2015, 03:25
    #39000128
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
Alibek B.,

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

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

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

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

По этому или вы читаете документацию или не читаете. Но нельзя быть немного беременным... Подход "это работает" неприменим. Или тогда "с do это не работает" и вот вам ответ.
...
Рейтинг: 0 / 0
06.07.2015, 09:19
    #39000185
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
Спасибо за потраченное время, конечно.
Но как ни странно, документацию я читаю.
Более того, и исходный код я также просматриваю:
Код: 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
14.07.2015, 17:38
    #39007218
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl DBI - как передать именованные параметры списком?
Прошу прощения, что долго не отвечал... Затянуло...

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


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


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