ORACLE PL/SQL:函数和可选参数,如何?

jlr*_*lin 6 oracle plsql

我正在寻找创建一个不接受任何参数并返回所有结果的函数的最佳方法,但也接受参数并返回这些结果.

我在工作中一直在处理的标准是:

FUNCTION get_records (
  i_code                                 IN records.code%type := NULL,
  i_type                                 IN records.type%type := NULL
) RETURN results
Run Code Online (Sandbox Code Playgroud)

问题是我想返回类型为NULL的记录,并使用:

WHERE type = nvl(i_type, type)
Run Code Online (Sandbox Code Playgroud)

由于显而易见的原因,它只返回具有实际类型而不是空记录的记录.我只是想知道是否有一种标准的方法可以在我们使用的所有功能中实现.巧合的是,如果我提供参数...我不想要该字段的NULL值.

Har*_*son 5

为什么不简单地说你有什么

 type = i_type OR (i_type IS NULL AND type IS NULL)
Run Code Online (Sandbox Code Playgroud)

这样,当传入的param为null时,它会查找所有内容(包括空值)或指定的值.现在,如果你只想要空值......

示例(将值从null更改为5,您将看到输出)

WITH TESTDATA AS (
        SELECT LEVEL dataId
          FROM DUAL
         CONNECT BY LEVEL <= 100
        UNION
        SELECT NULL 
         from dual
)
SELECT * 
  FROM TESTDATA
 where dataId = :n or (:n is null AND dataId is null) ;
Run Code Online (Sandbox Code Playgroud)

然而:n = 6结果将是

DATAID                 
---------------------- 
6
Run Code Online (Sandbox Code Playgroud)

(删除了一个新帖子,误读了一个参数)但我喜欢这种新方法并避免使用NVL

如果你不对动态sql不利,这是一个很好的方法

http://www.oracle.com/technetwork/issue-archive/2009/09-jul/o49asktom-090487.html

  • 我建议将其更改为`type = i_type OR i_type IS NULL`.根据我的经验,这比使用NVL()更有可能利用`type`的索引.而且,对我来说似乎更清楚. (3认同)

Jef*_*emp 5

解决这个问题的标准方法是重载函数,而不是使用默认值:

FUNCTION get_records (
  i_code                                 IN records.code%type,
  i_type                                 IN records.type%type
) RETURN results;

FUNCTION get_records (
  i_code                                 IN records.code%type
) RETURN results;

FUNCTION get_records RETURN results;
Run Code Online (Sandbox Code Playgroud)

注意:如果您还需要一个单独的版本i_type,如果它具有相同的基础类型,您可能会遇到问题i_code- 在这种情况下,您需要为函数使用不同的名称。