【问题标题】:PL SQL Parameter List EmptyPL SQL 参数列表为空
【发布时间】:2016-05-29 03:48:03
【问题描述】:

如果我有这样的 PL SQL 过程:

Create Or Replace Procedure get_age (first_name varchar(40), last_name varchar(50))

Begin

Select age
From Person
Where first = first_name AND last = last_name;

End;

不保证用户会传入first_namelast_name 变量的值。

如果其中一个变量没有值,我不希望在我的查询的Where 子句中出现first_namelast_name,我该如何在上述过程中说明这一点。

【问题讨论】:

  • 我认为这不是您拥有的实际代码。参数没有长度,过程中的select 必须有into,否则必须使用它来打开游标。如果你只是检索一个值,你会想要一个函数而不是一个过程。如果任一参数是可选的,您可以获得多行,那么您希望发生什么?

标签: sql plsql oracle11g


【解决方案1】:

您的查询与现在一样好,您可以在 WHERE 子句中接受空值:

Where (first = first_name OR first_name is NULL) AND (last = last_name OR last_name in NULL);

这样,用户可以输入名字和姓氏,只输入名字或姓氏,或者都不输入,结果将按预期选择。

【讨论】:

  • 感谢您的回复。当您在 where 子句中说 first_name is NULLlast_name in NULL 时,是否将参数 first_namelast_name 设置为 NULL?那么如果用户没有传入任何 first_name 或 last_name 作为参数,这个 where 子句的输出会是什么?由于您在 where 中将参数设置为 NULL,但这对 where 子句有何影响?
  • 嘿,这只是从用户那里获取输入,first_name last_name。所以基本上当他们输入名字和姓氏时,它只选择与输入的第一个和最后一个匹配的行。如果他们省略了一个参数,那么测试将自动通过。因此,如果他们不输入 first_name,where 子句是 (TRUE) AND (last = last_name),这种情况下用户可以仅按姓氏搜索。他们不输入任何参数 (TRUE) 并且 (TRUE) 返回所有行。这是一个非常动态的函数
【解决方案2】:

创建或替换过程 get_age (first_name varchar(40) default null, last_name varchar(50) default null)

开始

从人中选择年龄,其中 first = nvl(first_name,first) AND last = nvl(last_name,last);

结束;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2018-07-12
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多