【问题标题】:PL/SQL obscure codePL/SQL 晦涩的代码
【发布时间】:2015-04-13 15:03:18
【问题描述】:

我在工作中遇到了关于 PL/SQL 的晦涩代码,请您为我解释一下,这是什么意思?

PL/SQL 执行“选择”请求,例如

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

' - :3' 是什么?有什么作用?

【问题讨论】:

  • MySql 中没有 DECODE 功能。那是 Oracle PL/SQL 吗?如果是,那么:3 是绑定变量的名称。
  • 是的,它是PL SQL代码。它调用简单的 sql 'select' 请求并在请求中使用这个绑定变量。但它绑定什么???我在此请求或剩余代码中没有另一个 ':3'?我如何才能找到此代码在此 olace 中使用的数字(数量)?
  • 请编辑问题以显示整个 SQL 字符串,以及使用 execute immediate 运行它的方式 - 这将更容易解释绑定变量代表什么以及它的实际运行时值在哪里来自。

标签: sql oracle plsql plsqldeveloper


【解决方案1】:

这可以用作一个很好的例子,说明如何分解令人困惑的代码行以找出发生了什么。你没有包括整个查询,所以有些事情必须断章取义。首先,添加一些空格来阐明各个嵌套函数,使其更具可读性:

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

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

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

首先对我们看不到的查询中称为“金额”的列求和

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

然后得到它的绝对值(去掉符号)

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

然后返回一个表示符号的值。如果 0 返回 1。由于 ABS() 函数,它只能是 0 或 1。实际上,它似乎在测试该值是否为 0。

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

从中减去在第三个绑定变量中传递的任何值(其他人提供了有关绑定变量的信息)。这是将在 decode 语句中测试的表达式。

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

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

祝你好运!

【讨论】:

  • 感谢您的澄清!
  • 我不写代码,我应该测试它们——你的答案——很有用。谢谢你。我无法复制整个代码 - 因为它保护了公司的权利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2016-03-02
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多