从功能更新列的过程

时间:2019-01-23 13:31:34

标签: oracle plsql

我有问题。 我需要创建一个从table1提取or_id循环的过程。 来自table1的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;

1 个答案:

答案 0 :(得分:1)

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

此外,它是无效的-缺少DECLARE,没有END,您声明了一些变量(a_basket_ida_order_id),但使用了其他变量({{1 }},a_basketid)...一团糟。

关于您的问题:据我了解,所有操作都可以在单个a_ordertype语句中完成,不需要PL / SQL:

UPDATE

如果您坚持使用PL / SQL,请看一下:我使用了游标FOR循环,因为它比显式游标更易于维护(因为您不必创建游标变量,请打开游标,担心退出循环,请关闭游标-Oracle会为您完成此操作)。尽管您根本不需要局部变量(就像我已经说过的那样,也不需要PL / SQL),但我还是把它们保留了。

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