Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
eclipse170790 Member Откуда: Сообщений: 27 |
Здравствуйте! Я только начала изучать MYSQL. Перевожу хранимые процедуры Interbase на MYSQL. Версия MYSQL 2008. Вот код ХП Interbase - for SELECT field FROM table where pr=1 into :out_field do begin select * from vibor_smen(:out_f1,:out_f2,:out_f3,855) into :out_p1; select * from vibor_smen(:out_f1,:out_f2,:out_f3,854) into :vr_854; select * from vibor_smen(:out_f1,:out_f2,:out_f3,,852) into :vr_852; select * from vibor_smen(:out_f1,:out_f2,:out_f3,856) into :vr_856; vibor_smen - это другая ХП Interbase. Вот её код - if (in_kod>1) then begin out_time=0; for select f1,f2 from table where kod=:in_kod and f10=:in_f and vrem_b>=:in_d1 and vrem_b<=:in_d2 into out_t1,out_t2 do begin if (out_t2 is null) then out_t2=in_d2; out_time=out_time+(out_t2-out_t1); end end Вопрос, можно-ли в MYSQL сделать подобное? На второй кусок сделала скалярную функцию. А вот как с первым куском быть, не знаю. Курсоры не предлагать, есть на то причины. Заранее, спасибо за помощь. |
12 окт 17, 10:05 [20862878] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
только начал изучaть, и сразу не в тот раздел забрел. вот правильный: MySQL |
12 окт 17, 10:19 [20862934] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Может, MS SQL 2008? а то у MySQL нет такой версии - да и ветка форума под него другая...
Так FOR SELECT ... DO в исходном коде - это же чистый курсор. Только неявный. Может, познакомите с причинами? |
||||
12 окт 17, 10:20 [20862937] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Точно, ошиблась. |
12 окт 17, 10:43 [20863075] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Akina, медленно работают. |
12 окт 17, 10:44 [20863079] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Сама запуталась и Вас путаю. К сообщению приложен файл. Размер - 104Kb |
12 окт 17, 10:50 [20863111] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
|
||||||
12 окт 17, 14:29 [20864240] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Либо раскройте код, либо сделайте инлайн-функцию. |
||||
12 окт 17, 17:35 [20865145] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
alexeyvg, Вот как сделала на второй кусок- USE [base] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[FVibor_smen] (@IN_NLOK int, @IN_KOD int, @IN_D1 datetime,@IN_D2 datetime) RETURNS numeric(15,2) WITH SCHEMABINDING AS BEGIN DECLARE @TIME numeric(15,2), @T1 datetime, @T2 datetime, @VR float; set @TIME=0; if @IN_KOD>1 begin select @T1=vrem_b,@T2=vrem_e from dbo.table where nl=@IN_NLOK and cod=@IN_KOD and vrem_b>=@IN_D1 and vrem_b<=@IN_D2; if (@T2 is null) begin set @T2=@IN_D2; end set @TIME=@TIME+cast((@T2-@T1)as numeric(15,2))*24; end if @IN_KOD=0 begin select @T1=vrem_b,@T2=vrem_e from dbo.table where nl=@IN_NLOK and cod in (select cod from dbo.table3 where fl=0 and (sign_eq=0 or sign_eq=1)) and vrem_b>=@IN_D1 and vrem_b<=@IN_D2; if (@T2 is null) begin set @T2=@IN_D2; end set @TIME=@TIME+cast((@T2-@T1)as numeric(15,2))*24; end if @IN_KOD=1 begin select @T1=vrem_b,@T2=vrem_e from dbo.table where nl=@IN_NLOK and cod in (select cod from dbo.table3 where fl>0 and (sign_eq=0 or sign_eq=1)) and vrem_b>=@IN_D1 and vrem_b<=@IN_D2; if (@T2 is null) begin set @T2=@IN_D2; end set @TIME=@TIME+cast((@T2-@T1)as numeric(15,2))*24; end if @IN_KOD=-3 begin select @VR=prod_r from dbo.table2 where code_eq=@IN_NLOK; set @TIME=@TIME+@VR; end if @IN_KOD=-2 begin select @T1=vrem_b,@T2=vrem_e from dbo.table where nl=@IN_NLOK and cod in (select cod from dbo.table3 where (fl>0 and (sign_eq=0 or sign_eq=1)) and cod<>817 and cod<>853 and cod<>855 and cod<>860 and cod<>880 and cod<>864 and cod<>866 and cod<>867) and vrem_b>=@IN_D1 and vrem_b<=@IN_D2 if (@T2 is null) begin set @T2=@IN_D2; end set @TIME=@TIME+cast((@T2-@T1)as numeric(15,2))*24; end RETURN @TIME END --------- Я не могу разобраться как связать с первым куском Interbase (понимаю, что всё можно сделать, но не могу сообразить как). В первом куске меня сбивает с толку цикл For и как вызвать функцию из функцию. |
13 окт 17, 07:06 [20866040] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Строка - WITH SCHEMABINDING лишняя, это были пробы. Код без неё. |
13 окт 17, 07:30 [20866047] Ответить | Цитировать Сообщить модератору |
aleks222
Guest |
Ваша проблема - применение императивного программирования. Завязывайте с циклами, скалярными функциями и прочей подобной хренью - никто не обрабатывает данные "строчка за строчкой". Обрабатывают "все строки разом". |
||
13 окт 17, 08:13 [20866080] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
aleks222, мне надо, чтобы функции MS SQL отрабатывали также как и ХП Interbase. Т.е. взяли все машины из справочника, а потом прошлись по таблице "движение" (ХП vibor_smen) по этим машинам и определённым кодам вывели затраченное время. |
13 окт 17, 09:34 [20866237] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3970 |
ну, да ![]() скрипт можно немного приукрасить, типа такого, заменить такое select @T1=vrem_b,@T2=vrem_e from dbo.table where nl=@IN_NLOK and cod in (select cod from dbo.table3 where fl>0 and (sign_eq=0 or sign_eq=1)) and vrem_b>=@IN_D1 and vrem_b<=@IN_D2; if (@T2 is null) begin set @T2=@IN_D2; end на что-то такое: select @T1=vrem_b,@T2=ISNULL(vrem_e, @IN_D2)from dbo.table where nl=@IN_NLOK and cod in (select cod from dbo.table3 where fl>0 and (sign_eq=0 or sign_eq=1)) and vrem_b>=@IN_D1 and vrem_b<=@IN_D2; |
||
13 окт 17, 10:12 [20866356] Ответить | Цитировать Сообщить модератору |
bideveloper Member Откуда: Сообщений: 517 |
eclipse170790, думаете, тут все специалисты по Interbase? ) Напишите на русском языке ТЗ, что нужно сделать. Названия таблиц table, table2, table3 это жесть ) |
13 окт 17, 10:14 [20866366] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
bideveloper, из-за внутренних правил моей работы, не могу открыть имена таблиц. Задание такое - Взять все машины из справочника (к примеру spr_mash), а потом пройтись по таблице "движение" (ХП vibor_smen, например имя таблицы dvijenie) по этим машинам и определённым кодам вывести затраченное время. |
13 окт 17, 10:40 [20866529] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Ролг Хупин, я так понимаю, что Вы стебётесь. Задание - сменить базу Interbase на MS SQL, поэтому и приходится переделывать ХП на функции. |
13 окт 17, 10:41 [20866539] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
eclipse170790, надо мыслить запросами, как инструментом обработки математических множеств, а вы мыслите процедурно, на низком уровне. Выборка пересечений двух множеств по условию - это дело команды SELECT, а не if... Подумайте, как можно написать запрос. |
13 окт 17, 10:58 [20866644] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Владислав Колосов, я подумываю над ineer join. Т.е. в vibor_smen соединить таблицу движение и справочник машин. |
13 окт 17, 12:12 [20866981] Ответить | Цитировать Сообщить модератору |
xenix
Guest |
Что там думать-трясти надо. Напишите скрипты создания и заполнения тестовых таблиц, ну и желаемый результат - всем, думаю, будет проще |
||
13 окт 17, 12:22 [20867015] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
xenix, пошла в сторону временных таблиц. select cast((vrem_e-VREM_B) as numeric(15,3))*24 as t1,nl,vrem_b,vrem_e from dbo.dvij where nl in (select nl from spr_mash where pr=1) and code=867 and vrem_b>='2017-09-10 20:30:00' and vrem_b<='2017-09-11 08:30:00' order by NL,VREM_B T1 NL vrem_b vrem_e 0.312 37 2017-09-10 21:42:00.000 2017-09-10 22:00:00.000 0.312 37 2017-09-11 03:50:00.000 2017-09-11 04:08:00.000 0.360 37 2017-09-11 06:12:00.000 2017-09-11 06:34:00.000 0.168 37 2017-09-11 06:48:00.000 2017-09-11 06:58:00.000 0.192 59 2017-09-10 23:32:00.000 2017-09-10 23:44:00.000 0.168 59 2017-09-11 04:10:00.000 2017-09-11 04:20:00.000 0.144 241 2017-09-10 22:34:00.000 2017-09-10 22:42:00.000 0.096 261 2017-09-10 21:31:00.000 2017-09-10 21:37:00.000 0.072 261 2017-09-10 21:41:00.000 2017-09-10 21:46:00.000 0.144 373 2017-09-11 02:19:00.000 2017-09-11 02:28:00.000 0.264 373 2017-09-11 04:57:00.000 2017-09-11 05:13:00.000 0.072 377 2017-09-10 22:32:00.000 2017-09-10 22:36:00.000 0.024 377 2017-09-11 00:26:00.000 2017-09-11 00:27:00.000 0.072 377 2017-09-11 02:43:00.000 2017-09-11 02:47:00.000 0.288 377 2017-09-11 04:13:00.000 2017-09-11 04:30:00.000 0.144 377 2017-09-11 04:34:00.000 2017-09-11 04:42:00.000 0.216 391 2017-09-11 00:15:00.000 2017-09-11 00:28:00.000 0.072 406 2017-09-10 21:40:00.000 2017-09-10 21:45:00.000 0.168 406 2017-09-10 23:35:00.000 2017-09-10 23:45:00.000 0.288 406 2017-09-11 04:00:00.000 2017-09-11 04:17:00.000 0.096 417 2017-09-10 23:02:00.000 2017-09-10 23:08:00.000 Осталось только поле T1 просуммировать по каждой машине. |
13 окт 17, 12:37 [20867073] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Если слово "курсор" запрещённое, можно его эмулировать циклом, то есть в каждом шаге цикла выбираете одну нужную запись и обрабатываете. Но конечно всё это будет безумно медленно. |
||
13 окт 17, 12:41 [20867088] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Жутко извиняюсь за таблицу, не глянула перед тем как ответить, как она будет выглядеть. (. К сообщению приложен файл. Размер - 137Kb |
13 окт 17, 12:42 [20867093] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
alexeyvg, курсоры, да, запрещены. А в сторону цикла, можно хоть пример (сколько ссылок не смотрела, не догнала как их у себя использовать), или пояснение. Я в них не сильна просто, и не могу понять с какой стороны к ним подойти. |
13 окт 17, 12:45 [20867105] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Ах, да, забыла select cast((vrem_e-VREM_B) as numeric(15,3))*24 as t1,nl,vrem_b,vrem_e from dbo.dvij where nl in (select nl from spr_mash where pr=1) and code=867 and vrem_b>='2017-09-10 20:30:00' and vrem_b<='2017-09-11 08:30:00' order by NL,VREM_B Поле code должно меняться. Входным параметром не хочу делать, ибо их и так больше пяти значений разных. |
13 окт 17, 12:50 [20867126] Ответить | Цитировать Сообщить модератору |
eclipse170790 Member Откуда: Сообщений: 27 |
Всем спасибо за то, что помогаете. ). |
13 окт 17, 12:51 [20867130] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |