powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Баг, или у Оракла или в голове
17 сообщений из 17, страница 1 из 1
Баг, или у Оракла или в голове
    #39461523
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет,
кажется у меня понедельниковский вопрос.
Есть старая таблица
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE mytable(  ID          NUMBER, -- primary
  STF NUMBER,
  MYTEXT VARCHAR2(50 CHAR),
  AKTIV     CHAR(1 CHAR)          DEFAULT '0',
  NUMMER    CHAR(2 CHAR))



не спрашивайте почему NUMMER это CHAR я не отвечу, т.е. не знаю.
В любом случае STF + AKTIV + NUMMER это юник.

а теперь начинается понедельник!!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from mytable
where   STF = 1 
   and AKTIV  = :p_aktiv  -- varchar2
   and NUMMER  =:p_nummer -- varchar2

выдаёт NULL

select * from mytable
where   STF = 1 
   and AKTIV  = :p_aktiv  -- varchar2
   and NUMMER  =to_number(:p_nummer) -- varchar2

Выдаёт правильный ответ!



Тут самым простым ответом с моей стороны было, что проблема в том что поле NUMMER заявлено как CHAR!, но после перевода в VARCHAR2 ситуация не изменилась.
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461531
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74выдаёт NULLКакие основания противопоставлять этот результат "правильному ответу"?
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461560
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74,

Что лежит в :p_nummer?
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461562
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

ну хотя бы то, что во втором случае не меняя значение переменых, мы получаем правильный Record.

Но вопрос уже отпал :(
Oracle не конвертирует данные при MODIFY.
после того как переписал значение NUMMER - всё заработало :(
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461564
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

в p_nummer - иногда "1" иногда "01" и т.д.
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461567
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74Egoр,

в p_nummer - иногда "1" иногда "01" и т.д.
отсюда разница в результатах.
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461571
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

неее!! еще раз во время теста значение переменных НЕМЕНЯЛОСЬ!!
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461581
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74,

to_char(to_number('01')) = '1'
поэтому NUMMER = '01' - это False, а NUMMER = to_char(to_number('01')) - это True
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461601
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

это элементарно. Но в данном случае было так:

STF =1 --NUMBER, NUMMER ='1' CHAR -- Выдаёт NULL
STF =1 --NUMBER, NUMMER =1 CHAR -- Выдаёт RECORD
после MODIFY - тот же результат
STF =1 --NUMBER, NUMMER ='1' VARCHAR2 -- Выдаёт NULL
STF =1 --NUMBER, NUMMER =1 VARCHAR2 -- Выдаёт RECORD

после изменения значения с '1' на '1'
STF =1 --NUMBER, NUMMER ='1' VARCHAR2 -- Выдаёт RECORD
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461603
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74,

ну тут кажется все просто:
в NUMMER CHAR(2 CHAR) - храниться 1, но по факту Char 2 добъёт его пробелами до размера чара итого '1 '
если сравнить с :p_nummer -- varchar2 как '1' или '01' - это False

если сравнить с to_number(:p_nummer) то он сделает неявное приведение типов и получит что-то типа такого
NUMMER = cast(to_number(:p_nummer) as char) и будет искать '1 ' = '1 ' что есть True
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461611
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74,

думаю если делать
Код: plsql
1.
and NUMMER  = cast(:p_nummer as char(2))

- все будет работать ну и в :p_nummer передавать '1' а не '01' ... ну или анализировать данные как хранят односимвольные NUMMER (по примеру кажется что все-таки как '1 ')

выходов много, to_number, trim, rtrim, cast( as char(2) ... )
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461624
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLvladimir74,

думаю если делать
Код: plsql
1.
and NUMMER  = cast(:p_nummer as char(2))


- все будет работать ну и в :p_nummer передавать '1' а не '01' ... ну или анализировать данные как хранят односимвольные NUMMER (по примеру кажется что все-таки как '1 ')

выходов много, to_number, trim, rtrim, cast( as char(2) ... )
примерно так я и сделал и теперь всё работает.
насчём что передаваьть в :p_nummer - тут сложнее :( т.к.
при stf 1,4 надо передавать 1,2,3,4...
при stf 2,3 - 01,02,03,04...
Вот такой у нас северный олень живёт :) Эту структуру кто то 20 лет назад придумад, и досих пор живёт :)

Проблема а чтом что в VARCHAR2 данные хранятся как '1' а в CHAR ' 1' Это я еще знал, а вот то что при MODIFY не происходит конвертации - не знал
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461630
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimir74Проблема а чтом что в VARCHAR2 данные хранятся как '1' а в CHAR ' 1'


Надеюсь это опечатка и имелось ввиду VARCHAR2 данные хранятся как '1' а в CHAR '1 '

SY.
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461634
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLvladimir74,

ну тут кажется все просто:
в NUMMER CHAR(2 CHAR) - храниться 1, но по факту Char 2 добъёт его пробелами до размера чара итого '1 '
если сравнить с :p_nummer -- varchar2 как '1' или '01' - это False

если сравнить с to_number(:p_nummer) то он сделает неявное приведение типов и получит что-то типа такого
NUMMER = cast(to_number(:p_nummer) as char) и будет искать '1 ' = '1 ' что есть True
імхо не так

NUMMER =to_number(:p_nummer)

поле NUMMER будет неявно приведено к number(to_number(nummer)), если бы были значения напр " ", то ORA

.....
stax
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461640
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

очепятка =(

stax..,

я честно не помню в какую сторону будет идти неявное преобразование, но оно точно будет и я обычно этого избегаю из-за непредсказуемости
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461646
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,
к числовым, поетому и выстраливает ORA-01722: invalid number, в тч в зависимости от плана

......
stax
...
Рейтинг: 0 / 0
Баг, или у Оракла или в голове
    #39461652
vladimir74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYvladimir74Проблема а чтом что в VARCHAR2 данные хранятся как '1' а в CHAR ' 1'


Надеюсь это опечатка и имелось ввиду VARCHAR2 данные хранятся как '1' а в CHAR '1 '

SY.
точно, каюсь :( '1 '
вообще я поэтому очень не люблю CHAR, а так же самовольные оракловские преобразования.
Лучше бы сразу говорил несоответсвие типов, иди исправляй. ИМХО намного меньше проблем было бы потом :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Баг, или у Оракла или в голове
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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