Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема исспользования строковых ф-ций в SQL-запросе [IB5.x]


Страницы:   1 2

LizaX ©   (2004-07-12 11:44:00) 

Уважаемые мастера, помогите, пожалуйста, решить следующую проблему.
InterBase5.5. Имеется поле таблицы, тип данных - VARCHAR(150).
Нужно из строки выделить 8 последних знаков, и убрать последний.
Пример строки:
№дог.0096_Кооператив "Темп"_кафе_75365194_1605334_Применяю такой запрос:
SELECT networkitemid, substr(networkitemname, strlen(networkitemname)-7, strlen(networkitemname)-1)
from networkitem where networkitemname like '№%'

При выполнении в IB EXPERT выпадает сообщение:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
A fatal exception occurred during the execution of a user defined function.
arithmetic exception, numeric overflow, or string truncation.

и на выходе получаю 14 строк вместо 1958.


LizaX   (2004-07-12 16:23:00) [1]

Получается такая картина.
В UDF - SUBSTR:
SET NAMES WIN1251;

DECLARE EXTERNAL FUNCTION SUBSTR
   CSTRING(80),
   SMALLINT,
   SMALLINT
   RETURNS CSTRING(80) FREE_IT
   ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf.dll';

В 15-й строке колличество символов - 87.
Теперь понятно откуда ноги растут.


Reindeer Moss Eater   (2004-07-12 12:53:00) [2]

Тогда трассировка UDF поможет


LizaX   (2004-07-12 12:52:00) [3]


> Он, кстати, какой вообще?

Pdox ANSI Cyrillic.
В предыдущих 14 строках тоже проскакивали украинские символы.


Johnmen   (2004-07-12 12:51:00) [4]

substr(networkitemname, strlen(networkitemname)-7, 7)
и
where strlen(networkitemname)>7


Курдль   (2004-07-12 12:51:00) [5]


> LizaX ©   (12.07.04 12:23) [13]
> Ребята, прошу не смеяться и не улююкать. Что имеем то имеем.
> Если возможно - помогите.

Да никто не смеется - все Вам сочувствуют. Поэтому я еще раз прошу отнестись серьезно к моим словам.
Создайте нормальную БД, а не "..._1605334_
содержит в себе уникальный код из другой таблицы."

Перелейте туда данные из старой базы.
Обоснуйте и срубите с заказчика адекватную оплату.
Если Вам не хватает информации, чтобы убедить заказчика отказаться от этого бреда собачего - обращайтесь к нам!


Desdechado   (2004-07-12 12:48:00) [6]

как описаны функции substr и strlen, откуда они взяты?
в какой-то из поставочных реализаций был баг в ней, очень похожий на твой


Reindeer Moss Eater   (2004-07-12 12:45:00) [7]

А не языковый ли драйвер виноват, если валится на ""Баришівський"_ТП 330 Технологічне відділення...." ?

Он, кстати, какой вообще?


LizaX   (2004-07-12 12:40:00) [8]


> Так ведь уже помогли...
> Добавить в WHERE
> strlen(networkitemname)>7

Запрос
SELECT count(*)
from networkitem where networkitemname like '№%'   and strlen(networkitemname) <= 7
Возвращает - 0.


Reindeer Moss Eater   (2004-07-12 12:38:00) [9]

Открыть исходник FreeUDFLib, внести логирование внутри этих функций.


LizaX   (2004-07-12 12:34:00) [10]


> а откуда ИДФ? самописная или FreeUDFLib?

FreeUDFLib


Соловьев   (2004-07-12 12:31:00) [11]


> strlen

а откуда ИДФ? самописная или FreeUDFLib?


Курдль   (2004-07-12 12:27:00) [12]


> LizaX ©   (12.07.04 12:15) [12]
> > Зачем столь замысловатая обработка строки?
> Так уж получилось (не моя вина), что  строка


Вариантов много.

1. Убейте того, кто создал такую структуру.
2. Увольтесь оттуда, где Вас заставляют делать ТАКОЕ.
3. Если все-таки работа одноразовая и Вам надо просто перелить данные из чьей-то тупой базы в свою супер-правильную, то создайте одноразовый проект, получите весь набор данных на клиента и там неспешно обработайте средствами Delphi, а не SQL.


Deniz   (2004-07-12 12:27:00) [13]

А это обязательно в select обрабатывать, или может на клиенте или в ХП?


Johnmen   (2004-07-12 12:26:00) [14]

Так ведь уже помогли...
Добавить в WHERE
strlen(networkitemname)>7


Соловьев   (2004-07-12 12:25:00) [15]

предлагаю оформить этот запрос в виде ХП и дебагером пройтись, и точно выявить запись.


LizaX   (2004-07-12 12:23:00) [16]


> А что у нас в строке 15?

В строке 15:
№дог.0073_Шовко-радгосп  "Баришівський"_ТП 330 Технологічне відділення_6942233_1603973_
Данные очень корявые.
Ребята, прошу не смеяться и не улююкать. Что имеем то имеем. Если возможно - помогите.


LizaX   (2004-07-12 12:15:00) [17]


> Зачем столь замысловатая обработка строки?

Так уж получилось (не моя вина), что  строка №дог.0096_Кооператив "Темп"_кафе_75365194_ 1605334_
содержит в себе уникальный код из другой таблицы. Но именно из таблицы, которая ВАМ так не нравится необходимо выдрать данные, идентифицируя их именно по этому коду и потом обновить эти данные в другой таблице.


Johnmen   (2004-07-12 12:14:00) [18]

>LizaX ©

Это правильно, что ты пришла сюда, не найдя ответа на
http://sql.ru/forum/actualthread.aspx?bid=2&tid=105869
:)
Но не хватает исходных данных.
В целом Reindeer Moss Eater ©   (12.07.04 11:57) [3]


Соловьев   (2004-07-12 12:10:00) [19]


> Если бы было по другому представлено, то я бы советов не
> просила.

так сделайте - оградите себя от многих проблем.


Соловьев   (2004-07-12 12:08:00) [20]


> Таких строк нет. Я проверяла.

как?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо