【问题标题】:oracle plsql parameter default nulloracle plsql 参数默认为空
【发布时间】:2017-03-06 16:56:40
【问题描述】:

我必须在列中使用参数,并且列不能为空。但参数默认为空。我如何控制空值。 因为当我没有给出价值时,它会将价值视为 null 并且我的脚本正在失败。感谢您的帮助 示例 -

创建过程 test1(p_1 编号默认为空) 作为 开始 从表 1 中选择 col1、col2 其中 col1=p_1 -- 默认为 NULL;
结尾; /

enter code here

【问题讨论】:

  • 好吧,如果调用中没有提供值,你想在列中放入什么值?你必须有一些东西可以使用而不是 null。或者,如果参数为空,您是否要选择所有值? (您还必须选择进入某事...)
  • 嗨,alex,如果我不输入任何值,语句将忽略并在没有 where 条件的情况下执行。基本上我必须使用 2 个参数,1 我将输入值,另一个是默认 null。所以它会像 ,,,,, whrere col1=p_1 和 col2 = p_2。 p_2 我将输入值,p_1 将默认为 null
  • Alex,我在 into 子句中使用集合

标签: plsql oracle11g plsqldeveloper


【解决方案1】:

选项 1.- 其中 (nvl(col1, '[NULL]') = nvl(p_1, '[NULL]'))

选项 2.- 其中 (nvl(col1, '[NULL]') = coalesce(p_1, col1, '[NULL]'))

查询任何选项的宽度都比较昂贵。

选项 1.- 返回请求的值,并在空请求时返回空值。

选项 2.- 返回请求的值,以及空请求上的所有值。

将 '[NULL]' 值宽度替换为该类型和情况的意外值,对于索引,可以是 0(cero)或 -1(负数),对于日期,您可以查找 '01/01/0001' (一个意外的日期),对于字符串,您可以查找 '',但如果您的参数值可以具有域的任何值,您可以查找或结合第二列。

【讨论】:

    【解决方案2】:

    您可以使用or 使查询过滤器有条件:

    select col1, col2
    bulk collect into some_collectin
    from table1
    where p_1 is null or col1 = p_1
    

    如果p_1 为空,或者因为没有传递参数或者参数为空,那么第一部分匹配所有行。如果它不为 null,则第一部分不匹配任何行,因此应用相等性检查并仅过滤与参数匹配的行。

    如果你还有其他条件,那么记得用括号来确保整体逻辑是正确的:

    where (p_1 is null or col1 = p_1)
    and ...
    

    【讨论】:

    • 它工作了亚历克斯。多谢。我从早上开始就在挣扎。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多