为什么下面的查询在Oracle 10上失败而在Oracle 11上不成功
SELECT trunc(DBMS_RANDOM.value(low => 10, high =>50)) from dual;
Oracle 10: ORA-00907: missing right parenthesis
这个答案有点推测性,但是对于缺少右括号错误的一个可能的解释是,这个错误并不是关于缺少括号的。相反,如果DBMS_RANDOM.value
的API在Oracle 10和Oracle 11版本中不同,那么您可能会看到此错误。试试这个查询:
SELECT TRUNC(DBMS_RANDOM.value(10, 50))
FROM dual
如果这个工作,那么你将知道API在Oracle 10和11之间发生了变化。
这里是一个引用,使用API,因为我在我的查询。
这是11gR1中的新功能:
从这个版本开始,现在可以调用这个函数在SQL语句中。例如,命名表示法语法为:
SELECT f(pn=>3, p2=>2, p1=>1) FROM dual
或者,混合符号是:
SELECT f(1, pn=>3) FROM dual
在以前的版本中,尝试命名或混合表示法会导致一个错误。
所以在11g之前,你只能使用位置符号从SQL调用PL/SQL函数,例如
SELECT trunc(DBMS_RANDOM.value(10, 50)) from dual;
…就像@TimBiegeleisen已经展示的作品一样。"缺少右括号"错误并不一定意味着你的括号是不平衡的;只是解析器看到了一些出乎意料的东西,它认为括号可能在哪里——在这个例子中,在=>
。