Я пытаюсь написать процедуру без использования прямых операторов блокировки.
SET TERM ^ ;
ALTER PROCEDURE PROC_GETSTATUS (
IDTBL1 Integer )
RETURNS (
STATUS Varchar(255) )
AS
declare variable t int;
BEGIN
t=gen_id(RPUSING,1);
update TBL1 a set a.STATUS=cast('USINGBY' as varchar(255))||cast(:t as varchar(255)) where a.STATUS='free' and a.ID=:IDTBL1 order by a.LASTUPDATED rows 1 to 1;
STATUS=cast('USINGBY' as varchar(255))||cast(:t as varchar(255));
SUSPEND;
END^
SET TERM ; ^
GRANT EXECUTE
ON PROCEDURE PROC_GETSTATUS TO SYSDBA;
Когда я выбираю данные из этого по запросу, например:
select * from TBL1 a where a.STATUS in (select b.STATUS from PROC_GETSTATUS(1));
Он возвращает ноль. Но этот выбор
select * from TBL1 a where a.STATUS like '%USINGBY%'
в текущей транзакции возвращает обновленные данные. Как переписать этот запрос одним выбором процедуры в текущей транзакции?
SUSPEND
, это не выбираемая хранимая процедура (или, по крайней мере: она не должна быть), возможно, тот факт, что она теперь выбирается из-заSUSPEND
, вызывает проблему. - person Mark Rotteveel   schedule 28.11.2012