【问题标题】:trigger in oracle stored procedureoracle存储过程中的触发器
【发布时间】:2009-12-19 09:21:19
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 我们需要有关您的要求的更多详细信息?是否要将更改的列包含在结果集中?您希望在返回结果集之前提交更改吗?还是只有在处理完记录后才更新标志?
  • 感谢您的快速回复。这是我的详细要求实际上表中的记录数非常多,所以我在循环中调用存储过程,并且在每次迭代中我都选择一组记录。现在,为了避免重复记录选择,一旦我选择了记录,我将更新标志,以便在下一次迭代中不会选择它们。希望我清楚地提到了我的要求。只是想确保我们可以在存储过程中执行此操作,如果可以,那么我可以花一些时间在它上面..或者考虑不同的方法
  • 您需要返回引用游标还是处理该存储过程中的行?
  • @Vivek - 不,您还没有明确说明您的要求。如果您阅读回复,您会发现人们仍在提问或做出假设。您希望我们花时间回答您的问题。您至少可以花一些时间来解释您正在努力实现的目标。我怀疑有一种更有效的方法来实现这一点,但我不确定,因为我仍然不确定您的流程到底在做什么。

标签: oracle stored-procedures


【解决方案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;

我在这里进行了两次更新,以便在并发环境中,每个会话都选择并更新不同的行。 (例如,对于飞机座位预订系统)

【讨论】:

  • 我有一个疑问,如果前 10 行已经标记并且不需要选择,那么这个 rownum 的概念是否有效
  • 是的,这就是AND flag=0 的用途。它仅返回尚未处理的行。确保在该标志列上放置一个索引,并考虑错误处理。如果您在提供的版本中处理失败,您将不会再找到失败的行...
  • Vivek:Oracle 会在所有其他过滤器之后应用 rownum 过滤器,所以不用担心。
【解决方案2】:

听起来您正在尝试确保多个进程不会选择相同的行?

SELECT FOR UPDATE NO WAIT 可能是您的最佳选择。
http://download.oracle.com/docs/cd/E11882_01/appdev.112/e10472/static.htm#CIHHIIID

虽然这是 11.2,但它适用于早期版本的 Oracle,例如 10g。

【讨论】:

    【解决方案3】:

    首先,您不会“在引用游标中捕获整个结果集”,引用游标是指向结果集的指针。实际上,您返回的是一个查询,该查询将(或技术上可能)由接收它的任何人执行。

    我会忘记引用光标并使用pipelined table function。这样,该过程可以在将记录返回给调用者时处理记录(即将它们标记为已更新)。

    【讨论】:

      【解决方案4】:

      引用游标是不可修改的,因为它们只存在于内存中。它们是参考,如名称所示。您必须单独执行更新。

      【讨论】:

      • 大家好,再次解释我的要求:我有一个包含数千条记录的表。我必须处理所有这些记录,但我不能同时处理所有记录,我一次只能处理 1000 条记录。所以我使用存储过程并在循环中调用它。现在为了避免再次获取重复记录,我正在为我在一次迭代中选择的所有记录更新一个标志,这就是为什么我必须更新在存储过程中选择的所有记录。跨度>
      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 2021-11-02
      • 2011-09-30
      • 2018-01-18
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      相关资源
      最近更新 更多