Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Глюк Оракла с OUT NOCOPY / 25 сообщений из 29, страница 1 из 2
20.01.2020, 15:28
    #39916389
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Делаю триггер на основе процедуры, пытаясь изменить колонку, вставляется NULL.
Вот пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
drop table xxx_square;

CREATE TABLE xxx_square
(   A VARCHAR2(100)
  , B VARCHAR2(100)
);
    
CREATE OR REPLACE PACKAGE xxx_p1
IS
  PROCEDURE xxx_p_square (A IN VARCHAR2, B OUT NOCOPY VARCHAR2);
END xxx_p1;
/

CREATE OR REPLACE PACKAGE BODY xxx_p1
IS
  PROCEDURE xxx_p_square (A IN VARCHAR2, B OUT NOCOPY VARCHAR2)
  AS
  BEGIN
    B:= A || A;
  END xxx_p_square;
END xxx_p1;
/

CREATE OR REPLACE TRIGGER xxx_tr_square BEFORE INSERT ON xxx_square FOR EACH ROW
BEGIN
    xxx_p1.xxx_p_square(:new.a, :new.b);
END xxx_tr_square;

INSERT INTO xxx_square (A)
                     VALUES
                       ('123456789012345');

SELECT *
FROM xxx_square;



Bыдаёт cтроку: A= '123456789012345' В=NULL;

Ecли убрать NOCOPY или использовать тип NUMBER, то работает согласно русской логике, а не американской.
Нагуглить этот косяк не смог. Оракле - 11.2.
...
Рейтинг: 0 / 0
20.01.2020, 15:40
    #39916393
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
Нагуглить этот косяк

Подскажите пожалуйста, какого эффекта Вы ожидаете от буквосочетания "Out Nocopy"
...
Рейтинг: 0 / 0
20.01.2020, 15:46
    #39916395
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
andrey_anonymous, ожидаю, что результат выполнения процедуры сразу скопируется в значение параметра, т.е. в :new.b.
Кстати так и происходит, если типы параметров NUMBER. А вот с VARCHAR2 - oблом.
...
Рейтинг: 0 / 0
20.01.2020, 16:01
    #39916400
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
так и происходит

Это зависит от решения компилятора.
Попробуйте "более традиционный" вариант с IN OUT NOCOPY.
Ну и версия сервера непонятна - 11.2.0.1, к примеру, наполнен багами значительно плотнее, чем 11.2.0.5.
...
Рейтинг: 0 / 0
20.01.2020, 16:42
    #39916432
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
andrey_anonymous, не понимаю, о каком "решении компилятора" речь ? :)
Захочу - вставлю результат выполнения процедуры, захочу - вставлю NULL.
Bepcия - 11.2.0.4. Про 11.2.0.5 не слышал что-то.
...
Рейтинг: 0 / 0
20.01.2020, 16:50
    #39916447
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
Захочу - вставлю
косяк после триггера, захочу нет. Чудак.
...
Рейтинг: 0 / 0
20.01.2020, 17:02
    #39916454
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Elic
mercator
Захочу - вставлю
косяк после триггера, захочу нет. Чудак.


He понял.
...
Рейтинг: 0 / 0
20.01.2020, 17:16
    #39916467
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
сложно в автономной транзакции в лог записать результат процедуры?
...
Рейтинг: 0 / 0
20.01.2020, 17:19
    #39916468
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
alex-ls, Записывал, результат верный - '123456789012345123456789012345'.

Глюк на этапе приравнивания - выполняем :new.b := '123456789012345123456789012345', а получаем :new.b := NULL. Ccылками NOCOPY неправильно оракл играется.

В доке существует предупреждение про Exception, но тут всё штатно, никакого Exception не происходит.
...
Рейтинг: 0 / 0
20.01.2020, 19:23
    #39916517
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator

Ecли убрать NOCOPY или использовать тип NUMBER, то работает согласно русской логике, а не американской.


Американская логика работает согласно американской документации:

By default, actual parameter is passed by value; if you specify NOCOPY, it might be passed by reference.

SY.
...
Рейтинг: 0 / 0
21.01.2020, 07:07
    #39916612
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
He понял.
Добавь
Код: plsql
1.
dbms_output.put_line(':new.b=' || :new.b);
...
Рейтинг: 0 / 0
21.01.2020, 07:44
    #39916617
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Похоже на ошибку plsql-оптимизации. Например, в триггере отслеживается изменение полей :new (по аналогии с updating(поле)) и признак по окончании триггера используется для копирования только изменений в реальную запись. С nocopy изменений поля в контексте триггера не видно.
Явное присвоение значения до вызова процедуры должно исправить поведение.
...
Рейтинг: 0 / 0
21.01.2020, 08:17
    #39916626
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
-2-
Похоже на ошибку plsql-оптимизации.
Не воспроизводится.
...
Рейтинг: 0 / 0
21.01.2020, 10:26
    #39916682
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
By default, actual parameter is passed by value; if you specify NOCOPY, it might be passed by reference.

SY.
Пускай будет ссылка. Почему если делать через промежуточную переменную, то работает логично, по-русски:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE TRIGGER xxx_tr_square BEFORE INSERT ON xxx_square FOR EACH ROW
DECLARE

  tmp_b VARCHAR2(100);
  
BEGIN

    xxx_p1.xxx_p_square(:new.a, tmp_b);
    :new.b := tmp_b;
    
END xxx_tr_square;
/
...
Рейтинг: 0 / 0
21.01.2020, 10:41
    #39916694
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
У меня вообще ошибка перестала воспроизводиться :(
Пробовал на разных базах и разных серверах.

А на боевом 2 дня не мог понять в чём дело.
Похоже глюк оракла плавающий.
...
Рейтинг: 0 / 0
21.01.2020, 11:57
    #39916725
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
Похоже глюк оракла плавающий.
Скорее кто-то что-то делал не так.
...
Рейтинг: 0 / 0
21.01.2020, 13:05
    #39916771
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Elic
Скорее кто-то что-то делал не так.

Скрипт же целиком выложен. Да и народ вроде пробовал, не со слов же помочь пытался..
...
Рейтинг: 0 / 0
21.01.2020, 13:10
    #39916774
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
Скрипт же целиком выложен.
Elic
mercator
Захочу - вставлю
косяк после триггера, захочу нет.

mercator
Да и народ вроде пробовал
Elic
Не воспроизводится.

mercator
не со слов же помочь пытался.
Я не видел ни одного вывода из SQL*Plus-а. Твоего в том числе. Только невнятные вопли.
...
Рейтинг: 0 / 0
21.01.2020, 13:19
    #39916780
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Elic
Я не видел ни одного вывода из SQL*Plus-а. Твоего в том числе. Только невнятные вопли.

He надо так грубо. Дело в том, что запускал в лягушке.
...
Рейтинг: 0 / 0
21.01.2020, 13:27
    #39916784
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
Дело в том, что запускал в лягушке.
Тесты надо проводить в плюсе и только в плюсе.
Так что руки.
...
Рейтинг: 0 / 0
21.01.2020, 13:30
    #39916788
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
He надо так грубо
Ты бы сперва сам подумал, стоило ли бездоказательно обсуждать национальные логики.
...
Рейтинг: 0 / 0
21.01.2020, 13:41
    #39916796
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
Elic, Дружище, с чего ты взъелся на меня!?
Есть скрипт, причём полный, я бы, на твоём месте, прежде чем отвечать, прогнал бы его.
А глюк я продолжаю искать. Сейчас из боевой достану глючный триггер и прогоню через него наш биллинг из миллионов строк. Такое ощущение, что триггер спотыкается не на каждой строке.
...
Рейтинг: 0 / 0
21.01.2020, 13:49
    #39916798
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
прежде чем отвечать, прогнал бы его.
Я никогда не бываю голословен.
Elic
Не воспроизводится.
...
Рейтинг: 0 / 0
21.01.2020, 13:50
    #39916799
mercator
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
del
...
Рейтинг: 0 / 0
21.01.2020, 17:03
    #39916886
alex-ls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюк Оракла с OUT NOCOPY
mercator
А глюк я продолжаю искать. Сейчас из боевой достану глючный триггер и прогоню через него наш биллинг из миллионов строк. Такое ощущение, что триггер спотыкается не на каждой строке.

я бы уволил за такое...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Глюк Оракла с OUT NOCOPY / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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