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

Dynamický kurzor Oracle

Stručně řečeno, klauzule IN nepodporuje vazebné proměnné. Podporuje pouze hodnotu způsobem, který jste použili. Musíte ji zadat jako IN (var1, var2);

Aniž byste vás znali, použili jste proměnné vazby. Jedním z řešení je použití REFCURSOR Dynamickým vytvořením řetězce dotazu.

DECLARE
 VAR1 VARCHAR2(500);
 CUR1 SYs_REFCURSOR;
 QUERY_STRING VARCHAR2(2000) := 'SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN';

 MYREC IS RECORD 
 (
   COL1 VARCHAR(1000);
 );

 myrecord MYREC;

 BEGIN
  VAR1 := q'['V1','V2']';
  QUERY_STRING:= QUERY_STRING||'('||VAR1||')';

  OPEN CUR1 FOR QUERy_STRING;

    LOOP
      FETCH CUR1 INTO myrecord;
      DBMS_OUTPUT.PUT_LINE(myrecord.COL1);
      EXIT WHEN v_my_ref_cursor%NOTFOUND;
        ..
      -- your processing
    END LOOP;

  CLOSE CUR1;

END;

Jedna z mých dalších odpovědí má také jiný způsob použití kolekcí, pro větší seznam klauzulí IN.



  1. Jak přimět mysqli pracovat s DELIMITER v příkazech SQL?

  2. Jak získám SQL*Plus k vytváření pohledů / tabulek s prázdným řádkem uprostřed příkazu create?

  3. Databáze:Zřetězené funkce

  4. Poslední index daného podřetězce v MySQL