如何使用Ado Query来ALTER IN存储过程

时间:2015-01-26 18:30:05

标签: delphi stored-procedures ado alter interbase

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

在数据库创建时(以编程方式,使用IB API),在创建(使用TAdoQuery)表,异常和声明(也使用TAdoQuery)几个UDF之后,我们在两次传递中创建SP(仍然使用TAdoQuery)。 / p>

传递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 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;

对于任何想要进行测试的人:此特定机构中提到的表CODES的元数据是

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

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

在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改为第二个SP?

1 个答案:

答案 0 :(得分:1)

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