为啥 pi() 函数在使用其 JDBC 驱动程序的 Oracle 中不起作用?

Posted

技术标签:

【中文标题】为啥 pi() 函数在使用其 JDBC 驱动程序的 Oracle 中不起作用?【英文标题】:Why pi() function does not work in Oracle using its JDBC driver?为什么 pi() 函数在使用其 JDBC 驱动程序的 Oracle 中不起作用? 【发布时间】:2016-11-28 12:49:23 【问题描述】:

查询 1 可与 Oracle JDBC 驱动程序一起正常工作,但查询 2 不能。我不明白为什么。请问,有人可以帮我吗?

查询 1:

SELECT fn pi() FROM table;

查询 2:

SELECT pi() FROM table;

【问题讨论】:

你遇到了什么错误? SQL 错误 [904] [42000]:ORA-00904:“PI”:标识符无效 可以给 ddl 的 pi 吗?并检查连接到 Oracle 的用户名 因为Oracle中没有pi()(除非你自己创建)函数。 pi()是javadb的函数。 @NicholasKrasnov 不是 Javadb,而是 JDBC 【参考方案1】:

Oracle 中没有原生的pi() 函数。 JDBC 驱动程序将简单地将其替换为硬编码值。

如果你运行

SELECT fn pi() FROM dual;

司机会发送:

SELECT ( 3.141592653589793238462643383279502884197169399375 ) 
FROM
 dual

到服务器 - 这就是为什么您可以对 Oracle 数据库使用 fn pi(),即使没有这样的功能可用。

【讨论】:

【参考方案2】:

似乎没有任何native function 称为 PI。该错误表明您还没有创建用户定义的函数。

fn foo() 语法是provided by JDBC,因此没有它就无法工作:

fn 关键字的 JDBC 转义语法

您可以使用 fn 指定 JDBC 转义语法中的函数 关键词。语法

fn functionCall

其中functionCall 是列出的标量函数之一的名称 下面。

...通过前面的链接,我们可以看到底层的 PI() 函数是由 Java DB 和/或 Apache Derby 提供的。

【讨论】:

具体来说,JDBC 标准中定义的 JDBC 转义函数需要重写为数据源特定函数,或者 - 如果可能 - 在 JDBC 驱动程序中进行模拟。【参考方案3】:

你可以使用这个等式:

select 2*asin(1) from dual;

或者可以定义一个返回这个数字的函数如下:

create or replace function PI return numeric is
  Result numeric;
begin
  select 2*asin(1)
  into Result  from dual;
  return(Result);
end PI;

【讨论】:

【参考方案4】:

对我来说,id 不适用于数字,所以我改为浮动

create or replace function PI return float is
  Result float;
begin
  select 2*asin(1)
  into Result  from dual;
  return(Result);
end PI;

【讨论】:

以上是关于为啥 pi() 函数在使用其 JDBC 驱动程序的 Oracle 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sin(0.2*x + pi) 是非周期函数? [关闭]

复变函数求主值问题? 为啥加pi? 求解,谢谢?

为啥 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效

使用jdbc连接mysql为啥报错?

为啥maven编译时不需要jdbc的驱动包

如何使用 pi spark 在 oracle 数据库上执行选择查询?