Как вернуть результирующий набор таблицы в DB2-LUW без использования курсора?

#sql #db2 #db2-luw

#sql #db2 #db2-luw

Вопрос:

Я пытаюсь создать хранимую процедуру в DB2-LUWv10.5. Мне нужно вернуть результирующий набор таблицы без использования курсора (С ВОЗВРАТОМ).

Я запускаю приведенный ниже код на DB2-LUWv10.5. Когда я использую Approach2, он работает нормально и возвращает ожидаемый результирующий набор в качестве выходных данных, т.е. зарплату и бонус всех сотрудников. Однако, когда я использую Approach1, он выдает мне ошибку.

Обнаруженные ошибки:

  1. Ожидалось «,» вместо «;».
  2. «зарплата, бонус», похоже, неуместны.
  3. После «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. Однако хранимая процедура все равно должна открывать курсор, только для того, чтобы она могла передать открытый курсор обратно в качестве параметра. Однако вызывающей стороне все равно потребуется использовать этот курсор.

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