Oracle 从函数更新列的过程
我有个问题。 我需要创建一个从表1中获取或_id循环的过程。 表1中的这个id是一个参数调用函数,返回两个值d1和d2 表1中的值d1和d2必须更新。 怎么做?该函数工作正常,但我不知道如何循环它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
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;
那个函数的返回类型是什么?我完全同意你对第一段的看法:)