[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нет данных из хранимой процедуры
wasabi
Всем доброго времени суток! =)

Есть небольшой кусок кода на РНР:

$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";


smile.gif надеялся понять, какой либой пользуетесь. Итак, что за либа у вас? ну и собственно, показывайте не очевидный запрос, а то чем выполняете и разбираете данные

Спустя 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

Спустя 1 час, 12 минут, 53 секунды (4.04.2012 - 16:10) wasabi написал(а):
glock18
благодарю=) Завтра с утра попробую применить!

Спустя 14 часов, 29 минут, 19 секунд (5.04.2012 - 06:39) wasabi написал(а):
glock18
из статьи о мучениях программиста, понятно, что для получения данных от хранимки 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

$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 час, 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:

правильное создание временной таблицы:

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)
И так, все гениальное как говориться просто=) путем мытарств и опытным путем, ошибка найдена!


обычно так и бывает smile.gif мои поздравления с успешным разрешением
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.