2017-09-27 151 views
0

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

假设收集从1 to 5

page =2 -> 6 to 10 
page =3 -> 11 to 13 

我不想把页面逻辑在SELECT语句中充满了13条记录
page1通过应该给元素。 我没有得到正确的输出,当我通过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; 

回答

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; 

注意:它仅适用于示例代码。将此代码与您的逻辑联系起来。希望它能帮助你。如果它对您有帮助,请点击有用的提示按钮,这是此答案的左侧。

+0

非常感谢你..对不起,我迟到reply.I完全忘了LIMIT clause.I认为会从这里 –

+0

其OKY ...拉吉接管有个GRT一天......如果对你有帮助,点击这个答案左边的有用的提示按钮。 –

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; 
/