실제로는 제한된 반환 유형입니다. 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 - 쉬울 수 있습니다 ...
이 이
감사 알렉스, 매우 도움이 응답 - 위하고 넘어 갔어요 .색인을 생성하려면 컬렉션이 필요합니다. 그러나, 나는 당신이 "객체 유형과 그것들의 단일 테이블"을 의미하는 것을 따르지 않습니다. 조금 확장 할 수 있습니까? –
@JDor - 나는 내 대답에 대한 예를 추가했습니다. –
멋진 답변! 교과서 같은 거. 매우 감사합니다. –