从plsql关联数组中提取元素范围

时间:2017-09-27 03:37:10

标签: plsql oracle11g

我目前正在 oracle 11.2 。下面是代码片段。我想在传递的每个页码上从记录类型中提取元素范围。 而不是在查询本身,我想从表类型中提取。

假设集合中有13个记录 通过page传递的1应该提供1 to 5

中的元素
page =2 -> 6 to 10  
page =3 -> 11 to 13  

我不想将页面逻辑放在select语句中。 当我通过page 2和病房时,我没有得到正确的输出。 我现在没有确切的代码,但是当我明天早上去办公室时,我会更新循环内部的正确代码。

create or replace procedure p1 (page number) is
 TYPE rec_typ IS RECORD (col1 VARCHAR2(5),col2 VARCHAR2(50),col3 
    number(10));
    TYPE rec_tab IS TABLE OF rec_typ INDEX BY BINARY_INTEGER;
      t_tab rec_tab ;
      f_tab rec_tab ;
      n number :=0;
   BEGIN
      Select * bulk collect into t_tab from test;
      For j in p1*5-4..p1*5
    LOOP
    if t_tab.exists(j) then
      n:= n+1;
      f_tab.extend;
      f_tab(n) :=t_tab(j);
   end if;
    END LOOP;
   END;

2 个答案:

答案 0 :(得分:0)

使用 LIMIT 选项它会帮助你!!

参考:http://www.dba-oracle.com/plsql/t_plsql_limit_clause.htm

示例查询:在此代码中,您可以在参数中传递13。

 create or replace procedure p1 (page number) is
    TYPE rec_typ IS RECORD (col1 VARCHAR2(5),col2 VARCHAR2(50),col3 number(10));
        TYPE rec_tab IS TABLE OF rec_typ INDEX BY BINARY_INTEGER;
          t_tab rec_tab ;
          f_tab rec_tab ;
          n number :=0;
          j number :=1;
    CURSOR C IS
        Select * bulk collect into t_tab from test;
    BEGIN
    OPEN C;
    LOOP
    FETCH C BULK_COLLECT INTO t_tab LIMIT 5;

    EXIT WHEN L_PF.COUNT=0;

    if t_tab.exists(j) then
      n:= n+1;
      f_tab.extend;
      f_tab(n) :=t_tab(j);
   end if;
    j:=j+1;
    END LOOP;

    CLOSE C;

    END;

注意:它仅适用于示例代码。使用您的逻辑来使用此代码。希望它会对你有所帮助。如果它对你有帮助,点击这个答案左侧的有用的勾选按钮。

答案 1 :(得分:0)

您可以使用ROWNUM代替此集合,然后在此处使用分页概念。希望下面的代码段有用。

CREATE OR REPLACE
PROCEDURE p1(
    page NUMBER)
IS
TYPE rec_typ
IS
  RECORD
  (
    col1 VARCHAR2(5),
    col2 VARCHAR2(50),
    col3 NUMBER(10));
TYPE rec_tab
IS
  TABLE OF rec_typ INDEX BY BINARY_INTEGER;
  t_tab rec_tab ;
  LV_SQL  VARCHAR2(32676);
  lv_cond VARCHAR2(32676);
BEGIN
  LV_COND:=
  CASE
  WHEN PAGE = 1 THEN
    ' AND a.rn BETWEEN 1 AND 5 '
  WHEN PAGE =2 THEN
    ' AND a.rn BETWEEN 6 AND 10 '
  WHEN PAGE = 3 THEN
    ' AND a.rn BETWEEN 11 AND 15 '
  ELSE
    ''
  END;
  LV_SQL:= 'SELECT                     
            a.col1,                      
            a.col2,                      
            a.col3                    
            FROM                    
            (SELECT T.*,ROWNUM RN FROM TEST T)A                    
            WHERE 1 = 1 '||lv_cond;
  EXECUTE IMMEDIATE lv_sql BULK COLLECT INTO t_tab;
  FOR z IN t_tab.FIRST..t_tab.LAST
  LOOP
    DBMS_OUTPUT.PUT_LINE(t_tab(z).col1||' '||t_tab(z).col2||'  '||t_tab(z).col1);
  END LOOP;
END;
/