Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевод пользовательской функции с T-SQL на PL/SQL


Страницы:   1 2

Ольга ©   (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 нормально становится.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо