Как манипулировать данными в соответствии со значениями курсора, которые также являются возвращаемым значением хранимой процедуры в Oracle SQL? - PullRequest
0 голосов
/ 12 июля 2011

У меня есть хранимая процедура Oracle SQL, которая возвращает курсор. Этот курсор получает в теле хранимой процедуры значение сложного оператора выбора (в приведенном ниже примере я сделал оператор выбора простым).

Затем я хочу использовать курсор для двух вещей: 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 Ответ

1 голос
/ 12 июля 2011

Вы не можете копировать или клонировать курсор в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...