Есть небольшой кусок кода на РНР:
$query = "exec myProcedure";
$result = mssql_query($query);
while ($row = mssql_fetch_assoc($result)) { print $row['psevdonim'];}
Выгребаемые данные группирую и отстраиваю в табличном варианте, своего рода отчеты.
Когда в процедуре хранился один жирный SELECT, в РНР данные выгребались без проблем. Недавно процедура была изменена, теперь в ней ход действий следующий:
1. Создание виртуальной таблицы #Result;
2. Создаю курсор и полученые из него данные складываю в #Result, через update;
3. Произвожу апдейт #Result с полученными новыми данными;
4. Ну и под конец еще один SELECT, но уже из #Result, который выгребает необходимое.
Краткий пример процедуры:
DECLARE @ID int
DECLARE @AVERAGE int
CREATE TABLE #Result
(
ID int,
NAME nvarchar(50),
VALUE int,
AVERAGE int
)
INSERT INTO #Result(ID, NAME, VALUE) SELECT ID, NAME, VALUE, AVERAGE
FROM ...
INNER JOIN ...
DECLARE average_d CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR SELECT SUM(value)/COUNT(*) AS avAVERAGE, ID FROM table_name
WHERE ...
GROUP BY ...
OPEN average_d
FETCH NEXT FROM average_d INTO @AVERAGE, @ID
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #Result SET AVERAGE = @AVERAGE WHERE ID = @ID
FETCH NEXT FROM average_d INTO @AVERAGE, @ID
END
CLOSE average_d
DEALLOCATE average_d
SELECT ID, NAME, VALUE, AVERAGE FROM #Result
END
Собственно вопрос, почему PHP не выгребаются данные из процедуры? =)
P.S. Проверял процедуру в ReportingService2008, таблица строится прекасно.
Спустя 1 месяц, 18 дней, 5 часов, 18 минут, 10 секунд (4.04.2012 - 13:46) wasabi написал(а):
Вернулся к текущей проблеме=) Есть у кого идеи?
Спустя 6 минут (4.04.2012 - 13:52) glock18 написал(а):
а как вы ее в php то запрашиваете?
Спустя 4 минуты, 40 секунд (4.04.2012 - 13:57) wasabi написал(а):
glock18
вот так:
Самое интересное, что если в этой процедуре написать простой селект к какой нибудь таблице, то значения вернуться.
Но как только я усложняю процедуру виртуальной таблицей и курсором, данных на возврат нет.
вот так:
$query = "exec myProcedure";
Самое интересное, что если в этой процедуре написать простой селект к какой нибудь таблице, то значения вернуться.
Но как только я усложняю процедуру виртуальной таблицей и курсором, данных на возврат нет.
Спустя 26 минут (4.04.2012 - 14:23) wasabi написал(а):
К процедуре сосмнений нет, тяну из нее данные приложением на дельфях и ReportingService2008.
Спустя 6 минут, 13 секунд (4.04.2012 - 14:29) glock18 написал(а):
Цитата (wasabi @ 4.04.2012 - 10:57) |
вот так: $query = "exec myProcedure"; |

Спустя 22 минуты, 5 секунд (4.04.2012 - 14:51) wasabi написал(а):
Не совсем понимаю, что вы имеете ввиду какую либу(биюлиотеку) я использую :) Если про версию пхп (5.2.7) и mssql (2008).
Код самой хранимки, ничего архисложного:
$query = "exec myProcedure"; // собственно вызываю процедуру
$result = mssql_query($query);
while ($row = mssql_fetch_assoc($result)) { //получаю массив значений из хранимки, но он пустой.
print $row['kustId'];
}
Код самой хранимки, ничего архисложного:
USE [dev]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[tm_reportErrorModules]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @kpRowId int
DECLARE @devTypecapt nvarchar(50)
DECLARE @devName nvarchar(50)
DECLARE @objId int
DECLARE @objCapt nvarchar(50)
DECLARE @devId int
CREATE TABLE #Result
(
kustId int,
kustName nvarchar(50),
kpId int,
kpType nvarchar(50),
kpName nvarchar(50),
moduleNum int,
answer nvarchar(50),
datePoint datetime
)
INSERT INTO #Result(kpId, moduleNum, answer, datePoint) SELECT dev_id, module_num, link_msg, datepoint FROM kp_modules_state
DECLARE kpRow CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR SELECT kpId FROM #Result
OPEN kpRow
FETCH NEXT FROM kpRow INTO @kpRowId
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE upOne CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR SELECT kd.obj_id, kdt.dev_type_capt, kd.dev_name, do.capt kustCapt, kd.dev_id FROM kep_dev kd, kep_dev_type kdt, d_obj do WHERE kd.dev_type_id = kdt.dev_type_id and do.obj_id = kd.obj_id and kd.dev_id = @kpRowId
OPEN upOne
FETCH NEXT FROM upOne INTO @objId, @devTypecapt, @devName, @objCapt, @devId
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #Result SET kustId = @objId,kustName = @objCapt, kpName = @devName, kpType = @devTypecapt WHERE kpId = @devId
FETCH NEXT FROM upOne INTO @objId, @devTypecapt, @devName, @objCapt, @devId
END
CLOSE upOne
DEALLOCATE upOne
FETCH NEXT FROM kpRow INTO @kpRowId
END
CLOSE kpRow
DEALLOCATE kpRow
SELECT kustId, kustName, kpId, kpType, kpName, moduleNum, answer, datePoint FROM #Result
END
Спустя 5 минут, 40 секунд (4.04.2012 - 14:57) glock18 написал(а):
wasabi
так у вас mssql, а я то по наивности решил, что mysql. пардон за невнимательность
вот должно помочь - http://php.net/manual/ru/function.mssql-execute.php
вот статья по теме - http://www.sweeting.org/mark/blog/2005/02/...-and-sql-server
так у вас mssql, а я то по наивности решил, что mysql. пардон за невнимательность
вот должно помочь - http://php.net/manual/ru/function.mssql-execute.php
вот статья по теме - http://www.sweeting.org/mark/blog/2005/02/...-and-sql-server
Спустя 1 час, 12 минут, 53 секунды (4.04.2012 - 16:10) wasabi написал(а):
glock18
благодарю=) Завтра с утра попробую применить!
благодарю=) Завтра с утра попробую применить!
Спустя 14 часов, 29 минут, 19 секунд (5.04.2012 - 06:39) wasabi написал(а):
glock18
из статьи о мучениях программиста, понятно, что для получения данных от хранимки mssql необходимо:
в переменно $conn - собственно сам коннект к базе. Но что-то не выходит. Пустота значения мне возвращаются.
из статьи о мучениях программиста, понятно, что для получения данных от хранимки mssql необходимо:
$stmt=mssql_init("reportProcedure", $conn);
/* execute the procedure */
$result = mssql_execute($stmt);
/* get the row that is returned */
$row = mssql_fetch_assoc($result);
/* get my value out */
$my_id = $row['album_id'];
в переменно $conn - собственно сам коннект к базе. Но что-то не выходит. Пустота значения мне возвращаются.
Спустя 38 минут, 54 секунды (5.04.2012 - 07:18) wasabi написал(а):
Вот код составленный по мануалу из PHP.NET
Вот второй вариант обращения:
Обав варианта отрабатывают, когда в хранимой процедуре есть лишь один SELECT. Как только хранимую процедуру усложняем - затык.
glock18, возможно ли это из-за использования виртуальных таблиц в хранимой процедуре?
$link = mssql_connect('127.0.0.1', 'user', 'pass');
mssql_select_db('dev');
$stmt=mssql_init("reportProcedure", $link);
$result = mssql_execute($stmt);
$row = mssql_fetch_assoc($result);
$my_id = $row['idParam'];
echo $my_id;
Вот второй вариант обращения:
function &get_conn()
{
global $conn;
$myServer = "127.0.0.1";
$myUser = "user";
$myPass = "pass";
$myDB = "dev";
if(!$conn)
{
$conn = mssql_connect($myServer, $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
mssql_select_db($myDB, $conn)
or die("Couldn't select database $myDB");
}
return $conn;
}
$conn =& get_conn();
$stmt=mssql_init("reportProcedure", $conn);
$result = mssql_execute($stmt);
$row = mssql_fetch_assoc($result);
$my_id = $row['idParam'];
echo $my_id;
Обав варианта отрабатывают, когда в хранимой процедуре есть лишь один SELECT. Как только хранимую процедуру усложняем - затык.
glock18, возможно ли это из-за использования виртуальных таблиц в хранимой процедуре?
Спустя 5 часов, 7 минут, 12 секунд (5.04.2012 - 12:25) wasabi написал(а):
Единственным выходом сейчас вижу:
1. Вызываю хранимую процедуру которая проверяет существует ли таблица Result. Если да, то удаляет ее. Если нет, то создает реальную таблицу Result и складывает в нее данные.
2. Выполняю SELECT к этой таблице.
Выход конечно не джентельменский, но по другому не выходит.
Может есть еще у кого идеи?
1. Вызываю хранимую процедуру которая проверяет существует ли таблица Result. Если да, то удаляет ее. Если нет, то создает реальную таблицу Result и складывает в нее данные.
2. Выполняю SELECT к этой таблице.
Выход конечно не джентельменский, но по другому не выходит.
Может есть еще у кого идеи?
Спустя 1 час, 17 минут, 19 секунд (5.04.2012 - 13:42) wasabi написал(а):
Кстати нашел такую вещь, что mssql_get_last_message(), возвращает: The statement has been terminated.
Спустя 1 час, 4 минуты, 58 секунд (5.04.2012 - 14:47) wasabi написал(а):
И так, все гениальное как говориться просто=) путем мытарств и опытным путем, ошибка найдена!
При создании временной таблицы, обязательно указывайте может ли столбец содержать NULL:
правильное создание временной таблицы:
При создании временной таблицы, обязательно указывайте может ли столбец содержать NULL:
правильное создание временной таблицы:
CREATE TABLE #ResultUI
(
[kustId] [int] NULL,
[kustName] [nvarchar] (50) NULL,
[kpId] [int] NULL,
[kpType] [nvarchar] (50) NULL,
[kpName] [nvarchar] (50) NULL,
[moduleNum] [int] NULL,
[answer] [nvarchar] (50) NULL,
[datePoint] [datetime] NULL
)
Спустя 40 минут, 56 секунд (5.04.2012 - 15:28) glock18 написал(а):
Цитата (wasabi @ 5.04.2012 - 11:47) |
И так, все гениальное как говориться просто=) путем мытарств и опытным путем, ошибка найдена! |
обычно так и бывает
