2017-09-27 10 views
0

私は現在オラクル11.2です。以下はコードのスニペットです。渡されたすべてのページ番号のレコードタイプから要素の範囲を抽出したいと思います。 クエリ自体ではなく、テーブルタイプから抽出したいと思います。plsqlから要素の範囲を抽出します。連想配列

は、コレクションは、私はselect文でページロジックを置きたくない1 to 5

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

から要素を与えるべき13個の記録1で渡さ
pageで満たされていると仮定します。 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; 
/
関連する問題