我有问题。 我需要创建一个从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;
答案 0 :(得分:1)
这是我最近看到的最丑陋的代码之一。为了您自己(以及我们自己)的缘故,请学习如何正确设置格式和缩进代码并使其更易于阅读和遵循。
此外,它是无效的-缺少DECLARE
,没有END
,您声明了一些变量(a_basket_id
,a_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, '@');