powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / в SP @@error==0 при 2601
5 сообщений из 5, страница 1 из 1
в SP @@error==0 при 2601
    #33180402
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЭстЪ таблица, на одно из полей которой положено constraint unique и SP
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
...
insert into TABLE_NAME
(FIELD_1, ... FIELD_N)     
values     
(@FIELD_1, ... @FIELD_N)     
     
if @@rowcount!= 1      
  begin     
    select @NEW_ID= 0      
    select @RetValue=@@error
    -- select @str="'"||convert(varchar(256),@@error)||"'"
    -- print @str
  end     
else     
  begin     
    select @NEW_ID=@@identity     
    select @RetValue= 0      
end  
так вот: при попытке про'insert'ить запись с дублирующим значением попадаем в if @@rowcount!=1 - тут все честно. Но фот @RetValue возвращается равным 0 Ж8-/
Если просто в консоли делать
Код: plaintext
1.
2.
insert into TABLE_NAME (FIELD_1, ... FIELD_N) values (@FIELD_1, ... @FIELD_N)
select @@error
все честно @@error==2601, а фот в SP = 0 Ж8-/
Есть какие-то мысли?

select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
в SP @@error==0 при 2601
    #33181520
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну Субася и дает!!! Ж8-/ Оказывается, ната делать присвоение
@@error'а в каку-нить переменную, причем как только - так и сразу.
Вот - можете сами полюбоваться.
Код: plaintext
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
create table TestError
(
   Id numeric( 18 ) identity constraint NotNullId not null constraint pkTestError primary key,
   UniqueValue integer constraint NotNullUniqueValue not null,
   constraint ukTestErrorUniqueValue unique (UniqueValue)
)
go

create procedure sp_AfterInsert
  @Id numeric( 18 ),
  @UniqueValue integer,
  @NewId numeric( 18 ) output
as
begin
  declare
    @OldId numeric( 18 ),
    @RetVal integer,
    @tmpError integer,
    @tmpStr varchar( 256 )

  select @OldId=null

  select @OldId=Id
  from TestError
  where Id=@Id

  if @OldId is not null
    begin
      update TestError
      set UniqueValue=@UniqueValue
      where Id=@Id

      select @tmpError=@@error
      select @tmpStr="update @@error: '"||convert(varchar(256),@tmpError)||"'"
      print @tmpStr

      select @Retval=@tmpError

      if @tmpError!= 0 
        select @NewId= 0 
      else
        select @NewId=@Id
    end
  else
    begin
      insert into TestError (UniqueValue) values (@UniqueValue)

      select @tmpError=@@error
      select @tmpStr="insert @@error: '"||convert(varchar(256),@tmpError)||"'"
      print @tmpStr

      select @Retval=@tmpError

      if @tmpError!= 0 
        select @NewId= 0 
      else
        select @NewId=@@identity
    end

  return(@RetVal)
end
go

create procedure sp_WithRowCount
  @Id numeric( 18 ),
  @UniqueValue integer,
  @NewId numeric( 18 ) output
as
begin
  declare
    @OldId numeric( 18 ),
    @RetVal integer,
    @tmpError integer,
    @tmpStr varchar( 256 )

  select @OldId=null

  select @OldId=Id
  from TestError
  where Id=@Id

  if @OldId is not null
    begin
      update TestError
      set UniqueValue=@UniqueValue
      where Id=@Id

      if @@rowcount!= 1 
        begin
          select @tmpError=@@error
          select @tmpStr="update @@error: '"||convert(varchar(256),@tmpError)||"' (@@rowcounr!=1)"
          print @tmpStr

          select @Retval=@tmpError
          select @NewId= 0 
        end
      else
        begin
          select @tmpError=@@error
          select @tmpStr="update @@error: '"||convert(varchar(256),@tmpError)||"' (@@rowcounr==1)"
          print @tmpStr

          select @Retval= 0 
          select @NewId=@Id
        end
    end
  else
    begin
      insert into TestError (UniqueValue) values (@UniqueValue)

      if @@rowcount!= 1 
        begin
          select @tmpError=@@error
          select @tmpStr="insert @@error: '"||convert(varchar(256),@tmpError)||"' (@@rowcounr!=1)"
          print @tmpStr

          select @Retval=@tmpError
          select @NewId= 0 
        end
      else
        begin
          select @tmpError=@@error
          select @tmpStr="insert @@error: '"||convert(varchar(256),@tmpError)||"' (@@rowcounr==1)"
          print @tmpStr

          select @Retval= 0 
          select @NewId=@@identity
        end
    end

  return(@RetVal)
end
go
Тестируем sp_AfterInsert
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
delete from TestError
commit

declare
  @Id numeric( 18 ),
  @UniqueValue integer,
  @NewId numeric( 18 ),
  @RetVal integer

select @Id= 0 
select @UniqueValue= 1 

-- нормальный insert
exec @RetVal=sp_AfterInsert @Id,
  @UniqueValue,
  @NewId
select @RetVal, @Id, @UniqueValue, @NewId

-- insert с violation of PRIMARY or UNIQUE KEY constraint
exec @RetVal=sp_AfterInsert @Id,
  @UniqueValue,
  @NewId
select @RetVal, @Id, @UniqueValue, @NewId
SQL Advantage
...
insert @@error: '0'
...
insert @@error: '2601'
...

тут все по честному...

Тестируем sp_WithRowCount
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
delete from TestError
commit

declare
  @Id numeric( 18 ),
  @UniqueValue integer,
  @NewId numeric( 18 ),
  @RetVal integer

select @Id= 0 
select @UniqueValue= 1 

-- нормальный insert
exec @RetVal=sp_WithRowCount @Id,
  @UniqueValue,
  @NewId
select @RetVal, @Id, @UniqueValue, @NewId

-- insert с violation of PRIMARY or UNIQUE KEY constraint
exec @RetVal=sp_WithRowCount @Id,
  @UniqueValue,
  @NewId
select @RetVal, @Id, @UniqueValue, @NewId
и тут мы имеем (или нас ;) )
SQL Advantage
...
insert @@error: '0' (@@rowcounr==1)
...
insert @@error: '0' (@@rowcounr!=1)
...


Как местные многоуважаемые гуру это прокомментируют? Неужели if способен напрочь отшибить мОзги серваку?

P.S.
Справочное руководство. Том 1. Основные конструкции. (refman1.pdf)
@@error: Возвращает номер последней ошибки, выданной системой.

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
в SP @@error==0 при 2601
    #33181808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftНу Субася и дает!!! Ж8-/ Оказывается, ната делать присвоение
@@error'а в каку-нить переменную, причем как только - так и сразу.
Вот - можете сами полюбоваться.


Чему удивляешься ? @@error меняется каждым statement-ом, в том числе и IF-ом. Написано в документации, кстати.
...
Рейтинг: 0 / 0
в SP @@error==0 при 2601
    #33182049
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
@@error меняется каждым statement-ом, в том числе и IF-ом.

это они под bash косят ;) ? Я, 4 example, подумал на предмет его изменения тока опосля DDL || DML.

MasterZiv
Написано в документации, кстати.

И где?

Я имею ;) и юзаю:
Справочное руководство. Том 1. Основные конструкции. (refman1.pdf)
@@error: Возвращает номер последней ошибки, выданной системой.

И какая же ашипка м.б. в if? Получается кривой мануал?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
в SP @@error==0 при 2601
    #33182431
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft MasterZiv
@@error меняется каждым statement-ом, в том числе и IF-ом.

это они под bash косят ;) ? Я, 4 example, подумал на предмет его изменения тока опосля DDL || DML.

А чем тебе IF не DML ?

Ex_Soft
MasterZiv
Написано в документации, кстати.

И где?

Там унутри .... почитай - найдешь.

Ex_Soft
И какая же ашипка м.б. в if? Получается кривой мануал?


В IF может быть например подзапрос с ошибкой, может быть неправильный вызов функции.

Короче, @@error меняется ЛЮБЫМ оператором, прими это как данность и спокойно работай дальше.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / в SP @@error==0 при 2601
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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