С Новым годом! Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54

Перевести из ms sql server в oracle

12.02.2016, 00:42. Показов 4852. Ответов 83
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть процедура и запрос
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
declare @DishName varchar(250)='Борщ';
declare @DishId int;
select @DishId = idDish from Dish where NameOfDish = @DishName;
 
with a as
(
select idZakaz from WhatToZakaz where idDish = @DishId
),
b as
(
select top(1) w.idDish
  from a join WhatToZakaz w on w.idZakaz = a.idZakaz
  where w.idDish <> @DishId
  group by w.idDish
  order by count(number) desc
)
select d.NameOfDish
 from b inner join Dish d on d.idDish = b.idDish;
END
T-SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT top 1 with  ties datepart(dw,Zakaz.date1) AS Дата,
Max(WhatToZakaz.number) AS [Max-Количество],
Dish.NameOfDish
FROM Stuff1 inner  JOIN (Zakaz inner JOIN (Dish inner JOIN WhatToZakaz 
ON Dish.idDish = WhatToZakaz.idDish)
ON Zakaz.idZakaz = WhatToZakaz.idZakaz) 
ON Stuff1.idStuff = Zakaz.idStuff
GROUP BY  NameOfDish, Zakaz.date1
order by rank()
over(partition by datepart(dw,Zakaz.date1)
order by max(WhatToZakaz.number) desc)
помоги перевести на язык oracle(только начал изучение и ступор)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2016, 00:42
Ответы с готовыми решениями:

Oracle SQL Server
Есть ли возможность каким-то образом поработать с ним из-под обычной винды? У MS есть спец. редакции, здесь же я скачал oracle developer...

Экспорт из Oracle в MS SQL Server
Нужно експортировать базу данных из Oracle в MS SQL Server. Експорт и импорт должен осуществляться командным файлом Windows. Помогите

Переписать из Oracle в SQL SERVER
CREATE OR REPLACE TRIGGER Trigger_Section BEFORE DELETE ON Sections FOR EACH ROW DECLARE @CNT integer SET @CNT = 0; LINK_EXIST...

83
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 10:38
Из процедуры (???) сделал функцию, поскольку иначе никак не увидеть следов ее деятельности
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CREATE OR REPLACE FUNCTION return_name
RETURN VARCHAR2
IS 
    DishName    VARCHAR(250)='Борщ';
    DishId      NUMBER;
    ret_name    varchar2(250);
BEGIN     
    SELECT idDish INTO DishId FROM Dish 
    WHERE NameOfDish = DishName;
 
    WITH a AS
    (
    SELECT idZakaz FROM WhatToZakaz WHERE idDish = DishId
    ),
    b AS
    (
    SELECT w.idDish, COUNT(*) cnt
    FROM a,
         WhatToZakaz w
    WHERE 
        w.idZakaz = a.idZakaz
        w.idDish <> DishId
    GROUP BY w.idDish
    )
    SELECT NameOfDish INTO ret_name
    FROM (
    SELECT d.NameOfDish, rownumber() OVER (ORDER BY b.cnt DESC) nn
    FROM b, 
         Dish d 
    WHERE d.idDish = b.idDish
    ) WHERE nn=1;
    RETURN ret_name;
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;    
END;
Что касается селекта, то есть вопросы. Во-первых, каков тип поля WhatToZakaz? Во-вторых, что такое конструкция datepart(dw,Zakaz.date1) ? И, наконец, (на всякий случай), в конце запроса, в order by одном и втором все скобки правильно стоят?

Добавлено через 6 минут
Да, и еще вопрос. Поскольку оракловые функции могут отличаться от функций ms sql с теми же именами, прошу уточнить, что именно делает функция rank()

Добавлено через 11 минут
И еще вопрос. Поскольку в Oracle нет конструкции top 1 with ties, прошу уточнить, сколько и каких строк мы хотим вывести. Если я правильно понял, мы хотим вывести все строки с максимальной ценой для каждого значения datepart(dw,Zakaz.date1)
Добавлено через 15 минут
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 11:20  [ТС]
Второй запрос выводит максимальное число заказанных блюд по каждому дню недели.
1)whattozakaz это таблица, где idwhattozakaz number
2) DATEPART ( datepart , date ) Часть переменной типа date (значение даты или времени), имеющая значение типа integer, а dw возвращает день недели.
3) rank Возвращает ранг каждой строки в секции результирующего набора. Ранг строки вычисляется как единица плюс количество рангов, находящихся до этой строки.
4) на счет скобок, запрос рабочий
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 11:31
Цитата Сообщение от Max913 Посмотреть сообщение
где idwhattozakaz number
А зачем тогда использовать конструкцию WhatToZakaz.number ? Или max(WhatToZakaz) - это не число, а что-то другое?

Добавлено через 4 минуты
Селект, который у Вас написан, считает по дням недели, но данные группирует с начала всех времен (как бы, нарастающим итогом). Это так и надо, или, все-таки надо группировать только последнюю неделю, месяц, год ... ?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 11:31  [ТС]
и еще вопрос, как посмотреть результат деятельности этой функции, в ms выводилась таблица с результатами, сейчас где это возможно посмотреть
p.s. эта функция должна показывать какое блюдо с чем берут и включить ее должен в отчет
whattozakaz.number это поле количества заказнных блюд, в оракле его назвал numberr тип number
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 11:40
Цитата Сообщение от Max913 Посмотреть сообщение
функция должна показывать какое блюдо с чем берут
А Вы уверены, что хорошо танцевать от названия блюда? Может надо код блюда задавать вместо борща?

Добавлено через 5 минут
Не просто, что с чем берут, а блюдо с максимальной частотой из того же заказа, кроме выделенного. А список по заказам не нужен? Или из всех заказов с начала всех времен блюдо, которое заказывается чаще других вместе с указанным?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 11:41  [ТС]
а как лучше сделать, чтобы был вывод только по текущей неделе или по сезонам\за все время работы?

Смысл запроса вывести наиболее популярное блюдо по дням недели
"А Вы уверены, что хорошо танцевать от названия блюда? Может надо код блюда задавать вместо борща?"
можно и код, разницы не менял в запросе
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 11:45
По поводу возвращаемого значения то же самое. Может лучше код, а не название?

Добавлено через 3 минуты
Цитата Сообщение от Max913 Посмотреть сообщение
по сезонам
Можно, но немного сложно. Может, устроит по кварталам?
Цитата Сообщение от Max913 Посмотреть сообщение
за все время работы
Можно, конечно, но толку? В прошлом веке блюда другие были. Может, лучше за год (календарный, предыдущий, 365 дней до текущей даты - какой)?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 11:57  [ТС]
код лучше
год календарный

Добавлено через 8 минут
Как можно посмотреть результат функции? куда вписать?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 12:31
Функцию предлагаю сделать так
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE OR REPLACE FUNCTION frend_dish(pDishId  IN  NUMBER, 
                                      fmt IN VARCHAR2, 
                                      pBaseDate IN DATE DEFAULT trunc(sysdate))
-- Входные параметры:    pDishId - код тестируемого блюда
--                       fmt     - маска: 'ww' - неделя с начала года, 'mm' - месяц, 'q' -квартал, 'yy' - календарный год
--                      pBaseDate- базовая дата, для определения недели, месяца и т.д. Если не вводится - берется текущая дата
-- Выходное значение:   (number) - код наиболее часто заказываемого блюда из того же заказа, кроме тестируемого
RETURN NUMBER
IS 
    vDishId      NUMBER;
BEGIN     
    SELECT idDish INTO vDishId FROM (
    SELECT idDish, rownumber() OVER (ORDER BY cnt DESC) nn
    FROM (
    SELECT w.idDish, COUNT(*) cnt  -- как вариант, можно COUNT(distinct z.idZakaz) - выбор варианта зависит от возможности повторения блюд в заказе
    FROM Zakaz z,
         WhatToZakaz w,
         WhatToZakaz b
    WHERE w.idZakaz = z.idZakaz
      AND b.idZakaz = z.idZakaz
      AND w.idDish <> pDishId
      AND b.iddish =  pDishId
      AND trunc(z.date1, fmt) = trunc(pBaseDate, fmt)
    GROUP BY w.idDish
    ) WHERE nn=1;
    RETURN vDishId;
EXCEPTION
    WHEN OTHERS THEN
    RETURN NULL;    
END;
Вызвать можно, например, так
SQL
1
2
3
4
5
SELECT  a.idDish, a.NameOfDish,   -- базовое блюдо
        b.idDish, b.NameOfDish    -- наиболее часто сопутствующее блюдо
FROM (SELECT * FROM Dish WHERE rownum <10) a,
      Dish b
WHERE b.idDish = frend_dish(a.idDish,'ww');
Добавлено через 7 минут
Для сезонов стандартных масок форматов нет (или я не знаю). Надо как-то изгаляться, группируя месяцы
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 12:46  [ТС]
Error at line 25: PL/SQL: ORA-00907: missing right parenthesis

вывел ошибку, это где-то скобка нужна?
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 12:50
Есть еще один вариант вместо count
SQL
1
SELECT w.idDish, SUM(w.numberr) cnt
Так учитывается количество заказанных блюд, а не просто заказ

Добавлено через 1 минуту
Цитата Сообщение от Max913 Посмотреть сообщение
где-то скобка нужна?
SQL
1
 ) WHERE nn=1);
Добавлено через 1 минуту
А если заказано 5 борщей и одни котлеты? Не надо ли "вес" котлет разделить на 5?
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 12:54  [ТС]
функцию return_name , где выбираем блюдо с что с ним чаще всего берут вызвать
SQL
1
2
3
4
5
SELECT  a.idDish, a.NameOfDish,   -- базовое блюдо
        b.idDish, b.NameOfDish    -- наиболее часто сопутствующее блюдо
FROM (SELECT * FROM Dish WHERE rownum <10) a,
      Dish b
WHERE b.idDish = return_name(a.idDish,'w');
с выводом второй понял, это все писать в окне SQL Commands?

Добавлено через 2 минуты
Error at line 9: PL/SQL: SQL Statement ignored
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 12:55
Да.
Во внутреннем селекте можно явно указать список id основных блюд
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 12:56  [ТС]
уже запутался, по 1 функции, где выбираем блюдо и с ним еще одно, вывод писать в sql какой?

если ввожу
SQL
1
2
3
4
5
SELECT a.idDish, a.NameOfDish, -- базовое блюдо
b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM (SELECT * FROM Dish WHERE rownum <10) a,
Dish b
WHERE b.idDish = return_name(a.idDish,'w');
то ошибка ORA-06553: PLS-306: wrong number or types of arguments in call to 'RETURN_NAME'
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 12:59
Цитата Сообщение от Max913 Посмотреть сообщение
Error at line 9
надо писать row_number()
Извиняюсь

Добавлено через 2 минуты
Цитата Сообщение от Max913 Посмотреть сообщение
вывод писать в sql какой
Не понял вопрос. Можно так
SQL
1
2
3
4
5
SELECT b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'w')
  AND a.idDish ="id Борща";
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:02  [ТС]
Цитата Сообщение от AGK Посмотреть сообщение
Сообщение от Max913
Error at line 9
он ругает SELECT idDish INTO vDishId FROM (
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:03
Цитата Сообщение от Max913 Посмотреть сообщение
return_name
Я по-другому функцию назвал. Надо не return_name, которое без аргументов и varchar2 возвращает, а frend_dish, которая имеет входные параметры и возвращает number
0
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 54
12.02.2016, 13:06  [ТС]
подождите, давайте по порядку)
есть 1 функция
Цитата Сообщение от AGK Посмотреть сообщение
SQLВыделить код
CREATE OR REPLACE FUNCTION return_name
RETURN VARCHAR2
IS
* * DishName * *VARCHAR(250)='Борщ';
* * DishId * * *NUMBER;
* * ret_name * *varchar2(250);
BEGIN * *
* * SELECT idDish INTO DishId FROM Dish
* * WHERE NameOfDish = DishName;
WITH a AS
* * (
* * SELECT idZakaz FROM WhatToZakaz WHERE idDish = DishId
* * ),
* * b AS
* * (
* * SELECT w.idDish, COUNT(*) cnt
* * FROM a,
* * * * *WhatToZakaz w
* * WHERE
* * * * w.idZakaz = a.idZakaz
* * * * w.idDish <> DishId
* * GROUP BY w.idDish
* * )
* * SELECT NameOfDish INTO ret_name
* * FROM (
* * SELECT d.NameOfDish, rownumber() OVER (ORDER BY b.cnt DESC) nn
* * FROM b,
* * * * *Dish d
* * WHERE d.idDish = b.idDish
* * ) WHERE nn=1;
* * RETURN ret_name;
EXCEPTION
* * WHEN OTHERS THEN
* * RETURN NULL; * *
END;
чтобы посмотреть результат ее выполнения ввести в sql
SELECT b.idDish, b.NameOfDish -- наиболее часто сопутствующее блюдо
FROM Dish a,
Dish b
WHERE b.idDish = frend_dish(a.idDish,'w')
and a.idDish ="id Борща"; ??
0
765 / 666 / 194
Регистрация: 24.11.2015
Сообщений: 2,163
12.02.2016, 13:12
Цитата Сообщение от Max913 Посмотреть сообщение
SELECT idDish INTO vDishId FROM
А вы исправили row_number() ???

Добавлено через 2 минуты
Нет функция return_name отменяется. Мы работаем теперь с frend_dish, у которой есть входные параметры и которая возвращает число. Я в некоторых селектах, копируя, не исправил название функции. А в некоторых - сумел исправить

Добавлено через 1 минуту
Функция в 10 посте, но потом были исправления

Добавлено через 59 секунд
А селект можно взять, например, из 16 поста, он там минимальный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.02.2016, 13:12
Помогаю со студенческими работами здесь

Импорт данных из Oracle в SQL Server
Из одной таблицы в оракловой БД нужно скопировать данные в таблицу MS SQL средствами c# VS08. Делаю так: string connectionString1 =...

2-е одинаковые базы в SQL Server и Oracle
Здравствуйте. Кто знает, помогите, пожалуйста. У меня на работе есть 2-е программы (Для удобства буду называть их П1 и П2), написанные...

Переучиться с Oracle на Microsoft SQL Server
Насколько это сложно? Сколько времени это может занять? Заранее спасибо.

Сравнение SQL Server 2005 и Oracle 10g
Итак, нужно провести сравнительную характеристику SQL Server 2005 и Oracle 10g. Нужно сравнить по основным параметрам, типа: аппаратные...

Oracle: MySQL будет конкурировать с Microsoft SQL Server
Корпорация Oracle сегодня рассказала о своих дальнейших планах в отношении открытой СУБД MySQL, владельцем которой она стала при покупке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru