Oracle
 sql >> база данни >  >> RDS >> Oracle

Изпълнение на динамичен sql оператор в SYS_REFCURSOR

ще трябва да обвържете параметрите pAge и pPostcode . В динамичния SQL бихте поставили пред тях двоеточие (: ). Ако използвате EXECUTE IMMEDIATE или OPEN ... FOR , ще обвържете параметрите си чрез позиция, затова ги преименувах на :P1 и :P2 в примера:

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;

Забележка:Броят и позицията на свързващите променливи трябва да бъдат известни по време на компилиране , ето защо често използвам конструкцията по-горе (добавя параметъра към неговата позиция, дори ако не се използва). Добавяне на тавтология (както в AND :P1 IS NULL ) към заявка няма да повлияе на нейния план за обяснение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Осредняване на списък от пъти TIMESTAMP(6) WITH TIME ZONE

  2. Защо типът данни Long е заменен с LOB в Oracle?

  3. Как да редактирате съхранена процедура в Oracle SQL Developer?

  4. Как да извикате таблична функция на Oracle (конвейерна функция) от .NET

  5. Подаване на динамични входни параметри за „незабавно изпълнение“