Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите найти ошибку в триггере  [new]
real_ronaldu
Member

Откуда:
Сообщений: 29
Create Or Replace Trigger t_param_rm
After Insert on prod
for each row

declare

res varchar2(1000);
TYPE cur_typ IS REF CURSOR;
c cur_typ;
buf varchar2(500);
query_str VARCHAR2(1000);
Begin
select desc into query_str from group_table where сode in
(substr(:new.group, 1, length(:new.group)-1));
OPEN c FOR query_str;
loop
FETCH c INTO buf;
EXIT WHEN c%NOTFOUND;
res := res || ',' || buf;
end loop;
CLOSE c;
--если в таблицу prod добавляется новая запись...
If Inserting
Then
Insert Into audit_table Values(Sysdate,
'Добавлен параметр -'||res||;


End If;
End t_param_rm;
/
При добавлении новой записи в таблицу prod это действие должно записаться в таблицу audit_table. Входной параметр (новая запись) просто числа через запятые (типо 632147,965214,), а в таблицу audit_table должны записаться описания(desc) этих кодов(code) через запятые. Если я делаю инсерт он ругается "invalid number" Может я неправильно использую курсор, помогите плизз...
9 июн 11, 22:10    [10792431]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
stax..
Guest
real_ronaldu,
очепятка, или так в триггере
Insert Into audit_table Values(Sysdate,
'Добавлен параметр -'||res||;

.....
stax
9 июн 11, 22:42    [10792592]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
stax..
Guest
real_ronaldu,

я так понимаю, ето Ваш первый триггер в оракле?

......
stax
9 июн 11, 22:47    [10792611]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
real_ronaldu
Create Or Replace Trigger t_param_rm
  After Insert on prod
  for each row

declare

  res   varchar2(1000);
  TYPE cur_typ IS REF CURSOR;
  c cur_typ;
  buf varchar2(500);
  query_str VARCHAR2(1000);
Begin
 select desc into query_str from group_table where сode in 
 (substr(:new.group, 1, length(:new.group)-1));
 OPEN c FOR query_str;
  loop
    FETCH c INTO buf;
    EXIT WHEN c%NOTFOUND;
    res := res || ',' || buf;
  end  loop;
  CLOSE c;
  --если в таблицу prod добавляется новая запись...
 If  Inserting
    Then
        Insert Into audit_table Values(Sysdate,
              'Добавлен параметр -'||res||;
              

  End If;
End t_param_rm;
/
При добавлении новой записи в таблицу prod это действие должно записаться в таблицу audit_table. Входной параметр (новая запись) просто числа через запятые (типо 632147,965214,), а в таблицу audit_table должны записаться описания(desc) этих кодов(code) через запятые. Если я делаю инсерт он ругается "invalid number" Может я неправильно использую курсор, помогите плизз...

Для начала используйте тег SRC при оформлении кода в сообщении.
9 июн 11, 23:53    [10792824]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
suPPLer
Для начала используйте тег SRC при оформлении кода в сообщении.

OFF: Может подправить движок форума, чтобы он анализировал длинные сообщения на наличие ключевых слов и отсутствие тега SRC перед публикацией?
10 июн 11, 00:36    [10792963]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
real_ronaldu
Member

Откуда:
Сообщений: 29
есть функция -
create or replace function getdesc
(
new_code in varchar2
) return varchar2
is
res varchar2(1000);
query_str VARCHAR2(1000);
TYPE cur_typ IS REF CURSOR;
c cur_typ;
buf varchar2(500);
begin
query_str := 'select desc from group_table where code in ('||substr(new_code, 1, length(new_code)-1)||')';
OPEN c FOR query_str;
loop
FETCH c INTO buf;
EXIT WHEN c%NOTFOUND;
res := res || ',' || buf;
end loop;
CLOSE c;
return(res);
end getdesc;


я его вызывал в триггере вот так -

Create Or Replace Trigger t_param_rm
After Insert on prod
for each row

declare

Begin
--если в таблицу prod добавляется новая запись...
If Inserting
Then
Insert Into audit_table Values(Sysdate,
'Добавлен параметр -'||getdesc(:new.group)||);


End If;
End t_param_rm;

вот так он работал, мне не нужно отдельная функция хочу его внутри триггера прописать...
10 июн 11, 07:35    [10793253]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
real_ronaldu
я его вызывал в триггере вот так -

Create Or Replace Trigger t_param_rm
  After Insert on prod
  for each row

declare

Begin
  --если в таблицу prod добавляется новая запись...
 If  Inserting
    Then
        Insert Into audit_table Values(Sysdate,
              'Добавлен параметр -'||getdesc(:new.group)||);


  End If;
End t_param_rm;

вот так он работал, мне не нужно отдельная функция хочу его внутри триггера прописать...


Во-первых, прочитайте, как правильно оформлять сообщение. Во-вторых, не верю, что вот так он работал. Из-за выделенного. В-третьих, советую перечислять столбцы при вставке. И покажите уже DDL-скрипт создания таблицы audit_table.
10 июн 11, 10:55    [10794114]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
_Nikotin
suPPLer
Для начала используйте тег SRC при оформлении кода в сообщении.

OFF: Может подправить движок форума, чтобы он анализировал длинные сообщения на наличие ключевых слов и отсутствие тега SRC перед публикацией?


Предложение хорошее.
10 июн 11, 11:07    [10794207]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
stax..
Guest
real_ronaldu
есть функция -
create or replace function getdesc
(
  new_code   in varchar2
) return varchar2
is
  res   varchar2(1000);
  query_str VARCHAR2(1000);
  TYPE cur_typ IS REF CURSOR;
  c cur_typ;
  buf varchar2(500);
begin
  query_str := 'select desc from group_table where code in ('||substr(new_code, 1, length(new_code)-1)||')';
  OPEN c FOR query_str;
  loop
    FETCH c INTO buf;
    EXIT WHEN c%NOTFOUND;
    res := res || ',' || buf;
  end  loop;
  CLOSE c;
  return(res);
end getdesc;


я его вызывал в триггере вот так -

Create Or Replace Trigger t_param_rm
  After Insert on prod
  for each row

declare

Begin
  --если в таблицу prod добавляется новая запись...
 If  Inserting
    Then
        Insert Into audit_table Values(Sysdate,
              'Добавлен параметр -'||getdesc(:new.group)||);


  End If;
End t_param_rm;

вот так он работал, мне не нужно отдельная функция хочу его внутри триггера прописать...



Create Or Replace Trigger t_param_rm
  After Insert on prod
  for each row
declare
 function getdesc
 (
   new_code   in varchar2
 ) return varchar2
 is
   res   varchar2(1000);
   query_str VARCHAR2(1000);
   TYPE cur_typ IS REF CURSOR;
   c cur_typ;
   buf varchar2(500);
 begin
   query_str := 'select desc from group_table where code in ('||substr(new_code, 1, length (new_code)-1)||')';
   OPEN c FOR query_str;
   loop
     FETCH c INTO buf;
     EXIT WHEN c%NOTFOUND;
     res := res || ',' || buf;
   end  loop;
   CLOSE c;
  return(res);
 end getdesc;

Begin
  --если в таблицу prod добавляется новая запись...
-- If  Inserting
--    Then
        Insert Into audit_table Values(Sysdate,
              'Добавлен параметр -'||getdesc(:new.group));
--  End If;
End t_param_rm;


так как триггер токо After Insert то If Inserting можно опустить

......
stax
10 июн 11, 15:33    [10797193]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
real_ronaldu
Member

Откуда:
Сообщений: 29
stax, спасибо! Могу я добавить в этот триггер еще одну функцию --

create or replace function getdesctype
(
new_code in varchar2
) return varchar2
is
res varchar2(1000);
query_str VARCHAR2(1000);
TYPE cur_typ IS REF CURSOR;
c cur_typ;
buf varchar2(500);
begin
query_str := 'select desc from type_table where code in ('||substr(new_code, 1, length(new_code)-1)||')';
OPEN c FOR query_str;
loop
FETCH c INTO buf;
EXIT WHEN c%NOTFOUND;
res := res || ',' || buf;
end loop;
CLOSE c;
return(res);
end getdesctype;

и в триггер добавить --

Insert Into audit_table Values(Sysdate,
'Добавлен параметр -'||res||CHR(13)||CHR(10)|| /*(дескриптион из group_table)*/
'Добавлен тип - '||res);---?? /*(здесь дескриптион берется из другой таблицы type_table)*/
13 июн 11, 09:41    [10805317]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
stax..
Guest
real_ronaldu,

конешно можете, если надо добавляйте

вот такие конструкции
in ('||substr(new_code, 1, length(new_code)-1)||
чесно гря не очень есть гут

если ето просто проба пера то можно оставить
если производственный код то надо думать, мож есть смысл заменить на шото другое

зы
в триггер мона добавлять прямо код ф-ции/процедуры,
не вдаваясь в смысл я просто показал как малой кровью уйти от использования хранимой ф-ции/процедуры


......
stax
13 июн 11, 13:11    [10805781]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку в триггере  [new]
real_ronaldu
Member

Откуда:
Сообщений: 29
stax, спасибо большое
14 июн 11, 12:32    [10809317]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить