Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Truy vấn động với mệnh đề IN sử dụng con trỏ

Tình huống khó hiểu ai cũng gặp phải. Bạn có thể tạo một chuỗi Truy vấn động dựa trên mảng hoặc thứ gì đó của bạn. Và sử dụng như 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;

Mệnh đề IN hỗ trợ tối đa 1000 mặt hàng. Thay vào đó, bạn luôn có thể sử dụng một bảng để tham gia. Bảng đó có thể là Global Temporary Table(GTT) dữ liệu của ai được hiển thị cho phiên cụ thể đó.

Tuy nhiên, bạn vẫn có thể sử dụng nested table cũng cho nó (như bảng PL / SQL)

TABLE() sẽ chuyển đổi bảng PL / Sql thành một đối tượng bảng có thể hiểu được SQL (thực tế là một đối tượng)

Một ví dụ đơn giản về nó bên dưới.

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. Trả lại tên tháng ngắn từ một ngày trong Oracle

  2. Tạo màn hình đăng nhập tùy chỉnh trong Oracle Forms 10g

  3. cách kết nối với cơ sở dữ liệu oracle từ unix

  4. Truyền đối tượng kiểu bảng làm tham số đầu vào cho Thủ tục được lưu trữ trong Oracle từ C #

  5. Làm cách nào để loại bỏ các thẻ XML trống không mong muốn?