Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Доброе утро. Помогите, пожалуйста, разобраться, первый раз столунулся с такой проблемой. У меня 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; Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 11:40 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 11:57 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
gardenman Код: plaintext 1. 2. Нужен именно LIKE, а не =. Т.е. параметр СODE может задаваться маской, например 'M1%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:05 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Мда... неприятная ситуация... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:19 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Ещё одна идея возникла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:29 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Сори, не то нажал и пустое сообщение ушло :-) Можно например в функцию передать таблицу, допустим только с одним столбцом, а потом в селекте сделать сравнение параметра, например так CODE IN (SELECT * FROM tempTable) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:31 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Вообще-то лучше посмотреть на эту задачу с более высокого уровня. Можете ли вы объяснить а зачем вам нужна эта функция? Куда вы ее вставлять будите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 12:51 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Функция нужна для того чтобы возратить количество всего, что удовлетворяет условиям. Используется, точнее предполагается, внутри селекта, в котором из других таблиц формируются параметры для функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:16 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
А разве трудно все это сделать одним селектом?.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:18 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Трудно. Этот селект уже длиной около 4000 символов. Там уже и так много групировок и прочего чтобы был требуемый вид. Если формировать один селект, т.е вместо функций использовать вложенный селект, то он выростет тыщь до 8-10 символов. Да и его формирование будет мудрёным. Самое простое (как казалось) и элегантное решение, передать в функцию два параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:27 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Может вам имеет смысл разложить этот запрос на несколько временных таблиц, а потом их джойнить? А то на мазохизм смахивает... ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:31 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Возможно. Ладно, спасибо за помощь. Попробую поискать другое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:35 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Вообще-то это глюк. Оно должно работать. Напишу вопрос в буржуйскую эху. А пока пара вариантов извращений: 1. Если у вас v8.2, то Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Да, очень коряво, но работать должно. Почему like c host variable в процедуре работает, а в функции нет - не знаю (ibm жжет!!!). Обратите внимание, что получится сделать только таблицную функцию (должна быть modifies sql data), а не скалярную. 2. Если не боитесь слова "ява", можно и на ней написать. Одну скалярную функцию, без процедуры. Я бы так и сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:42 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Я не уверен что DB2 for LUW поддерживает SQL FUNCTION с MODIFY SQL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:45 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein CREATE PROCEDURE MYS.MYPROC(CODE CHAR (6), DID INTEGER, OUT CNT INT) Упс, ошибочка: Код: plaintext gardenman Я не уверен что DB2 for LUW поддерживает SQL FUNCTION с MODIFY SQL... Табличные - поддерживает. Проверено. Работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 13:49 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Человек из ibm сказал, что это - известное ограничение SQL UDF: локальные переменные и параметры не могут быть использованы в "inline" SQL PL, т.е. в функциях и триггерах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 11:15 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinЧеловек из ibm сказал, что это - известное ограничение SQL UDF: локальные переменные и параметры не могут быть использованы в "inline" SQL PL, т.е. в функциях и триггерах. а он сказал, почему при этом сообщение об ошибке оставили какое-то дезинформирующее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 12:10 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
вопрос? а он сказал, почему при этом сообщение об ошибке оставили какое-то дезинформирующее? Нет. В своем предыдущем посте я упустил, что речь идет про оператор LIKE разумеется, а не вообще про невозможнось использования локальных переменных и параметров в этом inline SQL PL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2006, 12:19 |
|
||
|
DB2 и хранимые процедуры.
|
|||
|---|---|---|---|
|
#18+
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,'')) @ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 14:24 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=131&tid=1605284]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 414ms |

| 0 / 0 |
