【问题标题】:How to use TAdoQuery to ALTER IB stored procedure如何使用 Ado Query 来 ALTER IN 存储过程
【发布时间】:2015-01-26 18:30:04
【问题描述】:

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

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

通过 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;

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

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

这两个pass是为了克服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 中的第一个更改为第二个?

【问题讨论】:

  • 我的第一个猜测是查询为:OUT_PARAM 准备了一个参数。所以我的第一次尝试是将查询对象的ParamCheck 设置为 False。
  • 不需要切换终止符来防止语句提前执行吗?之前是SET TERM ^ ;,之后是SET TERM ; ^
  • @TLama。我使用 ParamCheck:=false
  • @Roald。我在 Delphi 项目中使用 TAdoQuery,而不是 IBConsole。
  • 你是在进入sql语句之前还是之后设置了param check off?因为可能仍然会自动创建参数。您是否事先清除了参数列表?

标签: delphi stored-procedures ado alter interbase


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2014-11-21
相关资源
最近更新 更多