sql >> Databáze >  >> RDS >> Oracle

Dotaz Oracle se nezkompiluje

Myslím, že problém je v tom, že dynamický příkaz, který zkoušíte ve svém EXECUTE IMMEDIATE je příkaz SQL, nikoli příkaz PL/SQL. A INTO není SQL, je to PL/SQL.

Můžete buď vytvořit dynamický SQL příkaz pouze s jednou proměnnou vazby a poté umístěte INTO mimo dynamický příkaz. Toto je podporováno při provádění dynamického SQL prohlášení:

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;

Nebo můžete vytvořit dynamický PL/SQL anonymní blok:

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;

Tentokrát INTO musí být uvnitř dynamického řetězce a používat proměnnou vazby, protože s BEGIN a END; nyní děláte dynamické PL/SQL .

Pro váš případ použití bych doporučil první možnost, provedení dynamického SQL a umístěním INTO po řetězec příkazu.




  1. mysql - Porovnejte hodnoty z řetězců pro date=n s datem=n-1

  2. použití příkazu mysql LOAD v PHP selže, ale funguje to pomocí příkazového řádku

  3. postgresql - spoušť, aktualizace časového razítka při aktualizaci pole

  4. Tipy pro pohovor správce databáze SQL