2016-09-22 5 views
2

자바 방법 작성 PL/SQL 래퍼 기능 , PL/SQL 함수에서이 Java 메서드를 래핑 할 수 있지만 다음 코드로 PLS-00258 오류가 발생합니다. 나는 이것이 배열 입력 매개 변수 때문이라고 생각합니까? 어떤 제안?얻기 PLS-00258 때 지금</p> <pre><code>public int GatewayClientPoolHA(String[] DAUTAddresses, int[] DAUTPortArray, String sslKeystorePath, String sslKeystorePass) </code></pre> <p>(내가 LOADJAVA를 사용하여 JAR에서 오라클 11g 데이터베이스에로드 한) 다음과 같은 Java 메소드를 가지고

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은 12 월 이것은, NATURALN

을 POSITIVEN에서 NULL 제약 조건을 NOT이 포함되어 있습니다

작업 :를 사용하여 구속을 에 (

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'; 

...하지만 당신은 칠 것이다 : 그 PL/SQL 공식 선언 즉, 번호 유형, BINARY_INTEGER 또는 PLS_INTEGER

당신은이 제한되어 있지 않은 대신 때문에 RETURN NUMBER 필요 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) 컬렉션을하셔야합니다 패키지가 생성됩니다

CREATE TYPE daut_addresses_type IS TABLE OF VARCHAR2(50) 
/
CREATE TYPE daut_port_type IS TABLE OF NUMBER 
/

CREATE OR REPLACE PACKAGE daut_2fa IS 

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


END daut_2fa; 
/

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 NUMBER IS LANGUAGE JAVA 
    NAME 'daut.GatewayClientPoolHA(java.lang.String[], int[], java.lang.String, java.lang.String) return int'; 

END daut_2fa; 
/

Package body DAUT_2FA compiled 

SHOW ERRORS 

No errors. 

당신은 아마도 두 목록에 같은 인덱스 위치에 관련된 값을 옮기고로,하지만 당신을 위해 문제가있을 수 있습니다 색인이 생성되지 않습니다 컬렉션입니다. 자바에서 구조체로 풀면 오브젝트 유형과 그 대신 하나의 테이블이 필요합니다. 뭔가 같은 :

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

및 개체 유형을 전달 an example in the documentation있다 다음

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; 
/

; 이것은 단지 더 나아가 객체 컬렉션을 전달하기 때문에 객체/구조의 각 필드에 대해 적절한 유형 매핑을 사용하여 배열의 각 STRUCT 요소를 참조 할 수 있어야합니다. 나는 그 부분을 실제로 시도하지는 않았지만.

또는 포트 값을 문자열의 단일 varray를 사용하지만 연결하여 (예를 들어 '127.0.0.1:1521'을)와 자바에서 그 decompse - 쉬울 수 있습니다 ...

이 이
+0

감사 알렉스, 매우 도움이 응답 - 위하고 넘어 갔어요 .색인을 생성하려면 컬렉션이 필요합니다. 그러나, 나는 당신이 "객체 유형과 그것들의 단일 테이블"을 의미하는 것을 따르지 않습니다. 조금 확장 할 수 있습니까? –

+0

@JDor - 나는 내 대답에 대한 예를 추가했습니다. –

+0

멋진 답변! 교과서 같은 거. 매우 감사합니다. –