perl-dbi #temp таблица, созданная с использованием дескриптора dbh, недоступна при доступе через -> do () с тем же дескриптором - PullRequest
0 голосов
/ 04 августа 2011

Я сталкиваюсь с этой проблемой Perl DBD :: Откат ODBC неэффективен при включенном AutoCommit на , и, глядя на проблему, я обнаружил, что с Perl :: DBI с DBD :: ODBC на сервере sql. Но я не уверен, случится ли это с любым другим драйвером.

Проблема в том, что когда я создаю таблицу #temp с помощью $ dbh-> do и когда я пытаюсь получить доступ к той же таблице #temp с помощью другого $ dbh-> do, я получаю сообщение об ошибке ниже. Также это происходит не постоянно, а только с перерывами.

Неверное имя объекта '# temp'

$dbh->do("SELECT  ... INTO #temp FROM ...");
$dbh->do("INSERT INTO ... SELECT ... FROM #temp");

Вторая ошибка завершается с 'Неверное имя объекта' #temp ''

Пожалуйста, помогите мне с проблемой.

Ответы [ 2 ]

1 голос
/ 25 августа 2012

У меня тоже была эта проблема.Я попробовал все вышеперечисленное, но это не имело значения.Я наткнулся на это http://bytes.com/topic/sql-server/answers/80443-creating-temporary-table-select-into, которое решило мою проблему.

То, что происходит, - то, что ADO открывает второе соединение за вашей спиной.Это на самом деле не имеет ничего общего с тем, как вы создали таблицу.

Причина, по которой ADO открывает дополнительное соединение, заключается в том, что есть строки, ожидающие получения при первом соединении, поэтому ADO не может отправить запрос наэто соединение.

Я предполагаю, что Perl DBI делает то же самое, поэтому, исходя из этого предположения, вот что я сделал, и он прекрасно работал:

 my $sth = $dbh->prepare('Select name into #temp from NameTable');
 $sth->execute();
 $sth->fetchall_arrayref();
 $sth = $dbh->prepare('Select a.name, b.age from #temp a, AgeTable b where a.name = name');
 $sth->execute();
 my ($name,$age)
 $sth->bind_columns(\$name,\$age);
 while ( $sth->fetch())
 {
     # processing
 }
1 голос
/ 04 августа 2011

Не то чтобы это отвечало на ваш вопрос, но могло бы помочь. Следующее работает для меня.

#
# To access temporary tables in MS SQL Server they need to be created via
# SQLExecDirect
#
use strict;
use warnings;
use DBI;

my $h = DBI->connect();

eval {
    $h->do(q{drop table martin});
    $h->do(q{drop table martin2});
};

$h->do(q{create table martin (a int)});
$h->do(q{create table martin2 (a int)});

$h->do('insert into martin values(1)');

my $s;
# this long winded way works:
#$s = $h->prepare('select * into #tmp from martin',
#                    { odbc_exec_direct => 1}
#);
#$s->execute;
# and this works too:
$h->do('select * into #tmp from martin');
# but a prepare without odbc_exec_direct would not work

print "NUM_OF_FIELDS: " . DBI::neat($s->{NUM_OF_FIELDS}), "\n";

$s = $h->selectall_arrayref(q{select * from #tmp});
use Data::Dumper;
print Dumper($s), "\n";

$h->do(q/insert into martin2 select * from #tmp/);
$s = $h->selectall_arrayref(q{select * from martin2});
print Dumper($s), "\n";
...