powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Глюк Оракла с OUT NOCOPY
25 сообщений из 29, страница 1 из 2
Глюк Оракла с OUT NOCOPY
    #39916389
mercator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю триггер на основе процедуры, пытаясь изменить колонку, вставляется 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
Глюк Оракла с OUT NOCOPY
    #39916393
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mercator
Нагуглить этот косяк

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

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


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

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

В доке существует предупреждение про Exception, но тут всё штатно, никакого Exception не происходит.
...
Рейтинг: 0 / 0
Глюк Оракла с OUT NOCOPY
    #39916517
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Глюк Оракла с OUT NOCOPY
    #39916612
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mercator
He понял.
Добавь
Код: plsql
1.
dbms_output.put_line(':new.b=' || :new.b);
...
Рейтинг: 0 / 0
Глюк Оракла с OUT NOCOPY
    #39916617
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на ошибку plsql-оптимизации. Например, в триггере отслеживается изменение полей :new (по аналогии с updating(поле)) и признак по окончании триггера используется для копирования только изменений в реальную запись. С nocopy изменений поля в контексте триггера не видно.
Явное присвоение значения до вызова процедуры должно исправить поведение.
...
Рейтинг: 0 / 0
Глюк Оракла с OUT NOCOPY
    #39916626
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Похоже на ошибку plsql-оптимизации.
Не воспроизводится.
...
Рейтинг: 0 / 0
Глюк Оракла с OUT NOCOPY
    #39916682
mercator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Глюк Оракла с OUT NOCOPY
    #39916694
mercator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня вообще ошибка перестала воспроизводиться :(
Пробовал на разных базах и разных серверах.

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

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

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

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

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

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


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