2017-04-11 9 views
0

私はIN句で複数のproject_idsを取り込むSQLクエリを実行しようとしています。この問合せは、Oracle SQL Developerで直接実行すると正常に動作しますが、Groovyクラスでは機能しません。私はprojectListgroovy sql.rowsで文字列のリストをバインドパラメータとして使用する方法は?

とのparamsを交換する場合は、以下の

は以下
DB connection ready 
[[PROJECT_NO:x-xxxx, PROJECT_NAME:Xonions, Inc.]] 

は、上記の問題から2つの質問です私のコード

class Test { 

    private static final String PROJECT_INFO_FOR_USER ="select PROJECT_ID as PROJECT_NO, NAME as PROJECT_NAME from PROJECT_DIM where PROJECT_ID IN (?)" 

    private def getProjectList(def caseResult) { 
     def projectList = "" 
     caseResult.each { projno -> 
      if (projectList.length() == 0) { 
       projectList = "'${projno.project_no}'," 
      } else { 
       if (projectList.indexOf(projno.project_no) == -1) 
        projectList+="'${projno.project_no}'," 
      } 
     } 
     projectList = projectList.substring(0, projectList.length() - 1) 
     return projectList 
    } 

    private process() { 
     def db = [url: "jdbc:oracle:thin:@x.xx.xx.xx:1521:ORCL", 
        user: 'xxxx', password: 'xxxx', driver: 'oracle.jdbc.pool.OracleDataSource'] 
     def sql = Sql.newInstance(db.url, db.user, db.password, db.driver) 
     println "DB connection ready" 

     def caseResult = [['project_no':'x-xxxx', 'case_nos':['12344'], 'updated_on':'1485335172'], ['project_no':'y-yyyy', 'case_nos':['56789'], 'updated_on':1490359241]] 
     def projectList = "x-xxxx" 
     def params = getProjectList(caseResult) 
     def result = sql.rows(PROJECT_INFO_FOR_USER, params).collect {   // If I replace params with projectList then 'result' is assigned a row from oracle database 
      it as Map 
     } 
     println result 
    } 

    public static void main(String[] args) { 
     Test t = new Test() 
     t.process() 
    } 
} 

結果

DB connection ready 
[] 

結果である

  1. groovy sql.rowsクエリで文字列のリストをパラメータとしてバインドする方法はありますか?

  2. sql.rowsによって実行される最終クエリをパラメータで確認する方法はありますか?

+0

@NathanHughes ...あなたが声明とプロジェクト番号の数ではなく、スタートとしてベースのバインドのコレクションに作成する一般的な方法が必要だと思う:それは動的ですリストには、これを行うための他の方法がありますか? – Ricky

答えて

0

私は

import groovy.sql.Sql 

class Test { 

    private static final String PROJECT_INFO_FOR_USER ="select PROJECT_ID as PROJECT_NO, NAME as PROJECT_NAME from PROJECT_DIM where PROJECT_ID IN (" 

    private getProjectList(caseResult) { 
     def query = new StringBuffer(PROJECT_INFO_FOR_USER) 
     def binds = [] 
     caseResult.each { projno -> 
      if (query.length() == 0) { 
       query.append '?,' 
       binds << projno.project_no 
      } else { 
       if (query.indexOf(projno.project_no) == -1) { 
        query.append '?,' 
        binds << projno.project_no 
       } 
      } 
     } 

     query.deleteCharAt(query.length() - 1) 
     query.append(')') 
     [query: query.toString(), binds: binds] 
    } 

    private process() { 
     def db = [url: "jdbc:oracle:thin:@x.xx.xx.xx:1521:ORCL", 
        user: 'xxxx', 
        password: 'xxxx', 
        driver: 'oracle.jdbc.pool.OracleDataSource'] 
     def sql = Sql.newInstance(db.url, db.user, db.password, db.driver) 
     println "DB connection ready" 

     def caseResult = [['project_no':'x-xxxx', 'case_nos':['12344'], 'updated_on':'1485335172'], ['project_no':'y-yyyy', 'case_nos':['56789'], 'updated_on':1490359241]] 
     def projectList = "x-xxxx" 
     def params = getProjectList(caseResult) 

     def result = sql.rows(params.query, params.binds).collect {   // If I replace params with projectList then 'result' is assigned a row from oracle database 
      it as Map 
     } 
     println result 
    } 

    public static void main(String[] args) { 
     Test t = new Test() 
     t.process() 
    } 
} 
関連する問題