Я создал хранимую процедуру (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
, я получаю результирующие строки. До сих пор использование хранимой процедуры не удавалось.
select * from SP_TEST()
, не работает. Это два разных утверждения (в одном используетсяPROC()
, а в другомSP_TEST()
). Можете ли вы редактировать, чтобы объяснить, в чем настоящая проблема? - person Ken White   schedule 17.01.2014TSQLQuery.SQL
вместо свойстваTSQLQuery.CommandText
. Или переключитесь наTSQLStoredProc
. - person Remy Lebeau   schedule 17.01.2014First()
иNext()
для навигации по набору. Если хранимая процедура возвращает несколько наборов записей, вы можете использовать методNextRecordSet()
для доступа к дополнительным наборам. - person Remy Lebeau   schedule 17.01.2014