我有这样的要求:我必须使用存储过程从Oracle表中选择一定数量的记录。我将在ref游标中捕获整个结果集,但同时我必须更新所选记录中的标志(存储在ref游标中的标志)。
所以我想知道这是否可以在存储过程中使用。如果是,那么我必须使用什么,例如触发?
提前致谢
答案 0 :(得分:1)
光标不会“捕获”或“存储”任何内容。要存储内容,请使用PL / SQL表。 可能是你想要做的最接近的事情:
DECLARE
type t_foobar is table of foobar;
v_foobar t_foobar;
BEGIN
UPDATE foobar SET flag=1 WHERE foo=bar AND flag=0 AND rowum<=10;
SELECT * FROM foobar BULK SELECT INTO v_foobar WHERE flag=1;
UPDATE foobar SET flag=2 WHERE flag=1;
COMMIT;
/* process v_foobar here */
END;
我在这里做两个UPDATE,以便在并发环境中,每个会话选择并更新不同的行。 (例如飞机座位预订系统)
答案 1 :(得分:1)
听起来您正在尝试确保多个进程不选择相同的行?
SELECT FOR UPDATE NO WAIT可能是您的最佳选择 http://download.oracle.com/docs/cd/E11882_01/appdev.112/e10472/static.htm#CIHHIIID
虽然它是11.2,但它适用于早期版本的Oracle,例如10g。
答案 2 :(得分:1)
首先,您不会“在ref游标中捕获整个结果集”,ref游标是结果集的指针。实际上,你返回的是一个查询,它将(或技术上可能)由接收它的任何东西执行。
我忘记了参考光标并使用pipelined table function。这样,程序可以处理记录(即将它们标记为已更新),因为它将它们返回给调用者。
答案 3 :(得分:0)
Ref游标是不可修改的,因为它们仅存在于内存中。它们是一个参考,如名称所示。您必须单独执行更新。