Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

A consulta do Oracle não compila


Acho que o problema é que a instrução dinâmica que você está tentando no seu EXECUTE IMMEDIATE é uma instrução SQL, não uma instrução PL/SQL. E INTO não é SQL, é PL/SQL.

Você pode fazer um SQL dinâmico declaração com apenas uma variável de ligação e, em seguida, coloque seu INTO fora da declaração dinâmica. Isso é suportado ao fazer um SQL dinâmico declaração:
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 você pode fazer um PL/SQL dinâmico bloco anônimo:
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;

Desta vez, o INTO deve estar dentro da string dinâmica e usando uma variável de ligação, porque com o BEGIN e END; agora você está fazendo PL/SQL dinâmico .

Para o seu caso de uso, recomendo a primeira opção, fazendo o SQL dinâmico e colocando o INTO depois a seqüência de instruções.