Динамический SQL с использованием DB2 - PullRequest
0 голосов
/ 26 ноября 2018

Я занимаюсь этим уже несколько дней и не могу найти ответ на свой вопрос.Я хочу иметь возможность динамически создавать операторы SQL для работы с моей базой данных DB2.Ниже приведен тестовый код, с которым я играю, чтобы увидеть, как DB2 интерпретирует мой sql, но я получаю сообщение об ошибке каждый раз, когда запускаю это.Пожалуйста помоги.

Begin

Declare Monthcol integer;
Declare TXPage integer;
Declare TXYear integer;
Declare text varchar(2000);

set Monthcol = 11;
set TXPage = 10190;
set TXYear = 2018;

set text = 'Select GLMN'|| Monthcol ||  'from gldbfa.glpgl where glyear = 
2018 and glpage = 10190';
Print text;

end;

Я попытался привести переменные к varchar и попытался переместить секцию печати после окончания.Я получаю

"Состояние SQL: 42601 Код поставщика: -104 Сообщение: [SQL0104] TEXT токена недействителен. Допустимые токены::. Причина ... ...: Синтаксическая ошибка обнаружена втокен TEXT. Токен TEXT не является допустимым токеном. "

, если печать выполняется до конца.

Я получаю

" Состояние SQL: 42601 VendorКод: -104 Сообщение: [SQL0104] Недопустимый токен PRINT. Допустимые токены: (CL END GET УСТАНОВИТЬ ВЫЗОВ СВОБОДНОГО БЛОКИРОВКИ ОТКРЫТОГО ОТКРЫТИЯ С ALTER. Причина ....: Синтаксическая ошибка обнаружена на токене PRINT. "

если печать идет после конца.

Это очень легко сделать в SQL Server, но я очень новичок в DB2. Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

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

SELECT 
CASE
 WHEN :Monthcol = 1 THEN GLMN01 
 WHEN :Monthcol = 2 THEN GLMN02
 ---
 --- etc
 ---
 WHEN :Monthcol = 12 THEN GLMN12
END AS "GLMN"
FROM gldbfa.glpgl 
WHERE glyear = :TXYear AND glpage = :TXPage 
0 голосов
/ 27 ноября 2018

Если пример кода, который вы опубликовали, скопирован / вставлен из вашего фактического кода, то, вероятно, ваша проблема - просто пробелы в вашей конкатенации.

Begin

Declare Monthcol integer;
Declare TXPage integer;
Declare TXYear integer;
Declare text varchar(2000);

set Monthcol = 11;
set TXPage = 10190;
set TXYear = 2018;

set text = 'Select GLMN' || Monthcol || ' from gldbfa.glpgl
            where glyear = 2018 and glpage = 10190'; <----- You were missing a space after Monthcol so your select statements was 'Select GLMN11from gldbfa...'

-- execute statment here    
end;
0 голосов
/ 26 ноября 2018

Db2 для IBM i не имеет print

Вам нужно смотреть на Db2 для документов IBM i, а не на Db2 для LUW.
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzahg/rzahgsql.htm

В ответ на ваш комментарий, да, вы можете создавать динамические запросы ...

Как бы то ни было, делать это внутри хранимой процедуры SQL может быть сложно ... все зависит от того, что вы хотите сделать с результатами.См. Этот вопрос ... Динамически ссылаться на имя таблицы в запросе DB2 DB2 / 400 ..?

Что вы хотите сделать с возвращенной строкой?

...