Я пытаюсь создать хранимый процесс для инкапсуляции сложной логики.Вот основной код, немного анонимный:
SET TERM ^ ;
RECREATE PROCEDURE GET_DATA (
USERID INTEGER,
W INTEGER,
X INTEGER,
Y INTEGER)
RETURNS (
ID INTEGER,
NAME VARCHAR(64) CHARACTER SET UTF8)
AS
BEGIN
select first 1
QP.ID,
QO.NAME
from QP
join QO
on QO.ID = QP.QO_ID
where
(QO.W = :w) and (QO.X = :x) and (QO.Y = :y)
and ((QP.PREREQUISITE in (
select VALUE
from LOOKUP_TABLE1
where USER_ID = :userid))
or (QP.PREREQUISITE is null))
and (QO.Q_ID not in (
select VALUE
from LOOKUP_TABLE2
where USER_ID = :userid))
order by QP.SEQUENCE desc
into :ID, :NAME;
suspend;
END^
SET TERM ; ^
Ожидается, что он вернет 1 или 0 результатов.Это логически правильно;если я беру запрос SELECT
, подставляю параметры вручную и запускаю его в Firebird Maestro, он дает ожидаемый результат.Но если я скажу select ID, NAME from GET_DATA(1, 1, 2, 3)
с теми же параметрами, я получу пустой набор результатов.
Так что на уровне хранимых процедур что-то идет не так.Кто-нибудь знает, что это такое и как я могу это исправить?