sql >> Base de Datos >  >> RDS >> Oracle

La consulta de Oracle no se compilará

Creo que el problema es que la declaración dinámica que está intentando en su EXECUTE IMMEDIATE es una sentencia SQL, no una sentencia PL/SQL. Y INTO no es SQL, es PL/SQL.

Puedes hacer un SQL dinámico declaración con solo una variable de vinculación y luego coloque su INTO fuera de la instrucción dinámica. Esto es compatible cuando se hace un SQL dinámico declaración:

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;

O puede hacer un PL/SQL dinámico bloque 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;

Esta vez el INTO debe estar dentro de la cadena dinámica y usar una variable de vinculación, porque con BEGIN y END; ahora estás haciendo PL/SQL dinámico .

Para su caso de uso, recomendaría la primera opción, hacer SQL dinámico y colocando el INTO después la cadena de sentencia.