创建 Oracle SQL Java 函数不起作用
Posted
技术标签:
【中文标题】创建 Oracle SQL Java 函数不起作用【英文标题】:Creating Oracle SQL Java Function does not work 【发布时间】:2019-01-29 08:43:31 【问题描述】:当尝试创建 oracle SQL java 函数以生成随机 UUID 时,如in this *** answer 所述,我收到以下错误:
sql> CREATE or REPLACE FUNCTION random_uuid
RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'java.util.UUID.randomUUID() return java.lang.String'
[2019-01-29 09:28:29] [99999][17110] Warning: execution completed with warning
[2019-01-29 09:28:29] completed in 23 ms
[2019-01-29 09:28:29] 3:78:PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
[2019-01-29 09:28:29] ;
[2019-01-29 09:28:29] The symbol ";" was substituted for "end-of-file" to continue.
即使这只是一个警告,之后调用它也不起作用:
sql> select random_uuid() from dual
[2019-01-29 09:36:28] [65000][6575] ORA-06575: Package or function RANDOM_UUID is in an invalid state
我使用 IntelliJ IDEA 的数据库控制台来执行脚本。怎么了?
编辑:我的原始脚本末尾确实包含分号:
create or replace function random_uuid return varchar2 as
language java
name 'java.util.UUID.randomUUID() return String';
添加';'在 String 没有帮助之后:
create or replace function random_uuid return varchar2 as
language java
name 'java.util.UUID.randomUUID() return String;';
【问题讨论】:
那你为什么不添加请求的';'? 可以分享java代码吗? 脚本中除了“java.util.UUID.randomUUID()”之外没有java代码。我只是想在 IntelliJ IDEA 的数据库控制台中执行脚本。这似乎是由解析引起的:数据库控制台将末尾的分号视为语句分隔符,因此该语句缺少分号。 dbvis 也有同样的问题,但是可以用“--/”和“-”标记块。 检查类是否有效SELECT * FROM dba_objects WHERE object_type IN ('JAVA CLASS') and object_name = 'java/util/UUID';
IntelliJ IDEA 错误报告:youtrack.jetbrains.com/issue/DBE-7723
【参考方案1】:
由于问题似乎是 IDE 无法识别语句终止的位置,因此您可以尝试将其包装在 PL/SQL 匿名块中并使用 EXECUTE IMMEDIATE
强制它正确解析语句:
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE FUNCTION RandomUUID RETURN VARCHAR2 AS LANGUAGE JAVA NAME ''java.util.UUID.randomUUID() return java.lang.String'';';
END;
/
【讨论】:
'java.util.UUID.randomUUID() return String' 在使用 dbvis 和 SQL 块分隔符创建函数时工作得很好:confluence.dbvis.com/display/UG100/Executing+Complex+Statements以上是关于创建 Oracle SQL Java 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章
oracle中用dblink查询,有时候使用where中的字符串参数不起作用
count(distinct) over (partition by... 在 Oracle SQL 中不起作用
Spark SQL Dataframes - 如果使用 RDD.collectAsMap() 创建地图,则从 DataFrameNaFunctions 替换函数不起作用