예를 들어, 다음 코드를 고려하십시오.
ResultSet rs1, rs2; Statement stmt1 = jdbcCon.createStatement(TYPE_FORWARD_ONLY, CONCUR_UPDATABLE); rs1 = stmt1.executeQuery("SELECT * FROM SCH1.TBL1"); rs1.next(); Statement stmt2 = jdbcCon.createStatement(TYPE_FORWARD_ONLY, CONCUR_UPDATABLE); rs2 = stmt2.executeQuery("SELECT * FROM SCH1.TBL1"); rs2.next(); PreparedStatement pStmt = jdbcCon.prepareStatement( "DELETE FROM SCH1.TBL1 WHERE CURRENT OF " + rs2.getCursorName());
SQL문이 동적으로 실행되는 경우, 이 코드는 앰비규어티를 제공하지 않습니다. 그러나 SQL문이 정적으로 실행되고 ResultSet 오브젝트가 동일한 연결로 열린 경우, 문제점이 발생합니다. pureQuery는 pureQuery가 아닌 API 애플리케이션에 대한 SQL문을 캡처할 때 동일한 명령문을 한 번만 캡처합니다. pureQuery가 이 예제의 SQL문을 캡처하면, pureQueryXML 파일에는 SELECT * FROM SCH1.TBL1이라는 하나의 인스턴스가 포함됩니다. pureQuery가 커서에 DB_PDQ_SPC7이라는 이름을 지정하는 경우, pureQueryXML 파일에는 DELETE FROM SCH1.TBL1 WHERE CURRENT OF DB_PDQ_SPC7이라는 하나의 인스턴스도 포함됩니다.
런타임 시 WHERE CURRENT OF절에 커서 이름만 사용하는 경우, pureQuery는 두 가지 ResultSet 오브젝트 중 DELETE문의 커서가 작동하는 오브젝트를 판별할 수 없습니다.
덜 명확한 상황에서 동일한 앰비규어티가 발생할 수 있습니다. 예를 들어, SELECT문이 ResultSet 오브젝트를 리턴하는 메소드에 있을 수 있고, UPDATE 또는 DELETE WHERE CURRENT OF문이 ResultSet 오브젝트를 수신하는 메소드 내부에 입력 매개변수로 있을 수 있습니다.
애플리케이션의 소스 코드에서 문제점이 명확하게 드러나지 않을 수 있습니다. 이러한 이유로 pureQuery는 단일 SELECT문에 대해 둘 이상의 ResultSet 오브젝트가 현재 열려 있음을 감지하는 경우 경고를 로그합니다.
이러한 앰비규어티를 해결하기 위해 시도할 수 있는 기술은 다음과 같습니다.
Statement stmt1 = jdbcCon.createStatement(TYPE_FORWARD_ONLY,CONCUR_UPDATABLE); rs1 = stmt.executeQuery("SELECT * FROM SCH1.TBL1"); rs1.next(); Statement stmt2 = jdbcCon.createStatement(TYPE_FORWARD_ONLY,CONCUR_UPDATABLE); rs2 = stmt.executeQuery("SELECT * FROM SCH1.TBL1"); rs2.next(); rs2.deleteRow();
PreparedStatement pStmt = jdbcCon.prepareStatement( "DELETE FROM SCH1.TBL1 WHERE CURRENT OF " + rs2.getCursorName());런타임 시 pureQuery는 getCursorName() 메소드를 UPDATE 또는 DELETE문과 연관시킬 수 있으며 따라서 올바른 ResultSet 오브젝트를 명령문과 연관시킵니다. 이러한 연관은 getCursorName() 메소드가 다음 두 위치 중 하나에 표시되는 경우에만 보장됩니다.
z/OS®용 DB2®에 대해 동일한 정적 SQL SELECT문을 실행하고 여러 개의 동일한 ResultSet 오브젝트를 열어야 하는 경우, 먼저 JDBC 및 SQLJ용 IBM® 데이터 서버 드라이버 특성 db2.jcc.allowSqljDuplicateStaticQueries를 YES 또는 TRUE로 설정해야 합니다.