【问题标题】:Oracle, execute pl/sql code before stored procedure callOracle,在存储过程调用之前执行 pl/sql 代码
【发布时间】:2021-02-10 23:19:58
【问题描述】:

是否有可能在存储过程之前自动执行一些 PL/SQL 代码?诸如“on-before”之类的执行?

按照业务逻辑,每个存储过程都应该在一些名为“登录”的步骤之后执行。这不是登录数据库而是登录产品,我们无法改变这种行为,因为系统是由另一个团队开发的。我们不应该忘记每次都称其为“登录”。

在 Oracle 中是否有任何解决方案可以自动化此类事情?包是否有类似“初始化”部分的内容?

【问题讨论】:

  • 您是否考虑过编写执行“登录”功能的包装程序,然后调用第 3 方程序?
  • 另外,这个功能是否需要在每个会话中只运行一次?还是在每个程序执行之前?如果只是一次,您可以考虑编写一个 AFTER LOGON 触发器。
  • 我的看法是这样的:我们不能忘记每次都称它为“登录”。这就是你一直在做的事情。跨度>
  • 关于包装器 - 是的,我们现在正在使用这种方式,但是当新手忘记它们时会出现问题。登录后触发是一个有趣的想法,我会试试看。
  • @Del 感谢您的建议,但 AFTER LOGON 触发器无法帮助我,因为我们总是登录到数据库,但如何保证我们登录到系统?在执行程序之前,我们确实需要一些步骤。

标签: oracle stored-procedures plsql package initialization


【解决方案1】:

听起来您正在做的是登录应用程序,因此实际上需要在该应用程序中调用 LOGIN 过程。 @Del 提出的问题是相关的问题。如果答案是在对应用程序的每个过程执行之前,那么您需要在调用该应用程序中的另一个过程之前调用该 LOGIN 过程。但是,如果它是每个会话一次的要求,那么实际上存在一个“自动”过程。
您需要将所有调用接口例程放入一个包中。除了定义过程和函数之外,包本身还有一个执行部分。加载包时会自动执行此部分。该包在第一次调用其任何函数或过程时加载。
下面显示了您需要的包的骨架。 (仅限正文)

create or replace package interface_other_app as 
   procedure1 ... end procedure1; 
   procedure1 ... end procedure2; 
   last_procedure ... end last_procedure; 
BEGIN   -- package initialization. The code in here runs once when the pacaage is loaded. 
   other_app.login(application login parameters); 
end interface_other_app;



      

【讨论】:

  • 谢谢,带有执行部分的包听起来正是我需要的!还有一个问题 - 该部分是否每个会话执行一次?我的意思是当我进行另一个会话并从包中调用第一个过程时,BEGIN ... END 之间的代码将再次执行?
  • 我已阅读文档并找到答案 - 初始化部分每部分执行一次。 @Belayer,谢谢,我将问题标记为已回答。
  • 很高兴为您提供帮助。但稍作修正。执行部分在每次包加载时运行一次,每个会话都不需要一次。包可能会推出,特别是如果偶像一段时间,并且系统很忙。如果发生这种情况,包初始化/执行部分会在包再次加载时再次运行。这种情况并不常见,但确实会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2014-01-01
  • 2021-05-27
  • 2017-02-18
  • 2022-01-18
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多