2016-09-22 55 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

精彩回答!教科書的東西。非常感謝。 –