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
위 코드에서 수행하는 단계는 다음과 같습니다.
물음표는 위치 매개변수 표시문자입니다. 첫 번째는 매개변수 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
위 코드에서 수행하는 단계는 다음과 같습니다.
매개변수가 Bean 또는 Map 오브젝트의 Data.call() 메소드에 전달될 때, 스토어드 프로시저의 리턴된 OUT 및 INOUT 매개변수 값은 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인 하나의 매개변수만 있음을 표시합니다.
위 코드에서 수행하는 단계는 다음과 같습니다.
프로젝트 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
위 코드에서 수행하는 단계는 다음과 같습니다.