Delphi XE:TSQLQuery引发"输入参数不匹配"

时间:2014-01-16 21:15:40

标签: sql delphi firebird dbexpress mismatch

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

但是,当我使用Delphi XE中的dbExpress组件进行相同的选择时,会引发消息“输入参数不匹配”。 我正在使用TSQLQuery组件,CommandText属性设置为SP_TEST。 当我在CommandText属性中定义与我在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 ; ^ 中定义的相同的查询时,我得到了一个很好的结果。 但是在select语句中包含存储过程名称(使用正确的参数个数)会引发此错误消息。

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

更新 - 从伪答案移出并添加了格式:https://stackoverflow.com/editing-help

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

在IBExpert中输入声明:

TSQLQuery.CommandText

返回多行的结果集。

当我将同一个查询传递给SQL(或TSQLStoredProc属性时,我也试过了),会引发“输入参数不匹配”消息。

我尝试了TSQLQuery,但是当我使用Open方法时,会出现一条消息“Cursor not from Query”。

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

1 个答案:

答案 0 :(得分:0)

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

所以改为使用:

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

(注意3周围的引号)