Вернуть базовый набор результатов из Oracle 11g - PullRequest
0 голосов
/ 16 ноября 2011

Я пытаюсь вернуть набор результатов из таблицы Oracle 11g, после получения набора мне нужно установить все выбранные строки как обновленные.

Приведенный ниже скрипт возвращает только одну строкув то время, и я не могу заставить обновление работать так, как мне нравится.Некоторое базовое объяснение будет высоко ценится.

Может быть, это также плохая идея использовать тип строки?

CREATE OR REPLACE PROCEDURE OWNER_EXT.X_GETEXTERNALACCOUNTREF(result out X_externalaccountref%rowtype)
 IS
    cur SYS_REFCURSOR;

 BEGIN

 open cur for select * from X_externalaccountref WHERE externalstatus IS NULL;


  LOOP
   FETCH cur INTO result;

   update X_externalaccountref set  externalstatus = 1, externalchangedate = SYSDATE() where X_id = result.X_id; 

   EXIT WHEN cur%NOTFOUND;
  END LOOP;

  close cur;

 END;
/

Ответы [ 2 ]

1 голос
/ 16 ноября 2011
update X_externalaccountref 
set  externalstatus = 1
, externalchangedate = SYSDATE
where externalstatus  is null;

Почему бы и нет?

1 голос
/ 16 ноября 2011

Почему возвращается только одна запись: вы перебираете набор записей, выбирая одну запись за раз, и каждый раз назначаете эту запись выходной переменной.Таким образом, только ваша последняя запись будет сохранена в выходной переменной.

То, что вы хотите сделать, это вернуть набор записей.Для этого вы можете использовать таблицы pl / sql.Чтобы легко получить набор в таблицу, вы можете использовать массовый сбор в ( ссылка - но Google найдет вас гораздо больше).Вы можете использовать тип строки в качестве типа для своей таблицы или тип, который вы создаете сами.Вы можете использовать переменную пакета для объявления типа или определить тип в схеме базы данных.Если вы используете rowtype, это совсем не плохо.Если ваша таблица должна измениться, то тип строки будет также отражать это, избавляя вас от хлопот, связанных с обходом кода для добавления или удаления столбцов, если вы вручную объявили каждый столбец в своем собственном типе.

Пример:

function hand_out_money
return pck_emp.t_tab_emp
is
   tab_emp pck_emp.t_tab_emp;
begin
   select *
     bulk collect into tab_emp
     from emp
    where deptno = 20;

   update emp 
      set comm = comm + 10 
    where deptno = 20;

   return tab_emp;
end;

Чтобы использовать это, объявите t_tab_emp в package_spec.Таким образом, вы можете ссылаться на возвращаемый тип, откуда вы вызываете этот код.Просто вставьте туда type t_tab_emp is table of emp%rowtype; - как я сделал бы в пакете pck_emp.

Тогда ваш код вызова может быть:

declare
   tab_result pck.t_tab_emp;
begin
   tab_result := hand_out_money;
end;

Чтобы обновить информацию: если вы извлекаете все свои записи втаблицу plsql, после чего вы можете сделать один оператор обновления:

update X_externalaccountref 
   set externalstatus = 1, externalchangedate = SYSDATE
 where externalstatus IS NULL;

Также : вы можете просто использовать функцию, если вы только вернете эту одну переменную, это будет иметь смыслgetter.

Также : мне обычно не нравятся функции или процедуры с именем 'getxxx', которые затем выполняют DML.Более уместным было бы назвать вашу процедуру «activ_external_accounts», например, которая затем вернет набор записей.Имейте в виду, что если вы сделаете массовый выбор перед обновлением, externalstatus и externalchangedate не будут обновлены!Таким образом, вы получаете не возвращенный набор результатов, а набор перед обновлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...