Перевести хранимую процедуру из MS SQL Server в Informix - PullRequest
1 голос
/ 15 декабря 2010

Я не знаю, как написать конкретную хранимую процедуру в Informix, поэтому мне пришлось написать логику в своем уме в SQL Server, которую я знаю, как писать (простота Microsoft) ... Поэтому я напишу свою хранимую процедурув синтаксисе SQL и, пожалуйста, любой, кто знает синтаксис Informix и как писать, скажите мне эквивалент моей хранимой процедуры в Informix с небольшими подсказками, чтобы изучить методы, используемые в обоих ...

Моя хранимая процедура:

ALTER PROC [dbo].[DetectFine] @prog_code int
AS
---------------------------------
DECLARE @lect_code int;
DECLARE @prog_code_temp int;
DECLARE @confirm_reg int;
DECLARE @start_date_temp DATE;
---------------------------------
DECLARE Mycursor CURSOR FOR
SELECT l.confirm_reg,p.[start_date],l.lect_code,l.prog_code
FROM cc1lectprog l INNER JOIN cc1progtimes p
ON l.prog_code = p.prog_code
WHERE p.prog_code = @prog_code;
---------------------------------
OPEN Mycursor ;
---------------------------------
FETCH NEXT FROM Mycursor
INTO @confirm_reg,@start_date_temp,@lect_code,@prog_code_temp;
---------------------------------
WHILE @@FETCH_STATUS =0
BEGIN
Select @confirm_reg as Cconfirm_reg, @start_date_temp as Cstart_date ,@lect_code as Clect_code,@prog_code_temp as Cprog_code_temp;
-- This is executed as long as the previous fetch succeeds.
IF @confirm_reg = 0 AND GETDATE()>= DATEADD(DD,-3,@start_date_temp)
-----------------------------------------------------------------------
UPDATE cc1lectprog 
SET fine = 0
WHERE lect_code = @lect_code AND prog_code = @prog_code_temp;
-----------------------------------------------------------------------
FETCH NEXT FROM Mycursor
INTO @confirm_reg,@start_date_temp,@lect_code,@prog_code_temp;
-----------------------------------------------------------------------
END
CLOSE Mycursor
DEALLOCATE Mycursor
-----------------------------------------------------------------------

Примечание: эта хранимая процедура должна выполняться каждый период времени, как задание.Можно ли выполнять процедуру с параметрами каждый период времени или нет?А какие есть альтернативы, если нет?

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

Реальная простота Informix против "Microsoft простота":)

1 голос
/ 16 декабря 2010
CREATE PROCEDURE dbo.DetectFine(prog_code int)
    DEFINE l_lect_code INT;
    DEFINE l_prog_code INT;
    DEFINE l_confirm_reg INT;
    DEFINE l_start_date DATE;
    FOREACH SELECT l.confirm_reg, p.start_date, l.lect_code, l.prog_code
              INTO l_confirm_reg, l_start_date, l_lect_code, l_prog_code
              FROM cc1lectprog l INNER JOIN cc1progtimes p
                ON l.prog_code = p.prog_code
             WHERE p.prog_code = prog_code    
        IF l_confirm_reg = 0 AND TODAY >= l_start_date - 3 THEN
            UPDATE cc1lectprog 
               SET fine = 0
             WHERE lect_code = l_lect_code AND prog_code = l_prog_code;
        END IF;
    END FOREACH;
END PROCEDURE;

Если вы назвали курсор в цикле FOREACH, вы можете использовать WHERE CURRENT OF в операторе UPDATE вместо условия поиска.

FOREACH c_name FOR SELECT ...
    UPDATE ...
     WHERE CURRENT OF c_name;
END FORRACH;

Размещение точек с запятой всегда является одним из лучших искусств в SPL. Тем не менее, хранимая процедура выше компилируется - даже без какой-либо из таблиц в базе данных. Очевидно, что он потерпит неудачу, если запустить (выполнить) без соответствующих таблиц.


Если вы используете IBM Informix Dynamic Server (IDS) версии 11.50 или более поздней, то существует средство (разговорно), известное как DB-Cron, которое можно использовать для планирования регулярно выполняемых заданий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...