Процедура обновления столбца из функции - PullRequest
0 голосов
/ 23 января 2019

У меня проблема. Мне нужно создать процедуру, которая извлекает цикл or_id из table1. Этот идентификатор из таблицы1 является параметром, вызывающим функцию, которая возвращает два значения d1 и d2.

Значения d1 и d2 должны быть обновлены в таблице1. Как это сделать? Функция работает правильно, но я не знаю, как ее зациклить.

   CURSOR rec_cur IS

       SELECT s.or_id from table1 s;
              id number; 
              a_BASKET_ID varchar(20); 
              a_ORDER_ID varchar (20);

   BEGIN open rec_cur; loop
     fetch rec_cur into number;   
  EXIT WHEN rec_cur%NOTFOUND;    
  SELECT cut(v_param,1,'@') a_BASKET_ID, 
         cut(v_param,2,'@') a_ORDER_ID   
  FROM (SELECT function1(or_id) v_param FROM dual);

  UPDATE table1 b
      SET BASKET_ID = a_BASKETID,
      ORDER_ID = a_ORDERTYPE
      WHERE b.or_id = s.or_id;
END LOOP;

1 Ответ

0 голосов
/ 23 января 2019

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

Более того, он недопустим - отсутствует в DECLARE, нетEND, вы объявили некоторые переменные (a_basket_id, a_order_id), но использовали другие (a_basketid, a_ordertype) ... довольно беспорядок.

По вашему вопросу: насколькокак я понял, все можно сделать одним оператором UPDATE, PL / SQL не требуется:

update table1 set
  basket_id = cut(function1(or_id), 1, '@'),
  order_id  = cut(function1(or_id), 2, '@');

Если вы настаиваете на PL / SQL, посмотрите на это: IИспользуется курсорный цикл FOR, поскольку его проще поддерживать, чем явный курсор (поскольку вам не нужно создавать переменные курсора (ов), открывать курсор, беспокоиться о выходе из цикла, закрывать курсор - Oracle сделает это за вас),Хотя вам вообще не нужны локальные переменные (ни PL / SQL, как я уже говорил), я позволю им быть.

declare
  a_basket_id  table1.basket_id%type;
  a_order_id   table1.order_id%type;
begin
  for cur_r in (select or_id from table1) loop
    a_basket_id := cut(function1(cur_r.or_id), 1, '@');
    a_order_id  := cut(function1(cur_r.or_id), 2, '@');

    update table1 set
      basket_id = a_basket_id
      order_id  = a_order_id
      where or_id = cur_r.or_id;
  end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...