#sql #db2 #db2-luw
#sql #db2 #db2-luw
Вопрос:
Я пытаюсь создать хранимую процедуру в DB2-LUWv10.5. Мне нужно вернуть результирующий набор таблицы без использования курсора (С ВОЗВРАТОМ).
Я запускаю приведенный ниже код на DB2-LUWv10.5. Когда я использую Approach2, он работает нормально и возвращает ожидаемый результирующий набор в качестве выходных данных, т.е. зарплату и бонус всех сотрудников. Однако, когда я использую Approach1, он выдает мне ошибку.
Обнаруженные ошибки:
- Ожидалось «,» вместо «;».
- «зарплата, бонус», похоже, неуместны.
- После «p1» был достигнут конец текста.
Подход 1:
CREATE PROCEDURE read_emp()
SPECIFIC read_emp
LANGUAGE SQL
DYNAMIC RESULT SETS 1
p1: BEGIN
SELECT salary, bonus
FROM employee;
END p1
Подход 2:
CREATE PROCEDURE read_emp()
SPECIFIC read_emp
LANGUAGE SQL
DYNAMIC RESULT SETS 1
p1: BEGIN
DECLARE c_emp CURSOR WITH RETURN FOR
SELECT salary, bonus
FROM employee;
OPEN c_emp;
END p1
Ожидаемый результат —
Salary Bonus
25000 2500
30000 3000
50000 5000
40000 4000
45000 4500
Комментарии:
1. Привет, TT, только что добавил их.
2. Вы не можете использовать составные инструкции bare
SELECT
в Db2 SQL PL; вы должныSELECT ... INTO
что-то. Почему вы не хотите использовать курсор, если он работает так, как вы ожидаете?3. Курсор работает как ожидалось. Однако мне нужно знать, доступно ли в Db2 какое-либо другое решение для возврата результирующего набора.
Ответ №1:
Ваш «Подход 1» имеет недопустимый синтаксис, и Db2 отклонит его, потому что таков дизайн.
Хранимая процедура, которая хочет вернуть результирующий набор с помощью dynamic result set
синтаксиса, должна объявить и открыть хотя бы один курсор.
Но хранимая процедура не обязательно должна использовать синтаксис динамического результирующего набора. Хранимая процедура может свободно использовать выходной параметр, который является либо слабо типизированным типом данных cursor, либо строго типизированным типом данных cursor. Однако хранимая процедура все равно должна открывать курсор, только для того, чтобы она могла передать открытый курсор обратно в качестве параметра. Однако вызывающей стороне все равно потребуется использовать этот курсор.
Пользовательские функции могут возвращать таблицы, это альтернативный подход, поэтому вызывающим не нужно использовать явные курсоры для доступа к результирующим данным.