powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая процедура и SQL0746N
24 сообщений из 24, страница 1 из 1
Хранимая процедура и SQL0746N
    #35776940
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь сделать что-то вроде динамического представления. Имеется удф возвращающая набор строк, внутри нее вызывается процедура заполняющая таблицу из которой и возвращается набор. В итоге получаю SQL0746N - ошибка - мутация таблицы. Может кто в курсе - возможно ли разрешить редактирования таблицы и возвращения селекта с нее в одной процедуре?
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777050
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия и фикспак db2 какие?
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777089
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
db2level
DB21085I Instance "db2inst1" uses "64" bits and DB2 code release "SQL09010"
with level identifier "02010107".
Informational tokens are "DB2 v9.1.0.0", "s060629", "LINUXAMD64", and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V9.1".
Хотелось бы решение в коде, а не в настройках :)
это должно работать на 8-й и 9.5
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777160
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте

db2stop
db2set DB2_RESOLVE_CALL_CONFLICT =ALL
db2start
db2 CALL SYSPROC.REBIND_ROUTINE_PACKAGE ('P','procedureschema.procedurename','CONSERVATIVE')

Работать, если и будет, то только в v9.5.2 и выше.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777205
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, я уже пробовал - на 9.1 не работает.
Вообще мне надо вернуть из внешней процедуры/функции набор данных - может быть вы в курсе как это сделать?
Я навскидку сделал таблицу - загружаю в нее данные, а функций просто вызываю ее и выдаю набор.
В доках пока не нашел как из внешней процедуры можно набор вернуть.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777495
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IntserСпасибо, я уже пробовал - на 9.1 не работает.
Вообще мне надо вернуть из внешней процедуры/функции набор данных - может быть вы в курсе как это сделать?
Я навскидку сделал таблицу - загружаю в нее данные, а функций просто вызываю ее и выдаю набор.
В доках пока не нашел как из внешней процедуры можно набор вернуть.Опишите подробнее ваш алгоритм.
Что вам надо сделать?
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777537
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно сделать например вот такое
select * from TABLE(some_udf())
- т.е. возвратить набор, причем это внешняя процедура. Я первоначально сделал просто - внешняя процедура на С++ заполняет таблицу, а удф на sql просто ее вызывает и возвращает набор.
Хорошо было бы ссылку на толковую доку по этому вопросу - потому что непонятных вещей для меня еще довольно много.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35777873
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IntserМне нужно сделать например вот такое
select * from TABLE(some_udf())
- т.е. возвратить набор, причем это внешняя процедура. Я первоначально сделал просто - внешняя процедура на С++ заполняет таблицу, а удф на sql просто ее вызывает и возвращает набор.
Хорошо было бы ссылку на толковую доку по этому вопросу - потому что непонятных вещей для меня еще довольно много.Если ваша функция должна:
- вызвать процедуру, которая вставит записи в таблицу t1
- потом сделать как-то select ... from t1 where ... чтобы вернуть то, что вставила процедура
то так до v9.5.2 не получится.
Если же без select ... from t1 ... можно обойтись (например, процедура возвращает result set из вставленных записей), то можно, но с помощью С udf, а не sql.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35778515
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote]
Если же без select ... from t1 ... можно обойтись (например, процедура возвращает result set из вставленных записей), то можно, но с помощью С udf, а не sql.
[/quote]
Да, это именно то, что мне нужно. Вы не знаете толковой доки по этому вопросу - я скачал несколько редбуков и книгу по sql pl - там расписывается возвращение резалт сетов для процедур и функций на sql pl - но очень мало про внешние процедуры на c++
Вообще ничего не о том как применять макросы типа EXEC :(
Я по примерам что-то пытаюсь делать - но много непонятного.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779231
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Intser,

Давайте поконкретней? Примеры, очевидно, Вы уже нашли.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
EXEC SQL BEGIN DECLARE SECTION;
   sqlint32 hvOutId;
EXEC SQL END DECLARE SECTION;

sqlint32 lRet = false;

EXEC SQL WHENEVER SQLERROR GOTO return_error;

EXEC SQL
   SELECT ID
      INTO :hvOutId
     FROM SCH.TABLE WHERE FLAG = 'O';

  lRet = true;

return_error:

  EXEC SQL ROLLBACK;

...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779247
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Kiselev,

Сори, с ROLLBACK - я погорячился, он здесь совсем не к месту.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779281
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IntserВы не знаете толковой доки по этому вопросу - я скачал несколько редбуков и книгу по sql pl - там расписывается возвращение резалт сетов для процедур и функций на sql pl - но очень мало про внешние процедуры на c++
Вообще ничего не о том как применять макросы типа EXEC :(
Я по примерам что-то пытаюсь делать - но много непонятного.Начните отсюда: Introduction to embedded SQL .
Можно также для динамического sql: Introduction to DB2 Call Level Interface and ODBC .
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779418
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir KiselevIntser,

Давайте поконкретней? Примеры, очевидно, Вы уже нашли.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
EXEC SQL BEGIN DECLARE SECTION;
   sqlint32 hvOutId;
EXEC SQL END DECLARE SECTION;

sqlint32 lRet = false;

EXEC SQL WHENEVER SQLERROR GOTO return_error;

EXEC SQL
   SELECT ID
      INTO :hvOutId
     FROM SCH.TABLE WHERE FLAG = 'O';

  lRet = true;

return_error:

  EXEC SQL ROLLBACK;



Примерно так я и сделал - только у меня declare global temporary table и соответственно курсор на нее.
Получаю набор просто вызовом call some_proc(). Интересно можно этот курсор обработать в удф - не нашел никаких упоминаний - что-нибудь вроде этого сделать: select * from TABLE(some_udf())
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779473
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinIntserВы не знаете толковой доки по этому вопросу - я скачал несколько редбуков и книгу по sql pl - там расписывается возвращение резалт сетов для процедур и функций на sql pl - но очень мало про внешние процедуры на c++
Вообще ничего не о том как применять макросы типа EXEC :(
Я по примерам что-то пытаюсь делать - но много непонятного.Начните отсюда: Introduction to embedded SQL .
Можно также для динамического sql: Introduction to DB2 Call Level Interface and ODBC .

Спасибо, похоже то что нужно.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779501
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinЕсли ваша функция должна:
- вызвать процедуру, которая вставит записи в таблицу t1
- потом сделать как-то select ... from t1 where ... чтобы вернуть то, что вставила процедура
то так до v9.5.2 не получится.
Если же без select ... from t1 ... можно обойтись (например, процедура возвращает result set из вставленных записей), то можно, но с помощью С udf, а не sql.Я тут ошибку допустил.
External UDF не может модифицировать данные (или вызывать процедуру, которая это делает).
Так что без серьёзных извращений (типа вызова внутри функции на java процедуры через дополнительное jdbc type-4 соединения) не обойтись.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779533
IntserМне нужно сделать например вот такое
select * from TABLE(some_udf())
- т.е. возвратить набор, причем это внешняя процедура. Я первоначально сделал просто - внешняя процедура на С++ заполняет таблицу, а удф на sql просто ее вызывает и возвращает набор.
Хорошо было бы ссылку на толковую доку по этому вопросу - потому что непонятных вещей для меня еще довольно много.
Зачем нужно делать именно так? Код хранимой процедуры вам доступен для изменения?

Можно сделать так:
1. В хранимой создать и заполнить временную таблицу.
2. В приложении вызвать хранимую и после ее выполнения сделать выборку из временной таблицы.
В таком случае функция как таковая не нужна.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779595
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так я и делаю - только процедура у меня возвращает курсор - селект из временной таблицы.
Я хотел сделать дополнительную обертку из удф типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE FUNCTION func() 
RETURNS TABLE (DBNAME VARCHAR( 10 ),  ALIAS VARCHAR( 10 ), DRIVE VARCHAR( 400 ), NODENAME VARCHAR( 50 ), DBTYPE VARCHAR( 40 ), COMMENT VARCHAR( 50 ))
LANGUAGE SQL
SPECIFIC func
NOT DETERMINISTIC
MODIFIES SQL DATA
EXTERNAL ACTION
A: BEGIN ATOMIC
CALL proc();
RETURN SELECT DBNAME, ALIAS, DRIVE, NODENAME, DBTYPE, COMMENT FROM SESSION.TEMP_TB
END A
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779596
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Intser,

В примерах есть Ваш вариант, это TableUDF, причём на разных языках. Только временную таблицу и пространство нужно будет создать вне этой функции.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779610
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня неожиданным оказался тот факт, что временная таблица исчезает после окончания сессии(в основном я работал с ораклом - там она создается один раз). При этом у меня не срабатывает создание функции - временная таблица декларируется в процедуре и в функции она оказывается не известной.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779664
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы.
Буду смотреть примеры, разбираться.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35779683
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir KiselevIntser,

В примерах есть Ваш вариант, это TableUDF, причём на разных языках. Только временную таблицу и пространство нужно будет создать вне этой функции.SQL-функции в db2 for LUW не могут обращаться ко временным таблицам:
Код: plaintext
1.
2.
3.
4.
5.
declare global temporary table session.t1(i int) on commit preserve rows not logged@

create function f1()
returns table (i int)
return select i from session.t1@
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0526N The requested function does not apply to declared temporary tables.
LINE NUMBER=3. SQLSTATE=42995

Explanation:

The SQL statement being executed refers to a declared temporary
table. A declared temporary table cannot be used in the given
context.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35780167
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Вот такая штука работает, но, примеров на c/cpp нет, есть только на других языках. Поскольку они работают с контекстом, то выборка из курсора, открытого в PRO1 должна пройти нормально (из CLP работает). Как на с, я не пробовал, а потому не знаю, увы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE USER TEMPORARY TABLESPACE TSPACE1 MANAGED BY SYSTEM USING ('TSPACE')@
declare global temporary table session.t1(i int) on commit preserve rows not logged in tspace1@

create procedure pro1()
dynamic result sets  1 
begin atomic
  DECLARE c1 CURSOR WITH RETURN FOR
    select i from session.t1;
  
  -- можно отсюда вынести эти команды
  insert into session.t1 values( 7 );
  insert into session.t1 values( 8 );
  open c1;
end@

-- Нормально работает
call pro1()@

-- !!! некорректная функция, просто пример того, что можно вызвать pro1 из UDF
create function f1()
returns table (i int)
modifies sql data
begin atomic
  call pro1();
  return values( 6 );
end@

select * from TABLE(f1()) as f@
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35780270
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Kiselev,

1. В процедуре, которую вызывает sql функция, может быть обращение к временным таблицам. Напрямую из функции - нет, она просто не скомпилируется.
2. sql функции не могут объявлять курсоры или с ними работать, поэтому в sql функции невозможно обработать result set процедуры.
3. внешняя функция может обработать result set процедуры, но из внешней функции нельзя выполнять команды изменения данных (в т.ч. вызывать modifies sql data процедуры), а sql табличная функция может быть modifies sql data.

Твой пример не противоречит ни одному утверждению.
Поэтому, если только из выходных параметров процедуры не удастся собрать select для return в sql функции, то до v9.5.2 ничего не выйдет.
...
Рейтинг: 0 / 0
Хранимая процедура и SQL0746N
    #35781910
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остановился просто на возврате набора из:
Код: plaintext
1.
2.
-- процедура декларирует временную таблицу, заполняет ее и возвращает открый курсор
CALL some_proc()
Отрабатывает как если бы делался селект из таблицы
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая процедура и SQL0746N
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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