忽略 PL/SQL 函数的返回值

Posted

技术标签:

【中文标题】忽略 PL/SQL 函数的返回值【英文标题】:Ignoring a PL/SQL function's return value 【发布时间】:2019-11-05 09:49:02 【问题描述】:

有时我调用一个 PL/SQL 函数来接收和处理它返回的值。其他时候,我只想调用相同的函数来产生副作用。

例如,考虑一个将其参数记录在表中的日志记录函数,然后返回由相同参数创建的格式化字符串。有时我想使用返回的值,例如将其显示给用户,其他时候我只是调用表记录的函数并忽略返回值。在后一种情况下,我想避免声明一个变量来保存返回值并编写一个赋值语句。

This question 触及主题,答案似乎是调用者必须使用函数返回的值,无论是通过赋值语句还是select into

有没有办法在 PL/SQL 中调用函数并丢弃返回值?

【问题讨论】:

你为什么在乎?如果您出于某种原因必须调用它,请执行此操作。最简单的方法是将其分配给变量。如果你以后不做任何事情,那又怎样?换句话说,我不理解您的担忧(除了您希望避免声明变量这一事实之外)。 对我来说,分配一个变量然后什么也不做是一种代码味道,而不是调用一个已知具有理想副作用的函数,而忽略它的返回值。 @waldrumpus plsql 设计的很大一部分会导致代码异味,您必须习惯它。在这里减轻它的唯一方法是声明小的匿名块,如声明 x 号;开始 x := func();结尾;是的,它很丑,但至少未使用的变量不会污染外部范围。 @piezol - “plsql 设计的很大一部分导致代码异味” - 我认为你的意思是惯用的 PL/SQL 不同于惯用的 Java(或任何你的标准是)。很多所谓的异味其实都是试图将不合适的范式适配到 PL/SQL 中。 @APC 我认为您在这里一针见血。我的任务是实现一个包含大量活动部件的流程,并且所有控制逻辑也必须在 PL/SQL 中实现。这个问题源于我尝试用我习惯的方法解决这个问题 - 可能导致 PL/SQL 的一些不当使用。 【参考方案1】:

分配一个变量然后什么都不做是代码味道

如果我们谈论的是代码异味,那么拥有一个更改数据库状态的函数就有点奇怪了。约定是过程改变状态,函数只读取状态。

因此,以您为例,您可以将日志记录功能实现为 logger 包中的两个重载过程。

procedure log_this(p1_in number, p2 in timestamp, p_fmt_txt out varchar2);

procedure log_this(p1_in number, p2 in timestamp);

在包体中,第二个过程只是调用第一个过程并吞下out参数。

现在您可以调用适当的过程,具体取决于您是否要查看格式化字符串。

当然,如果你想在 SELECT 语句中调用你的函数,这个解决方案是行不通的,但是通过查询改变数据库状态确实是一种代码味道。

【讨论】:

这是一个我还没有想到的好主意。 @waldrumpus - 不是每个人都喜欢超载,但我认为谨慎使用它会带来巨大的好处。

以上是关于忽略 PL/SQL 函数的返回值的主要内容,如果未能解决你的问题,请参考以下文章

从 PL/SQL 函数返回多个值

具有布尔返回值的 pl/sql 函数的 OracleType?

在 pl/sql 函数中选择子句返回错误值

获取 ORA-06503 的原因:PL/SQL:函数返回没有值?

使用 JDBC 从 PL/SQL 存储函数中获取表返回值

检查后从表中返回值的 PL/SQL 函数