Eu tenho tido dificuldade em tentar criar um gatilho para um banco de dados Sybase SAP SQLAnywhere 16 seguindo estes documentos.
Atualmente está com erro de sintaxe -131 na linha 15/16 (a instrução de atualização), mas não vejo nenhum erro na sintaxe. O que eu estou fazendo errado aqui?
create trigger "DBA"."WKM_autoFillCL143" after insert order 2 on "DBA"."case_checklist"
when ((select top 1 "inserted"."code" from "inserted") in( '143' ) )
begin
declare @parentRef integer;
declare @desc varchar(255);
declare @desc1 varchar(255);
declare @checkID integer;
set @parentRef = (select top 1 "parent_ref" from "inserted");
if (@parentRef <> '0')
then
set @desc = (select "description" from "case_checklist" where "checklist_id" = @parentRef);
if (@desc is not null)
then
set @checkID = (select top 1 "checklist_id" from "inserted");
update "WKM_RecordChecklistMapping" set "c143" = @checkID where "c142" = @parentRef;
declare @tabid integer;
set @tabid = (select top 1 "tab_id" from "WKM_recordChecklistMapping" where "c142" = @parentRef);
set @tabid = (select top 1 "tab_id" from "user_tab2_data" where "tab_id" = @tabid);
if (@tabid is not null)
then
declare @recProvider varchar(255),@recsRequested varchar(255),@dateFrom "datetime",@dateTo "datetime"
set @recProvider = (select top 1 "Provider_Name" from "user_tab2_data" where "tab_id" = @tabid);
set @recsRequested = (select top 1 "Records_Requested" from "user_tab2_data" where "tab_id" = @tabid);
set @dateFrom = (select top 1 "For_Dates_From" from "user_tab2_data" where "tab_id" = @tabid);
set @dateTo = (select top 1 "Through" from "user_tab2_data" where "tab_id" = @tabid);
set @desc1 = 'Receipt '+@recProvider+' Records? '+@recsRequested+', dates '+"coalesce"(convert(varchar(255),@dateFrom,1),'00/00/00')+' to '+"coalesce"(convert(varchar(255),@dateTo,1),'00/00/00');
set @checkID = (select top 1 "checklist_id" from "inserted");
update "case_checklist" set "description" = @desc1,"staff_assigned" = 'ZKS',"due_date" = ("today"()+7) where "checklist_id" = @checkID
end if;
end if;
end if;
end;
Acho que o problema que você está enfrentando é causado por obter uma mistura de sintaxe T-SQL (ASE) e sintaxe SQLA (Watcom). Você pode usar gatilhos T-SQL no SQLA - mas com muitas limitações. É melhor fazer uma reescrita se você puder.
Isso está em conformidade, se funciona, não tenho ideia! (As mudanças estão todas nas instruções DECLARE. Uma por variável, aspas duplas removidas do tipo de dados timestamp (conforme comentário do markp-fuso). Se você realmente precisa de variáveis locais mais abaixo no código, você deve declará-las no início do um novo bloco BEGIN / END)