为啥 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) 是非周期函数? [关闭]