Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];

Вниз

Как возвратить набор данных из процедуры.   Найти похожие ветки 

 
Hro   (2002-09-25 23:23) [0]

Всем здрасте. Подскажите (или лучше маленький пример) как вернуть из хранимой процедуры нечто похожее на таблицу. Разъясняю: есть некая хранимая процедура делающая вычисления и получающая некий набор, сейчас я записываю этот набор в некую таблицу, а из программы делаю запрос к этой таблице. Это неправильно. Как сделать чтоб получать результат прямо из процедуры.
Заранее благодарю.


 
Владислав   (2002-09-26 06:20) [1]

Заканчивай свою процедуру оператором SELECT. В TADOQuery напиши что-то типа EXECUTE your_procedure_name. Далее выполняй метод Open TADOQuery.


 
Hro   (2002-09-26 23:17) [2]

И сколько-же мне переменных объявлять?


 
Владислав   (2002-09-27 08:30) [3]

Каких переменных? Я тебя не понял.
Вот тебе пример:

--Это (слово в слово) написано в TADOQuery

EXECUTE dbo.dead_time_cost :DATE, :COUNTER_AGENT_ID

--А это процедура dbo.dead_time_cost созданная на сервере

CREATE PROCEDURE dead_time_cost
@REPORT_DATE DATETIME, @COUNTER_AGENT_ID BIGINT
AS

DECLARE
@DAY_BEGIN DATETIME,
@DAY_END DATETIME,
@CAR_CIRCLE_COUNT INT

SET @CAR_CIRCLE_COUNT = dbo.car_circle_count(@REPORT_DATE)

SELECT @DAY_BEGIN=DATEADD(hour, -4, CAST(ROUND(CAST(@REPORT_DATE AS FLOAT), 0, 1) AS DATETIME))
SELECT @DAY_END=DATEADD(hour, 20, CAST(ROUND(CAST(@REPORT_DATE AS FLOAT), 0, 1) AS DATETIME))

SELECT
car_number,
car_residence_name,
double_operation,
dead_time_begun,
dead_time_ended,
dbo.calc_dead_time(dead_time_begun, dead_time_ended) dead_time,
dbo.calc_dead_time_cost(car_number, dead_time_begun, dead_time_ended, @CAR_CIRCLE_COUNT, double_operation, car_residences.car_residence_id) dead_time_cost,
@REPORT_DATE report_date,
@CAR_CIRCLE_COUNT car_circle_count,
dbo.in_car_count(@REPORT_DATE) in_car_count,
dbo.out_car_count(@REPORT_DATE) out_car_count
FROM cars INNER JOIN car_residences ON cars.car_residence_id = car_residences.car_residence_id
WHERE counter_agent_id = @COUNTER_AGENT_ID AND
dead_time_ended IS NOT NULL AND
(dead_time_ended > @DAY_BEGIN) AND (dead_time_ended <= @DAY_END)
ORDER BY dead_time_ended

GO

--А это открытие запроса в Builder

qryDeadTime->Open();


Если это не то, что тебе нужно. Уточни.


 
BlackTiger   (2002-09-27 13:52) [4]

TADOStoredProcedure довольно странный компонент, даже не знаю на кой он вообще нужен, подозреваю, что "просто для того, чтобы был".
Его эквивалент простой TADOQuery, где в SQL прописано что-то вроде "EXEC dbo.sp_give_me_something Param1, Param2 ...".

Или мы все чего-то не понимаем?


 
Hro   (2002-09-27 23:59) [5]

СПАСИБО ЗА ОТВЕТЫ. Но это не совсем то что мне надо.
Уточняю. Представьте что в теле процедуры в цикле происходят некоторые вычисления и при каждой итерации получается некоторое колличество параметров, скажем 5. Колличество итераций неизвестно. Хотелось бы чтоб результатом работы данной процедуры был некий набор данных состоящий из пяти колонок. Т.е. при каждой терации получаем одну запись.


 
BlackTiger   (2002-09-28 02:42) [6]

Ne ponjal! :-{
A v chom problemi? Ljuboj grid, jesli jemu ne prisvaivat" otkritogo dataseta i ne zadavat" kolonok, pri otkritii dataseta pokazhet stol"ko kolonok, skol"ko ih budet na moment otkritija.
Dal"she ih formatiruj rukami (kodom) kak hochesh.
Stranno kak-to...


 
Hro   (2002-09-29 00:04) [7]

>> BlackTiger Вопрос не в DBGrid-e, а в процедуре
например
procedure MyProc as
declare @a1 int, @a2 int, @a3 int, @a4 float, @a5 float
declare @recNo int, @i int
select @recNo=count(*) FROM TABLE1 where Field1 between 1 and 100
set @i=0
while @i<= @recNo
begin
select @a1=sum(field1) from table1 where Field1 between 10*@i and 10*(@i+1) and field2=1
select @a2=sum(field1) from table2 where Field1<0
select @a3=count(*) from table3 where Field1 between @a1 and @a2
select @a4=avg(field1) from table4 where Field2 between @a1 and @a2
set @a5=(@a4=@a1+@a2+@a3)/@i
end
Это грубый пример но суть в том что при каждой итерации получаем определенные значения переменных @a1, @a2, ... @a5
и надо получить на выходе набор из пяти колонок со значениями соответствующими этим пяти переменным.


 
BlackTiger   (2002-09-29 00:40) [8]

Блин, под руками нет книжки, а сам точно не уверен в случае с процедурами. Точно знаю о ФУНКЦИЯХ, возвращающих таблицу. Примерно так (точнее посмотри в шаблонах Query Analyser):
CREATE FUNCTION fn_get_some(@p1 int, @p2 int)
RETURNS TABLE ret_table (@f1 nvarchar(12),@f int)
AS
BEGIN
INSERT INTO ret_table
VALUES(N"AAA",1)
-- ...
RETURN ret_table
END
Может что-то напутал, но МОЖНО. Ведь процедуры ВОЗВРАЩАЮТ наборы данных.


 
Hro   (2002-09-30 00:12) [9]

>> BlackTiger Спасибо, но
OUTPUT
Indicates that the parameter is a return parameter. The value of this option can be returned to EXEC[UTE]. Use OUTPUT parameters to return information to the calling procedure. Text, ntext, and image parameters can be used as OUTPUT parameters. An output parameter using the OUTPUT keyword can be a cursor placeholder.

Видимо тут без временной таблицы не обойтись.


 
Владислав   (2002-09-30 06:12) [10]

Можно создать временную таблицу с пять полями вставить в нее записи со значениями переменных @a1, @a2, ... @a5 и завершить выполнение этой процедуры обычным SELECT"ом из временной таблицы.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.036 c
14-68997
Карлсон
2002-09-29 20:32
2002.10.21
как устроен скандиск?


3-68608
KaPaT
2002-09-28 14:06
2002.10.21
Помогите разобраться с ошибкой пожалуйста....


1-68816
Ionv
2002-10-10 07:49
2002.10.21
Как вывести на эран число 16-ом виде?


4-69077
Eug201
2002-09-06 10:40
2002.10.21
Richedit (центрировать по вертикали)


1-68860
Пончик
2002-10-10 11:33
2002.10.21
FrontPage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский