Jag tror att problemet är att den dynamiska satsen du försöker i din EXECUTE IMMEDIATE
är en SQL-sats, inte en PL/SQL-sats. Och INTO
är inte SQL, det är PL/SQL.
Du kan antingen göra en dynamisk SQL sats med bara en bindningsvariabel och placera sedan din INTO
utanför det dynamiska uttalandet. Detta stöds när du gör en dynamisk SQL uttalande:
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;
Eller så kan du göra en dynamisk PL/SQL anonym blockering:
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;
Den här gången INTO
måste vara inuti den dynamiska strängen och använda en bindningsvariabel, eftersom med BEGIN
och END;
du gör nu dynamisk PL/SQL .
För ditt användningsfall skulle jag rekommendera det första alternativet, att göra dynamisk SQL och placera INTO
efter uttalandesträngen.