Delphi XE:TSQLQuery提高了"Input parameter mismatch"



我在Firebird 2.5中创建了一个存储过程(SP_TEST),它返回一个选择并使用3个输入参数。 这个SP_TEST在 IBExpress 中工作正常,当我输入例如 SQL 命令时:select * from SP_TEST(1,2,3)有一个正确的结果。

但是,当我使用 Delphi XE 中的 dbExpress 组件进行相同的选择时,会引发消息"输入参数不匹配"。 我正在使用 TSQLQuery 组件,将 CommandText 属性设置为"select * from SP_TEST(1,2,3)"。 当我在 CommandText 属性中定义与我在SP_TEST中定义的相同查询时,我得到了一个不错的结果。 但是,在 select 语句中包含存储过程名称(具有正确数量的参数)会引发此错误消息。

谁能告诉我我做错了什么?

更新 - 从伪答案和格式中移动:https://stackoverflow.com/editing-help

SET TERM ^ ;
ALTER PROCEDURE SP_TEST (
NJAAR Integer,
NMAAND Integer,
CREKNR Varchar(6) )
RETURNS (
TOTAAL Numeric(15,2),
CODE Varchar(4),
OMSCHR Varchar(40),
RICHTING Varchar(3),
PROG Numeric(18,2),
TRANS Numeric(18,2) )
AS
BEGIN
FOR
SELECT a.CODE, a.OMSCHR, a.RICHTING,
SUM(iif(richting='AF',-1,1) * COALESCE(p.bedrag,0)) as prog,
SUM(iif(richting='AF',-1,1) * COALESCE(t.bedrag,0)) as trans,
0 as totaal
FROM POSTEN a
left JOIN prognose p on p.POST = a.CODE and p.JAAR = :nJAAR and p.MAAND = :nMAAND
left JOIN TRANSACT t on t.POST = a.CODE and EXTRACT(YEAR FROM t.datum) = :nJAAR and EXTRACT(MONTH FROM t.datum) = :nMAAND
WHERE REKTOEPAS containing :cREKNR
GROUP by a.CODE, a.OMSCHR, a.RICHTING
INTO :CODE,
:OMSCHR,
:RICHTING,
:PROG,
:TRANS,
:TOTAAL
DO
BEGIN
totaal = iif(abs(prog) > abs(trans),prog,trans);
SUSPEND;
END
END^
SET TERM ; ^

在 IBExpert 中输入语句:

SELECT * FROM SP_TEST(2014,1,'0001')

返回包含多行的结果集。

当我将相同的查询传递给TSQLQuery.CommandText(或SQL属性时,我也尝试过这个),会引发消息"输入参数不匹配"。

我尝试了TSQLStoredProc,但是当我使用 Open 方法时,会出现一条消息"游标未从查询返回"。

实际上,我的存储过程是一种视图,我喜欢dbExpress组件(TSQLQueryTSQLStoredProc)中的结果。 如前所述,当我将完整的SQL代码放在"SELECT..."之间时。和TSQLQuery.SQL属性中的"GROUP BY",我得到了结果行。 到目前为止,使用存储过程将失败。

你的第三个参数是一个VARCHAR,但你尝试使用select * from SP_TEST(1,2,3),这里的第三个参数是一个INTEGER。这也是与有效的过程调用的唯一区别。

因此,请改为使用:

select * from SP_TEST(1,2,'3')

(注意 3 周围的引号)

最新更新