Я создал хранимую процедуру (SP_TEST
) в Firebird 2.5, которая возвращает выбор и использует 3 входных параметра. Этот SP_TEST
отлично работает в IBExpress, когда я вхожу, например. команда SQL: select * from SP_TEST(1,2,3)
есть правильный результат.Delphi XE: TSQLQuery повышает «несоответствие входных параметров»
Однако, когда я использую компоненты dbExpress в Delphi XE для выполнения того же выбора, появляется сообщение «Несоответствие входных параметров». Я использую компонент TSQLQuery, с свойством CommandText, равным "select * from SP_TEST(1,2,3)"
. Когда я определяю тот же запрос в свойстве CommandText, как я определил в SP_TEST
, у меня хороший результат. Но в том числе имя хранимой процедуры в инструкции select (с нужным номером параметра) вызывает это сообщение об ошибке.
Может ли кто-нибудь сказать мне, что я делаю неправильно?
UPDATE - переехал из псевдо-ответа и форматирования добавил: 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 (TSQLQuery
или TSQLStoredProc
). Как сказано, когда я поместил полный код SQL между «SELECT ...» и «GROUP BY» в TSQLQuery.SQL
, я получаю результирующие строки. Использование хранимой процедуры завершается с ошибкой до сих пор.
Я запутался. Вы говорите, что использование команды SQL 'select * from PROC() 'работает, но с использованием' select * из SP_TEST() 'терпит неудачу. Это два разных оператора (один использует 'PROC()' и другой 'SP_TEST()'). Можете ли вы [изменить], чтобы объяснить, какова фактическая проблема? –
Ожидал бы выполнить sp_test (1,2,3) ... –
http://SSCCE.org Показать код. Показать объявление SP. Покажите, как вы упорядочиваете TSQLQuery, все свойства, которые вы меняете, и как вы его открываете - все. Мы не можем догадываться о вещах, которые мы не можем видеть. И покажите точный дословный текст ошибки. Ваш запрос «select * from SP_TEST (1,2,3)» вообще не имеет параметров. –