如何使用 Ado Query 修改存储过程

How to use TAdoQuery to ALTER IB stored procedure

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

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

pass 1. 使用 SQL 命令 CREATE PROCEDURE,我们创建 all 具有普通主体的 SP,例如

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

通过 2. 使用 ALTER PROCEDURE,每个 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;

任何想做测试的人:这个特定主体中提到的 table CODES 的元数据是

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

两次通过是为了克服SP相互依赖的障碍。

在 D5 中,有必要尊重丑陋的 "convention",包括在 TAdoQuery.SQL 中使用双冒号(而不是冒号)来为 SQL 命令中引用的 SP 参数添加前缀发生在 SP 体内。想象一下上面的 SP——它的整个主体是一个单一的 SQL 命令——它的冒号加倍了。那是在 D5 中,SP 的创建工作 "as expected",无论 "ugly" 约定的细节如何。

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

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

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

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

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