sql >> Database teknologi >  >> RDS >> Oracle

Oracle:Dynamisk forespørgsel med IN-klausul ved hjælp af markør

Klassisk situation alle har. Du kan danne en forespørgselsstreng dynamisk baseret på dit array eller noget. Og brug som ÅBEN 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;

IN-klausulen understøtter maksimalt 1000 elementer. Du kan altid bruge en tabel til at deltage i stedet. Den tabel kan være en Global Temporary Table(GTT) hvis data er synlige for den pågældende session.

Du kan stadig bruge en nested table også for det (som PL/SQL-tabel)

TABLE() vil konvertere en PL/Sql-tabel som et SQL-forståeligt tabelobjekt (et faktisk objekt)

Et simpelt eksempel på det nedenfor.

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. Ændre MySQL standardtegnsæt til UTF-8 i my.cnf?

  2. ODP.NET Oracle.ManagedDataAcess tilfældige ORA-12570-fejl

  3. Hvorfor min pessimistiske låsning af JPA med Oracle ikke virker

  4. Hvordan forespørges række med laveste værdi, og også at kende værdien af ​​den højeste værdi?