如何使用 TAdoQuery 来改变 IB 存储过程



我们测试D5项目(使用IB 2009服务器和IBProvider)到XE6的迁移,使相同的IB服务器保持为ADO提供程序。该项目大量使用存储过程 (SP)。

在创建数据库时(以编程方式,使用 IB API),在创建(使用 TAdoQuery)表、异常并声明(也使用 TAdoQuery)多个 UDF 之后,我们分两次创建 SP(仍然使用 TAdoQuery)。

通过 1.使用 SQL 命令 CREATE PROCEDURE,我们创建所有具有简单主体的 SP,例如

PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
  EXIT;   <-- trivial body
END;

通过 2.使用ALTER程序,每个SP都被赋予其适当的主体,例如

PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5))
RETURNS ("OUT_PARAM" VARCHAR(5))
AS
BEGIN
  SELECT MAX(C_CODE)
  FROM CODES
  WHERE C_CODE < :IN_PARAM
  INTO :OUT_PARAM;
END;

对于任何想要进行测试的人:此特定正文中引用的表 CODES 的元数据是

CREATE TABLE "CODES"
("C_CODE" VARCHAR(5) NOT NULL,
PRIMARY KEY ("C_CODE"));

这两个过程是为了克服 SP 相互依赖的障碍。

在 D5 中,有必要尊重一个丑陋的"约定",包括在 TAdoQuery.SQL 中使用双冒号(而不是冒号)作为 SP 主体中发生的 SQL 命令中提到的 SP 参数的前缀。想象一下上面的 SP - 其整个主体是一个 SQL 命令 - 其冒号加倍。那是在D5中,SP的创建"按预期"工作,无论"丑陋"约定的细节如何。

现在我们在 XE6 中,我们很快注意到在这种特殊情况下 - 我们称之为"带参数的 SP"(SPWP) - 我们的 D5 方法失败了,因为 IB 不能容忍在 D5 中(可能)预处理的双冒号。不幸的是,使用TAdoQuery.Sql中的简单冒号,我们没有达到目标。我们得到

EOleException 
ErrorCode=-2146824580 ($800A0E7C) 
Msg=<"Parameter object is improperly defined. Inconsistent or incomplete information was provided"

这表明现在轮到ADO不满意了。

问题:如何使用TAdoQuery和SQL命令ALTER PROCEDURE,将上述SP中的第一个更改为第二个?

在代码中将 SQL 分配给 TAdoQuery 时,请确保在分配 SQL 语句之前已设置ParamCheck := False。否则,仍会填充Params列表。

最新更新