Squeak.ru - шаблоны программирования

Вызов хранимой процедуры PLSQL из службы Grails

Нужна небольшая помощь с закрытием этой части, и, может быть, немного больше. Я пытаюсь вызвать хранимую процедуру в Oracle 11g из службы 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 В GRAILS

Что я действительно хочу, так это вернуть набор результатов и поместить его в список, я просто не знаю, как это сделать.

При попытке {cursorResults -> println cursorResults} выдает ошибку

Message: org.apache.commons.dbcp.DelegatingCallableStatement with Address: "oracle.jdbc.driver.T4CCallableStatement@...."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()


  • Что такое affiliateList в listPeople()? 08.05.2013
  • тот же список, что и peopleList, я менял имена 08.05.2013
  • Вы использовали eachRow, как указано в ответе ниже? 08.05.2013
  • Да. Похоже на {cursorResults -> cursorResults.eachRow{result -> resultList << result} 08.05.2013
  • Я не уверен насчет NPE в блоке кода, если не увижу его полностью. Вы также можете попробовать использовать sql.eachRow вместо sql.call. sql.eachRow вызывает замыкание для каждой строки. См. мое редактирование для образца. 08.05.2013

Ответы:


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
    }
07.05.2013
  • Какая линия? Вы сказали, что уже заполнили cursorResults? Могу ли я увидеть исключение? 08.05.2013
  • Взгляните на последние несколько строк из того же сообщения, которое вы упомянули в вопросе. 08.05.2013

  • 2

    единственное, что сработало для меня, это:

    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")])
                    }
                }
    

    Когда я не использовал его.

    27.11.2014
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...