Je pense que le problème est que l'instruction dynamique que vous essayez dans votre EXECUTE IMMEDIATE
est une instruction SQL, pas une instruction PL/SQL. Et INTO
n'est pas SQL, c'est PL/SQL.
Vous pouvez soit faire un SQL dynamique déclaration avec une seule variable de liaison, puis placez votre INTO
en dehors de l'instruction dynamique. Ceci est pris en charge lors de l'exécution d'un SQL dynamique déclaration :
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;
Ou vous pouvez faire un PL/SQL dynamique bloc anonyme :
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;
Cette fois, le INTO
doit être à l'intérieur de la chaîne dynamique et utiliser une variable de liaison, car avec le BEGIN
et END;
vous faites maintenant du PL/SQL dynamique .
Pour votre cas d'utilisation, je recommanderais la première option, faire du SQL dynamique et en plaçant le INTO
après la chaîne de déclaration.