FAQ по perl и программированию для web Страница 15. Работа без курсоров
|
Страница 15 из 16 Работа без курсоров DBI предоставляет несколько методов для такого рода работы: Методы для запросов: - selectrow_array
Возвращает одну строку запроса в виде массива - selectall_arrayref
Возвращает весь ответ сервера в виде массива ссылок на массивы. Методы для выражений, не возвращающих значений - do
исполняет запрос Пример: #получить значение bar при baz=3 ($bar) = $dbh->selectrow_array('select bar from foo where baz=3');
# установить baz в некоторое значение при bar='somestring' $dbh->do("update set baz=1 where bar='somestring'");
9.2 Как работать с записями кусочками: первые N записей, следующие N...? Можно несколькими способами: 1. Просто прокручивая курсор: $c = $dbh->prepare('select baz, bar from foo'); $c->execute; # если нужна последовательность с 26 по 50
for ($k = 0; $k < 26; $k++) { $c->fetchrow_array; } # теперь можно вывести данные print "<table border=1><tr><th>bar</th><th>baz</th></tr>\n"; while (($bar, $baz) = $c->fetchtrow_array) { print "<tr><td>$bar</td><td>$baz</td></tr>\n"; } $c->finish; # Закрыть курсор print "</table>";
2. Используя курсоры СУБД # Показан синтаксис PostgeSQL $dbh->do('declare mycursor cursor for select bar, baz from foo'); $dbh->do('move 25');
# И теперь будем получать данные $c = $dbh->prepare('fetch forward 25 in mycursor'); while (($bar, $baz) = $c->fetchrow_array) { print ....; } $c->finish; $dbh->do('close mycursor');
3. Для MySQL можно использовать директиву LIMIT $c = $dbh->prepare('select bar, baz from foo limit 26,25'); while (($bar, $baz) = $c->fetchrow_array) { print ....; } $c->finish;
9.3 Где взять документацию/учебник по SQL? - В книжных магазинах сейчас обширный набор книг по SQL. (От рекомендаций воздержусь -- ни одну из них я не читал)
- На MCP personal bookshelf ( https://pbs.mcp.com) есть книга "Teach yourself SQL in 21 days" -- весьма рекомендую, очень хорошая книга.
- На citforum ( https://www.citforum.ru) были какие-то руководства
9.4 Как можно подсоединится к MS SQL Server? Вроде как можно при помощи DBD::FreeTDS |