powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE
5 сообщений из 5, страница 1 из 1
EXECUTE IMMEDIATE
    #36161816
ihorek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Никак не получается заставить заработать EXECUTE IMMEDIATE
Есть следующий кусок кода:

CREATE TRIGGER Insert_HISTORY_TRIGGER_SOURCE
AFTER INSERT ON HISTORY_TRIGGER_SOURCE
REFERENCING NEW TABLE AS NEW_TAB
FOR EACH ROW
BEGIN ATOMIC
DECLARE l_strXLMAttr varchar(1024);
DECLARE v_strQuery varchar(1024);

FOR C1 AS
SELECT colname FROM syscat.columns WHERE tabname = 'HISTORY_TRIGGER_SOURCE'
DO

IF (l_strXLMAttr IS NULL) THEN
ELSE
SET l_strXLMAttr = l_strXLMAttr || ', ';
END IF;

SET l_strXLMAttr = l_strXLMAttr || ' t.' || C1.colname || ' as ' || colname;

END FOR;

SET v_strQuery = 'update DB2USER.HISTORY_TRIGGER set row_version = ' || l_strXLMAttr;
EXECUTE IMMEDIATE v_strQuery;
END@

При компиляции, гнусно ругается на EXECUTE IMMEDIATE, типа :
SQL0104N Обнаружен неправильный элемент "EXECUTE IMMEDIATE" после текста "' || l_strXLMAttr;
". Список возможных правильных элементов: "<signal_stmt_head>

Подскажите, в чем трабл.
Спасибо
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE
    #36162532
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
попробуйте проверить правильно ли генерится запрос.
Для этого можно или создать курсор в который поместить значение переменной l_strXLMAttr
или создать какую-нибудь табличку в которую поместить вашу переменную.



Тоже, если вы используете какое -нибудь стороннее приложение в качестве консоли, то возможно что оно глючит.

Попробуйте создать триггер в коммандной строке.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE
    #36163036
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В справке описано тело триггера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
|--+-CALL----------------------------------------------+--------|
   |                         ( 5 )                       |   
   +-Compound SQL (compiled)---------------------------+   
   +-Compound SQL (inlined)----------------------------+   
   |        ( 6 )                                        |   
   +-DELETE--------------------------------------------+   
   +-FOR-----------------------------------------------+   
   +-+-----------------------------------+--fullselect-+   
   | |       .-,-----------------------. |             |   
   | |       V                         | |             |   
   | '-WITH----common-table-expression-+-'             |   
   +-GET DIAGNOSTICS-----------------------------------+   
   +-IF------------------------------------------------+   
   +-INSERT--------------------------------------------+   
   +-ITERATE-------------------------------------------+   
   +-LEAVE---------------------------------------------+   
   +-MERGE---------------------------------------------+   
   +-SET Variable--------------------------------------+   
   +-SIGNAL--------------------------------------------+   
   |        ( 7 )                                        |   
   +-UPDATE--------------------------------------------+   
   '-WHILE---------------------------------------------'   

Про EXECUTE IMMEDIATE ничего не сказано.
И ещё, хоть на этапе компиляции ошибки не будет, но сам код триггера не совсем корректен. Переменная l_strXLMAttr не инициализирована. Всё время выполнения она будет NULL, так же как и v_strQuery. Если же исправить это, то в EXECUTE IMMEDIATE попадёт строка вида:
Код: plaintext
'update DB2USER.HISTORY_TRIGGER set row_version = t.field1 as field1, t.field2 as field2, t.field3 as field3'

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE
    #36163288
ihorek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно. Спасибо.
...
Рейтинг: 0 / 0
EXECUTE IMMEDIATE
    #36163920
Favn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ihorek,
EXECUTE IMMEDIATE не входит в подмножество inline SQL PL, употребляемое в триггерах и функциях. Можно создать SP с EXECUTE IMMEDIATE внутри и вызывать ее через доступный в inline CALL. Пример из DB2 Cookbook:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE execute_immediate (IN  in_stmt     VARCHAR( 1000 )
                                   ,OUT out_sqlcode INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
   DECLARE sqlcode INTEGER;
   DECLARE EXIT HANDLER FOR sqlexception
       SET out_sqlcode = sqlcode;
   EXECUTE IMMEDIATE in_stmt;
   SET out_sqlcode = sqlcode;
   RETURN;
END!
COMMIT!

Вызов SP:
Код: plaintext
CALL execute_immediate(in_stmt, out_sqlcode);
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / EXECUTE IMMEDIATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]