powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 и хранимые процедуры.
19 сообщений из 19, страница 1 из 1
DB2 и хранимые процедуры.
    #33738021
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро.

Помогите, пожалуйста, разобраться, первый раз столунулся с такой проблемой.

У меня DB2 v8.1.10.812

Необходимо созать процедуру на вход которой передаётся стока, до 6,например, символов и число, и возвращается кол-во строк удовлетворяющие условиям.

Вот как это задумывалось:

CREATE FUNCTION MYS.MYFUN(CODE CHAR (6), DID INTEGER)
RETURNS INTEGER
BEGIN ATOMIC
RETURN
SELECT COUNT(*)
FROM XZ.T1 O, XZ.T2 M
WHERE O.C_ID = M.C_ID AND O.D_ID = DID AND M.MCODE LIKE CODE AND O.STATE=2 AND O.FLAG<>'F'
;
END @

Но возникает ошибка:
Неверный предикат LIKE или скалярная функция POSSTR - первый операнд не является строчным выражением или второй операнд не является строкой.
Объяснение:
Предикат LIKE или скалярная функция POSSTR, входящие в оператор, ошибочны из-за того, что первый операнд не является строчным выражением или второй операнд не является строкой.

Операнд в левой части предиката LIKE или предиката NOT LIKE, или первый операнд функции POSSTR должен быть строчным выражением. Значение, находящееся в правой части предиката или второй операнд функции POSSTR должны быть одними из следующих объектов:




Т.е. как я понял, параметр CODE не понимается как строка.

Как тут быть?
Может быть формиравть строку запроса, а потом выполнять в таком духе

DECLARE stmt VARCHAR(1000);
SET stmt = 'SELECT COUNT(*) ... AND O.D_ID =' || DID || ' AND (M.MCODE LIKE ' || CODE || ' ) AND O.STATE=2 ...' ;
PREPARE s1 FROM stmt ;
EXECUTE s1;

Спасибо.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738081
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create function My_t (schema char( 10 ),did int )
returns int
language sql
begin atomic
	declare cnt int default  0 ;
	set cnt=(select count(*)+did from syscat.tables 
				where tabschema=schema);
	return cnt;
end
@
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738123
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenman
Код: plaintext
1.
2.
create function My_t (schema char( 10 ),did int )
where tabschema=schema


Нужен именно LIKE, а не =.

Т.е. параметр СODE может задаваться маской, например 'M1%'
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738188
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда... неприятная ситуация...
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738229
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё одна идея возникла.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738240
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, не то нажал и пустое сообщение ушло :-)


Можно например в функцию передать таблицу, допустим только с одним столбцом, а потом в селекте сделать сравнение параметра, например так

CODE IN (SELECT * FROM tempTable)

?
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738319
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то лучше посмотреть на эту задачу с более высокого уровня.
Можете ли вы объяснить а зачем вам нужна эта функция? Куда вы ее вставлять будите?
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738414
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция нужна для того чтобы возратить количество всего, что удовлетворяет условиям.

Используется, точнее предполагается, внутри селекта, в котором из других таблиц формируются параметры для функции.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738418
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве трудно все это сделать одним селектом?....
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738467
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трудно. Этот селект уже длиной около 4000 символов.
Там уже и так много групировок и прочего чтобы был требуемый вид.

Если формировать один селект, т.е вместо функций использовать вложенный селект, то он выростет тыщь до 8-10 символов.

Да и его формирование будет мудрёным.

Самое простое (как казалось) и элегантное решение, передать в функцию два параметра.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738496
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может вам имеет смысл разложить этот запрос на несколько временных таблиц, а потом их джойнить? А то на мазохизм смахивает... (
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738514
Морфий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно.
Ладно, спасибо за помощь.
Попробую поискать другое решение.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738557
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то это глюк. Оно должно работать.
Напишу вопрос в буржуйскую эху.

А пока пара вариантов извращений:

1.
Если у вас v8.2, то
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE PROCEDURE MYS.MYPROC(CODE CHAR ( 6 ), DID INTEGER, OUT CNT INT)
BEGIN
SET I=
(
SELECT COUNT(*)
FROM XZ.T1 O, XZ.T2 M
WHERE O.C_ID = M.C_ID AND O.D_ID = DID AND M.MCODE LIKE CODE AND O.STATE= 2  AND O.FLAG<>'F'
);
END@

CREATE FUNCTION MYS.MYFUN(CODE CHAR ( 6 ), DID INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
RETURNS TABLE (I INTEGER)
BEGIN ATOMIC
DECLARE I INT;
CALL MYS.MYPROC(CODE, DID, I);
RETURN SELECT I FROM SYSIBM.SYSDUMMY1;
END@

Да, очень коряво, но работать должно. Почему like c host variable в процедуре работает, а в функции нет - не знаю (ibm жжет!!!).
Обратите внимание, что получится сделать только таблицную функцию (должна быть modifies sql data), а не скалярную.

2.
Если не боитесь слова "ява", можно и на ней написать.
Одну скалярную функцию, без процедуры.
Я бы так и сделал.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738565
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не уверен что DB2 for LUW поддерживает SQL FUNCTION с MODIFY SQL...
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33738590
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
CREATE PROCEDURE MYS.MYPROC(CODE CHAR (6), DID INTEGER, OUT CNT INT)


Упс, ошибочка:
Код: plaintext
CREATE PROCEDURE MYS.MYPROC(CODE CHAR ( 6 ), DID INTEGER, OUT I INT)...

gardenman
Я не уверен что DB2 for LUW поддерживает SQL FUNCTION с MODIFY SQL...


Табличные - поддерживает.
Проверено. Работает.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33741982
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Человек из ibm сказал, что это - известное ограничение SQL UDF: локальные переменные и параметры не могут быть использованы в "inline" SQL PL, т.е. в функциях и триггерах.
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33742183
вопрос?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinЧеловек из ibm сказал, что это - известное ограничение SQL UDF: локальные переменные и параметры не могут быть использованы в "inline" SQL PL, т.е. в функциях и триггерах.
а он сказал, почему при этом сообщение об ошибке оставили какое-то дезинформирующее?
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33742222
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос?
а он сказал, почему при этом сообщение об ошибке оставили какое-то дезинформирующее?
Нет.

В своем предыдущем посте я упустил, что речь идет про оператор LIKE разумеется, а не вообще про невозможнось использования локальных переменных и параметров в этом inline SQL PL...
...
Рейтинг: 0 / 0
DB2 и хранимые процедуры.
    #33793002
krestianin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PosStr или Like нельзя использовать если второй параметр - строковая
переменная, а не строка. Пришлось выкручиваться через substr и length

Вот пример где из таблицы выбераются подобающие ФИО, заданные в любом виде, как и например Фамилия: Ивано, Имя: Алекс, Отчество: влад

create function INS_O( p_fam char(40)
, p_nam char(40)
, p_otch char(40)
)
returns table (
fam char(40)
, nam char(40)
, otch char(40)
)
specific INS_O
language sql
reads sql data
no external action
not deterministic
return
/* v.01.10 */
select
fam
, nam
, otch
from fio_list
where substr(fam, 1, length(rtrim(p_fam)))=upper(value(p_fam,''))
and substr(nam, 1, length(rtrim(p_nam)))=upper(value(p_nam,''))
and substr(otch, 1, length(rtrim(p_otch)))=upper(value(p_otch,''))
@
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 и хранимые процедуры.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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