【发布时间】: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