我目前正在 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;
答案 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;
/