sql >> Database >  >> RDS >> Oracle

Oracle:Dynamische query met IN-clausule met cursor

Klassieke situatie die iedereen heeft. U kunt dynamisch een queryreeks vormen op basis van uw array of iets dergelijks. En gebruik als 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;

IN-clausule ondersteunt maximaal 1000 items. Je kunt in plaats daarvan altijd een tabel gebruiken om mee te doen. Die tabel kan een Global Temporary Table(GTT) zijn waarvan de gegevens zichtbaar zijn voor die specifieke sessie.

Toch kun je een nested table gebruiken ook ervoor (zoals PL/SQL-tabel)

TABLE() zal een PL/Sql-tabel converteren als een SQL-begrijpelijk tabelobject (eigenlijk een object)

Hieronder een eenvoudig voorbeeld.

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. Converteer MySql-gegevens van Latin1 naar UTF8

  2. Ontvang de nieuwste gegevens waarin datum/tijd-velden uit twee tabellen worden vergeleken

  3. PostgreSQL 11 - Procedures

  4. Mysql krijgt de laatste id van een specifieke tabel