Oracle 从函数更新列的过程

Oracle 从函数更新列的过程,oracle,plsql,Oracle,Plsql,我有个问题。 我需要创建一个从表1中获取或_id循环的过程。 表1中的这个id是一个参数调用函数,返回两个值d1和d2 表1中的值d1和d2必须更新。 怎么做?该函数工作正常,但我不知道如何循环它 CURSOR rec_cur IS SELECT s.or_id from table1 s; id number; a_BASKET_ID varchar(20); a_ORDER_ID v

我有个问题。 我需要创建一个从表1中获取或_id循环的过程。 表1中的这个id是一个参数调用函数,返回两个值d1和d2

表1中的值d1和d2必须更新。 怎么做?该函数工作正常,但我不知道如何循环它

   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;

这是我最近看到的最丑陋的代码之一。为了您自己(以及我们自己),请学习如何正确格式化和缩进代码,使其更易于阅读和理解

此外,它是无效的-缺少
声明
,没有
结束
,您声明了一些变量(
a_篮子id
a_订单id
),但使用了另一个变量(
a_篮子id
a_订单类型
)。。。一团糟

关于您的问题:据我所知,一切都可以在一个
UPDATE
语句中完成,不需要PL/SQL:

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

如果您坚持使用PL/SQL,请看一看:我使用了游标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;

那个函数的返回类型是什么?我完全同意你对第一段的看法:)