0

複数のカーソルを実行できるストアド プロシージャが必要です。

各カーソルをループしてから、各行で何らかの操作を行います。

このようにして、これらのカーソルから目的の結果が得られます。このような複数のカーソルの結果は、他のいくつかの行と結合してからフィルターで除外し、最終的にそれらの行を proc から返す必要があります。

各 cusror と別のクエリには同じ列があることに注意してください。

オラクルでこれを行う方法がわかりません。

私を助けてください。

        create or replace PROCEDURE test_proc
    (
      -- some inputs 
      hc_cursor OUT SYS_REFCURSOR
    ) 

    IS 

    cursor cursor_one is 
        SELECT * FROM table_one ; 

    BEGIN    

     FOR current_row in cursor_one
      loop 

          -- do some modification on each row and return each modified row

      end loop; 

    cursor cursor_two is 
        SELECT * FROM table_one ; 

    BEGIN    

     FOR current_row in cursor_two
      loop 

          -- do some modification on each row and return each modified row
          -- append to result from first cursor 

      end loop; 


    -- union results from both these cusrors with some another query 
    -- now filter these records on some criterais 
    -- return finally

    END;    
4

3 に答える 3

3

私の提案は、カーソルからの行を一時テーブルに挿入することです。次に、言及したフィルター基準の既存のテーブルと一時テーブルを結合します。疑似コード:

create or replace function my_func
return sysrefcursor
is
    cursor cursor_one is 
        SELECT * FROM table_one ; 

    cursor cursor_two is 
        SELECT * FROM table_one ; 
    BEGIN    

     FOR current_row in cursor_one
      loop 

          -- do some modification on each row and insert into temporary table

      end loop; 



     FOR current_row in cursor_two
      loop 

          -- do some modification on each row and insert into temporary table

      end loop; 


    -- results from cursor 1 and 2 exist in temporary table

    open out_cursor for
     select t.* from
      my_temp_table t
      join
      my_other_table tt
      on (t.col1 = tt.col1) -- or whatever columns are appropriate
      where t.col2 = 'some criteria' -- or whatever filter criteria you like.

    return out_cursor;

    END;  
于 2012-05-26T16:48:58.177 に答える
0
create
package my_pkg as

   type my_rec is record
   (
     <list your fields here>
   );

   type my_rec_tab is table of my_rec;

   function get_my_rows
     return my_rec_tab pipelined;

end my_pkg;

create
package body my_pkg as

   function get_my_rows
     return my_rec_tab pipelined
   as
   begin

      for c_cur in (select * from table_one)
      loop

         -- do some modification on the current row and return the modified row

         pipe row (c_cur);

      end loop;

      for c_cur in (select * from table_one)
      loop

         -- do some modification on the current row and return the modified row

         pipe row (c_cur);

      end loop;

      return;

   end get_my_rows;

end my_pkg;

select * from table(my_pkg.get_my_rows);
于 2012-05-28T08:05:47.770 に答える
0
create  type emp_obj AS object 
(
 empno    NUMBER (4)        
,ename  VARCHAR2(10)
,sal      number(7,2)
,job      varchar2(9)
);

CREATE TYPE EMP_NT AS TABLE OF emp_OBJ;


create or replace package test_pkg
IS
TYPE abc_cur is REF CURSOR;

procedure test_proc
(
p_rec IN OUT abc_cur
);

END test_pkg;
/

create or replace package body test_pkg
IS 
procedure test_proc
(
p_rec IN OUT abc_cur
)
IS
v_emp_nt emp_nt;
BEGIN

SELECT emp_obj(empno,ename,sal,job) BULK COLLECT INTO v_emp_nt FROM EMP;

FOR i in v_emp_nt.first..v_emp_nt.last 
LOOP

IF v_emp_nt(i).job='CLERK' THEN 

    v_emp_nt(i).sal := v_emp_nt(i).sal +200;

ELSIF v_emp_nt(i).job='MANAGER' THEN

    v_emp_nt(i).sal := v_emp_nt(i).sal +800;
END IF;

END LOOP;

open p_rec for select * from table(v_emp_nt); 

END test_proc;

END test_pkg;
/

コードを見てきたように、私がしていることは、nested table(カーソルが何をしているか) で目的の結果を取得し、結果のレコードに基づいて何らかの操作を行い、ネストされたテーブルを更新することです。

最後にこれからカーソルを作成し、updated nested table開いた後にカーソルを返します。 前後の結果比較

今あなたの質問:How can you return append cursor

簡単ですcreate two nested table ,do some manipulation on both the nested table

v_emp_nt1asを持っているとfirst nested tableします。あなたは別のv_emp_nt2ものを持っていsecond nested tableます、あなたはそれに何らかの操作をします。

今、あなたのcursor意志は次のようになります

 open p_rec FOR (select * from v_emp_nt1 union select * from v_empnt2);

このようにして、目的の出力を実現できます。

**注:** 上記のコードは 1 つの入れ子になったテーブル用です。コードを完成させるには、別の入れ子になったテーブルを作成する必要があります。

于 2012-05-26T11:08:59.557 に答える