PL / SQL模糊代码

时间:2015-04-13 15:03:19

标签: sql oracle plsql plsqldeveloper

我在工作中遇到了关于PL / SQL的模糊代码,拜托,你能解释一下,这意味着什么?

PL / SQL执行'select'请求,例如

DECODE(SIGN(ABS(SUM(amount))) - :3, -1, 0, SUM(AMOUNT)),

什么是' - :3'?是什么功能?

1 个答案:

答案 0 :(得分:2)

这可以作为一个很好的例子,说明如何分解令人困惑的代码行来弄清楚发生了什么。您没有包含整个查询,因此有些事情必须脱离上下文。首先,添加一些空格来阐明各个嵌套函数,并使其现在更具可读性:

DECODE(  SIGN( ABS( SUM(amount)  )  ) - :3, -1, 0, SUM(AMOUNT)   ),

然后首先分析它们以了解发生了什么:

DECODE(  SIGN( ABS( **SUM(amount)**  )  ) - :3, -1, 0, SUM(AMOUNT)   ),

首先将名为“amount”的列加起来,该列是我们看不到的查询的一部分

DECODE(  SIGN( **ABS( SUM(amount)  )**  ) - :3, -1, 0, SUM(AMOUNT)   ),

然后得到它的绝对值(删除标志)

DECODE(  **SIGN( ABS( SUM(amount)  ) )** - :3, -1, 0, SUM(AMOUNT)   ),

然后返回一个表示符号的值。如果< 0返回-1,或者如果= 0则返回0并且如果> 0返回1.由于ABS()函数,它只能是0或1。实际上,似乎是测试值是否为0。

DECODE(  **SIGN( ABS( SUM(amount)  ) ) - :3**, -1, 0, SUM(AMOUNT)   ),

从中,减去第3个绑定变量中传递的任何值(其他人已经给出了绑定变量的信息)。这是将在解码语句中测试的表达式。

如果值为-1,则返回0,否则返回amount列的总和。

有些事情似乎没有意义,比如获取剥离符号的绝对值,然后调用sign()函数。然而,没有规格和完整的选择会显示出什么类型的价值:3是很难知道原始意图是什么。我怀疑这就是你在这里的原因,因为你是一个幸运的人,想知道为什么这不能按预期工作。当你弄明白时,在代码中添加注释,以澄清你的想法并帮助下一个人。

祝你好运!