2011-07-12 7 views
0

カーソルを戻すoracle sqlストアド・プロシージャがあります。 このカーソルは、ストアドプロシージャ本体に複雑なselect文の値を取得します(下の例では、select文をシンプルにしています)。Oracle sqlのストアド・プロシージャの戻り値であるカーソル値に従ってデータを操作する方法は?

その後、私は2つのことのためにカーソルを使用したい: 1.ストアドプロシージャ本体内の別のテーブル内のいくつかの値を更新するために、そのデータを使用してストアドプロシージャ 2の戻り値として使用してください

私はそれを行う方法を見つけることができませんでしたので、その間に(複雑な)select文を複製し、別のカーソルを別のテーブルを更新するための値にしなければなりませんでした。

create or replace procedure sp_GetBuildings(returned_cursor OUT SYS_REFCURSOR, 
               timeFrameHrsParam number) is 
    v_buildingID Buildings.buildingId%type; 

     cursor t_result is 
      select customerId 
      from (select buildingId from Buildings) b 
      inner join Customers c on c.building_id = b.building_id; 
    begin 
     open returned_cursor for 
      select customerId 
       from (select buildingId from Buildings) b 
       inner join Customers c on c.building_id = b.building_id; 
     for t in t_result 
      loop 
       v_buildingID := t.building_id;     
       update Buildings set already = 1 where building_id = v_buildingID ; 
      end loop;   
     commit; 
    end sp_GetBuildings; 

select文のレプリケーションを節約できる解決策を教えてください。

答えて

1

Oracleではカーソルをコピーまたはクローン作成できません。カーソルは、結果セットへのポインタに過ぎず、カーソルを読み取ると結果リストに沿って一方向に移動します。ただし、配列を使用すると、非常によく似たものを実現できます。

CREATE TYPE nt_number AS TABLE OF NUMBER; 

CREATE OR REPLACE PROCEDURE sp_getbuildings(returned_table OUT nt_number, 
              timeframehrsparam NUMBER) IS 
    CURSOR t_result IS 
     SELECT customerid 
     FROM  buildings b 
       JOIN customers c 
       ON c.building_id = b.building_id; 
    i NUMBER; 
BEGIN 
    OPEN t_result; 

    FETCH t_result 
    BULK COLLECT INTO returned_table; 

    CLOSE t_result; 

    FORALL i IN returned_table.FIRST .. returned_table.LAST 
     UPDATE buildings 
     SET already = 1 
     WHERE building_id = v_buildingid; 

    COMMIT; 
END sp_getbuildings; 
関連する問題