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

Dynamiczny kursor Oracle

W skrócie, klauzula IN nie obsługuje zmiennych wiązanych. Obsługuje tylko wartość, w taki sposób, w jaki użyłeś. Musisz określić to jako IN (var1, var2);

Nie wiedząc o tym, użyłeś zmiennych bind. Jednym z obejść jest użycie REFCURSOR Poprzez dynamiczne tworzenie ciągu zapytania.

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 moich innych odpowiedzi ma również inny sposób używania kolekcji, dla większej listy klauzul IN.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz dane za 31 grudnia z ostatnich 5 lat i dzisiejszą datę

  2. jak wykonać wiele zapytań Oracle c#

  3. Dostęp do parametrów URL w Oracle Forms / OC4J

  4. Oracle DB — Ustaw numer wejściowy na dokładną długość

  5. Problem z typem znaku Oracle w zapytaniu Hibernate HQL