2014-09-26 4 views
1

첫 번째로, 바보 같은 질문 인 경우 사과해야하지만 PL/SQL을 처음 사용합니다.키 - 값을 PL/SQL 프로 시저에 전달하는 방법은 무엇입니까?

java 및 PL/SQL을 사용하여 Oracle 데이터베이스와 상호 작용해야하는 프로젝트 작업 중입니다. 데이터베이스에 전달하고자하는 키 - 값의 결정할 수없는 목록이 있습니다. 초기 연구에서 oracle.sql.STRUCT 및 oracle.sql.ARRAY를 가리키는 것으로 보입니다.

데이터베이스 측에 기존 객체/테이블 유형이 필요하기 때문에 STRUCT 및 ARRAY 객체를 선호하지 않습니다.

편집 : 내 자바 코드

java.sql.Connection connection = myGetConnection(); 
// create variables for the oracle.sql.ARRAY 
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor("TEXT_TABLE", connection); 
Object[] arrayObject = new Object[2]; 

//create STRUCT objects 
StructDescriptor descriptor = StructDescriptor.createDescriptor("MYITEM", connection); 

// Loop through the map and put objects in the arrayObject 
for(int i = 0; i < myMap.size(); i++){ 
String key = "key"+1; 
String value = "value"+2; 
Object[] obj = {key,value}; 
STRUCT structObj = new STRUCT(descriptor, connection, obj); 

// put the struct object in the array object 
arrayObject[i] = structObj; 
} 

// create the oracle.sql.ARRAY 
ARRAY array = new ARRAY(arraydesc, connection, arrayObject); 

//.. 
oracleCallableStatement = connection.prepareCall("{call myPackage.myProcedure(?)}"); 
oracleCallableStatement.setArray(1, array); 
oracleCallableStatement.execute(); 
oracleCallableStatement.close(); 

내가 excplictly 내 오라클 데이터베이스 차종의 형식을 선언해야한다는 사실을에 내 PL에

/SQL

CREATE OR REPLACE TYPE myItem AS object (c1 VARCHAR2(10), c2 VARCHAR2(30)); 
CREATE OR REPLACE TYPE text_table AS TABLE OF myItem ; 

나는 일을하는 더 쉬운 방법이 있어야한다고 생각합니다. 이것들은 매우 원시적 인 객체입니다.

이것이 올바른 방법인가요? 이것이 내 유일한 옵션입니까?

답변

2

어리석은 질문이 아니며, 내가하는 것처럼 그렇게하고있는 것입니다 (적어도 그렇게 생각합니다.). ARRAY 유형을 스키마 수준 컬렉션 유형과 연결할 수 있어야하므로 SQL CREATE TYPE으로 생성해야합니다. 패키지에 정의 된 PL/SQL 콜렉션이 될 수는 없습니다. 예를 들어 가능하다면 좀 더 깔끔할 수 있습니다. 오라클이 Java 배열을 임의의 컬렉션에 매핑하는 마법의 방법은 없습니다. 데이터를 JDBC를 통해 알 수있는 스트림으로 전송할 수 있도록 유형을 정의하고 연관시켜야합니다. 내가 다른 일을 고려해 볼 수 있습니다

있는 유일한 방법은 테이블 형식보다는 varray로 컬렉션을 만드는 것입니다 : 당신이 크기를 제한 할 필요가 없습니다 ...

CREATE TYPE text_varray AS table OF myItem ; 

; 요소의 순서는 중요 할 수 있으며 varray에 의해서만 유지됩니다.

또 다른 옵션은 varrays 2 개를 키와 값에 대해 사용하고 프로 시저에 두 개의 인수를 전달하는 것입니다. 원래의 Java 2 차원 배열을 2 개의 개별 배열로 변환해야합니다. 그 이점은 내장형 (sys.odcivarchar2list) 중 하나를 사용할 수 있고 자신의 varray 또는 개체 유형을 만들지 않아도된다는 것입니다. 하지만 자바 쪽에서 더 복잡하고 자신의 타입을 유지하는 것이 그리 어려운 일이 아니기 때문에 가치가 없을 것입니다. varray에서 table으로 변경하면 요소가 두 목록에서 반드시 동일한 순서로 변경되지 않으므로 옵션이 아닙니다.

개체 정의의 문자열 길이가 맞으면 sys.odciobject and sys.odciobjectlist을 잠재적으로 사용할 수 있습니다. 비슷한 설정을 사용하기 때문에 가능합니다. 시스템이 미래에 변경 될 경우를 대비해 자신의 유형을 사용하는 것이 더 안전하거나 더 긴 문자열을 필요로하는 요구 사항이 변경 될 가능성이 더 큽니다.

관련 문제