将存储过程从 MS SQL Server 转换为 Informix

问题描述 投票:0回答:3

我不知道如何在 Informix 中编写特定的存储过程,所以我必须在 SQL Server 中编写我脑海中的逻辑,我知道如何编写(微软的简单性)...所以我将在 Informix 中编写我的存储过程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
-----------------------------------------------------------------------

注意:这个存储过程需要像作业一样每隔一段时间执行一次。是否可以每隔一段时间执行带参数的程序?如果没有,还有什么替代方案?

sql sql-server-2008 stored-procedures informix
3个回答
2
投票
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 循环中命名游标,则可以在 UPDATE 语句中使用 WHERE CURRENT OF 而不是搜索条件。

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

分号的放置始终是 SPL 中的艺术之一。但是,上面的存储过程确实可以编译 - 即使数据库中没有任何一个表。显然,如果没有相关表就运行(执行)就会失败。


假设您使用的是 IBM Informix Dynamic Server (IDS) 11.50 或更高版本,那么有一个(通俗地)称为 DB-Cron 的工具可用于安排定期执行的作业。


2
投票

真正的 Informix 简单性与“Microsoft 简单性”:)


0
投票

使用游标和变量通常效率较低,而使用现代 Informix SQL 可以避免。

© www.soinside.com 2019 - 2024. All rights reserved.