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-08-01 13:43:00) [1]

Исправляюсь:
OLE DB provider 'bl.cdo.ups.ru' does not contain table ' "reader"."myview"'. The table either does not exist or the current user does not have permissions on that table.


Ольга   (2005-08-01 13:25:00) [2]

Возвращаюсь к теме.
И так, я сделала, как мне и советовали, VIEW а не функцию. Теперь возникла другая заморочка:
1. Прилинковала к серверу MSSQL сервер Oracle8.1 Линк с правами пользователя Оракла "reader", вижу оракловские таблицы и View через MS Enterprise Manager.
2. В Оракле "reader" имеет права на чтение одной таблицы ZVK_DBA.DSGRPLAN и на создание VIEW. Создала VIEW
reader.myview. В SQL Plus все прекрасно выбирается.
3. В MS Query Analyzer запускаю 2 запроса к прилинкованным объектам -
напрямую к таблице:
select * from [bl.cdo.ups.ru]..ZVK_DBA.DSGRPLAN - работает
к View:
select * from [bl.cdo.ups.ru]..rdgreader.myview - не работает
Ошибка:
OLE DB provider 'bl.cdo.ups.ru' does not contain table '"rdgreader"."getrdg"'. The table either does not exist or the current user does not have permissions on that table.
Каких прав не хватает? Или к View надо обращаться как то по особенному?


ANB   (2005-07-28 16:30:00) [3]

Тьфу, 8.1.7.4.1


Sergey13   (2005-07-28 16:04:00) [4]

2[26] ANB ©   (28.07.05 16:01)
> Оракла 8.2.
Не знаю такой. 8.0.х видел, 8.1.х тоже. 8.2 - нет. 8-)


ANB   (2005-07-28 16:02:00) [5]

Да, еще, пересоздание сервиса помогает, но у меня там уже штук 15 немаленьких схем и неохота их все выгружать - загружать. Я раз промучился, а когда снова упала, уже не стал.


ANB   (2005-07-28 16:01:00) [6]


> Sergey13 ©   (28.07.05 15:55) [25]
- а мы этого не делали. Оракла 8.2.
oradim ом уже все правил, в реестре все включил. Посмотрели лог - там при автостарте - ошибка нехватки Share Memory. Но кода ручками стартуешь базу - все нормально.


Sergey13   (2005-07-28 15:55:00) [7]

2[24] ANB ©   (28.07.05 15:47)
Вторая часть твоей проблемы - не знаю, разбираться надо (возможно проканает просто пересоздать сервис или отредактировать его ORADIM-ом). А первая - там в дистрибутиве надо убить (вроде в 2 местах) symcjit.dll. В простейшем случае этого хватает. Иногда надо открыть файл oraparam.ini и изменить jre_memory_options на jre_memory_options = -nojit-ms16m-mx32m. Есть еще несколько советов. Но указанного мне хватало в большинстве случаев.


ANB   (2005-07-28 15:47:00) [8]


> Sergey13 ©   (28.07.05 12:32) [15]
- кстати, у меня тоже была проблема с установкой 8i на П4 (Хрюша). Еле с нашим админом смогли запихать. Обрубив HTTP сервер. И теперь бага есть - если один из сидов хоть раз упал, то больше он в автомате не стартует. Это не оттуда же у проблемы ноги растут ?


ANB   (2005-07-28 15:44:00) [9]

Твоя функция ничего полезного не сделает. Ибо ты возвращаешь и не курсор и не набор данных, а пытаешьсявернуть строку.
Select из такой функции и из функции, возвращающей курсор в оракле не проканает. Пиши лучше вьюху.


Reindeer Moss Eater   (2005-07-28 13:53:00) [10]

Reindeer Moss Eater © [17]
Так, так, так... А вот с этого места можно поподробнее:
decode(mod(rownum,2),0,hour1_00,1,hour0_30)
Ничего не поняла.


Если строка четная, в выборку попадает поле hour1_00, иначе hour0_30


Sergey13   (2005-07-28 13:13:00) [11]

2 [20] Ольга   (28.07.05 13:07)
> Буду иметь в виду, если придется шаманить, поможете?
Поможем. Не вопрос.


Ольга   (2005-07-28 13:07:00) [12]

Sergey13 ©  [19]
О, дошло, 4 пенек - это пентиум 4 (я, знаете, в прогр. сленге слаба). Буду иметь в виду, если придется шаманить, поможете?

Reindeer Moss Eater © [17]
Так, так, так... А вот с этого места можно поподробнее:
decode(mod(rownum,2),0,hour1_00,1,hour0_30)
Ничего не поняла.


Sergey13   (2005-07-28 12:59:00) [13]

2[16] Ольга   (28.07.05 12:54)
> 8.1 на Win2000
ОСь в данном случае по барабану. Важен процик. Если 4 пенек, то там надо в дистрибутиве пошаманить немного - это известная проблема.


Ольга   (2005-07-28 12:57:00) [14]


> Я бы наверное завернул все это в пакет

Я бы тоже, но пока не разобралась с этими пакетами.


Reindeer Moss Eater   (2005-07-28 12:56:00) [15]

create or replace view myview as
select objectid,
       trunc(datetime) + rownum * 30 / 14440,
       decode(mod(rownum,2),0,hour1_00,1,hour0_30)
from ....


Ольга   (2005-07-28 12:54:00) [16]


> В общем все неправильно

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

> функция заменяется одной вьюхой

Заманчиво, но... Таблица, из которой делается запрос, содержит не 3-4 поля, а 50 (ID, дата и 48 значений за каждые 30 мин. суток). А мне надо получить получасы в записях, а не в полях. Как создать такую вьюху - 48 раз UNION? Это накладно, таблица офигенная.

> Не 8-ку на 4 пенек (???) ставили случаем?

8.1 на Win2000
Если вслепую не удастся, то придется еще попробовать на ХР.


Sergey13   (2005-07-28 12:32:00) [17]

2[11] Ольга   (28.07.05 12:18)
Я бы наверное завернул все это в пакет. Там и тип можно объявить.

[2] Ольга   (28.07.05 09:41)
>> Oracle то поставь. Он на любую NT нормально становится.
>Мои коллеги пробовали - убили кучу времени, но так и не поставили.
Не 8-ку на 4 пенек ставили случаем?


Reindeer Moss Eater   (2005-07-28 12:31:00) [18]

А вообще эта функция заменяется одной вьюхой.


Reindeer Moss Eater   (2005-07-28 12:27:00) [19]

Параметры указываются безразмерными.
Вместо numeric надо number.
Вместо returns надо return.
После AS убрать кавычку.

В общем все неправильно.


Reindeer Moss Eater   (2005-07-28 12:22:00) [20]

Ну для начала заменить все "=" на ":="


Страницы:   1 2

Наверх

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