Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];

Вниз

Проблема с ХП   Найти похожие ветки 

 
Avreliy   (2003-07-07 12:42) [0]

Здравствуйте мастера.
При попытке выполнить процедуру выбора выдаётся сообщение:
"Arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets
Statement: execute procedure sp_rep1_1("01.01.01")"

Вот текст процедуры:
--------------------------------------------------------------
CREATE PROCEDURE SP_REP1_1(DAT DATE)
RETURNS (EMPLOYEENO INTEGER, SRCFIN VARCHAR(40), OVERDEP VARCHAR(50),
DEP VARCHAR(120), SUBDEP VARCHAR(120), POST VARCHAR(80),
SUMM NUMERIC(9,2), COMMENTS VARCHAR(80))
AS
BEGIN
FOR SELECT E.EMPLOYEENO, E.SRCFIN, E.OVERDEP, E.DEP, E.SUBDEP, E.POST, D.SUMM, D.COMMENTS
FROM EMPLOYEE E, EMDETAIL D, RISE R
WHERE (E.EMPLOYEENO = D.EMPLOYEENO)
AND (D.RISENO = R.RISENO)
AND ((R.RISETYPE = "ххх") OR (R.RISETYPE = "Ххх"))
AND (D.DATEBEGIN <= :DAT)
AND ((D.DATEEND >= :DAT) OR (D.DATEEND IS NULL))
INTO :EMPLOYEENO, :SRCFIN, :OVERDEP, :DEP, :SUBDEP, :POST, :SUMM, :COMMENTS
DO
SUSPEND;
END^

-------------------------------------------------------------
Попробывал указать кодировку для каждого поля - не помогло.
В чём ошибка?


 
Zacho   (2003-07-07 12:46) [1]

А типы переменных точно соответствуют типам полей в запросе ?


 
Avreliy   (2003-07-07 13:01) [2]

Проверил - соответствуют точно.


 
Zacho   (2003-07-07 13:12) [3]

В общем, такая ошибка может возникать в следующих случаях:
1. Несоответствие character set у поля и character set, указанного при подключении к БД.
2. Арифметическое переполнение (например, попытка записать в переменную или поле типа SMALLINT значение типа INTEGER)
3. Попытка записать в строковую переменную или поле строку большей длинны, чем определенная в типе этого поля.
4. Деление на ноль.
Проверь, не может ли у тебя происходить что-либо из этого. Например, одно из полей, выбираемых в запросе - вычисляемое, и при его вычислении и происходит ошибка.
И еще, попробуй SELECT * FROM sp_rep1_1("01.01.01") вместо EXECUTE PROCEDURE


 
Johnmen   (2003-07-07 13:18) [4]

Какой диалект ?


 
Avreliy   (2003-07-07 13:18) [5]

Может быть это связано с тем, что при определении строковых столбцов таблиц я использовал домены, а при определении столбцов процедуры - основной тип данных(VARCHAR)?


 
Avreliy   (2003-07-07 13:19) [6]

Диалект - 1й.


 
Zacho   (2003-07-07 13:20) [7]


> Avreliy (07.07.03 13:18)

Нет, не может, если размер совпадает.


 
KDS   (2003-07-07 13:23) [8]

формат даты в системе необходимо сверить
воможно ИБ настроен на четырехзначный "дд.мм.гггг", а у клиента (Виндовз) двухзначный "дд.мм.гг".
вот поэтому процедура sp_rep1_1 и не "ест" этот параметр "DAT"
лечится быстро через Пуск-Панель управления-Начиональные настройки-формат даты


 
Johnmen   (2003-07-07 13:27) [9]

...procedure sp_rep1_1("01.01.01 11:11:11")...


 
Avreliy   (2003-07-07 13:28) [10]

> KDS © (07.07.03 13:23)
Даты согласуются.


 
Avreliy   (2003-07-07 13:31) [11]

> Johnmen © (07.07.03 13:27)
То же самое...


 
Zacho   (2003-07-07 13:33) [12]


> Avreliy (07.07.03 13:28)

И все-таки, возможно я и ошибаюсь, но EXECUTE PROCEDURE возвращает только одну запись, в данном случае тебе нужно использовать SELECT * FROM sp_rep1_1(...). Хотя к данной ошибке это не должно иметь отношения.


 
Avreliy   (2003-07-07 13:37) [13]

> Zacho © (07.07.03 13:33)
Если бы ХП работала, то возвратила хотя бы одну запись вместо ошибки...


 
Zacho   (2003-07-07 13:48) [14]


> Avreliy (07.07.03 13:37)

Попробуй максимально упростить запрос в процедуре. Для начала выбирай только одно поле из одной таблицы. Если ошибка исчезнент - постепенно добавля в запрос остальные поля и таблицы, так ты обнаружишь и причину ошибки.


 
Avreliy   (2003-07-07 14:13) [15]

Снова попробывал указать кодировку для каждого поля - заработало. Видимо, в прошлый раз после указания кодировки, я забыл подтвердить изменения - поэтому не работало.


 
Avreliy   (2003-07-07 17:04) [16]

С этой процедурой понятно - нужно было указать кодировку для всех символьных полей.
Однако, вот какой баг:
Есть другая процедура:

CREATE PROCEDURE SP_REP1_SENIORITY(DAT DATE)
RETURNS (EMPLOYEENO INTEGER, SUMM NUMERIC(9,2))
AS
BEGIN
FOR SELECT R.EMPLOYEENO, D.SUMM
FROM REP1_1 R, EMDETAIL D, RISE RS
WHERE (R.EMPLOYEENO = D.EMPLOYEENO)
AND (D.RISENO = RS.RISENO)
AND (RS.RISETYPE = "xxxxx")
AND (D.DATEBEGIN <= :DAT)
AND ((D.DATEEND >= :DAT) OR (D.DATEEND IS NULL))
INTO :EMPLOYEENO, :SUMM
DO
SUSPEND;
END^

------------------------------------------------------------
Так вот, хотя тут и не возвращается символьное поле, но выдаётся всё-то же сообщение:
Arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets

Оказывается, нужно в множество возвращаемых полей для этой процедуры добавить символьное поле "RISETYPE = "xxxxx"" и указать для него кодировку. Получается, что в случае объединения большого количества таблиц, мне будет нужно добавлять в множество возвращаемых полей процедуры столько символьных полей, сколько используется в условии объединения, хотя мне в результирующем наборе данных они нужны не будут.


 
Zacho   (2003-07-08 06:24) [17]


> Avreliy (07.07.03 17:04)
> Оказывается, нужно в множество возвращаемых полей для этой
> процедуры добавить символьное поле "RISETYPE = "xxxxx""
> и указать для него кодировку. Получается, что в случае объединения
> большого количества таблиц, мне будет нужно добавлять в
> множество возвращаемых полей процедуры столько символьных
> полей, сколько используется в условии объединения, хотя
> мне в результирующем наборе данных они нужны не будут.

Это не совсем так, точнее совсем не так. В множество возвращаемых полей добавлять ничего не надо. Просто при выполнении запроса происходит сравнение СИМВОЛЬНОЕ_ПОЛЕ=СИМВОЛЬНОЕ_ЗНАЧЕНИЕ. Charset СИМВОЛЬНОГО_ЗНАЧЕНИЯ - тот, что ты указал при подключении к БД. Если он не совпадает с charset"ом СИМВОЛЬНОГО_ПОЛЯ то и выдается такая ошибка. Так что все что тебе надо - в контексте определенного подключения работать только с теми полями, charset которых совпадает с charset"ом, указанным в параметрах этого подключения. Если тебе в одном подключении надо работать с полями с разным charset"ом, то имеет смысл для всех полей в БД установить character set none, соответственно при подключении его тоже не указывать. Правда, тогда для некоторых операций (сортировка, UPPER и т.п.) придется использовать UDF. Если же у тебя нет необходимости держать в БД строки в разной кодировке, то установи у всех строковых полей в БД один нужный тебе character set и указывай его в параметрах подключения.


 
Avreliy   (2003-07-08 17:17) [18]

Кодировка, указанная в параметрах подключения, совпадает с кодировкой поля.
Проблема была до тех пор, пока в список возвращаемых полей процедуры я не добавил символьное поле с указанием кодировки.


 
Zacho   (2003-07-09 09:49) [19]


> Avreliy (08.07.03 17:17)

Ерунда какая-то. Возможно, баг в IB6, но более вероятно, что ошибка все-же где-то у тебя. Вот пример процедуры, которая точно работает безо всякого добавления символьного поля в список возвращаемых полей. Пример абстрактный, ничего реального подходящего у себя не вспомнил и накропал (и проверил это) за пару минут.
CREATE PROCEDURE TEST
RETURNS (
ID_OS INTEGER,
ID_OKOF INTEGER)
AS
begin
FOR SELECT O.ID_OS, OK.ID_OKOF
FROM OS O, OKOF OK
WHERE (OK.ID_OKOF=O.OKOF)
AND (OK.NAME_OKOF="Насосы вихревые, масляные и центробежные прочие")
INTO :ID_OS,:ID_OKOF DO
suspend;
end



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.008 c
3-100593
paxer
2003-07-07 11:47
2003.07.31
Какие компоненты доступа к БД FireBird использовать?


14-100888
Yuraz
2003-07-16 13:58
2003.07.31
Как узнать, есть ли пересечение фигур? Известны координаты.


3-100558
AndrewVolkov
2003-06-29 13:40
2003.07.31
Dblookupcombobox поле text


3-100547
avch
2003-07-11 12:34
2003.07.31
FastReport


8-100841
Intell
2003-04-04 06:30
2003.07.31
Как узнать разрешение видео?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский