Myślę, że problem polega na tym, że dynamiczna instrukcja, którą próbujesz w swoim EXECUTE IMMEDIATE
, jest instrukcją SQL, a nie instrukcją PL/SQL. I INTO
to nie SQL, to PL/SQL.
Możesz wykonać dynamiczny SQL oświadczenie z tylko jedną zmienną bind, a następnie umieść swój INTO
poza dynamiczną instrukcją. Jest to obsługiwane podczas wykonywania dynamicznego SQL oświadczenie:
execute immediate 'select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end from DUAL'
into varResult
using IN varSampleCode;
Lub możesz zrobić dynamiczny PL/SQL blok anonimowy:
execute immediate 'begin select CASE WHEN EXISTS ( SELECT 1 from samples where samplecode = :varSamplecode and auditflag = 0 and ' || varFilterString || ') then 1 else 0 end into :varresult from DUAL; end;'
using IN varSampleCode, OUT varResult;
Tym razem INTO
musi znajdować się wewnątrz ciągu dynamicznego i używać zmiennej bind, ponieważ z BEGIN
i END;
robisz teraz dynamiczne PL/SQL .
Dla twojego przypadku użycia polecam pierwszą opcję, wykonując dynamiczne SQL i umieszczenie INTO
po ciąg instrukcji.