【问题标题】:Oracle - How to write simple PL/SQL procedureOracle - 如何编写简单的 PL/SQL 过程
【发布时间】:2011-12-16 20:35:46
【问题描述】:

我需要创建一个包含会话的表。成功通过身份验证的新用户将被添加到表中。每次用户打开页面时,用户都会在此表中进行检查。所以我想使用每分钟运行一次的 PL/SQL 程序并删除超过 30 分钟的会话来刷新“死亡”会话。

或者也许每次重新加载页面时执行DELETE FROM "Dates" WHERE "Date" < SYSDATE - 1/48;会是一个更优化的解决方案?

【问题讨论】:

  • 呃,出于好奇,为什么要使用 PL/SQL 过程?这是否意味着由 dbms_scheduler 或其他东西运行?
  • 或者如果我每次重新加载页面时都执行 ... 可能应该避免在页面加载期间杀死“死会话”,但将其作为偶尔运行的后台进程(比如每 5 分钟运行一次)即使每分钟运行一次,服务器上的负载也会比每次页面加载时执行的负载要少得多。 (假设一个稍微成功的 Web 应用程序。)并且避免因为页面不需要的东西而减慢页面加载速度。正如 Jeff Atword 所说,“性能是一种特征。” codinghorror.com/blog/2011/06/performance-is-a-feature.html

标签: oracle oracle10g oracle11g


【解决方案1】:
delete 
from table
where date_column < sysdate - 30/1440;

1 是一天

1/1440 是一分钟

30/1440 等于 30 分钟

【讨论】:

  • 正确,除非绝对必要,否则不要担心走 PL/SQL 路线。
【解决方案2】:

您不需要程序来执行此操作。简单的删除查询就足够了。

DELETE FROM "Dates" WHERE "Date" < SYSDATE - 1/48;

如果你一定需要过程,你应该把这个查询包装到过程中。

【讨论】:

  • 这里有更多信息:我需要创建一个带有会话的表。成功通过身份验证的新用户将被添加到表中。每次用户打开页面时,用户都会在此表中进行检查。所以我想使用 PL/SQL 程序,它将每分钟运行一次并删除大于 30 分钟的会话来刷新“死亡”会话。或者如果我执行这个“DELETE FROM "Dates" WHERE "Date"
  • 这三个(sql语句、触发器、pl/sql过程)中哪一个使用的硬件资源较少?
  • 我已将更多信息移至问题
  • 尝试这种方式首先创建一个表,每当有人使用用户名登录帐户时,在该表中插入一个条目(这是由触发器完成的),在插入触发器之前将检查您的条件是什么需要。
【解决方案3】:

SQL

delete from mytable
  where mytable.datefield < sysdate - .02083333333333333333;
commit;

.02083333333333333333 是 1800 / 86400,即 30 分钟(以秒为单位)/一天中的秒数

如果您正在编写触发器或存储过程,您将使用 PL/SQL。请详细说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多