Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / <PHP> Извлечь 1 страницу из запроса к SQL Server / 13 сообщений из 13, страница 1 из 1
30.01.2006, 09:28
    #33509902
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
Требуется извлечь из запроса (сам он м.быть содержит очень много записей) 1 страницу (например 10) записей и отобразить впоследствии в броузере в виде grid (таблица с выделенной текущей записью) c возможностью перелистывания и др. операций над текущей записью в grid. Сначала я отправил этот post в форум SQL Server, но там молчат как рыба об лёд. Наверное, здесь отреагируют быстрее. Дело в том, что у меня хорошо с SQL, но я делаю первые шаги по работе с БД через WEB и нуждаюсь в одобрении/порицании в этой области.
В общем, я хочу замечаний типа "Ты неправ, а делать нужно вот так"
или "Базовая идея порочна по таким то причинам"
ЗАРАНЕЕ СПАСИБО

-
Ниже реализация
Во первых, написал процедуру на SQL Server 2000:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE dbo.PageFromQuery @sql varchar( 8000 ), @Start int, @PageSize int
-- @sql - запрос
-- @Start - порядковый номер 1-й извлекаемой записи
-- @PageSize - число извлекаемых записей
-- процедура создаёт @PageSize наборов по 1 записи в каждом
 AS
declare @i int,
	@dcl_curs varchar( 8000 )
set @dcl_curs='declare ps cursor keyset for '+@sql
exec (@dcl_curs)
open ps
fetch absolute @Start from ps
set @i= 1 
while (@@fetch_status <> - 1  and @i<@PageSize) begin
	fetch next from ps
	set @i=@i+ 1 
end
close ps
deallocate ps
GO

Во вторых, написал PHP - ф-ю, извлекающую результат из процедуры в массив

Код: plaintext
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.
30.
31.
<?php
function ODBC_PageFromQuery($conn,$query,$start,$pagesize,&$FieldNames){
// $conn - соединение с БД
// $query - запрос
// $start - номер первой извлекаемой записи
// $pagesize - число извлекаемых записей
// $FieldNames - массив имён полей результата
// возвращает false при неудаче либо массив записей
$q="exec dbo.PageFromQuery '".$query."',".$start.",".$pagesize;
$res=odbc_exec($conn,$q);
if(!$res){
	return false;
}
$nFields=odbc_num_fields ($res);
$nRows= 0 ;
for($i= 0 ;$i<$nFields;$i++){
	$FieldNames[$i]=odbc_field_name($res, $i+ 1 );
}
do{
	while(odbc_fetch_row($res)){
		for($i= 0 ;$i<$nFields;$i++){
			$s=odbc_result ($res, $i+ 1 );
			$r[$nRows][$FieldNames[$i]]=$s;
		}
		$nRows++;
	}
}while(odbc_next_result($res));
return $r;
}
?>

и в третьих, написал пример обращения к php - ф-ии (кстати, в самом запросе ~180000 записей):

Код: plaintext
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.
30.
31.
32.
33.
34.
<?php
include ("functions.php");
$Psw="mk";
$User="mk";
$DSN="AsuVuz";
$conn=odbc_connect($DSN,$User,$Psw,SQL_CUR_USE_ODBC);

$query='select FIO,DatePair,TimeStart,SubjName,GSName,AudName '.
'from Schedule s, Employee,Pair,Subj,Aud,GS '.
'where s.Emp_ID=Employee.Emp_ID '.
'  and s.Pair_ID=Pair.Pair_ID'.
'  and s.Subj_ID=Subj.Subj_ID'.
'  and s.Aud_ID=Aud.Aud_ID'.
'  and s.GS_ID=GS.GS_ID '.
'order by DatePair,TimeStart, FIO';
$start= 100 ;
$pagesize= 10 ;
$FieldNames=array();
$r=ODBC_PageFromQuery($conn,$query,$start,$pagesize,$FieldNames);
if($r){
	$nRows=count($r);
} else {
	exit();
}
$nFields=count($FieldNames);
echo $nRows."  ".$nFields."<br>";
for($i= 0 ;$i<$nRows;$i++){
	for($j= 0 ;$j<$nFields;$j++){
		echo $FieldNames[$j]."=".$r[$i][$FieldNames[$j]]."  ";
	}
	echo "<br>";
}
odbc_close($conn);
?>
Всё работает довольно быстро.
...
Рейтинг: 0 / 0
30.01.2006, 11:11
    #33510224
paul_c0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
...
Рейтинг: 0 / 0
30.01.2006, 11:12
    #33510229
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
Специфика работы с веб, такая как малопредсказуемое количество параллельных запросов и определённые ограничения во взаимодействии с клиентами, подразумевает, что все регулярно выполняемые запросы к базе быстрые, выполняются по индексам и даже значительное их количество не вызовет существенного замедления. А в совокупности с тем, как строится взаимодействие с клиентом, использование курсора не даёт особых выгод и вполне можно ограничиться запросами с LIMIT.
...
Рейтинг: 0 / 0
30.01.2006, 11:57
    #33510395
?????
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
DocAl...вполне можно ограничиться запросами с LIMIT . а разве его есть в авторSQL Server 2000 ?
...
Рейтинг: 0 / 0
30.01.2006, 12:13
    #33510465
Yorick.kiev.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
????? DocAl...вполне можно ограничиться запросами с LIMIT . а разве его есть в авторSQL Server 2000 ?

Есть TOP
...
Рейтинг: 0 / 0
30.01.2006, 14:18
    #33510908
?????
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
Yorick.kiev.ua
Есть цитата из ссылки: paul_c0 Постраничная выборка
TOP n записей выбираются уже из конечного результата запроса, то проверка условия WHERE будет выполняться для каждой строки главного запроса. При этом, время выполнения этой проверки будет расти вместе с номером выбираемой порции(страницы).
И есть ~180000 записей у автора.
...
Рейтинг: 0 / 0
30.01.2006, 17:01
    #33511503
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
Спасибо за реплики, коллеги.
>DocAl
LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)
>др. замечания:
Я не использую нумерацию записей и мне не нужно TOP. Вместо этого я сразу перехожу к начальной записи страницы:
Код: plaintext
fetch absolute @Start from ps
Если вы дадите себе труд попробовать, то убедитесь, что на одной таблице без lookup полей результат получается практически мгновенно. Я не заметил зависимости от объёма выборки запроса, хлтя она должна быть логарифмической (индексы в В-деревьях).
-
Но суть то не в этом. Я писал:
Я самТребуется извлечь из запроса (сам он м.быть содержит очень много записей) 1 страницу (например 10) записей и отобразить впоследствии в броузере в виде grid (таблица с выделенной текущей записью) c возможностью перелистывания и др. операций над текущей записью в grid.
Прошу направить критику в этот адрес. Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
...
Рейтинг: 0 / 0
30.01.2006, 18:07
    #33511707
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
...
Рейтинг: 0 / 0
30.01.2006, 22:42
    #33512071
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
* muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
Которой, похоже, в MSSQL действительно нету.(
Подложили мелкомягкие свинью, однако...
А какой-нибудь rownum или что-то подобное есть, может быть?
...
Рейтинг: 0 / 0
31.01.2006, 00:19
    #33512121
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
DocAl * muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
Которой, похоже, в MSSQL действительно нету.(
Подложили мелкомягкие свинью, однако...
А какой-нибудь rownum или что-то подобное есть, может быть?Наверняка есть аналог.
...
Рейтинг: 0 / 0
31.01.2006, 06:26
    #33512223
muk07
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
Последний раз вопрошаю, уже почти не надеясь:
muk07Прошу направить критику в этот адрес --> Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
...
Рейтинг: 0 / 0
31.01.2006, 06:53
    #33512235
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
muk07Последний раз вопрошаю, уже почти не надеясь:
muk07Прошу направить критику в этот адрес --> Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
Вопрос слишком неконкретен, потому и ответить сложно.
ОбщО можно ответить лишь только что HTML позволяет создавать достаточно сложные формы, в связке с JS можно добиться сложного влияния их элементов друг на друга, однако ограничения накладываемые JS на изменения состояния формы следует учитывать лишь как вспомогательные, и на стороне сервера следует обязательно проверять сообщённые значения на корректность.
...
Рейтинг: 0 / 0
31.01.2006, 09:30
    #33512372
msh
msh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
<PHP> Извлечь 1 страницу из запроса к SQL Server
2 * : аналога сожалению нет.
Но как вариант можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE sp_viewpage @Rows INT, @pagenumber INT
AS
DECLARE
  @Handle     INT,
  @TotalRows  INT,
  @thispage   INT
EXEC sp_cursoropen
            @Handle OUT,
            'select BranchCode, BranchName from info_table_9es',  1 ,  1 ,
            @TotalRows OUT
SET @thispage =  1  + @Rows * (@pagenumber -  1 )
EXEC sp_cursorfetch @Handle,  16 , @thispage, @Rows

--например, выведем 15-ть строк второй страницы
EXEC sp_viewpage  15 ,  2 
Далее фетчить по потребностям :-)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / <PHP> Извлечь 1 страницу из запроса к SQL Server / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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