StoredProcedureResult 오브젝트의 OUTINOUT 매개변수

StoredProcedureResult가 리턴될 때, 스토어드 프로시저에 의해 리턴되는 모든 OUT 또는 INOUT 매개변수의 값은 StoredProcedureResultgetOutputParms() 메소드에 의해 리턴되는 Object[]에 있습니다.
StoredProcedureResult 오브젝트는 이 버전의 Data 인터페이스의 call() 메소드에 의해 리턴됩니다.
StoredProcedureResult call (java.lang.String sql, Object... parameters)

위치 매개변수 전달

예를 들어, 두 개의 IN Integer 매개변수와 하나의 OUT Float를 갖고 있고 리턴된 쿼리 결과가 없는 것으로 정의된 스토어드 프로시저를 고려하십시오. 다음과 같은 논리로 이를 호출할 수 있습니다.

Integer one = new Integer(1);                                                      1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                 2 
Data db = DataFactory.getData(con);                                                3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);   4 
Object[] outputs = spr.getOutputParms();                                           5 
Float oneThird = outputs[2]; // outputs is Object[3]                               6 
spr.close();   // best practice                                                    7 

위 코드에서 수행하는 단계는 다음과 같습니다.

  1. IN 매개변수에 사용할 두 변수를 선언하고 초기화합니다.
  2. 데이터베이스에 대한 연결을 작성합니다.
  3. Data 인터페이스의 구현 인스턴스를 작성합니다.
  4. Data.call() 메소드를 호출하여 IN 매개변수의 값을 전달하는 CALL문을 실행하고 StoredProcedureResult의 구현에 결과를 저장합니다.
  5. Object[] 배열에 INOUTOUT 매개변수의 값을 저장합니다. IN 매개변수는 배열에 배치되지 않으며 NULL 플레이스 홀더를 갖고 있습니다.
  6. Float 오브젝트에 OUT 매개변수의 값을 저장합니다. 배열에서 처음 두 오브젝트는 IN 매개변수의 값이므로 OUT 매개변수의 값은 세 번째 오브젝트입니다.
  7. StoredProcedureResult spr과 연관된 모든 자원을 닫고 해제합니다.

물음표는 위치 매개변수 표시문자입니다. 첫 번째는 매개변수 Integer one에 해당하고 두 번째는 매개변수 Integer three에 해당하며 마지막은 매개변수 널(NULL)에 해당합니다. 널(NULL) 값은 스토어드 프로시저의 OUT 매개변수 값에 대한 플레이스 홀더입니다.

또 다른 예제로는 SQL 메소드 getRatio()에 관한 부분 정보만 있다고 가정하십시오. getRatio() 메소드가 쿼리 결과를 리턴하지 않는 것을 몰랐고 해당 메소드의 IN 매개변수가 OUT 매개변수이기도 하다는 사실을 몰랐던 경우, 논리는 다음과 같을 수 있습니다.

Integer one = new Integer(1);                                                     1 
Integer three = new Integer(3);
Connection con = DriverManager.getConnection(...);                                2 
Data db = DataFactory.getData(con);                                               3 

StoredProcedureResult spr = db.call("CALL getRatio(?, ?, ?)", one, three, null);  4 
Object[] outputs = spr.getOutputParms();                                          5 
for (int j = 0; j < outputs.length; j++)                                          6 
 System.out.println(j + ": " + outputs[j]); 

 while (spr.moveToNext()) {                                                       7 
      ResultSet rsPtr = spr.getResults();
      ...                                                                         8 
   }
}

spr.close();                                                                      9 

위 코드에서 수행하는 단계는 다음과 같습니다.

  1. IN 매개변수에 사용할 두 변수를 선언하고 초기화합니다.
  2. 데이터베이스에 대한 연결을 작성합니다.
  3. Data 인터페이스의 구현 인스턴스를 작성합니다.
  4. Data.call() 메소드를 호출하여 IN 매개변수의 값을 전달하는 CALL문을 실행하고 StoredProcedureResult의 구현에 결과를 저장합니다.
  5. Object[] 배열에 INOUTOUT 매개변수의 값을 저장합니다. IN 매개변수는 배열에 배치되지 않으며 NULL 플레이스 홀더를 갖고 있습니다.
  6. Object[] 배열의 값을 인쇄합니다.
  7. 스토어드 프로시저가 쿼리 결과를 리턴한 경우, 현재 리턴된 ResultSet가 있으면 이를 닫고 다음 ResultSet로 이동합니다.
  8. rsPtr이 참조하는 현재 ResultSet를 처리합니다.
  9. StoredProcedureResult spr과 연관된 모든 자원을 닫고 해제합니다.

Bean에서 매개변수 전달

매개변수가 Bean 또는 Map 오브젝트의 Data.call() 메소드에 전달될 때, 스토어드 프로시저의 리턴된 OUTINOUT 매개변수 값은 Object[] 배열에 표시되며 주어진 Bean 또는 Map 오브젝트를 갱신하는 데 사용됩니다.

예를 들어, 분자, 분모 및 비율 특성이 있는 Bean인 Ratio를 가정하십시오.

Integer one = new Integer(1);                                   1 
Integer three = new Integer(3);
Ratio rValue = new Ratio(one, three);                           2 
Connection con = DriverManager.getConnection(...);              3 
Data db = DataFactory.getData(con);                             4 

StoredProcedureResult spr = db.call(
  "CALL getRatio(:numerator, :denominator, :ratio)", rValue);   5 
Float oneThird = rValue.getRatio();                             6 
spr.close();                                                    7 

이 예제에서 :name 매개변수 표시문자의 사용은 Map 오브젝트였을 수도 있지만 Bean인 하나의 매개변수만 있음을 표시합니다.

위 코드에서 수행하는 단계는 다음과 같습니다.

  1. 두 변수인 onethree를 선언하고 초기화합니다.
  2. Ratio Bean인 rValue에 대한 참조를 선언 및 초기화하고 1 및 3을 컨스트럭터에 전달하여 분자 및 분모의 값을 제공합니다.
  3. 데이터베이스에 대한 연결을 작성합니다.
  4. Data 인터페이스의 구현 인스턴스를 작성합니다.
  5. Data.call() 메소드를 호출하여 rValue에서 전달되는 CALL문을 실행합니다. numeratordenominator의 특성은 IN 매개변수이고 ratioOUT 매개변수입니다. CALL문은 ratio의 값을 갱신합니다.
  6. 비율 값을 새 Float oneThird에 저장합니다.
  7. StoredProcedureResult spr과 연관된 모든 자원을 닫고 해제합니다.

Map 오브젝트에서 매개변수 전달

프로젝트 ID에 대한 DeptProject Bean 특성와 프로젝트에 대한 새 종료 날짜에 해당하는 값에 전달되어 스토어드 프로시저가 호출된다고 가정하십시오. OUT 매개변수는 해당 부서 프로젝트에 필요한 갱신된 직원 레벨입니다.

스토어드 프로시저를 해당 용도로만 개발하지는 않을 지 모르지만 작은 프로젝트가 주요 프로젝트에 포함되어 있어서 단일 프로젝트의 종료 날짜를 갱신하면 포함된 여러 프로젝트에 전달될 수 있으며 이러한 종류의 연쇄 조작에 스토어드 프로시저가 적합합니다. call() 메소드에 전달되는 매개변수가 DeptProject 오브젝트일 수는 있지만 완전히 채워진 인스턴스를 사용하려 할 때 완전히 채우거나 사용하지 않을 오브젝트를 사용하는 것은 좋지 않습니다. 이러한 종류의 사용에는 Map 오브젝트를 선택하는 것이 좋습니다.

이 예제에서 이 스토어드 프로시저에 대한 호출은 다음과 같을 수 있습니다.

Map<String, Object> slipMap;                                             1 

//...                                                                    2 

Connection con = DriverManager.getConnection(...);                       3 
Data db = DataFactory.getData(con);                                      4 

StoredProcedureResult spr = db.call(
  "CALL newEndDate(":projectId, :endDate, :staffLevel)", slipMap );      5 
spr.close();                                                             6 

위 코드에서 수행하는 단계는 다음과 같습니다.

  1. Map slipMap을 선언합니다.
  2. slipMapprojectIdendDate를 설정합니다.
  3. 데이터베이스에 대한 연결을 작성합니다.
  4. Data 인터페이스의 구현 인스턴스를 작성합니다.
  5. Data.call() 메소드를 호출하여 slipMap에서 전달되는 CALL문을 실행합니다. projectIdendDate의 특성은 IN 매개변수이고 staffLevelOUT 매개변수입니다. CALL문은 staffLevel의 값을 갱신합니다.
  6. StoredProcedureResult spr과 연관된 모든 자원을 닫고 해제합니다.

피드백