powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по хранимой процедуре
21 сообщений из 21, страница 1 из 1
Вопрос по хранимой процедуре
    #34452471
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Имеется некая хранимая процедура типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE DB2.PROCEDURE1 ( IN snmb CHARACTER( 11 ) )
------------------------------------------------------------------------
-- SQL Хранимая процедура
------------------------------------------------------------------------
P1: BEGIN
    DECLARE сfio CURSOR WITH RETURN FOR  SELECT fa,im, ot
    FROM db2.register WHERE npers = snmb;
    OPEN сfio;
END P
При вызове этой процедуры сразу же возвращается значение трех полей.
А как сделать чтобы данные не возвращались сразу же, а только после запроса к курсору, примерно так

Код: plaintext
1.
2.
CALL  DB2.PROCEDURE1( 38475698 )
SELECT * FROM cfio
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34452753
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Если PROCEDURE1 можно изменить, то в ней заполняйте результатами селекта временную таблицу, а не формируйте курсор.
Если нельзя, тогда зависит от того, откуда вызывается PROCEDURE1.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34454647
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процедуру пишу сам, поэтому права на изменения есть. Да этого момента считал что курсор это и есть временная таблица. Переделал процедуру следующим образом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE DB2.PROCEDURE1 ( IN snmb CHARACTER( 11 ) )
------------------------------------------------------------------------
-- SQL Хранимая процедура
------------------------------------------------------------------------
P1: BEGIN
    DECLARE GLOBAL TEMPORARY TABLE сfio AS (SELECT fa,im, ot
    FROM db2.register WHERE npers = snmb) DEFINITION ONLY;
END P

и почему то ругается на переменную snmb, как тогда переменную туда передать? Как назло в SQL Reference Vol 2, нет ни одного примера для сравнения. Подскажите как правильно сделать.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34454786
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сколько понял в DECLARE GLOBAL TEMPORARY TABLE только определяется структура таблицы, теперь не получаеися записать эти данные во временную таблицу
Код: plaintext
1.
2.
3.
4.
db2 declare global temporary table test2 (numb integer) not logged with replace 
db2 insert into session.test2 VALUES ( 1245 )
db2 commit
db2 select * from session.test2
и возвращается 0 записей
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34454986
mitek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в декларацию таблицы добавьте ON COMMIT PRESERVE ROWS
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34455030
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mitekON COMMIT PRESERVE ROWS
спасибо, странно что по умолчанию в таблице нельзя сохранять данные, тогда зачем такая таблица нужна. Ну да ладно. Пока разбираюсь с ХП, возникли другие вопросы.
1. Как определить, что на вход ХП передано нужное кол-во параметров.
2. Что входные параметры нужных типов.
3. Как прервать выполнение ХП если не выполнено одно из условий, с выводом сообщения.

Заранее спасибо за ответы
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34455112
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OlegA67спасибо, странно что по умолчанию в таблице нельзя сохранять данные, тогда зачем такая таблица нужна. Ну да ладно. Пока разбираюсь с ХП, возникли другие вопросы.
1. Как определить, что на вход ХП передано нужное кол-во параметров.
2. Что входные параметры нужных типов.
3. Как прервать выполнение ХП если не выполнено одно из условий, с выводом сообщения.Временная таблица, созданная без предложения ON COMMIT PRESERVE ROWS , очищается после COMMIT.
Если в приложении, вызывающем процедуру, установлен автокоммит (автоматическая выдача COMMIT после каждой sql команды), то такая таблица будет очищаться после вызова процедуры (т.к. после call commit буден выдан автоматом).
Если не установлен - не будет очищаться.
Чтобы очистки не происходило при установленном автокоммите, надо декларировать таблицу с ON COMMIT PRESERVE ROWS.

1. и 2. проверяется менеджером БД при вызове процедуры.
3. : SIGNAL statement
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34455280
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, тогда еще вопрос, не получается вставить конструкцию типа CASE. например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE sn INTEGER DEFAULT  0 
CASE 
    WHEN skod =  1  THEN
         sn =  1457 
         .........
   WHEN  skod =  2  THEN
        sn  =  2 * 15 
        ..........
END

Или эта конструкция CASE используется только в операторе SELECT ?
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34455414
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
set sn=
CASE 
   WHEN skod =  1  THEN  1457 
   WHEN skod =  2  THEN  2 * 15 
END;
А вообще различают CASE statement и Case expression

В догонку к временным таблицам: вы в процедуре добавьте в конец декларации таблицы with replace , а то ваша процедура в одной и той же сессии сработает только 1 раз.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34457984
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
CASE statement Эта конструкция как раз и нужна была.

Не могу понять параметр DYNAMIC RESULT SETS integer в CREATE PROCEDURE. Hасколько понял указывает верхний порог возвращаемых результатом, и как им пользоватся или вернее на что влияет этот параметр. ))
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34458064
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinsteinдобавьте в конец декларации таблицы with replace, а то ваша процедура в одной и той же сессии сработает только 1 раз

В DB2 v 7.2 for win с таким использованием GLOBAL TEMPORARY был глюк:
Без явного DROP TABLE при каждом повторном вызове процедуры на сервере съедались какие-то ресурсы (думаю не освобождалась память из под описания таблицы). Через каждые 200-400 итераций скачком увеличивалось время выполнения очередной итерации и в диспетчере задач на сервере увеличивался объем занятой памяти (выделялся очередной пул?). Память возращалась только по завершения сессии.

Про более старшие версии не знаю - не работал.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34458244
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OlegA67Не могу понять параметр DYNAMIC RESULT SETS integer в CREATE PROCEDURE. Hасколько понял указывает верхний порог возвращаемых результатом, и как им пользоватся или вернее на что влияет этот параметр. ))Это просто декларация. Это кол-во записывается в системный каталог.
В доке написано, что если кол-во реально возвращенных result set'ов не совпадает с тем, что было указано при создании, то должно выдаваться предупреждение (SQLSTATE 0100E).
На самом деле этого не происходит.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34498862
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник еще вопрос, почему то не запускается хранимка, с использованием параметра в режиме OUT
Вот пример
Код: plaintext
1.
2.
3.
4.
CREATE PROCEDURE PROC.PROCEDURE2 (out mem1 INTEGER )
P1: BEGIN
    SET mem1 =  15 ;
END P1           

При выполенение команды DB2 CALL PROC.PROCEDURE2 (), выходит ошибка

SQL0440N Не найдено авторизованной подпрограммы "PROC.PROCEDURE2" типа
"PROCEDURE" с совместимыми аргументами. SQLSTATE=42884.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34498877
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DB2 CALL PROC.PROCEDURE2 ( ? )
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34498985
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо Mark Barinstein, из командной строки все заработало. Но не пучилось сразу запустить подобную хранимку из клиентского приложения(сделано на VFP9). С другого форума подсказали как это сделать. :o)).
Код: plaintext
1.
myvar =  1 
= SQLEXEC(nStatementHandle,"CALL  PROC.PROCEDURE2(?@my_var)")
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34517905
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла очередная проблема. Имеется ХП примерно такого вида
Код: plaintext
1.
2.
3.
4.
5.
P1: BEGIN
------
SET dexper = CAST(SUBSTR(vtext,LOCATE('","',vtext,LOCATE('","',vtext,LOCATE('","',vtext, LOCATE('","',vtext)+ 1 )+ 1 )+ 1 )+ 3 ,  10 ) AS DATE);
------
END P1 
где vtext строка вида
"ИН42",1,"001-001-001 01","ИВАНОВ","ИВАН","ИВАНОВИЧ",2007,",664009,,,ДУБКИ Г,,СТРОИТЕЛЕЙ УЛ,1,В,1",7661.47,0.00,0.00, "01/01/2007/","15/03/2007" ,0,0,0,0,"07/04/2007"
и вроде бы работало , пока не натолкнулся что vtext может быть и такого вида
"ИН42",1,"001-001-001 01","ИВАНОВ","ИВАН","ИВАНОВИЧ",2007,",664009,,,ДУБКИ Г,,СТРОИТЕЛЕЙ УЛ,1,В,1",7661.47,0.00,0.00, "","" ,0,0,0,0,"07/04/2007"
и тогда у меня ХП вылетает по ошибки
SQL0180N Неверный синтаксис строчного представления даты и времени.
SQLSTATE=22007
Собственно вопрос, как сделать чтоб по этой ошибке, процедура не прерывалась а переменной
dexper присваивалось бы значение NULL. Буду признателен за подсказку
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34518375
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
SET dexper = CAST(NULLIF(SUBSTR(vtext,LOCATE('","',vtext,LOCATE('","',vtext,LOCATE('","',vtext, LOCATE('","',vtext)+ 1 )+ 1 )+ 1 )+ 3 ,  10 ), '') AS DATE);
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34518526
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немножко не то, это бы работало если бы я точно определял бы , в какой позиции заканчивается дата. А так как не смог определить к чему привизаться то тупо поставил в качестве второго параметра функции SUBSTR() цифру 10. Конечно можно привизать к запятым, так это сколько раз мне писать тогда функции LOCATE. Может подскажите как это сделать красиво.
С уважением
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34518732
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OlegA67Может подскажите как это сделать красиво.Напишите скалярную функцию-токенайзер, которая будет получать на вход длинную строку атрибутов, разделенную запятыми, и номер подстроки, которую надо выделить.
На выходе будет возвращаться нужная подстрока.
К ней применяйте nullif.
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34519074
OlegA67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinНапишите скалярную функцию-токенайзер
Легко сказать, будем думать. Спасибо
...
Рейтинг: 0 / 0
Вопрос по хранимой процедуре
    #34521860
Delphi_coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного не по теме, но:

Для начала, я удаляю все кавычки <">, после делаю замену пустых значений <,,> на <,$,>. Бакс служит сигналом для пустого/неверного значения. Правда это не ХП, а в коде загрузчика пачек.

З.Ы. Парсить текстовые файлы средствами СУБД, мягко сказать удивило... Стоит ли оно того?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по хранимой процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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