Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
1) Если я правильно понял, в окне Редактора команд нельзя выполнять
команды типа IF, CREATE FUNCTION
Каким наиболее оптимальным образом (в каком окне, что нужно сделать для вызова этого окна) можно выполнить команды вида

IF EXISTS (SELECT * FROM SYSCAT.ROUTINES WHERE ROUTINESCHEMA = 'VFP' AND ROUTINENAME = 'AT' ) THEN
DROP FUNCTION VFP.AT ;
END IF ;
IF EXISTS (SELECT * FROM SYSCAT.ROUTINES WHERE ROUTINESCHEMA = 'VFP' AND ROUTINENAME = 'RAT' ) THEN
DROP FUNCTION VFP.RAT ;
END IF ;
то есть я проверяю наличие пользовательских функций и затем их удаляю
и затем создание нескольких пользовательских функций ?
то есть выполнение несколько команд вида CREATE FUNCTION
Если я правильно понял, то аналогом команды GO MS SQL Server является команда @ ?
2) Точное (бинарное) сравнение и поиск в строках
Есть ли возможность при создании базы данных задать, какое будет сравнение строк -
чувствительное к регистру case-sensitive или нечувствительное к регистру
case-insensitive, то есть функции для работы со строками (типа locate, translate, replace)
будут работать по разному в зависимости от установки ?
Если я правильно понял документацию, то такой возможности в явном виде нет,
и сравнение зависит от collating sequence ?
В документации я нашел несколько примеров collating sequence SQL_CS_SYSTEM,
SQL_CS_SYSTEM_NLSCHA, SQL_CS_IDENTITY_16BIT и т.д.
Во всех присутствует CS - case-sensitive , отсюда вопрос встречал ли кто-нибудь в своей практике
collating sequence в которой сравнение и поиск строк был бы нечувствительным к регистру ?
Не имеет ли смысл использовать тип FOR BIT DATA для гарантированного бинарного сравнения и поиска в строках независимо от collating sequence ?
Спасибо.
19 ноя 05, 19:07    [2086705]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Речь идет о базе данных DB2 Express.
19 ноя 05, 19:09    [2086707]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Конечно, в "Редакторе команд" можно выполнять как IF...THEN, так и CREATE FUNCTION. Вот с сочетанием различных команд могут возникнуть проблемы.

Перво-наперво, чтобы успешно выполнять команды типа CREATE FUNCTION, надо понимать смысл завершителей (statement termination character). Рассмотрим
BEGIN ATOMIC 
  FOR row AS 
    SELECT pk, c1, discretize(c1) AS d 
    FROM source 
  DO 
    IF row.d is NULL THEN INSERT INTO except VALUES(row.pk, row.c1); 
    ELSE INSERT INTO target VALUES(row.pk, row.d); 
    END IF; 
  END FOR; 
END;
По умолчанию "внешний" statement termination character равен точке с запятой ("внутренний" всегда равен точке с запятой), и это ведёт к неприятностям. "Внешний" надо задать другим символом (напр., @, и писать так:
BEGIN ATOMIC 
  FOR row AS 
    SELECT pk, c1, discretize(c1) AS d 
    FROM source 
  DO 
    IF row.d is NULL THEN INSERT INTO except VALUES(row.pk, row.c1); 
    ELSE INSERT INTO target VALUES(row.pk, row.d); 
    END IF; 
  END FOR; 
END @
), задаётся в левом нижнем углу экрана (для CLP - опция -tdРАЗДЕЛИТЕЛЬ, напр. -td@).
20 ноя 05, 23:30    [2088196]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Пункт второй - EXISTS. В DB2 из IF его, к сожалению, не вызвать. Надо писать что-то вроде
BEGIN
  DECLARE i INTEGER;
  SET i = (SELECT 1 FROM ... FETCH FIRST 1 ROW ONLY);
  IF i = 1 THEN 
     ...
END @
Можно ещё делать DROP без проверки и перехватывать исключение.

Как я помню, в BEGIN ATOMIC ... END такие манипуляции невозможны, а BEGIN ... END должно быть частью хранимой процедуры.
20 ноя 05, 23:34    [2088204]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Зачем такие сложности (раньше был аналогичный вопрос с DROP'анием таблицы), когда можно просто писать, не утруждая себя проверками,
DROP такаяФункция;
DROP эдакаяФункция;
для меня загадка. Видимо, у молодёжи накапливается слишком много энергии, и им некуда больше её приложить.
20 ноя 05, 23:37    [2088212]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
@ - это не аналог MS SQL go, а просто разделитель. Можно выбрать другой.
20 ноя 05, 23:38    [2088214]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Сравнение строк в DB2 чувствительно к регистру. Нечувствительное придётся задавать как SELECT ... FROM ... WHERE ucase(field) = ucase(:value). Индексов по функциям на данный момент нет, но есть суррогат. Если определить поле a la
u_field generated always as (ucase(field))
то оптимизер может осуществить подстановку как
SELECT ... FROM ... WHERE u_field = ucase(:value)
а по u_field можно создавать индекс
20 ноя 05, 23:43    [2088218]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Виктор, большое спасибо за полный ответ.
Еще один вопрос к Вам, как к эксперту, но сначала небольшое предисловие.
Если я правильно понял, я не могу в пользовательской функции выполнять следующие команды
CREATE TABLE
DECLARE GLOBAL TEMPORARY TABLE
Теперь предположим, я пишу пользовательскую функцию, возвращающую таблицу ( в MS SQL Server я, к примеру, могу задать в такой функции имя возвращаемой таблицы), которая слова из строки символов помещает в таблицу.
В DB2 я должен обращаться к уже существующим таблицам – поэтому я не нашел лучшего решения
как создать командой CREATE TABLE SESSION.МОЯ_ТАБЛИЦА фиктивную таблицу для того, чтобы собрать пользовательскую функцию без появления сообщений типа «я не могу найти таблицу SESSION.МОЯ_ТАБЛИЦА»,
затем перед вызовом моей пользовательской функции я выполняю команду
DECLARE GLOBAL TEMPORARY TABLE МОЯ_ТАБЛИЦА
И при работе пользовательской функции при обращении к SESSION.МОЯ_ТАБЛИЦА происходит обращение в временной таблице, поскольку в соответствии с документацией при одновременном существовании
постоянной таблицы МОЯ_ТАБЛИЦА в схеме SESSION и одноименной временной таблице обращение к SESSION.МОЯ_ТАБЛИЦА относится к временной таблице.
Является ли найденный мной вариант наилучшим, можете ли Вы предложить нечто лучшее?
То есть пользовательская функция должна в идеале работать каждая со своей таблицей и возвращать в виде таблицы некий результат.
Спасибо.
Кстати, нашел интересное поведение функции Locate.
values locate('','string',100); возвращает 100, вообще, можно указать любое число в качестве третьего аргумента и функция возвратит его (если первый аргумент пустая строка). Хотя должна была бы возвращать всегда 0.
28 ноя 05, 07:23    [2114698]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
автор

Теперь предположим, я пишу пользовательскую функцию, возвращающую таблицу ( в MS SQL Server я, к примеру, могу задать в такой функции имя возвращаемой таблицы), которая слова из строки символов помещает в таблицу.
В DB2 я должен обращаться к уже существующим таблицам – поэтому я не нашел лучшего решения
как создать командой CREATE TABLE SESSION.МОЯ_ТАБЛИЦА фиктивную таблицу


Честно говоря не пойму зачем так делать?
Неужели обыкновенного SQL не хватает?
Можно ведь создать э... виртуальную временную таблицу, которая целиком раполагается в памяти. И работать будет быстрее.
28 ноя 05, 11:12    [2115397]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
ggv
Member

Откуда:
Сообщений: 1810
наверное, наследие ms sql
почему-то работающие с ним очень _активно_ используют временные таблицы, но это субъективное наблюдение
28 ноя 05, 14:46    [2116512]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
ggv
наверное, наследие ms sql
почему-то работающие с ним очень _активно_ используют временные таблицы, но это субъективное наблюдение

Это не субъективное наблюдение. Такая же фигня с теми кто юзает Sybase.
У этих баз (они же родственники) SQL очень слаб.
28 ноя 05, 16:05    [2116950]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
ggv
Member

Откуда:
Сообщений: 1810
недавно давал "рецензию" по поводу возможности миграции проекта с ms sql на db2.
Посмотрел DDL скрипты, с просто неописуемым количеством temp tables, по нескольку штук в SP, поговорил с разработчиками - к ms sql претензий нет, все устраивает, вот только временные таблицы, вот с ними бы получше, чтоб не клинило так когда их много......
no comments
28 ноя 05, 16:58    [2117291]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
2 Игорь2004: Я DECLARE GLOBAL TEMPORARY TABLE ещё не разу не использовал - просто не было нужды. Почитайте лучше "кулинарную книжку" с http://ourworld.compuserve.com/homepages/Graeme_Birchall/HTM_COOK.HTM

Если вы всё-таки будете настаивать на временных таблицах, то... поищите http://groups.google.com/group/comp.databases.ibm-db2, да на news://news.software.ibm.com, там были обсуждения. Я читал, но забыл почти сразу, о чём там говорилось. Помню только, что там есть свои тонкости, и вообще не факт, что к временной таблице можно обратиться из UDF (). Скорее нет, чем да.

Важный момент. "при одновременном существовании постоянной таблицы МОЯ_ТАБЛИЦА в схеме SESSION и одноименной временной таблице обращение к SESSION.МОЯ_ТАБЛИЦА относится к временной таблице." Очевидно, это относится к компиляции SQL-выражения. Предположим, на момент T1 временная таблица ещё не определена, вы скомпилировали SQL-выражение в момент T2, и затем определили временную таблицу в момент T3. В T4 выполнили SQL, но план SQL-выражения уже определён. Как я понимаю, план не должен измениться. А хранимая процедура на SQL в DB2, как правило, использует Static SQL, т.е. план хранится в базе. Стало быть, см
28 ноя 05, 18:44    [2117875]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
URL не туда попал - он про temporary в UDF.
28 ноя 05, 18:45    [2117878]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
UDF - не Static SQL, а фактически макроподстановка, компилируется вместе с вызвавшим её SQL-выражением, так что шансы могут быть. Но план надо смотреть.
28 ноя 05, 18:47    [2117889]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
ggv
Member

Откуда:
Сообщений: 1810
да и здесь на форуме что-то было --- типа, невыполнимое условие в теле процедуры, под условием - DECLARE GLOBAL TEMPORARY TABLE
и компилятор не ругается
28 ноя 05, 18:49    [2117895]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
(я успел немного погуглить) в ньюсгруппе comp.databases.ibm-db2 Серж Релю (?) предлагал решение
IF 1=0 THEN
  DECLARE GLOBAL TEMPORARY TABLE...
END IF;
бррррр
28 ноя 05, 20:47    [2118161]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Victor Metelitsa

Важный момент. "при одновременном существовании постоянной таблицы МОЯ_ТАБЛИЦА в схеме SESSION и одноименной временной таблице обращение к SESSION.МОЯ_ТАБЛИЦА относится к временной таблице." Очевидно, это относится к компиляции SQL-выражения. Предположим, на момент T1 временная таблица ещё не определена, вы скомпилировали SQL-выражение в момент T2, и затем определили временную таблицу в момент T3. В T4 выполнили SQL, но план SQL-выражения уже определён. Как я понимаю, план не должен измениться. А хранимая процедура на SQL в DB2, как правило, использует Static SQL, т.е. план хранится в базе.

Неверно. When binding a package that has static SQL statements that refer to tables implicitly or explicitly qualified by SESSION, those statements will not be bound statically. When these statements are invoked, they will be incrementally bound, regardless of the VALIDATE option chosen while binding the package. At runtime, each table reference will be resolved to a declared temporary table, if it exists, or a permanent table. If neither exists, an error will be raised (SQLSTATE 42704). Но это к SP и т.п., а насчёт UDF всё ещё непонятно.
28 ноя 05, 21:11    [2118195]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
А вот теперь всё ясно.
Restrictions on the Use of Declared Global Temporary Tables: Declared global temporary tables cannot:
– Be specified in an ALTER, COMMENT, GRANT, LOCK, RENAME or REVOKE statement (SQLSTATE 42995).
– Be referenced in a CREATE ALIAS, CREATE FUNCTION (SQL Scalar, Table, or Row), CREATE TRIGGER, or CREATE VIEW statement (SQLSTATE 42995).
– Be specified in referential constraints (SQLSTATE 42995).
Очевидно, я это всё читал, но забыл.
28 ноя 05, 21:14    [2118199]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Вывод: читайте кулинарную книжку. http://ourworld.compuserve.com/homepages/Graeme_Birchall/HTM_COOK.HTM
28 ноя 05, 21:15    [2118201]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
gardenman
ggv
наверное, наследие ms sql
почему-то работающие с ним очень _активно_ используют временные таблицы, но это субъективное наблюдение

Это не субъективное наблюдение. Такая же фигня с теми кто юзает Sybase.
У этих баз (они же родственники) SQL очень слаб.

Слабый SQL это не главная причина. Я например тоже спокойно юзаю локальные и глобальные времянки на WatcomSQL, хотя его слабым назвать по отношению MSSQL/Sybase ASE нельзя. Глобальные времянки позволяют клиентскому приложению сессионно хранить промежуточные данные (например юзер понащелкал в списке, что должно попасть в отчет, клиентская прога это сохранила в глобальную времянку и вызвала отчет, который обычным джойном по заполненной времянке уже фильтрует в отчет только то, что нужно). Локальные времянки же используются внутри ХП для разруливания сложных запросов, промежуточных аггрегаций, используемых многократно и борьбы с блокировками. С учетом того, что у нас глобальные и локальные времянки можно обьявлять как NOT TRANSACTIONAL и нет такого тяжелого наследия, как TempDB у MSSQL, то с времянками все просто летает. И кстати на глобальные времянки можно вешать все что угодно и использовать где угодно, кроме FOREIGN KEY. Хоть триггеры писать - что иногда очень даже неплохо. Так что не надо удивляться тому, чего не понимаешь - я вот например в тихом шоке, что DB2-шники хранимки предпочитают на C писать и вообще тут язык хранимых процедур насколько я понимаю не очень то давно появился, я не представляю, как без него в СУБД можно было обходится - судя по работающим проектам на DB2 - можно, хотя мне понять и сложно.
29 ноя 05, 07:05    [2118638]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Спасибо всем участникам за высказанные мнения.
TO gardenman

“Можно ведь создать э... виртуальную временную таблицу, которая целиком раполагается в памяти”
А каким образом можно создать виртуальную временную таблицу ? Я ничего про виртуальные временные таблицы,
к сожалению, не нашел в документации. Только про временные и глобальные временные таблицы.

To Виктор Вы совершенно правы касательно временных таблиц (из функции их просто не видно).
Спасибо за порекомендованую книжку, весьма доступно и хорошо написана. Мне там понравился следующий пример, в котором таблица наполняется «из воздуха»,
если можно так выразится.
Вот этот пример
CREATE FUNCTION NumList(max_num INTEGER)
RETURNS TABLE(num INTEGER)
LANGUAGE SQL
BEGIN ATOMIC
RETURN WITH temp1 (num) AS
(VALUES (0)
UNION ALL
SELECT num + 1 FROM temp1 WHERE num < max_num)
SELECT num FROM temp1;
END    
Собственно говоря, я затеял возню с временными таблицами, только для того, чтобы в функции, возвращающей таблицу,
не обращаться ни к какой постоянной таблице.
Вот описание моей функции
GETALLWORDS() Функция определенная пользователем
Помещает в таблицу все слова из строки
GETALLWORDS( cString[, cDelimiters])
Тип возвращаемого значения таблица GETALLWORDS (WORDNUM smallint, WORD varchar(4000), STARTOFWORD smallint, LENGTHOFWORD smallint)
Описание структуры возвращаемой таблицы GETALLWORDS
поле WORDNUM smallint – порядковый номер слова в строке cString
поле WORD varchar(4000) - слово
поле STARTOFWORD smallint – позиция в строке cString, с которой начинается слово
поле LENGTHOFWORD smallint – длина слова

Параметры
cString varchar(4000) – строка, слова которой будут помещены в таблицу GETALLWORDS.
cDelimiters varchar(256) - необязательный параметр, определяет те символы, которые будут служить разделителями слов в строке cString. Разделителями по умолчанию являются пробелы, символы табуляции, возврата каретки и перевода строки.
GETALLWORDS() считает каждый символ из строки cDelimiters как отдельный разделитель, а не всю строку cDelimiters как единый разделитель.
Примечания: GETALLWORDS() по умолчанию считает, что слова разделены пробелами, символами табуляции, возврата каретки и перевода строки. Если передан параметр cDelimiters, функция игнорирует пробелы, символы табуляции, возврата каретки и перевода строки.
Пример вызова:
SELECT *  FROM TABLE(VFP.GETALLWORDS('Как прикажете, мессир? - спросил Фагот у замаскированного.
      Ну что  же, -  задумчиво отозвался тот,  они  люди как  люди. Любят деньги, но ведь это всегда было...  Человечество любит деньги, из чего бы  те ни  были сделаны,  из кожи ли, из бумаги ли, из бронзы или из золота.
Ну,  легкомысленны...  ну,  что  ж... и  милосердие  иногда  стучится  в  их сердца...  обыкновенные люди... в  общем,  напоминают прежних...  квартирный вопрос только испортил их...')) AS A;
Вот какое решение мне удалось найти (пришлось создать постоянную таблицу), наполнять ее, возвращать результат и
при последующих вызовах удалять записи, вставленные в предыдущих вызовах.
Но у моего решения возможно есть недостаток – теоретически при большом количестве вызовов, один пользователь
Может удалить записи вставленные другим пользователем. Это место показано в коде.
Не говяря уже о том что наверняка есть более красивое решение.
Отсюда вопрос – может ли кто-нибудь предложить другое, более элегантное решение.
Использовать временную таблицу (наполняя ее в самой функции как в приведенном выше прмере из «кулинарной» книги мне не удалось, поскольку, алгоритм поиска слов в строке не является простым).
Вот код моей функции
CREATE FUNCTION VFP.GETALLWORDS
(cString1 VARCHAR(4000), cDelimiters1 VARCHAR(256))
RETURNS table (WORDNUM SMALLINT, WORD VARCHAR(4000), STARTOFWORD SMALLINT, LENGTHOFWORD SMALLINT)
SPECIFIC  GETALLWORDS
DETERMINISTIC NO EXTERNAL ACTION MODIFIES SQL DATA
BEGIN ATOMIC
     DECLARE   k, BegOfWord, wordcount, nEndString, flag SMALLINT;
     DECLARE cString  VARCHAR(4000) FOR BIT DATA;
     DECLARE cDelimiters  VARCHAR(256) FOR BIT DATA;
     DECLARE CALL_ID  CHAR(13) FOR BIT DATA;
     SET CALL_ID  = GENERATE_UNIQUE();
     SET  cString = cString1,  cDelimiters  = cDelimiters1;
     SET   k =   1 ,  wordcount  =  1 ,  BegOfWord  =  1 ,  flag  =  0 ,  cString  =  COALESCE(cString, '') ,  cDelimiters  =  COALESCE(cDelimiters,  CHR(32) CONCAT  CHR(9) CONCAT CHR(10) CONCAT  CHR(13)) ,
     nEndString  =  1  +  LENGTH(cString);
     BOUCLE: WHILE 1 > 0     DO
          IF k - BegOfWord > 0 THEN
                INSERT INTO  VFP1.GETALLWORDS (WORDNUM, WORD, STARTOFWORD, LENGTHOFWORD, UNIQUE_ID )
                             VALUES      (wordcount, SUBSTR(cString, BegOfWord, k - BegOfWord), BegOfWord, k - BegOfWord, CALL_ID );
                SET   wordcount =   wordcount  +  1  ,  BegOfWord  =  k; -- previous word
          END IF;
          IF flag = 1 THEN
                LEAVE BOUCLE;
          END IF;
          WHILE nEndString > k and LOCATE(SUBSTR(cString, k, 1), cDelimiters) > 0       DO
               SET   k =   k  +  1  ,  BegOfWord  =  BegOfWord  +  1; -- skip  break characters, if any
          END WHILE;
          WHILE  nEndString > k and LOCATE(SUBSTR(cString, k, 1), cDelimiters) = 0      DO
               SET   k =   k  +  1; -- skip  the character in the word
          END WHILE;
          IF k >= nEndString THEN
               SET   flag =   1;
          END IF;
     END WHILE;

    DELETE FROM VFP.GETALLWORDS WHERE DEL = 'T' AND  UNIQUE_ID < CALL_ID;
    UPDATE  VFP1.GETALLWORDS SET DEL = 'T' WHERE UNIQUE_ID  = CALL_ID;
-- вот узкое место (на мой взгляд) в данный момент кто-нибудь может удалить 
-- только что полученный реультат
   RETURN SELECT WORDNUM, WORD, STARTOFWORD, LENGTHOFWORD  FROM  VFP1.GETALLWORDS WHERE UNIQUE_ID  = CALL_ID ;
END


При всех недостатках MS SQL Server там данная задача решалась легко, возможно и DB2 есть нормальное решение.
29 ноя 05, 07:48    [2118671]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
2 Игорь
"виртуальную временную таблицу" я как раз и имел в виду рекурсивные запросы. Вы наверное никогда не пробовали юзать рекурсивный SQL. Попробуйте. Кстати, в том же COOK BOOK есть пример Normalize/Denormalize data. Это как раз вам в тему. И, если мне не изменяет память здесь на форуме был уже пример как строку разложить по словам в таблицу.
И, еще, если вдруг вам придет в голову создать выражение, которое возвращает конкретное число записей, посмотрите в сторону values:

db2 => values (1,current timestamp),(2,current timestamp),(3,current timestamp)

1           2
----------- --------------------------
          1 2005-11-29-11.00.21.351000
          2 2005-11-29-11.00.21.351000
          3 2005-11-29-11.00.21.351000

  3 record(s) selected.

db2 =>


А что касается использовать SQL для решения задач подобной вашей, я .. даже не смотря на то, что SQL позволяет все это сделать решил бы ее на C/C++. Я конечно затрачу времени на это раза в 2-3 больше, но производительность увеличится раз в 100. Причем табличные функции на C/C++ именно в DB2 пишутся просто влет. Задача приведенная вами - сугубо вычислительная. Жрет много процессорных ресурсов.

Кстати, объясните пожалуйста зачем cScting и cDelemiters вы делаете FOR BIT DATA.

2 ASCRUS
У DB2 есть спицифика в разработке. Особые фичи.Особый путь. Которым можно и не пользоваться. Я здесь на форуме неоднократно говорил о том, что такое Static SQL. Для чего нужны ХП? Для того, чтобы избавится от затрат времени на компиляцию. Для того, чтобы перенести бизнес-логику на сервер.
А в DB2 это возможно и без ХП. С помощью статического SQL. Причем производительность только выростет. Если действительно есть желание с этим разобраться почитайте про команды BIND и PREP и про статический SQL.

Что касается временных таблиц в DB2. Когда вы создаете временную таблицу инфа о ней не хранится в системном каталоге. Я даже не знаю способа посмотреть список всех временных таблиц. Да и получить структуру временной таблицы можно лишь так:
describe select * from <tmpеtable>
Поэтому при создании времянок нет никаких блокировок в системном каталоге.
но с другой стороны и триггеров не создать Короче все приносится в жертву только одному - производительности.
29 ноя 05, 11:03    [2119328]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Извините, пока лень вникать в ваш алгоритм. В чём вы видите "не является простым"? В том, что разделители могут быть разными? Так их можно свести к одному (пробелу) при помощи функции TRANSLATE, после чего уже воспользоваться примером из кулинарной книжки, разбирающим строку на слова (там была небольшая ошибка, но её легко исправить). При этом нумерация получается легко, а длина слова получается, естественно, функцией LENGTH от этого слова. (lenght(WORD)=LENGTHOFWORD)

Над вычислением STARTOFWORD надо подумать. Скажем, можно попробовать так: рекурсивный алгоритм "поедает" анализируемую строку, и зная начальную длину и длину "поедаемого" остатка, можно определить и STARTOFWORD.
29 ноя 05, 17:52    [2122254]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное выполнение команд, сравнение - строк 2 вопроса  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2550
Игорь2004

-- вот узкое место (на мой взгляд) в данный момент кто-нибудь может удалить
-- только что полученный реультат

Каким же образом? Строки ведь заблокированы до завершения транзакции. Вот добавить своё (в новой DB2; в старой тоже сядет на блокировку), пожалуй, сможет.
29 ноя 05, 17:55    [2122271]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить