2013-05-07 65 views
0

需要一點幫助,關閉這部分,也許更多一點。我正嘗試從Grails服務中調用Oracle 11g中的存儲過程。從Grails服務調用PLSQL存儲過程

到目前爲止:

import java.sql.* 
import groovy.sql.Sql 
import oracle.jdbc.driver.OracleTypes 

class DummyService { 

def dataSource 

def serviceMethod() { 
} 

def listPeople(){ 
    Sql sql = new groovy.sql.Sql(dataSource) 
    def resultList = [] 

    sql.call("BEGIN mypackage.p_get_people(?); END;", 
      [Sql.resultSet(OracleTypes.CURSOR)]) {cursorResults -> 

      if(cursorResults.next()) { 
       results = cursorResults.getAt(1); 
      } 
    } 
    return resultList 
} 

好了,所以這將返回第一行的數據,以及根據什麼傳遞給getAt()方法,我可以抓住該列。我在這裏發現的ORACLE STORED PROCS IN GRAILS

我真正想要的是返回結果集並將其放入列表中,我只是不知道該怎麼做。

當我嘗試{cursorResults -> println cursorResults}它拋出一個錯誤

Message: org.apache.commons.dbcp.DelegatingCallableStatement with Address: "[email protected]"is closed 

直接在Oracle上運行這個程序有457行中的光標,有沒有什麼幫助的。

編輯1: 應對dmahapatro,這是NPE

| Error 2013-05-07 14:16:05,123 [http-bio-8080-exec-1] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [GET] /testapp/messages/list 
Stacktrace follows: 
Message: null 
Line | Method 
->> 15 | list  in testapp.MessagesController$$EO5AzzAw 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter 
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker 
| 908 | run . . in  '' 
^ 662 | run  in java.lang.Thread 

而現在15行僅僅是println dummyService.listPeople()

+0

什麼是'listPeople()'中的'affiliateList'? – dmahapatro 2013-05-07 20:36:23

+0

與peopleList相同的列表,我正在更改名稱 – idonaldson 2013-05-07 20:38:07

+0

您是否使用過'eachRow',如下面的答案中所述? – dmahapatro 2013-05-07 20:42:50

回答

1

sql.call結果GroovyResultSet。您應該能夠對結果集執行eachRow並將其推送到列表中。

def listPeople(){ 
    Sql sql = new groovy.sql.Sql(dataSource) 
    def resultList = [] 

    sql.call("BEGIN mypackage.p_get_people(?); END;", 
      [Sql.resultSet(OracleTypes.CURSOR)]) {cursorResults -> 
      cursorResults.eachRow{result -> 
       resultList << result 
      } 
    } 
    return resultList 
} 

編輯:

或者使用sql.eachRow

sql.eachRow("BEGIN mypackage.p_get_people(?); END;", 
      [Sql.resultSet(OracleTypes.CURSOR)]) {row -> 
       resultList << row 
    } 
+0

我得到了一個N​​PE。 – idonaldson 2013-05-07 20:18:43

+0

哪一行?你說你已經有了'cursorResults'填充?我能看到異常嗎? – dmahapatro 2013-05-07 20:25:55

+0

我更新了NPE錯誤的原始問題 – idonaldson 2013-05-07 20:32:35

0

該做的工作對我來說唯一的事情是這樣的:

def array = [] 
sql.call("begin SCHEMA.PKG_NAME.PROCEDURE_NAME(${personId},${Sql.resultSet OracleTypes.CURSOR}); end;") 
      {rset -> 
       rset.eachRow(){       
        array.add(["NAME":it.getString("TABLE_COLUMN_NAME"),"DESC":it.getString("TABLE_COLUMN_DESC")]) 
       } 
      } 

當我不使用它.getString(「TABLE_COLUMN_NAME」)它會給我一個NULL錯誤在我嘗試「println」