2014-01-16 3 views
0

Я создал хранимую процедуру (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, я получаю результирующие строки. Использование хранимой процедуры завершается с ошибкой до сих пор.

+1

Я запутался. Вы говорите, что использование команды SQL 'select * from PROC() 'работает, но с использованием' select * из SP_TEST() 'терпит неудачу. Это два разных оператора (один использует 'PROC()' и другой 'SP_TEST()'). Можете ли вы [изменить], чтобы объяснить, какова фактическая проблема? –

+0

Ожидал бы выполнить sp_test (1,2,3) ... –

+0

http://SSCCE.org Показать код. Показать объявление SP. Покажите, как вы упорядочиваете TSQLQuery, все свойства, которые вы меняете, и как вы его открываете - все. Мы не можем догадываться о вещах, которые мы не можем видеть. И покажите точный дословный текст ошибки. Ваш запрос «select * from SP_TEST (1,2,3)» вообще не имеет параметров. –

ответ

0

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

Так вместо того, чтобы использовать:

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

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

+0

К сожалению, первый список параметров был быстрым примером, последний пример - это список реальных параметров для списка SP, который я перечислял: SELECT * FROM SP_TEST (2014,1, '0001') – user3204266