Источник данных возвращен из сохраненного процесса Informix - PullRequest
2 голосов
/ 16 января 2009

У меня есть хранимая процедура Informix, которая возвращает два столбца и несколько строк. Я могу использовать "EXECUTE FUNCTION curr_sess (2009, 'SP')" "отлично, но как мне получить результаты во временной таблице.

РЕДАКТИРОВАТЬ: Мы находимся на версии 10.00.HC5


Проверка идеи Джонатана Леффлера не сработала.

EXECUTE FUNCTION curr_sess(2009,'SP')

отлично работает. Тогда я сделал

CREATE TEMP TABLE t12(yr smallint, sess char(4));

Но когда я пытаюсь

INSERT INTO t12 EXECUTE FUNCTION curr_sess(2009,'SP');

Это не работает, я получаю «Недопустимый оператор SQL в программе SPL». ошибка.


Источник для curr_sess

begin procedure

DEFINE _yr smallint;
DEFINE _sess char(4);

SELECT
    DISTINCT
    sess_vw.yr,
    sess_vw.sess,
    sess_vw.sess_sort
FROM
    sess_vw
ORDER BY
    sess_vw.sess_sort DESC
INTO temp tmp_sess WITH NO LOG;

SELECT
    FIRST 1
    tmp_sess.yr,
    tmp_sess.sess
FROM
    tmp_sess
WHERE
    tmp_sess.sess_sort = sess_sort(iYear,sSess)
INTO temp tmp_final WITH NO LOG;

FOREACH cursor1 FOR
    SELECT
        tmp_final.yr,
        tmp_final.sess
    INTO
        _yr,
        _sess
    FROM
         tmp_final
    RETURN _yr, _sess WITH RESUME;
END FOREACH;

DROP TABLE tmp_sess;
DROP TABLE tmp_final;

end procedure

EDIT: sess_sort () выполняет поиск.

Я пытался переписать функцию одним запросом. Вот следующая_сессия:

SELECT
    FIRST 1
    sess_vw.sess_sort
FROM
    sess_vw
WHERE
    sess_vw.sess_sort > sess_sort(2009,'SP')
ORDER BY
    sess_vw.sess_sort ASC

Кто-то из IBM написал мне по электронной почте и предложил использовать что-то вроде этого:

SELECT
    *
FROM
    TABLE(next_sess(2009,'SP'))

Но это все равно не сработало.

Ответы [ 2 ]

4 голосов
/ 17 января 2009

Одна возможность - это хранимая процедура. Другой (протестированный на IDS 11.50.FC1), который я не был уверен, будет работать:

CREATE PROCEDURE r12() RETURNING INT, INT;
   RETURN 1, 2 WITH RESUME;
   RETURN 2, 3 WITH RESUME;
END PROCEDURE;

CREATE TEMP TABLE t12(c1 INT, c2 INT);

INSERT INTO t12 EXECUTE PROCEDURE r12();

Последняя строка является важной.


Принимая во внимание, что хранимая процедура не может быть выполнена, как показано выше (поскольку она содержит недопустимый оператор SQL), вам нужно использовать хранимые процедуры другим способом - проиллюстрированным этим тестовым кодом (который работает: сработал первым) время, которое меня приятно удивило):

CREATE TEMP TABLE t12(yr smallint, sess char(4));

CREATE PROCEDURE curr_sess(yearnum SMALLINT, sesscode CHAR(2))
    RETURNING SMALLINT AS yr, CHAR(4) AS sess;
    RETURN yearnum, (sesscode || 'AD') WITH RESUME;
    RETURN yearnum, (sesscode || 'BC') WITH RESUME;
END PROCEDURE;

CREATE PROCEDURE r12(yearnum SMALLINT, sesscode CHAR(2))
    DEFINE yr SMALLINT;
    DEFINE sess CHAR(4);
    FOREACH EXECUTE PROCEDURE curr_sess(yearnum, sesscode) INTO yr, sess
    INSERT INTO t12 VALUES(yr, sess);
    END FOREACH;
END PROCEDURE;

EXECUTE PROCEDURE r12(2009,'SP');

SELECT * from t12;

Вы можете включить создание временной таблицы в хранимую процедуру; Вы могли бы даже организовать удаление ранее существующей таблицы с тем же именем, что и временная таблица (используйте обработку исключений). Учитывая, что вы используете IDS 10.00, вы застряли с фиксированным именем для временной таблицы. Было бы возможно, хотя и не рекомендовано (мной) использовать динамическое средство SQL в 11.50 для именования временной таблицы во время выполнения.

Помните, что хранимые процедуры, которые обращаются к временным таблицам, при повторном использовании повторно оптимизируются - используемая таблица не совпадает с прошлой (потому что она временная), поэтому план запроса не так уж и полезен.

0 голосов
/ 28 января 2009

Возможно, это не получится, потому что «отбрасываемая таблица» не является допустимой оценкой в ​​процедуре, которая используется в этом контексте? http://publib.boulder.ibm.com/infocenter/idshelp/v115/topic/com.ibm.sqls.doc/ids_sqs_1755.htm#ids_sqs_1755

...