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

Wykonywanie dynamicznej instrukcji sql do SYS_REFCURSOR

będziesz musiał powiązać parametry pAge i pPostcode . W dynamicznym SQL należy je poprzedzić dwukropkiem (: ). Jeśli używasz EXECUTE IMMEDIATE lub OPEN ... FOR , powiążesz swoje parametry za pomocą pozycji, dlatego zmieniłem ich nazwy :P1 i :P2 w ​​przykładzie:

DECLARE
   lsql VARCHAR2(500) := 'SELECT c.id 
                            FROM carer c, cared_for cf, carer_cared_for ccf 
                           WHERE c.id = ccf.carer_id (+)
                             AND cf.id (+) = ccf.cared_for_id';
BEGIN
   IF pPostcode IS NULL THEN
      lsql := lsql || ' AND :P1 IS NULL';
   ELSE
      lsql := lsql || ' AND c.postcode like ''%''|| upper(:P1)||''%''';
   IF pPostcode pAge > 0 THEN
      lsql := lsql || ' AND :P2 = ROUND((MONTHS_BETWEEN(sysdate,
                                                        c.date_of_birth)/12))';
   ELSE
      lsql := lsql || ' AND nvl(:P2, -1) <= 0';
   END IF;
   OPEN pReport FOR lsql USING pPostcode, pAge;
END;

Uwaga:Liczba i pozycja zmiennych wiązania muszą być znane w czasie kompilacji , dlatego często używam powyższej konstrukcji (dodając parametr do jego pozycji, nawet jeśli nie jest używany). Dodanie tautologii (jak w AND :P1 IS NULL ) do zapytania nie wpłynie na jego plan wyjaśniania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:nieprawidłowy indeks kolumny w wildfly

  2. Błąd podczas wykonywania procedury składowanej Oracle w SSRS:PLS-00306:zła liczba lub typy argumentów w wywołaniu do

  3. Jak pobrać komentarze z Oracle 11g za pomocą JDBC?

  4. Błąd SQL Developer Nie można znaleźć wirtualnej maszyny Java

  5. Jak zmienić rozmiar kolumny widoku w Oracle?