在oracle存储过程中触发

时间:2009-12-19 09:21:19

标签: oracle stored-procedures

我有这样的要求:我必须使用存储过程从Oracle表中选择一定数量的记录。我将在ref游标中捕获整个结果集,但同时我必须更新所选记录中的标志(存储在ref游标中的标志)。

所以我想知道这是否可以在存储过程中使用。如果是,那么我必须使用什么,例如触发?

提前致谢

4 个答案:

答案 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游标是不可修改的,因为它们仅存在于内存中。它们是一个参考,如名称所示。您必须单独执行更新。