将 PLSQL 过程/函数标记为已弃用
Posted
技术标签:
【中文标题】将 PLSQL 过程/函数标记为已弃用【英文标题】:Mark PLSQL procedure/function as deprecated 【发布时间】:2015-09-24 11:52:59 【问题描述】:某些编程工具(如 C# 或 Java)可以将过程/函数标记为已弃用。但是 Oracle PLSQL 没有为此提供内置功能。我想知道还有其他方法可以支持此功能。
我希望它们显示为“关于正在编译的任何 PL/SQL 代码的 PL/SQL 编译器警告。”。
96/43 PLW-06005: inlining of call of procedure 'TEST' was done
【问题讨论】:
我对 C# 和 Java 都不熟悉。您能否澄清一下当 PL/SQL 子例程被标记为已弃用时会发生什么。 你遇到过这个oracle论坛帖子吗? community.oracle.com/thread/2342126 这对于另一个 pragma 来说可能是个好主意:“pragma deprecated proc_name [msg]”。可选消息可能类似于“改用 alt_proc_name”。 听起来很合理。发布到Oracle Database Ideas。 Oracle 在 12.2 版中增加了对此的支持。我已经添加了一个详细的答案。 【参考方案1】:在 Oracle 12.2 版中,为此有一个新的pragma
:
pragma deprecate ( deprecated_thing, 'Message to other developers' );
... 其中deprecated_thing
是任何PL/SQL 标识符。可以弃用以下内容:
例如:
CREATE OR REPLACE PACKAGE old_package AS
PRAGMA DEPRECATE(old_package , ’Package old_package has been deprecated in favor of new_package’);
PROCEDURE p1;
PROCEDURE p2;
END old_package;
任何尝试编译使用您已弃用的任何东西的东西的人都会收到 PLW-6019 到 PLW-6022 范围内的 PL/SQL 警告。
您可以按如下方式启用这些警告,以便在您尝试编译代码时看到它们:
alter session set plsql_warnings = 'enable:(6019,6020,6021,6022)';
或者,您可以将会话设置为将这些警告视为错误:
alter session set plsql_warnings = 'error:6020';
或者,您可以设置对象本身以使任何人使用它都会出错:
alter package <package with deprecated stuff> compile plsql_warnings = 'error:6020' reuse settings;
【讨论】:
【参考方案2】:这不是 Oracle 和 PL/SQL 语言支持的功能。您必须开发一种框架,该框架将在执行开始时检查变量以确定代码是否已贬值,但这一切都必须由开发团队手动处理。 这根本不是 Oracle 尚未包含的功能。
【讨论】:
【参考方案3】:我们有一个基于PL/SQL Source Code Control inside the database – After Compile trigger for automatic archiving 的自定义解决方案。
每当我们编译(创建或替换)一个 PL/SQL 对象时,都会触发 CREATE DDL 事件,我们可以使用自己的触发器拦截该事件。此时,我们有各种信息可用于将新记录插入到 PLSQL_ARCHIVE 表中。
整体流程如下
触发器收集有关已编译对象的信息(关键字 厘米)。这些关键字之一是标题方法中的deprecated
(默认:false
)。
然后触发器分析使用的方法并检查是否已弃用。如果
该方法已过时,然后存储在我们的warning_table
中。
为了显示警告(棘手的部分),我们重写了视图
USER_ERRORS
与我们的 warning_table
合并。
现在我们在编译对象时有一个有用的消息:
OPLW-00001: The method SomeDeprecatedMethod is deprecated
注意:对不起,我不能分享源代码,因为是内部开发。
【讨论】:
【参考方案4】:dbms_output.put_line('This function is deprecated');
【讨论】:
编译代码时不执行dbms_output dbms_output.put_line 只有在方法执行时才“可见”。问题是“关于正在编译的任何 PL/SQL 代码的编译器警告”。 是的,完全清楚。 DDL 触发器将是一种方式。干杯 ;)以上是关于将 PLSQL 过程/函数标记为已弃用的主要内容,如果未能解决你的问题,请参考以下文章