Код:
CREATE OR REPLACE FUNCTION DUPOFJOBSSR(ORIGINJOB IN INTEGER,
NEWNAME IN VARCHAR2)
RETURN INTEGER IS
RESULT INTEGER;
NEWID INTEGER;
ALLSHOP INTEGER;
BEGIN
--задание-источник должно существовать и быть активным, т.е. должна стоять галочка "Исполнение разрешено"
RESULT := 0;
-- создание нового джоба на основе полученных данных
--новый максимальный номер
SELECT GREATEST(1, NVL(MAX(ID), 0) + 1)
INTO NEWID
FROM SUPERMAG.SMCONTROLTASKS;
--сохранения параметров задания
INSERT INTO SUPERMAG.SMCONTROLTASKS
(ID,
TITLE,
FNTYPE,
FNID,
SCHEDTYPE,
DAYMASK,
INTERVALLEN,
INTERVALSTART,
INTERVALEND,
ONETIME)
SELECT NEWID,
NEWNAME,
OT.FNTYPE,
OT.FNID,
OT.SCHEDTYPE,
OT.DAYMASK,
OT.INTERVALLEN,
OT.INTERVALSTART,
OT.INTERVALEND,
OT.ONETIME
FROM SUPERMAG.SMCONTROLTASKS OT
WHERE OT.ID = ORIGINJOB;
--сохранение параметров расчёта сср
INSERT INTO SUPERMAG.SMSALERATETASKPARAM
(TASKID,
MAXDURATION,
DATEFROM,
DATETO,
CALCALG,
INCLUDEDAYS,
SALERATERANGE,
WITHRETURN,
ALLSHOPS)
SELECT NEWID,
OTP.MAXDURATION,
OTP.DATEFROM,
OTP.DATETO,
OTP.CALCALG,
OTP.INCLUDEDAYS,
OTP.SALERATERANGE,
OTP.WITHRETURN,
OTP.ALLSHOPS
FROM SUPERMAG.SMSALERATETASKPARAM OTP
WHERE OTP.TASKID = ORIGINJOB;
--удаление мест хранения для этого задания (на всякий случай)
DELETE FROM SUPERMAG.SMSALERATETASKLOCS WHERE TASKID = NEWID;
-- проверка списка магазинов: все или не все
ALLSHOP := 1;
SELECT OTP.ALLSHOPS
INTO ALLSHOP
FROM SUPERMAG.SMSALERATETASKPARAM OTP
WHERE OTP.TASKID = ORIGINJOB;
IF (ALLSHOP) = 0 THEN
-- если не все, то копируем
INSERT INTO SUPERMAG.SMSALERATETASKLOCS
(TASKID, SHOPID)
SELECT NEWID, SHOPID
FROM SUPERMAG.SMSALERATETASKLOCS
WHERE TASKID = ORIGINJOB;
END IF;
--удаление разделов классификатора для этого задания (на всякий случай)
DELETE FROM SUPERMAG.SMSALERATETASKCLS WHERE TASKID = NEWID;
--
INSERT INTO SUPERMAG.SMSALERATETASKCLS
(TASKID, TREE)
SELECT NEWID, TREE
FROM SUPERMAG.SMSALERATETASKCLS
WHERE TASKID = ORIGINJOB;
--здесь явно указывается что это расчёт сср
BEGIN
SUPERMAG.SMINITTASKJOB(NEWID, 0, 'WH', 0);
END;
COMMIT;
RESULT := NEWID;
RETURN(RESULT);
END DUPOFJOBSSR;