ОШИБКА: курсор"< неназванный портал 5 >" не существует

Abirami спросил: 28 апреля 2018 в 08:28 в: java

Я пытаюсь вызвать функцию / хранимую процедуру PostgreSQL (которая возвращает курсор). Я вызываю функцию через stored-proc-outbound-gateway Spring Integration. Это дает мне ошибку ниже:

Caused by: org.springframework.messaging.MessageHandlingException: Expression evaluation failed: @sampleProcedureGateway.exchange(#root).payload; nested exception is org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{? = call erb.getSampleDetails_sp(?, ?, ?, ?, ?)}]; SQL state [34000]; error code [0]; ERROR: cursor "<unnamed portal 5>" does not exist; nested exception is org.postgresql.util.PSQLException: ERROR: cursor "<unnamed portal 5>" does not exist

Ниже приведена конфигурация интеграции Spring:

<int:chain input-channel="inputDataChannel">
    <int-jdbc:stored-proc-outbound-gateway data-source="dataSource" expect-single-result="true" is-function="true" stored-procedure-name="erb.getSampleDetails_sp" ignore-column-meta-data="true">
        <int-jdbc:sql-parameter-definition name="id" direction="IN"/>
        <int-jdbc:sql-parameter-definition name="date" direction="IN"/>
        <int-jdbc:sql-parameter-definition name="name" direction="IN"/>
        <int-jdbc:sql-parameter-definition name="endrow" type="INTEGER" direction="IN"/>
        <int-jdbc:sql-parameter-definition name="startrow" type="INTEGER" direction="IN"/>
        <int-jdbc:sql-parameter-definition name="finalData" direction="OUT"/>
        <int-jdbc:parameter name="id" expression="headers.messageProcessResultHeader.interfaceRequestMetaData.dealerCode"/>
        <int-jdbc:parameter name="date" expression="headers['documentDate']"/>
        <int-jdbc:parameter name="name" expression="headers['IsRTIDealer']"/>
        <int-jdbc:parameter name="endrow" expression="headers['endRow']"/>
        <int-jdbc:parameter name="startrow" expression="headers['startRow']"/> 
        <int-jdbc:returning-resultset name="finalData" row-mapper="sampleRowMapper" />
</int-jdbc:stored-proc-outbound-gateway>                                                        
</int:chain>

Ниже хранится процедура:

CREATE OR REPLACE FUNCTION erb.getSampleDetails_sp(
id text,
date text,
name text,
endrow double precision,
startrow double precision,
OUT finalData refcursor)
    RETURNS refcursor
    LANGUAGE 'plpgsql'    COST 100
    VOLATILE 
AS $BODY$BEGIN
    IF name = 'true' THEN
        OPEN finalData FOR
        SELECT
            *
            FROM (SELECT
                row_number() OVER (ORDER BY NULL) AS rnum, vhinv.*
                FROM (SELECT query) AS vhinv
                LIMIT i_endrow) AS var_sbq
            WHERE rnum >= i_startrow;
    ELSE
        OPEN finalData FOR
        SELECT
            *
            FROM (SELECT
                row_number() OVER (ORDER BY NULL) AS rnum, vhinv.*
                FROM (SELECT query) AS vhinv
                LIMIT i_endrow) AS var_sbq_2
            WHERE rnum >= i_startrow;
    END IF;
END;$BODY$;

Есть ли способ разрешить это?


2 ответа

Artem Bilan ответил: 28 апреля 2018 в 12:35

Прежде всего, вам действительно нужно быть уверенным, что хранимая процедура действительно является функцией (is-function="true"), и она возвращает курсор.

Было бы замечательно убедиться, что ваша хранимая процедура что вы правильно сопоставляете все аргументы.

В справочном руководстве также есть описание:

Определяет направление определения параметра SQL. По умолчанию используется IN. Допустимые значения: IN, OUT и INOUT. Если ваша процедура возвращает ResultSets, используйте элемент returning-resultset. Необязательно.

Я имею в виду, что вам нужно удалить sql-parameter-definition name="finalData" из вашей конфигурации и просто положиться на returning-resultset name="finalData".

Abirami ответил: 29 апреля 2018 в 10:09
Да. Все SP в Postgres объявлены как функция. Я попытался удалить sql-параметр-definition name ="finalData". Но все же я получаю ту же ошибку. Отредактированный вопрос с сохраненным содержимым процедуры. (Без включения фактических запросов выбора)
Artem Bilan ответил: 29 апреля 2018 в 10:10
Вы должны отредактировать свой вопрос и показать процедуру
Abirami ответил: 29 апреля 2018 в 10:48
Отредактирован вопрос с помощью хранимой процедуры
Abirami ответил: 29 апреля 2018 в 12:01

Эта проблема была исправлена ​​после установки autoCommit в false в определении компонента Datasource.

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverName);
dataSource.setUrl(dbConnectionUrl);
dataSource.setUsername(userName);
dataSource.setDefaultAutoCommit(false);
dataSource.setEnableAutoCommitOnReturn(false);