Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Здравствуйте! Я только начала изучать 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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
o-o
Guest
только начал изучaть, и сразу не в тот раздел забрел.
вот правильный: MySQL
12 окт 17, 10:19    [20862934]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15944
eclipse170790
Версия MYSQL 2008.

Может, MS SQL 2008? а то у MySQL нет такой версии - да и ветка форума под него другая...

eclipse170790
Курсоры не предлагать, есть на то причины.

Так FOR SELECT ... DO в исходном коде - это же чистый курсор. Только неявный. Может, познакомите с причинами?
12 окт 17, 10:20    [20862937]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Точно, ошиблась.
12 окт 17, 10:43    [20863075]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Akina, медленно работают.
12 окт 17, 10:44    [20863079]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Сама запуталась и Вас путаю.

К сообщению приложен файл. Размер - 104Kb
12 окт 17, 10:50    [20863111]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 15944
eclipse170790
медленно работают.
Ну тогда используйте, например, временные таблицы.

eclipse170790
Вопрос, можно-ли в MYSQL сделать подобное?
Даже не смотря, что там было сделано в интербэйзе - можно.

eclipse170790
как с первым куском быть, не знаю.
не старайтесь портировать код. Разберитесь в логике и напишите заново, но уже с учётом особенностей диалекта MS SQL.
12 окт 17, 14:29    [20864240]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 25595
eclipse170790
А вот как с первым куском быть, не знаю.
Понять, что он делает, и переписать код.
eclipse170790
На второй кусок сделала скалярную функцию.
Лучше так не делать, будет медленно.
Либо раскройте код, либо сделайте инлайн-функцию.
12 окт 17, 17:35    [20865145]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Строка - WITH SCHEMABINDING лишняя, это были пробы. Код без неё.
13 окт 17, 07:30    [20866047]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
aleks222
Guest
eclipse170790
Я не могу разобраться как связать с первым куском Interbase (понимаю, что всё можно сделать, но не могу сообразить как). В первом куске меня сбивает с толку цикл For и как вызвать функцию из функцию.


Ваша проблема - применение императивного программирования.
Завязывайте с циклами, скалярными функциями и прочей подобной хренью - никто не обрабатывает данные "строчка за строчкой". Обрабатывают "все строки разом".
13 окт 17, 08:13    [20866080]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
aleks222, мне надо, чтобы функции MS SQL отрабатывали также как и ХП Interbase. Т.е. взяли все машины из справочника, а потом прошлись по таблице "движение" (ХП vibor_smen) по этим машинам и определённым кодам вывели затраченное время.
13 окт 17, 09:34    [20866237]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
Ролг Хупин
Member

Откуда: Оттуда
Сообщений: 1454
eclipse170790
aleks222, мне надо, чтобы функции MS SQL отрабатывали также как и ХП Interbase. Т.е. взяли все машины из справочника, а потом прошлись по таблице "движение" (ХП vibor_smen) по этим машинам и определённым кодам вывели затраченное время.


ну, да

скрипт можно немного приукрасить, типа такого, заменить такое

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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
bideveloper
Member

Откуда:
Сообщений: 110
eclipse170790,

думаете, тут все специалисты по Interbase? )

Напишите на русском языке ТЗ, что нужно сделать.
Названия таблиц table, table2, table3 это жесть )
13 окт 17, 10:14    [20866366]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
bideveloper, из-за внутренних правил моей работы, не могу открыть имена таблиц. Задание такое - Взять все машины из справочника (к примеру spr_mash), а потом пройтись по таблице "движение" (ХП vibor_smen, например имя таблицы dvijenie) по этим машинам и определённым кодам вывести затраченное время.
13 окт 17, 10:40    [20866529]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Ролг Хупин, я так понимаю, что Вы стебётесь. Задание - сменить базу Interbase на MS SQL, поэтому и приходится переделывать ХП на функции.
13 окт 17, 10:41    [20866539]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5142
eclipse170790,

надо мыслить запросами, как инструментом обработки математических множеств, а вы мыслите процедурно, на низком уровне. Выборка пересечений двух множеств по условию - это дело команды SELECT, а не if... Подумайте, как можно написать запрос.
13 окт 17, 10:58    [20866644]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Владислав Колосов, я подумываю над ineer join. Т.е. в vibor_smen соединить таблицу движение и справочник машин.
13 окт 17, 12:12    [20866981]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
xenix
Guest
eclipse170790
Владислав Колосов, я подумываю над ineer join. Т.е. в vibor_smen соединить таблицу движение и справочник машин.

Что там думать-трясти надо. Напишите скрипты создания и заполнения тестовых таблиц, ну и желаемый результат - всем, думаю, будет проще
13 окт 17, 12:22    [20867015]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 25595
eclipse170790
aleks222, мне надо, чтобы функции MS SQL отрабатывали также как и ХП Interbase. Т.е. взяли все машины из справочника, а потом прошлись по таблице "движение" (ХП vibor_smen) по этим машинам и определённым кодам вывели затраченное время.
Ну, тогда напрямую переписывайте, скалярные функции вместо процедур, курсор вместо SELECT ... do begin
Если слово "курсор" запрещённое, можно его эмулировать циклом, то есть в каждом шаге цикла выбираете одну нужную запись и обрабатываете.

Но конечно всё это будет безумно медленно.
13 окт 17, 12:41    [20867088]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Жутко извиняюсь за таблицу, не глянула перед тем как ответить, как она будет выглядеть. (.

К сообщению приложен файл. Размер - 137Kb
13 окт 17, 12:42    [20867093]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
alexeyvg, курсоры, да, запрещены. А в сторону цикла, можно хоть пример (сколько ссылок не смотрела, не догнала как их у себя использовать), или пояснение. Я в них не сильна просто, и не могу понять с какой стороны к ним подойти.
13 окт 17, 12:45    [20867105]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Ах, да, забыла
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]     Ответить | Цитировать Сообщить модератору
 Re: Пользовательские функции MYSQL  [new]
eclipse170790
Member

Откуда:
Сообщений: 15
Всем спасибо за то, что помогаете. ).
13 окт 17, 12:51    [20867130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить