![]() |
| ||
|
|
Новости |
Поиск |
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-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]Ну для начала заменить все "=" на ":="