将 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 过程/函数标记为已弃用的主要内容,如果未能解决你的问题,请参考以下文章

将 pybind11 绑定标记为已弃用的最佳方法

如何在 RAML 中将 REST 服务标记为已弃用

重命名python子包,将旧名称标记为已弃用

是否可以在打字稿中将某些内容标记为已弃用?

如何在 Delphi 中将单个枚举值标记为已弃用

代码分析/FxCop CA1726:UsePreferredTerms 显示已取消为已弃用