2013-05-07 3 views
0

Нужно немного помочь с закрывающей частью этого и, возможно, немного больше. Я пытаюсь вызвать хранимую процедуру в Oracle 11g из моей службы Grails.Вызов PLSQL хранимой процедуры из службы Grails

До сих пор:

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 строк в курсоре, если это помогает на всех.

Edit 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

Что такое 'affiliateList' в' listPeople() '? – dmahapatro

+0

список похожих людейList, я менял имена около – idonaldson

+0

Вы использовали 'eachRow', как указано в ответе ниже? – dmahapatro

ответ

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 
} 

EDIT:

В качестве альтернативы, используя sql.eachRow

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

Я получаю NPE с этим. – idonaldson

+0

Какая линия? Вы сказали, что у вас уже есть «cursorResults»? Могу ли я увидеть исключение? – dmahapatro

+0

Я обновил исходный вопрос с ошибкой NPE – idonaldson

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 erro r на все, что я пытаюсь «println»

Смежные вопросы