将存储过程从 MS SQL Server 转换为 Informix
Posted
技术标签:
【中文标题】将存储过程从 MS SQL Server 转换为 Informix【英文标题】:Translate stored procedure from MS SQL Server to Informix 【发布时间】:2010-12-15 07:40:55 【问题描述】:我不知道如何在 Informix 中编写特定的存储过程,所以我必须在我知道如何编写的 SQL Server 中编写我脑海中的逻辑(微软简单)......所以我将编写我的存储过程在 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
-----------------------------------------------------------------------
注意:这个存储过程需要像作业一样每隔一段时间执行一次。是否可以每隔一段时间执行带有参数的程序?如果没有,还有什么替代方案?
【问题讨论】:
我想简单是在旁观者的眼中:一个简单的 FOREACH 循环所需的所有基础设施,加上神秘的Select @confirm_reg as Cconfirm_reg, ...
,除了吵闹之外似乎没有其他用途,这让我觉得Informix SPL 比 MS SQL 更简单。我承认'@' sigils 使处理变量和列名等变得更容易,但代价是行噪音——这足以让 Perl 程序员有宾至如归的感觉。
【参考方案1】:
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 简单性”:)
【讨论】:
以上是关于将存储过程从 MS SQL Server 转换为 Informix的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL Server 存储过程转换为 Oracle 过程以从表中查询
将数据从 MS Sql Server 存储过程导出到 excel 文件
MS SQL Server - 如何将所有存储过程从我的机器导出到我的朋友机器?
从 MS SQL SERVER 和 MS ACCESS 调用存储过程的结果之间的差异