Delphi XE: TSQLQuery вызывает несоответствие входных параметров

Я создал хранимую процедуру (SP_TEST) в Firebird 2.5, которая возвращает выбор и использует 3 входных параметра. Это SP_TEST отлично работает в IBExpress, когда я ввожу, например, команда SQL: select * from SP_TEST(1,2,3) есть правильный результат.

Однако, когда я использую компоненты dbExpress в Delphi XE для того же выбора, появляется сообщение «Несоответствие входных параметров». Я использую компонент 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 (TSQLQuery или TSQLStoredProc). Как было сказано, когда я помещаю полный код SQL между «SELECT ...» и «GROUP BY» в свойстве TSQLQuery.SQL, я получаю результирующие строки. До сих пор использование хранимой процедуры не удавалось.


person user3204266    schedule 16.01.2014    source источник
comment
Я смущен. Вы говорите, что использование команды SQL 'select * from PROC () `работает, но команда, использующая select * from SP_TEST(), не работает. Это два разных утверждения (в одном используется PROC(), а в другом SP_TEST()). Можете ли вы редактировать, чтобы объяснить, в чем настоящая проблема?   -  person Ken White    schedule 17.01.2014
comment
Можно было ожидать выполнения sp_test (1,2,3) ...   -  person Tony Hopkinson    schedule 17.01.2014
comment
SSCCE.org Показать код. Покажите декларацию ИП. Покажите, как вы упорядочиваете TSQLQuery, все свойства, которые вы меняете, и как вы его открываете - все. Мы не можем догадываться о том, чего не видим. И покажите точный дословный текст ошибки. Ваш запрос select * from SP_TEST (1,2,3) вообще не имеет параметров.   -  person Arioch 'The    schedule 17.01.2014
comment
Используйте свойство TSQLQuery.SQL вместо свойства TSQLQuery.CommandText. Или переключитесь на TSQLStoredProc.   -  person Remy Lebeau    schedule 17.01.2014
comment
Может ли TSqlStoredProc читать много строк из SP? @RemyLebeau   -  person Arioch 'The    schedule 17.01.2014
comment
Да, если хранимая процедура возвращает набор результатов. Затем вы должны использовать его методы First() и Next() для навигации по набору. Если хранимая процедура возвращает несколько наборов записей, вы можете использовать метод NextRecordSet() для доступа к дополнительным наборам.   -  person Remy Lebeau    schedule 17.01.2014
comment
Это хранимая процедура:   -  person user3204266    schedule 17.01.2014
comment
Я не думаю, что несоответствие входных параметров - это ВЕСЬ текст. по крайней мере, в нем отсутствует имя класса ошибки. Пожалуйста, скопируйте весь текст окна ошибки   -  person Arioch 'The    schedule 17.01.2014
comment
Это когда я передаю тот же запрос в TSQLQuery.CommandText с использованием ванильного компонента TSQLQuery, созданного только что в предыдущей строке? Поскольку этот запрос не имеет никаких параметров, похоже, что они остались от предыдущих команд, и вы сделали что-то плохое, чтобы не удалять больше не используемые параметры. Также что такое docwiki.embarcadero.com/Libraries/XE5/en /?   -  person Arioch 'The    schedule 17.01.2014


Ответы (1)


Ваш третий параметр - VARCHAR, но вы пытаетесь использовать select * from SP_TEST(1,2,3), и здесь третий аргумент - INTEGER. Это также единственное отличие от вызова процедуры, который действительно работает.

Поэтому вместо этого используйте:

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

(обратите внимание на кавычки вокруг 3)

person Mark Rotteveel    schedule 17.01.2014
comment
Извините, первый список параметров был быстрым примером, последний пример - реальный список параметров для указанного мной SP: SELECT * FROM SP_TEST (2014,1, '0001') - person user3204266; 17.01.2014