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

Oracle:dynamiczne zapytanie z klauzulą ​​IN za pomocą kursora

Klasyczna sytuacja, którą każdy ma. Możesz utworzyć ciąg zapytania dynamicznie w oparciu o tablicę lub coś innego. I użyj jako OPEN CURSOR. .

  DECLARE
    v_mystring VARCHAR(50);
    v_my_ref_cursor sys_refcursor;
    in_string varchar2='''abc'',''bcd''';
    id2 varchar2(10):='123';
        myrecord tablename%rowtype;
  BEGIN

    v_mystring := 'SELECT a.*... from tablename a where name= :id2 and 
                    id in('||in_string||')';

    OPEN v_my_ref_cursor FOR v_mystring USING id2;

    LOOP
      FETCH v_my_ref_cursor INTO myrecord;
      EXIT WHEN v_my_ref_cursor%NOTFOUND;
        ..
      -- your processing
    END LOOP;
    CLOSE v_my_ref_cursor;

  END;

Klauzula IN obsługuje maksymalnie 1000 pozycji. Zawsze możesz użyć tabeli do przyłączenia się zamiast tego. Ta tabela może być Global Temporary Table(GTT) którego dane są widoczne dla tej konkretnej sesji.

Nadal możesz użyć nested table również do tego (jak tabela PL/SQL)

TABLE() przekonwertuje tabelę PL/Sql na zrozumiały obiekt tabeli SQL (w rzeczywistości obiekt)

Prosty przykład poniżej.

CREATE TYPE pr AS OBJECT
           (pr  NUMBER);
/
CREATE TYPE prList AS TABLE OF pr;
/

declare
  myPrList prList := prList ();
  cursor lc is 
    select * 
      from (select a.*
              from yourtable a
                   TABLE(CAST(myPrList as prList)) my_list
             where 
                   a.pr = my_list.pr
             order by a.pr desc) ;
  rec lc%ROWTYPE;

BEGIN 
  /*Populate the Nested Table, with whatever collection you have */
  myPrList := prList ( pr(91),
                       pr(80));
  /*
     Sample code: for populating from your TABLE OF NUMBER type 

     FOR I IN 1..your_input_array.COUNT
     LOOP
          myPrList.EXTEND;
          myPrList(I) := pr(your_input_array(I));
     END LOOP;
  */
  open lc;
  loop 
    FETCH lc into rec;
    exit when lc%NOTFOUND; -- Your Exit WHEN condition should be checked afte FETCH iyself!
    dbms_output.put_line(rec.pr);
  end loop;
  close lc;
END;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać wyrazów odrębnych i sumarycznych w wyroczni?

  2. Wykonywanie zbiorczych aktualizacji za pomocą procedur składowanych MyBatis i Oracle

  3. Dowiedz się, czy ciąg zawiera tylko znaki ASCII

  4. Dlaczego funkcja pi() nie działa w Oracle korzystającym ze sterownika JDBC?

  5. Jak wyodrębnić powtarzalne wartości węzłów json oddzielnie od XML za pomocą ORACLE SQL?