![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевод пользовательской функции с T-SQL на PL/SQL
Ольга © (2005-07-28 08:31:00)Уважаемые мастера-ораклисты, помогите перевести функцию. У меня нет Oracle, негде потренироваться.
На T-SQL это выглядит так:
CREATE FUNCTION dbo.GetRDG (@nplan int, @beg datetime, @end datetime)
RETURNS @GetData TABLE (nplan int, DT datetime, fvalue float)
AS
BEGIN
DECLARE @data datetime, @np int, @h01 float, @h02 float
DECLARE RAB CURSOR SCROLL FOR
SELECT data,nplan,h01,h02
FROM DG_PH
WHERE NPLAN=@NPLAN AND
DATA>=@beg AND DATA<=@end
FOR READ ONLY
OPEN Rab
FETCH NEXT FROM Rab INTO @data, @np, @h01, @h02
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO @GetData VALUES (@np, @data, @h01)
INSERT INTO @GetData VALUES (@np, @data, @h02)
FETCH NEXT FROM Rab INTO @data, @np, @h01, @h02
END
DEALLOCATE Rab
RETURN
END
Может ли вообще функция возвращать таблицу(курсор) в Oracle?
Ольга (2005-07-28 12:18:00) [21]Ну вот сотворила НЕЧТО. Трудно программировать на малознакомом языке вслепую. Прежде, чем отправить клиенту функцию на пробу, хочу услышать критику мастеров:
CREATE FUNCTION GetRDG(nplan numeric(6,0),tbeg date,tend date)
RETURNS SETOF users_type AS '
DECLARE r users_type%ROWTYPE; (объявление типа см. ниже)
BEGIN
DECLARE i NUMBER(2,0)
i=1;
FOR Row IN
SELECT datetime,objectid,hour0_30
FROM ZVK_DBA.dsgrplan_archiv
WHERE objectid=NPLAN AND
datetime>=tbeg AND datetime<=tend
LOOP
r.nplan=Row.objectid;
r.DT=TRUNC(Row.datetime)+i*30/1440 ;
r.fvalue=Row.hour0_30;
i=i+1;
RETURN NEXT r;
r.nplan=Row.objectid;
r.DT=TRUNC(Row.datetime)+i*30/1440 ;
r.fvalue=Row.hour1_00;
i=i+1;
RETURN NEXT r;
END LOOP;
RETURN;
END;
Вызываем функцию из клиентского приложения:
Создаем свой тип данных:
Query.SQL.Text:='CREATE TYPE users_type AS (nplan numeric(6,0), DT date, fvalue numeric(10,0));';
Query.ExecSQL;
Считываем данные:
Query.SQL.Text:='SELECT * FROM GetRDG(:np, :d1, :d2)';
Query.Open;
Reindeer Moss Eater (2005-07-28 11:51:00) [22]> Может ли вообще функция возвращать таблицу(курсор) в Oracle?
Может конечно.
Надо только определиться куда возвращать результат. На клиента или он будет использоваться исключительно на сервере.
Может и не надо никакого курсора возвращать.
ANB (2005-07-28 11:48:00) [23]Точно, не нужна тут функция. В оракле - дата - число. 1 - один день. 1/24/60 - минута. Есть add_months - чтобы прибавить месяцы. Ее достаточно. А время - просто числом добавляй и не мучайся.
Sergey13 (2005-07-28 11:40:00) [24]2[6] Ольга (28.07.05 11:25)
А зачем функция?
select sysdate+30/1440 from dual
например добавляет полчаса к системной дате. 1440=24*60
ANB (2005-07-28 11:29:00) [25]
> evvcom © (28.07.05 10:44) [5]
> Может ли вообще функция возвращать таблицу(курсор) в Oracle?
> Ольга (28.07.05 11:25) [6]
- ща поищу, но чего то для минут не помню я . . .
Отвечу минут через 20 - 30. Ща оракла у меня занята.
Ольга (2005-07-28 11:25:00) [26]Процесс пошел. Функцию почти написала.
Нужен аналог для PL/SQL функции DATEADD(minute, 30, @data)
(извините за наглость, у меня кроме Internet ничего нет)
evvcom (2005-07-28 10:44:00) [27]Курсор и таблица - разные вещи. [4] возвращает курсор.
ANB (2005-07-28 10:31:00) [28]Это, отвлекся я. Вот самый короткий примерчик :
PROCEDURE getds_gsl( DATASET OUT system_types.TCursor) IS
BEGIN
OPEN DATASET FOR
SELECT *
FROM v_p5_gsl v
ORDER BY v.NAME;
END getds_gsl;
На 8i работает.
ЗЫ. Ораклу ставить просто. Если 2000 или XP, то вообще без проблем. Там же универсальный инсталлятор. Только лишнее все выкинуть надо, а то по умолчанию еще и HTTP сервер ставится.
Ольга (2005-07-28 10:25:00) [29]Эй, на шхуне! Живые есть?...
Может хоть чтиво какое подскажите на тему создания функций и курсоров в Oracle.
ANB, вы про меня забыли или примерчик не нашелся?
Ольга (2005-07-28 09:41:00) [30]
> Oracle то поставь. Он на любую NT нормально становится.
Мои коллеги пробовали - убили кучу времени, но так и не поставили. Да и не хочется, чесно говоря, времени жалко. Мне ведь кроме вот этой "фитюльки" больше от Oracle ничего не надо.
> Могу примерчик поискать с курсором
Безмерно была бы благодарна.
ANB (2005-07-28 09:27:00) [31]Может. Но это надо в доку лезть. Могу примерчик поискать с курсором. Набор данных в Oracle похитрее возвращается, я так ни разу не делал.
Совет : Oracle то поставь. Он на любую NT нормально становится.