Oracle
 sql >> Database >  >> RDS >> Oracle

La query Oracle non verrà compilata

Penso che il problema sia che l'istruzione dinamica che stai provando nel tuo EXECUTE IMMEDIATE è un'istruzione SQL, non un'istruzione PL/SQL. E INTO non è SQL, è PL/SQL.

Puoi eseguire un SQL dinamico istruzione con una sola variabile di binding e quindi inserisci il tuo INTO al di fuori della dichiarazione dinamica. Questo è supportato quando si esegue un SQL dinamico dichiarazione:

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;

Oppure puoi eseguire un PL/SQL dinamico blocco anonimo:

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;

Questa volta il INTO deve essere all'interno della stringa dinamica e utilizzare una variabile bind, perché con BEGIN e END; ora stai eseguendo PL/SQL dinamico .

Per il tuo caso d'uso, consiglierei la prima opzione, eseguendo SQL dinamico e inserendo il INTO dopo la stringa dell'istruzione.