Oracle 9i:据说缺少右括号

时间:2009-01-15 22:54:02

标签: oracle function ora-00907

我有一个用Oracle 9i(版本9.2.0.4.0)编写的简单函数来模拟内联IF。对于那些感兴趣的人,这里是代码:

create or replace
FUNCTION IIF  
   (testExpression NUMBER,
    trueResult NUMBER,
    falseResult NUMBER)
RETURN NUMBER   
AS
BEGIN
   /*
      A simple in-line IF function for use with SQL queries. If the test
      expression evaluates to any non-zero value, it is considered to be 
      true, and the trueResult is returned. Otherwise, falseResult is
      returned.
   */   
   IF (testExpression is null) or (testExpression = 0) THEN
      return falseResult;
   ELSE
      return trueResult;
   END IF;
END IIF;

这不是火箭科学。现在,这是一个很大的谜团:如果我执行以下SQL语句,一切都很好,并且完全符合我的预期:

SELECT IIF(1, 'true', 'false') FROM DUAL;
SELECT IIF(0, 'false', 'true') FROM DUAL;

但是,以下内容会从Oracle产生一个非常奇怪的错误:

SELECT IIF((0 = 1), 'false', 'true') FROM DUAL;

该错误如下:

ORA-00907: missing right parenthesis.
显然,事实并非如此。有没有人碰巧对这一点奇怪的解释?

目前正在进行大量的自我控制,以防止自己将Oracle服务器抛到窗外。 Oracle似乎 rife 有这些无聊的行为。

编辑:我是否需要使用某种神奇的语法在select语句中使用相等运算符?

5 个答案:

答案 0 :(得分:5)

也许你可以解释你想要做什么。我认为您正在寻找CASEDECODE函数,但我无法确定。看起来你出于某种原因正在反对SQL语言。

发生错误是因为Oracle不期望查询的select子句中存在关系运算符:

SQL> SELECT IIF(1>7, 0, 1) FROM DUAL;
SELECT IIF(1>7, 0, 1) FROM DUAL
            *
ERROR at line 1:
ORA-00907: missing right parenthesis

SQL> SELECT 1=0 FROM DUAL;
SELECT 1=0 FROM DUAL
        *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

请参阅this Ask Tom article

答案 1 :(得分:3)

你想要

SELECT CASE WHEN *expr* then 'true' else 'false' end col_alias FROM DUAL;

或简单的相等测试

SELECT DECODE(*val1*,*val2*,'true','false') col_alias FROM dual;

这比执行PL / SQL功能要好得多。 您的方法不起作用的原因有很多。

  1. 布尔值不是Oracle数据类型。

  2. 它们是PL / SQL数据类型,但即使这样也没有隐式转换为数字(零假,非零)

  3. 没有'expression'数据类型,因此SQL引擎无法将表达式传递给PL / SQL。

  4. 即使将表达式作为字符串传递给PL / SQL,PL / SQL引擎也无法动态评估字符串中的表达式。它必须将字符串构建为动态SQL语句并动态执行,返回结果(以有效的SQL数据类型,如字符串或数字)。

答案 2 :(得分:1)

  1. Oracle数据库中没有BOOLEAN类型,因此您不能使用“(1 = 0)”之类的表达式。
  2. 即使存在BOOLEAN类型,也已声明第一个参数为NUMBER类型。你必须传递一个数字,或者可以隐式转换为一个数字。
  3. 最后,我不明白你的任何一个例子除了“无效数字”之外是如何实际产生的,因为你的第二和第三个参数也不能转换为数字。

答案 3 :(得分:0)

从未使用过oracle我不能直接提供任何合理的建议,但是看看语句可能是oracle有问题从布尔推断数字?..

IIF签名期望NUMBER作为第一个参数,并且在通话中您正在通过BOOL评估。

这只是一个想法。

答案 4 :(得分:0)

除了解码和大小写外,还有nvl。