2012-05-25 1 views
2

먼저 서문 : jdbc를 사용하여 데이터베이스에 임시 테이블을 만드는 Java 클래스를 작성했습니다. 저는 JSE6과 Oracle 11XE를 테스트 DB로 사용하고 있지만,이 클래스는 DB2와 호환되어야합니다.DDL 문에서 바인드 변수를 사용할 수 없습니다. 대안?

내가 만들려고하는 임시 테이블이 더 큰 테이블에서 왔으며 데이터에서 필터링 및 집계를 수행합니다. 내가 필터링하는 기본 매개 변수는 런타임에 사용자가 결정합니다. 내가 할 노력하고있어 하나의 간단한 예는 이것이다 :

내 문제는 내가 데이터를 필터링하는 매개 변수를 지정해야하고, 나는 그들이 올바르게 이스케이프하고 확인해야한다는 것입니다
CREATE TABLE temp_table AS (
    SELECT 
      table1.department_id, 
      SUM(CASE WHEN table1.number_1 < &1 THEN table1.number_1 ELSE 0 END)) AS column1    
    FROM 
      table1 
    GROUP BY table1.department_id 
) 

은/지역화/입력 . 이것은 준비된 문장을 사용하면 쉽지만, DDL에서는 바인드 변수를 사용할 수 없습니다. 임시 해결책은 내가 직접 쿼리 문자열을 변경하여 올바른 위치에 매개 변수를 작성하는 것이지만 이제는 PreparedStatement 객체 대신에 모든 검사를 구현해야한다는 것을 의미합니다. 다른 모든 혜택을 잃어 버렸습니다.

나는 다른 솔루션을 연구,하지만 그들 중 누구도 지금까지 저를 확신하지 :

  1. 내가 먼저 (SELECT 빈 temp_table를 만든 다음 temp_table (ID, 1 열)에 삽입로를 채울 수 ...)하지만 성능 손실이 발생할 수 있습니다. 그래서 나는 CREATE temp_table AS를 유지하고 싶습니다.

  2. 내부 SELECT 쿼리를 보유하기 위해 임시 구문을 작성하고 적절한 포맷/현지화 된/etc. 쿼리 문자열,하지만 그것에서 최종 쿼리를 얻을 수있는 방법을 찾지 못했습니다 (그리고 그것을 확실히 읽을 수 없습니다 here). 나는이 사건에 대한 찾을 수있는 유일한 옵션은 DebuggableStatement을 사용하는 것입니다,하지만 난 프로젝트 (또한, 그것은 내 문제를 해결하는 매우 우아 방법은 같다)

  3. 난 또 다른 솔루션에 포함 할 수 있습니다 모르겠어요 생각하는 것은 단순히 임시 테이블을 만드는 쿼리를 넣는 것입니다 (각 테이블에 대해 CREATE AS (SELECT ...)를 데이터베이스에 넣고 프로 시저 내부에서 호출 할 수있게합니다 CallableStatement 사용. 이런 식으로 나는 타이핑을 처리하지 않고 여전히 좋은 성능을 가지고 있습니다. db와의 결합이 더 낫지 만 (물론 프로 시저가 있는지, 자바에서 추가/제거를해야하는지)

제 질문은 제가 생각할 수있는 것보다 나은 대안이 있습니까?

+0

http://stackoverflow.com/q/4164949/1290442를 확인하십시오. 첫 번째 의견에는 가능한 해결책도 포함되어 있습니다. – Zecas

답변

0

데이터베이스 무신론자입니까? 아니면 오라클 만 타겟팅합니까? PL/SQL을 사용하려면 저장 프로 시저에 PL/SQL을 저장할 필요가 없습니다. 필요한 것을 수행하는 익명의 PL/SQL 블록을 빌드하고 실행하십시오. 익명의 PL/SQL 블록은 동적으로 생성 될 수 있으므로 강력한 형식의 변수가 PL/SQL에 선언되어 매개 변수를 보유하고 Java 코드가 값을 저장합니다. Java는 형식 안전성을 처리하지 못합니다. 그냥 문자열을 다시 작성하십시오. 익명의 PL/SQL 블록을 실행하면 Oracle이 처리합니다.

+0

예, 데이터베이스에 무관심해야합니다. 오라클 전용 버전이 최후의 수단입니다. 어쨌든이게 내가 찾고있는 것 같아. 감사! – SirBif