#sql #db2-400 #temporary
#sql #db2-400 #временная
Вопрос:
DB2 / 400 SQL: Я работаю в функции sql, которая использует глобальную временную таблицу. У меня возникла проблема с объявлением этой таблицы: SQL отправляет мне сообщение об ошибке, но я не вижу, в чем проблема? Может кто-нибудь рассказать мне, что связано с этой ошибкой?
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос, чтобы включить текстовую версию инструкции и ошибки, а не картинку. Таким образом, мне не нужно отсеивать лишние биты, и я могу вырезать и вставить это в свой клиент для тестирования.
2. Функция создается, когда я отключаю строки объявления моей временной таблицы: в документе IBM не указано, как сделать объявление такого типа в функции.
3. Процедуры SQL должны быть определены, а затем скомпилированы, прежде чем вы сможете их использовать. Здесь неясно, что вы делаете, на каком шаге вы находитесь. Если вы пытаетесь определить ее (запустить как SQL), имейте в виду, что тело процедуры содержит точки с запятой, поэтому вам нужно изменить разделитель SQL на что-то другое перед ее запуском. Я сам использую ‘#’. Это должно быть в последней строке вашего кода.
Ответ №1:
Я не говорю и не читаю по-французски, но, похоже, ошибка сообщает вам, что определение вашей функции ожидает возвращаемое значение, но тело функции ничего не возвращает.
Теперь при создании скалярной функции SQL тело функции начинается с объявлений. Эти объявления предназначены для переменных и курсоров. К некоторому сожалению, вы создаете глобальную временную таблицу, используя инструкцию, начинающуюся с DECLARE
. Это относится не к объявлениям, а к телу процедуры.
.-NOT ATOMIC-.
>>- -------- --BEGIN-- ------------ ---------------------------->
'-label:-' '-ATOMIC-----'
>-- --------------------------------------- -------------------->
| .-----------------------------------. |
| V | |
'--- -SQL-variable-declaration-- -- ; -'
-SQL-condition-declaration-
-return-codes-declaration--
'-INCLUDE-statement---------'
>-- -------------------------------------- --------------------->
| .----------------------------------. |
| V | |
'--- -DECLARE CURSOR-statement- -- ; -'
'-INCLUDE-statement--------'
>-- --------------------------------- -------------------------->
| .-----------------------------. |
| V | |
'--- -handler-declaration- -- ; -'
'-INCLUDE-statement---'
.---------------------------------.
V |
>---- ----------------------------- - --END-- ------- ---------><
'-SQL-procedure-statement-- ; ' '-label-'
Это часть инструкции процедуры SQL!
Комментарии:
1. Да, вы правы. Я исправил это, но снова возникает та же проблема: я не могу объявить глобальную временную таблицу в функции SQL…
2. Функция создается, когда я отключаю строки объявления моей временной таблицы: в документе IBM не указано, как сделать объявление такого типа в функции.
3. Все в порядке: я нашел. Объявление таблицы должно находиться за объявлением переменных.
4. Это то, что я как раз собирался вам рассказать. Просто собираюсь обновить этот ответ для будущих читателей.
Ответ №2:
Раздел объявления должен предшествовать созданию любых таблиц.
Хотя это кажется нелогичным, объявление ГЛОБАЛЬНОЙ ВРЕМЕННОЙ ТАБЛИЦЫ не является обычным объявлением переменной.
Попробуйте переместить объявления других переменных над объявлением таблицы.