2009-08-27 4 views
0

사용자 입력을 기반으로 레코드 세트를 삽입해야하는 테이블이 있습니다. IE : 선택할 항목 목록에서 선택. 이 예제에서는 int의 컬렉션이라고 가정 해 보겠습니다..NET에서 PL/SQL 패키지 프로 시저 또는 함수로 데이터 컬렉션을 전달 하시겠습니까?

인터넷에서 좋은 예는 많지 않습니다. There's only one related question here on SO,하지만 답을주지 못합니다 (둘 다 답은 막 다른 골목 임).

  1. .NET에서 패키지로 호출을 어떻게 설정합니까?
  2. 컬렉션을 수신하도록 패키지 프로 시저 또는 함수를 어떻게 설정합니까?
  3. 프로 시저 또는 함수 내부에서 컬렉션을 한 번 처리하는 방법은 무엇입니까?

답변

1

.NET에서 Oracle과 마지막으로 작업 한 적이 있었는데, Pro .NET 오라클 프로그래밍 (Mark A. Williams)에서 꽤 많이 깨달았습니다. 4 년이나 더 지났지 만 잘 쓰여지고 매우 유용하다는 것을 알게되었습니다.

0

.NET 관점에서 말할 수는 없지만 Java 코드와 비슷한 문제가 있습니다. 아마도이 솔루션은 몇 가지 용도로 사용됩니다 ...

요소 집합을 저장할 수있는 데이터베이스에 새로운 TYPE을 작성하여 시작하십시오.

CREATE TYPE my_array_type IS TABLE OF NUMBER 
    INDEX BY BINARY_INTEGER; 

당신이 입력 한 다음 MY_ARRAY_TYPE의 매개 변수를 수용 할 수있는 프로 시저를 만들 : 나는 일반적으로 TABLE 유형을 사용

CREATE PROCEDURE process_array(my_array MY_ARRAY_TYPE) IS 
    i BINARY_INTEGER; 
    my_array_element NUMBER; 
BEGIN 
    i := my_array.FIRST; 
    WHILE my_array.EXISTS(i) LOOP 
    my_array_element := my_array(i); 
    /* do something with my_array_element... */ 
    i := my_array.NEXT(i); 
    END LOOP; 
END; 

다음 트릭은 동적으로 익명 PL/SQL 블록을 구축하는 것입니다 선택의 프로그래밍 언어 (전 VB.NET 또는 C#을 가정하고) 그것을 실행합니다. 나는 .NET으로 말을 많이하지만, 여기에 자바의 예입니다 수 없습니다 더 나은 방법이 알고

int[] myArray = ...; 

StringBuilder plsql = new StringBuilder(); 
plsql.append("DECLARE"); 
plsql.append(" my_array MY_ARRAY_TYPE;"); 
plsql.append("BEGIN"); 
for (int i = 0; i < myArray.length; i++) { 
    plsql.append(" my_array(" + i + ") := ?;"); 
} 
plsql.append(" PROCESS_ARRAY(my_array);"); 
plsql.append("END"); 

CallableStatement statement = connection.prepareCall(plsql.toString()); 
for (int i = 0; i < myArray.length; i++) { 
    statement.setInt(i + 1, myArray[i]); 
} 

statement.execute(); 

,하지만이 곳에서만 특히 자바/JDBC 세계에서 가장 신뢰할 수있는 듯 Oracle의 모든 JDBC 드라이버 (!)의 서브 세트는 콜렉션 유형을 지원합니다.

+0

사용자 입력을 연결 하시겠습니까? 어디에서 그 일을합니까? 유일한 연결은'i' 변수입니다. 사용자 입력은 명령문 매개 변수를 통해 지정됩니다. –

+0

@ 아담 : 당신 말이 맞아요. 아담, 바인딩을 못 봤어? ". –

1

odp.net의 Oracle technet how to 섹션을보십시오. 배열을 바인딩하는 예제가 있습니다. 그러나 절차는 n 번 호출됩니다. plsql 프로 시저의 매개 변수는 일반 유형 (valuetype)입니다.

array at once을 전달하는 또 다른 예가 있습니다. plsql 프로 시저의 매개 변수는 plsql 테이블입니다. 처리 콜렉션 (= plsql 테이블)은 her으로 설명됩니다. 그것은 당신의 문제에 더 잘 어울립니다.

관련 문제