【问题标题】:Java String parameter in Oracle sql developerOracle sql developer中的Java字符串参数
【发布时间】:2017-07-26 17:21:24
【问题描述】:

我必须在 Oracle SQL Developer 中使用一些 java 函数。但是我在使用 java String 参数时遇到了一些麻烦。我知道我的代码对这个字符串没有任何作用。会的。

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "StringTest" AS
public class StringTest
{ 
    public static int test(String a)
    {
        return 1;
    }
}
/

返回:

Java 源字符串测试已创建

然后:

CREATE OR REPLACE FUNCTION F_STRING(input1 in char) return number
as LANGUAGE JAVA NAME 'StringTest.test(String) return int';

函数 F_STRING 编译

现在当我尝试执行我的功能时:

SELECT F_STRING("some_text") FROM MyTable;

ORA-00904:“some_text”:标识符无效

  1. 00000 - “%s:无效标识符”

当我尝试使用单引号而不是 " 我得到这个:

ORA-29531:StringTest 类中没有方法测试 29531. 00000 - “类 %s 中没有方法 %s” *原因:试图执行一个不存在的方法 Java 类。 *Action:调整调用或创建指定方法。

当我使用 varchar2 而不是 char 时,也会发生同样的事情。 我确定我错过了一些非常简单的东西,但在几个小时内找不到解决方案,这已经让我发疯了。

【问题讨论】:

    标签: java sql oracle oracle-sqldeveloper


    【解决方案1】:

    当您在 oracle 中发布 java 方法时,您必须使用完整的类名。 (规范名称)。

    int - 没问题, String - 不行。

    改变这个

    CREATE OR REPLACE FUNCTION F_STRING(input1 in char) return number
        as LANGUAGE JAVA NAME 'StringTest.test(String) return int';
    

    到这个。

    CREATE OR REPLACE FUNCTION F_STRING(java.lang.String in char) return number
    as LANGUAGE JAVA NAME 'StringTest.test(java.lang.String) return int';
    

    【讨论】:

    • 一开始就在尝试这个,但可能打错了,所以我放弃了这个想法。即使没有F_STRING(java.lang.String in char) F_STRING(input1 in char) 也可以工作
    • 对于intchar 等基本类型,没有锥形路径。对于类,此 (String, Char) 路径是必需的。但我不明白为什么它与 F_STRING(input1 in char) 一起使用。在 Oracle 中 varchar2 = varchar =~(几乎) = CHAR。在 java String != char.
    【解决方案2】:

    Oracle 不会容忍String 改用java.lang.String

    ..还有

    不要过度使用 " 符号,因为这会迫使您对对象使用精确的大小写调用,因为这对于 java 源代码不是一个大问题,它可能与其他对象有关。

    CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED stringtest AS
    public class StringTest
    {
        public static int test(String a)
        {
            return 1;
        }
    }
    
    
    CREATE OR REPLACE FUNCTION F_STRING(input1 in char) return number
    as LANGUAGE JAVA NAME 'StringTest.test(java.lang.String) return java.lang.Intiger';
    
    
    SELECT F_STRING('some_text') FROM dual;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2021-02-12
      相关资源
      最近更新 更多