我不知道如何在 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
-----------------------------------------------------------------------
注意:这个存储过程需要像作业一样每隔一段时间执行一次。是否可以每隔一段时间执行带参数的程序?如果没有,还有什么替代方案?
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 的工具可用于安排定期执行的作业。
真正的 Informix 简单性与“Microsoft 简单性”:)
使用游标和变量通常效率较低,而使用现代 Informix SQL 可以避免。