2

为什么以下查询在 Oracle 10 上失败而不是在 Oracle 11 上。

SELECT trunc(DBMS_RANDOM.value(low => 10, high =>50)) from dual;

甲骨文 10:

ORA-00907: missing right parenthesis 
4

2 回答 2

2

这个答案有点投机,但是对缺少右括号错误的一种可能解释是,这个错误实际上与缺少括号有关。相反,如果DBMS_RANDOM.value您的 Oracle 10 与 Oracle 11 版本中的 API 不同,那么您可能会看到此错误。试试这个查询:

SELECT TRUNC(DBMS_RANDOM.value(10, 50))
FROM dual

如果这有效,那么您将知道 API 在 Oracle 10 和 11 之间发生了变化。

这是一个参考,它使用我在查询中使用的 API。

于 2016-08-31T13:14:07.927 回答
1

这是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 已经展示了作品。“缺少右括号”错误并不一定意味着您的括号不平衡;只是解析器看到了一些它没想到的东西,它认为括号可能会去哪里——在这种情况下,在=>.

于 2017-01-06T17:31:53.430 回答