2017-04-11 58 views
0

我试图执行一个SQL查询与IN子句,它需要多个project_ids。当我直接在Oracle SQL Developer中运行它时,此查询工作正常,但不能从常规类中运行。如何使用字符串列表作为groovy sql.rows中的绑定参数?

下面是我的代码

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 
[] 

结果当我projectList

取代PARAMS
DB connection ready 
[[PROJECT_NO:x-xxxx, PROJECT_NAME:Xonions, Inc.]] 

以下是上述问题的2个问题

  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() 
    } 
} 
相关问题