2016-09-22 114 views
2

我有以下的Java方法获取PLS-00258当Java方法创建PL/SQL包装功能

public int GatewayClientPoolHA(String[] DAUTAddresses, 
      int[] DAUTPortArray, 
      String sslKeystorePath, 
      String sslKeystorePass) 

(我已经使用loadjava其JAR加载到一个Oracle 11g数据库)现在,我想把这个Java方法包装在PL/SQL函数中,但是我得到了一个PLS-00258错误,下面的代码。我想这是因为数组输入参数?有什么建议么?

CREATE OR REPLACE PACKAGE daut_2fa IS 

    TYPE daut_addresses_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; 
    TYPE daut_port_type IS TABLE OF INTEGER INDEX BY BINARY_INTEGER; 

    FUNCTION GatewayClientPoolHA (
     DAUTAddresses   IN daut_addresses_type, 
     DAUTPortArray   IN daut_port_type, 
     sslKeystorePath  IN VARCHAR2, 
     sslKeystorePass  IN VARCHAR2 
) RETURN INTEGER; 


END daut_2fa; 
/
SHOW ERROR 


CREATE OR REPLACE PACKAGE BODY daut_2fa IS 

    FUNCTION GatewayClientPoolHA (
     DAUTAddresses   IN daut_addresses_type, 
     DAUTPortArray   IN daut_port_type, 
     sslKeystorePath  IN VARCHAR2, 
     sslKeystorePass  IN VARCHAR2 
) RETURN INTEGER IS LANGUAGE JAVA 
    NAME 'daut.GatewayClientPoolHA(java.lang.String[], int[], java.lang.String, java.lang.String) return int'; 



END daut_2fa; 

回答

4

它实际上是它不喜欢的约束返回类型; INTEGER是受约束的数量,从而导致the PLS-00258 error

PLS-00258:在CALL规格不允许约束数据类型

原因:为C或Java调用规范不能对约束PL/SQL形式参数类型。其中有PL/SQL类型有约束是自然科学,NATURALN,积极,POSITIVEN,SIGNTYPE,INTEGER,INT,SMALLINT,DECIMAL,NUMERIC,DEC这包括不POSITIVEN NULL约束,NATURALN

操作:使用不受约束类型为PL/SQL正规报关即为编号,BINARY_INTEGER或PLS_INTEGER

您需要RETURN NUMBER代替它不受限:

FUNCTION GatewayClientPoolHA (
     DAUTAddresses   IN daut_addresses_type, 
     DAUTPortArray   IN daut_port_type, 
     sslKeystorePath  IN VARCHAR2, 
     sslKeystorePass  IN VARCHAR2 
) RETURN NUMBER IS LANGUAGE JAVA 
    NAME daut.GatewayClientPoolHA(java.lang.String[], int[], java.lang.String, java.lang.String) return int'; 

...但你会打(在11gR2任何路):

PLS-00999: implementation restriction (may be temporary) INDEX TABLE parameters are disallowed 

而且即使没有索引的PL/SQL表,你会仍然得到:

PLS-00999: implementation restriction (may be temporary) Non-schema collection parameters are disallowed in Java callout 

所以你需要架构级别(不PL/SQL)集合,为不同的类型之前创建的创建包:

未编制索引可能是你的问题虽然,因为你可能把相关的值在两个列表相同的索引位置的集合。如果您可以将它解压缩为Java中的结构,您可能需要一个对象类型和单个表格。类似:

import oracle.sql.STRUCT; 
public class daut { 
    public int GatewayClientPoolHA(STRUCT[] DAUTAddressesAndPorts, 
       String sslKeystorePath, 
       String sslKeystorePass) 
    { 
    ... 
    } 
} 

然后

CREATE TYPE daut_addresses_port_type AS OBJECT (
    address VARCHAR2(50), 
    port number 
) 
/

CREATE TYPE daut_addresses_port_tab_type AS TABLE OF daut_addresses_port_type 
/

CREATE OR REPLACE PACKAGE daut_2fa IS 

    FUNCTION GatewayClientPoolHA (
     DAUTAddressesAndPorts IN daut_addresses_port_tab_type, 
     sslKeystorePath  IN VARCHAR2, 
     sslKeystorePass  IN VARCHAR2 
) RETURN NUMBER; 

END daut_2fa; 
/

CREATE OR REPLACE PACKAGE BODY daut_2fa IS 

    FUNCTION GatewayClientPoolHA (
     DAUTAddressesAndPorts IN daut_addresses_port_tab_type, 
     sslKeystorePath  IN VARCHAR2, 
     sslKeystorePass  IN VARCHAR2 
) RETURN NUMBER IS LANGUAGE JAVA 
    NAME 'daut.GatewayClientPoolHA(oracle.sql.STRUCT[], java.lang.String, java.lang.String) return int'; 

END daut_2fa; 
/

an example in the documentation该传递的对象类型;这只是进一步并传递一组对象,因此您应该能够使用对象/结构的每个字段的适当类型映射来引用数组中的每个STRUCT元素。虽然我没有真的尝试过这个部分。

或者使用字符串的单varray但串联端口值(例如'127.0.0.1:1521')和decompse在Java中 - 这可能是更容易...

+0

感谢亚历克斯,非常有帮助的反应 - 你已经超出了。你是正确的,我需要收集索引。但是,我并不完全遵循“对象类型和单个表格”的含义 - 您可以扩展一下吗? –

+0

@JDor - 我已经添加了一个我想要回答的例子。 –

+0

精彩回答!教科书的东西。非常感谢。 –