Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
Я с Oracle/MySQL на "ВЫ", так что сильно не бейте по рукам))
Данная БД работает с 2004 года, при попытке открытия записей через клиента периодически появляется ошибка "Invalid time", все решалось простым удалением записей и новым их созданием, но потом пришел я на работу и захотел разобраться))) Нашел старый TOAD 8.5.3 - к которому имелась инструкция по подключению к БД. Полазив по таблицах на нашел ту самую в которой рождалась ошибка, только в TOAD она звучит как "0.0 is not a valid timestamp". Я решил установить в проблемном месте значение по умолчанию "SYSDATE", но оно все равно не вносится, если клиент ничего не установил.

Как попробовать заставить таблицу принимать значение по умолчанию? При условии что нарушать работу БД нельзя, уволят к чертям и разбираться никто не будет))

P.S.: Клиент - exe-шник сделан в Delphi, что он собой представляет можно только догадываться, исходника нет)). Кто разработчик всего этого добра и кто внедрял в рабочий процесс - тоже не известно.


P.Р.S.: Как такой запрос:
UPDATE OFFICE_ORDERS
SET WHO_DATE = SYSDATE
WHERE WHO_DATE NOT BETWEEN '01.01.1996' AND '01.01.2018';

реагирует на NULL? (Это один из вариантов решения озвученной проблемы)

К сообщению приложен файл. Размер - 73Kb
19 июл 17, 15:00    [20657935]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
to_date

автор
Данная БД работает с 2004 года, при попытке открытия записей через клиента периодически появляется ошибка "Invalid time", все решалось простым удалением записей и новым их созданием,

ахринетъ
19 июл 17, 15:28    [20658086]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
semenar,
Сделал вчера в таблице:
TO_DATE(SYSDATE, 'DD/MM/YYYY')
- значением по умолчанию, но значения не вносятся. Наверное все-таки клиент записывает NULL, если пользователь ничего не ввёл. А так как автопарк состоит из Win XP (да-да, у нас таких много), 7, 8, 8.1, 10 -- х64/х86, то проблема будет появляться.
Вчера разбирался с пользователем после которого появлялась озвученная ошибка - проблема от данного пользователя возникала потому что на его системе Win 7 х32, стояла BDE x64. Заменил на BDE х32 и пользователь пока что не ломает записи.
20 июл 17, 10:04    [20660059]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
AmKad
Member

Откуда:
Сообщений: 5222
albatraus
TO_DATE(SYSDATE, 'DD/MM/YYYY')
NLS-мина. Используй trunc.
20 июл 17, 10:08    [20660076]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Elic
Member

Откуда:
Сообщений: 29979
albatraus
TO_DATE(SYSDATE, 'DD/MM/YYYY')
Жуть.
20 июл 17, 10:08    [20660079]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
AmKad
Member

Откуда:
Сообщений: 5222
albatraus
проблема от данного пользователя возникала потому что на его системе Win 7 х32, стояла BDE x64. Заменил на BDE х32 и пользователь пока что не ломает записи.
Это не есть истинная причина проблемы, это всего лишь фактор, при котором она воспроизводится/не_воспроизводится.
20 июл 17, 10:12    [20660105]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Q.Tarantino
Member [заблокирован]

Откуда: Где-то рядом...
Сообщений: 12015
слов нет.
20 июл 17, 10:32    [20660196]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5369
Q.Tarantino
слов нет.

рекомендую...
СЛОВАРЬ
Сборник слов в алфавитном порядке, с пояснениями, толкованиями или с переводом на другой язык.
20 июл 17, 10:38    [20660221]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
albatraus
P.Р.S.: Как такой запрос:
UPDATE OFFICE_ORDERS
SET WHO_DATE = SYSDATE
WHERE WHO_DATE NOT BETWEEN '01.01.1996' AND '01.01.2018';

реагирует на NULL? (Это один из вариантов решения озвученной проблемы)


Плохо реагирует, не показывает их

Хочешь искать с null
select *
from OFFICE_ORDERS
WHERE WHO_DATE is null;


ну а дальше:
- Найди хоть 1 запись с null.
- Проверь из клиента что твоя ошибка воспроизводится для этой записи.
- Замени поле WHO_DATE не на sysdate, a хотя-бы на Date_Modify для одной этой записи.
- Проверь из клиента что твоя ошибка не воспроизводится для этой записи.
- Напиши результат
20 июл 17, 10:56    [20660385]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
MaximaXXL
- Найди хоть 1 запись с null.
- Проверь из клиента что твоя ошибка воспроизводится для этой записи.
- Замени поле WHO_DATE не на sysdate, a хотя-бы на Date_Modify для одной этой записи.
- Проверь из клиента что твоя ошибка не воспроизводится для этой записи.
- Напиши результат

Наверное я ввёл сообщество в заблуждение, извините.
Если в записи NULL то всё нормально работает, но иногда, насколько я понял, вместо NULL записывается какое-то значение отличимое от NULL ("0" или еще что), хоть клиент позволяет сохранять только дату или ничего.

MaximaXXL
albatraus
P.Р.S.: Как такой запрос:
UPDATE OFFICE_ORDERS
SET WHO_DATE = SYSDATE
WHERE WHO_DATE NOT BETWEEN '01.01.1996' AND '01.01.2018';

реагирует на NULL? (Это один из вариантов решения озвученной проблемы)

Плохо реагирует, не показывает их

А это хорошо)), можно исправить всех "Инвалидов" (пользователи их так называют) за 2017 год, не внося изменения в работающие записи.


Сейчас наверное вопрос стоит уже по другому: может ли клиент перезаписывать значение в таблице БД выставленное по умолчанию, если у него даже не активировалось соответственное поле (никакие данные не вносились и не удалялись)?
20 июл 17, 11:57    [20660890]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5369
albatraus
может ли клиент перезаписывать значение в таблице БД выставленное по умолчанию, если у него даже не активировалось соответственное поле (никакие данные не вносились и не удалялись)?

Всё что явно или опосредствованно не запрещено - разрешено (как это ни банально);
Что вы хотели сказать выделенным набором слов?
20 июл 17, 12:16    [20660970]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
Viewer,

Пользователь в клиентском приложении хочет выставляет дату, а хочет - нет. Обычно они (пользователи) в клиенте даже не ставят курсор в поле отвечающее за значение поля "WHO_DATE" в БД (извините за тавтологию).
20 июл 17, 12:44    [20661071]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
albatraus
Viewer,

Пользователь в клиентском приложении хочет выставляет дату, а хочет - нет. Обычно они (пользователи) в клиенте даже не ставят курсор в поле отвечающее за значение поля "WHO_DATE" в БД (извините за тавтологию).


У вас дата в дефаулте, она будет заполнена, если не пользователем. то ораклом.

13:18:59 stat@iips> create table t(id number, d date default sysdate);

Table created.

Elapsed: 00:00:00.03
13:19:03 stat@ii> insert into t(id) values(1);
1 row created.
Elapsed: 00:00:00.00
13:19:19 stat@ii> select * from t;
        ID D
---------- --------
         1 20.07.17
Elapsed: 00:00:00.01
13:22:48 stat@ii> select * from t;
        ID D
---------- --------
         2 20.07.17
Elapsed: 00:00:00.00
13:22:53 stat@ii> update t set d=null;
1 row updated.
Elapsed: 00:00:00.01
13:23:01 stat@ii> update t set id=id+1;
1 row updated.
Elapsed: 00:00:00.01
13:23:11 stat@ii> select * from t;
        ID D
---------- --------
         3
13:23:22 stat@ii> exit

Если дата в нулл, то и при update ничего не будет. Поищите по форуму как включить трассировку сессии, вы там увидите, что и куда вставляете. Это если у вас нет возможности посмотреть исходники клиента.
20 июл 17, 13:28    [20661296]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
semenar,

Данные из файла трассировки:
***...***
Delete From CustomsAdmin.OFFICE_ORDERS
Where DCUS_Code = 38 and
Type_Card = 1 and Num_Card = 62 and
Year_Card = 2017

***...***

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  DELETE OFFICE_ORDERS 
      1   TABLE ACCESS BY INDEX ROWID OFFICE_ORDERS 
      1    INDEX RANGE SCAN (ххххххххххх)

***...***

Insert Into CustomsAdmin.OFFICE_ORDERS
(DCUS_Code, Num_Card, Year_Card,
Who, Who_Date, For_Whom, For_Whom_Note, Order_Content, Order_Pos,
UserN) Values (:1, :2, :3,
:4, :5, :6, :7, :8, :9,
:10)
***...***


Запись в таблице удаляется (вдруг что-то такое существует), а потом перезаписывается данными из клиента, где и есть моя проблемная запись Who_Date. Поэтому всё зависит от пользователя и его машины: если пользователь не поставит дату -> клиент отправит NULL -> и в результате из неправильных настроек машины пользователя мы можем получить в таблице ошибку.
Правильно я понял?
21 июл 17, 13:10    [20664565]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
[quot albatraus]semenar,
Delete From CustomsAdmin.OFFICE_ORDERS
Where DCUS_Code = 38 and
Type_Card = 1 and Num_Card = 62 and
Year_Card = 2017
[/src]
Ну тут как бы удаление. Хотя пристрелите меня, не понимаю зачем delete+insert, когда нужно update.
albatraus
Insert Into CustomsAdmin.OFFICE_ORDERS
(DCUS_Code, Num_Card, Year_Card,
Who, Who_Date, For_Whom, For_Whom_Note, Order_Content, Order_Pos,
UserN) Values (:1, :2, :3,
:4, :5, :6, :7, :8, :9,
:10)
[/src]
Запись в таблице удаляется (вдруг что-то такое существует), а потом перезаписывается данными из клиента, где и есть моя проблемная запись Who_Date. Поэтому всё зависит от пользователя и его машины: если пользователь не поставит дату -> клиент отправит NULL -> и в результате из неправильных настроек машины пользователя мы можем получить в таблице ошибку.
Правильно я понял?

В вашем коде идет вставка, в том числе who_date. И есть переменная привязки. Явно null не прописан. Я канечно могу предложить решение данного гамнокодинга, а именно переименовать таблицу, сделать view, who_date varchar2. И думается весь гамногодинг заработает, особенно после delete+insert.
22 июл 17, 20:12    [20667002]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
semenar
Явно null не прописан.

Я ничего явно прописанного в трассировке не увидел (может и не должен) Поэтому, исходя из изложенного, буду считать что Default
у WHO_DATE перезаписывается NULL из клиента. Думаю та этом обсуждение можно заканчивать.

semenar, Вы уж извините, но исправлять код я не стану... руки еще не доросли да и как оно в БД всё завязано я не знаю.

semenar, MaximaXXL, AmKad - спасибо Вам за помощь и подсказки.
22 июл 17, 23:16    [20667276]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
albatraus
Наверное я ввёл сообщество в заблуждение, извините.
Если в записи NULL то всё нормально работает, но иногда, насколько я понял, вместо NULL записывается какое-то значение отличимое от NULL ("0" или еще что), хоть клиент позволяет сохранять только дату или ничего.


albatraus
Запись в таблице удаляется (вдруг что-то такое существует), а потом перезаписывается данными из клиента, где и есть моя проблемная запись Who_Date. Поэтому всё зависит от пользователя и его машины: если пользователь не поставит дату -> клиент отправит NULL -> и в результате из неправильных настроек машины пользователя мы можем получить в таблице ошибку.
Правильно я понял?


Вот сейчас я ничего не понял. Так Вы ловите null, 0 или черную кошку в черной комнате?
т.е. Вы хотя-бы для себя очертили проблемму:
1. Вас null в поле устраивает или нет?
2. Проблемма возникает когда в поле Who_Date - что?
3. Можно ли воспроизвезти эту ошибку на тестовом/боевом сервере?
4. Есть ли понимание проблеммы вообще, или пока только из разряда мне рассказывали что приходилось удалять?
22 июл 17, 23:19    [20667280]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
MaximaXXL
1. Вас null в поле устраивает или нет?

Да, устраивает.

MaximaXXL
2. Проблемма возникает когда в поле Who_Date - что?

При просмотре через TOAD данного поля, он уходит в циклическую ошибку и я ничего не могу увидеть.
Запросом я вижу что там: 12.01.0201, 00.10.0951, 21.07.5201...

MaximaXXL
3. Можно ли воспроизвезти эту ошибку на тестовом/боевом сервере?

Через клиента, я не могу. (Сейчас я считаю что проблема возникает из-за неправильных настроек пользователя)

MaximaXXL
4. Есть ли понимание проблеммы вообще, или пока только из разряда мне рассказывали что приходилось удалять?

Для меня это "что-то-где-то"
albatraus
Я с Oracle/MySQL на "ВЫ", так что сильно не бейте по рукам))
24 июл 17, 09:36    [20668723]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
albatraus
Сейчас я считаю что проблема возникает из-за неправильных настроек пользователя

Пришлось пересмотреть это мнение так как ошибки появляются и спонтанно - «Раз, два… Меркурий во втором доме… луна ушла… шесть – несчастье… вечер - семь», - Воланд.
Сейчас решил сделать триггер:
CREATE OR REPLACE TRIGGER CUSTOMS.update_invalid_time
BEFORE INSERT OR UPDATE
ON CUSTOMSADMIN.OFFICE_ORDERS
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
begin
	 if :new.who_date not between '01.01.2005' AND sysdate + 30 then :new.who_date := null;
end if;
end;
/

Но мне здесь не нравится sysdate + 30 поскольку я не знаю как оно поведет себя 2 декабря.

Когда я вставляю вместо sysdate + 30 это trunc(to_date(sysdate + interval '1' year),'YEAR') (лучше бы получить 31.12.текущего года), то я получаю ошибку PLS-00201: identifier 'NUMTOYMINTERVAL' must be declared

Подскажите как исправить ошибку или как по другому подойти к этому решению?
11 авг 17, 10:38    [20715789]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6718
albatraus
to_date(sysdate

AmKad
NLS-мина. Используй trunc

Ты когда на электронные часы смотришь, тоже выписываешь время прописью буквами на бумажку, а потом (возможно воспринимая как буквы другого языка) переводишь в цифры?
Не надо приводить тип данных к самому себе через неявное преобразование.

И сравнение со строкой '01.01.2005' точно такое же неявное преобразование без гарантии результата. Приведи всё к одному типу. Строки - через to_date с явной маской или литеральную запись.

Если у тебя в БД реально есть даты вида 00.01.1951 - это говорит о кривом заполнении поля. DEFAULT тебя не спасёт хотя бы потому, что по трассировке значение передаётся явно.
create table dropme_t (id number not null, dt date default sysdate)
/

insert into dropme_t(id) values(1);

insert into dropme_t(id, dt) values(2, null);

select * from dropme_t;

drop table dropme_t;


И вопрос "на добивание", а в каком типе данных передаёт приложение? Там не чиселка случаем?
11 авг 17, 11:02    [20715942]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Elic
Member

Откуда:
Сообщений: 29979
albatraus
between '01.01.2005'
nls-быдлокод продолжается.
11 авг 17, 11:03    [20715951]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
env
Не надо приводить тип данных к самому себе через неявное преобразование.

Так лучше будет: trunc((sysdate + interval '1' year),'YEAR')?


env
И сравнение со строкой '01.01.2005' точно такое же неявное преобразование без гарантии результата. Приведи всё к одному типу. Строки - через to_date с явной маской или литеральную запись.

to_date('01.01.2005','dd.mm.yyyy')

env
И вопрос "на добивание", а в каком типе данных передаёт приложение? Там не чиселка случаем?

Не знаю. Исходника нет.
11 авг 17, 12:11    [20716305]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
Viewer
Member

Откуда: Самара
Сообщений: 5369
albatraus
Но мне здесь не нравится sysdate + 30 поскольку я не знаю как оно поведет себя 2 декабря.

поведёт себя согласно правилам арифметики для дат..
trunc(last_day(sysdate)) ?
11 авг 17, 12:26    [20716359]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
env
Если у тебя в БД реально есть даты вида 00.01.1951 - это говорит о кривом заполнении поля.

 DATE_MODIF WHO_DATE  
---------- ----------
03.01.2012 21.11.8201
25.12.2012 12.07.0201
25.12.2012 15.07.0201
21.11.2012 16.11.1201
14.09.2012 14.09.0112
18.09.2012 17.08.0912
19.10.2012 18.10.8201

Потому и хочу триггер, но не знаю что делать с вот этим:
albatraus
trunc((sysdate + interval '1' year),'YEAR'), то я получаю ошибку PLS-00201: identifier 'NUMTOYMINTERVAL' must be declared

Что я должен объявить(задекларировать)?
11 авг 17, 12:32    [20716389]     Ответить | Цитировать Сообщить модератору
 Re: Изменение значения в таблице по умолчанию через TOAD  [new]
albatraus
Member

Откуда:
Сообщений: 19
Viewer
поведёт себя согласно правилам арифметики для дат..
trunc(last_day(sysdate)) ?


Это понятно, не повалятся ли ошибки, вот этого я не знаю.

Viewer
trunc(last_day(sysdate)) ?

А как насчет последнего дня года, а не месяца?
11 авг 17, 12:36    [20716407]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить