Oracle
 sql >> база данни >  >> RDS >> Oracle

ЛИМИТ ЗА ГРУПОВО СЪБИРАНЕ в ИЗПЪЛНЕНИЕ НЕЗАБАВНО

Изглежда, че синтаксисът EXECUTE IMMEDIATE не позволява клауза за групово събиране на LIMIT

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#CJACGJJG


bulk_collect_into_clause
http://docs.oracle .com/cd/E11882_01/appdev.112/e25519/returninginto_clause.htm#CJAIAGHJ

Можете да използвате курсор и команда FETCH .. LIMIT заедно с команда OPEN..FOR,
по следния начин:

DECLARE
  ....
  cur sys_refcursor;
BEGIN
  v_query := 'SELECT level AS x FROM dual CONNECT BY LEVEL <=10';
  OPEN cur FOR v_query;
  LOOP
     FETCH cur BULK COLLECT INTO collection LIMIT 3;
     EXIT WHEN collection.COUNT = 0;

     /* Process data from `collection` */

  END LOOP;
  CLOSE cur;
END;

Пример:

DECLARE
  TYPE col_typ IS table of NUMBER;
  collection col_typ;
  v_query varchar2(3000); 
  cur sys_refcursor;
  i int := 0;
  x int;
BEGIN
  v_query := 'SELECT level AS x FROM dual CONNECT BY LEVEL <=10';

  OPEN cur FOR v_query;
  LOOP
     FETCH cur BULK COLLECT INTO collection LIMIT 3;
     EXIT WHEN collection.COUNT = 0;

     /* Process data from `collection` */
     i := i + 1;
     DBMS_OUTPUT.PUT_LINE('==== Batch nbr #' || i );
     FOR x IN 1 .. collection.COUNT LOOP
       DBMS_OUTPUT.PUT_LINE( collection( x ) );
     END LOOP;
  END LOOP;
  CLOSE cur;
END;
/

Резултат:

==== Batch nbr #1
1
2
3
==== Batch nbr #2
4
5
6
==== Batch nbr #3
7
8
9
==== Batch nbr #4
10


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да конфигурирам местоположението на моя файл tnsnames на Oracle?

  2. JFreeChart използва цифрова заявка ORACLE

  3. Как да зададете Incemental на true за множество таблици с един и същи собственик, като използвате DBMS_STATS.set_table_prefs?

  4. Процедура за актуализиране на таблица, която вече е попълнена

  5. ORA-01111 в MRP във Physical Standby база данни