Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie Oracle nie skompiluje się

Myślę, że problem polega na tym, że dynamiczna instrukcja, którą próbujesz w swoim EXECUTE IMMEDIATE, jest instrukcją SQL, a nie instrukcją PL/SQL. I INTO to nie SQL, to PL/SQL.

Możesz wykonać dynamiczny SQL oświadczenie z tylko jedną zmienną bind, a następnie umieść swój INTO poza dynamiczną instrukcją. Jest to obsługiwane podczas wykonywania dynamicznego SQL oświadczenie:

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;

Lub możesz zrobić dynamiczny PL/SQL blok anonimowy:

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;

Tym razem INTO musi znajdować się wewnątrz ciągu dynamicznego i używać zmiennej bind, ponieważ z BEGIN i END; robisz teraz dynamiczne PL/SQL .

Dla twojego przypadku użycia polecam pierwszą opcję, wykonując dynamiczne SQL i umieszczenie INTO po ciąg instrukcji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy używanie ROWID do lokalizowania wiersza/rekordu w Oracle jest bezpieczne?

  2. Oracle MIN jako funkcja analityczna — dziwne zachowanie z ORDER BY?

  3. Czy istnieje alternatywa dla pakietu utl_http dla żądań http przy użyciu Oracle pl sql?

  4. Wyniki pakowania Oracle sqlplus

  5. Zapytanie Oracle, aby znaleźć ciąg niezawierający znaków