powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не создается sequence?!?
19 сообщений из 19, страница 1 из 1
Не создается sequence?!?
    #32182707
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На оракле 3 день до этого сидел на Microsoft. поэтому наверно че-то не понимаю.
Написал процедуру она бегает по SYS.TAB и по опр условиям формирует Sequence и триггеры, но через execute im... создавать sequences не хочет.
Помогите советом.
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182709
Рустем
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сисовские таблы в принципе нельзя навесить триггера...
смотри "Концепции"
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182726
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я из sys.tab беру данные о таблица чтобы сгенерить для них триггера и сиквенсы и через exec запускаю формирование

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
....
vcSeqBody:='CREATE SEQUENCE '||vcTName||'_SEQ'||chr( 13 )
          ||'minvalue 1'||chr( 13 )
          ||'maxvalue 999999999999999999999999999'||chr( 13 )
          ||'start with 1'||chr( 13 )
          ||'increment by 1'||chr( 13 )
          ||'nocache'||chr( 13 )
          ||'cycle;';
 vcSeqDropBody:='Drop SEQUENCE '||vcTName||'_SEQ;';
  ......
	Select count(*) as a into u
        	from  sys.all_sequences  o
        	where  o.sequence_name= vcTName||'_SEQ';
if U= 1  then			        
 execute immediate  vcSeqDropBody;
 commit;
end if;  
 execute immediate vcSeqBody;
 commit;
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182729
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит "не хочет"? Как звучит ошибка?

ну и уберите ";" в конце строки в переменных vcSeqBody и vcSeqDropBody.
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182737
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за точки с запятой sequence теперь создается и удаляется!!!

Но теперь моя процедура вылетает на создании триггера!
Вот триггер который она сгенерила
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE TRIGGER ACCBAL1_INC
BEFORE INSERT ON ACCBAL1 FOR EACH ROW
declare
 I integer;
begin
 if :new.IDACCBAL1 is null then
  SELECT ACCBAL1_SEQ.NextVal into :new.IDACCBAL1 from Dual;
 else
  SELECT ACCBAL1_SEQ.NextVal into I from dual;
  while :new.IDACCBAL1>I loop 
    SELECT ACCBAL1_SEQ.NextVal into I from dual;
  end loop;
 end if;
end ACCBAL1_INC;


1.он создается
2.процедура на этом вываливается без сообщ об ошибке
3. если зайти в него через список объектов он с красненькой пометкой и ошибкой:

Compilation errors for TRIGGER ARTDBA.ACCBAL1_INC

Error: PLS-00103: Encountered the symbol "" when expecting one of the following:

begin function package pragma procedure subtype type use
<an identifier> <a double-quoted delimited-identifier> cursor
form current
Line: 3
Text: declare


И еще выделена строчка с DECLARE
4. Если же после захода в его редактирование нажать f8(execute)
то он без ошибок создается.
В чем прикол я не понимаю, а сделать надо. Напишите пож-та свои предположения или советы :<(
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182742
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слово declare используется только в анонимном pl/sql блоке. Уберите его.
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182743
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком виде он орет Invalid trigger specification
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE TRIGGER ACCBAL1_INC
BEFORE INSERT ON ACCBAL1 FOR EACH ROW
 I integer;
begin
 if :new.IDACCBAL1 is null then
  SELECT ACCBAL1_SEQ.NextVal into :new.IDACCBAL1 from Dual;
 else
  SELECT ACCBAL1_SEQ.NextVal into I from dual;
  while :new.IDACCBAL1>I loop 
    SELECT ACCBAL1_SEQ.NextVal into I from dual;
  end loop;
 end if;
end ACCBAL1_INC
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182744
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот он злощаастный код который вылетает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    vcTrIncBody:='CREATE OR REPLACE TRIGGER '||vcTName||'_INC'||chr( 13 )
        	||'BEFORE INSERT ON '||vcTName||' FOR EACH ROW as'||chr( 13 )
          ||'declare'||chr( 13 )          
          ||' I integer;'||chr( 13 )
          ||'begin'||chr( 13 )
  				||' if :new.'||vcPKColName||' is null then'||chr( 13 )
     			||'  SELECT '||vcTName||'_SEQ.NextVal into :new.'||vcPKColName||' from Dual;'||chr( 13 )
          ||' else'||chr( 13 )||'  SELECT '||vcTName||'_SEQ.NextVal into I from dual;'||chr( 13 )
          ||'  while :new.'||vcPKColName||'>I loop '||chr( 13 )||'    SELECT '||vcTName||'_SEQ.NextVal into I from dual;'||chr( 13 )   
          ||'  end loop;'||chr( 13 )||' end if;'||chr( 13 )||'end '||vcTName||'_INC';
 execute immediate vcTrIncBody;
commit;
    
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182745
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, наврал с declare :-) В триггере блок трактуется как анонимный.
Но тут как раз ";" после end нужна, т.к. она не является командой на выполнение (как в запросе). Ну и уберите ACCBAL1_INC в конструкции с "end;"
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182746
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас заметил - у вас "as" перед declare стоит - уберите.
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182750
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And there is no need to commit. CREATE TRIGGER is a DDL and tehrefore implictly commits itself (actually DDL commits twice: before and after).

SY
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182751
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сож не помогает. As это я случайно оставил когда declare уберал на всякий случай еще и c AS пробовал.

Он все время ругается на строку после FOR EACH ROW
в не зависимости от того begin там или declare
в ручную он не компилится пока не войдешь и не отредактируешь;
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182753
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
You are missing semicolon ; . Remember, trigger body is PL/SQL, not SQL. PL/SQL end statement MUST have ; at the end.

SY
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182755
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SY
>You are missing semicolon ;. Remember, trigger body is PL/SQL, not SQL. PL/SQL
>end statement MUST have ; at the end.

я уже говорил, думаю товарищ исправил :-)

2 Lav
запостите, пожалуйста еще раз триггер и сообщение об ошибке.

судя по предидущему

Error: PLS-00103: Encountered the symbol "" when expecting one of the following:
begin function package pragma procedure subtype type use


тут возможно лишний возврат строки, поэтому лучше отладить текст в sql*plus, например, а потом уже формировать строки для execute immediate.
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182756
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vcTrIncBody:='CREATE OR REPLACE TRIGGER '||vcTName||'_INC '
||'BEFORE INSERT ON '||vcTName||' FOR EACH ROW'||chr(13)
||'declare'||chr(13)
||' I integer;'||chr(13)
||'begin'||chr(13)
||' if :new.'||vcPKColName||' is null then'||chr(13)
||' SELECT '||vcTName||'_SEQ.NextVal into :new.'||vcPKColName||' from Dual;'||chr(13)
||' else'||chr(13)||' SELECT '||vcTName||'_SEQ.NextVal into I from dual;'||chr(13)
||' while :new.'||vcPKColName||'>I loop '||chr(13)||' SELECT '||vcTName||'_SEQ.NextVal into I from dual;'||chr(13)
||' end loop;'||chr(13)||' end if;'||chr(13)
||'end;';

CREATE OR REPLACE TRIGGER ACCBAL1_INC BEFORE INSERT ON ACCBAL1 FOR EACH ROW
declare
I integer;
begin
if :new.IDACCBAL1 is null then
SELECT ACCBAL1_SEQ.NextVal into :new.IDACCBAL1 from Dual;
else
SELECT ACCBAL1_SEQ.NextVal into I from dual;
while :new.IDACCBAL1>I loop
SELECT ACCBAL1_SEQ.NextVal into I from dual;
end loop;
end if;
end;
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182757
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compilation errors for TRIGGER ARTDBA.ACCBAL1_INC

Error: PLS-00103: Encountered the symbol "" when expecting one of the following:

begin function package pragma procedure subtype type use
<an identifier> <a double-quoted delimited-identifier> cursor
form current
Line: 2
Text: declare
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182762
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Just noticed: you are using CHR(13) which is LINE FEED!!! It should be CHR(10) which is CARRIAGE RETURN:

Код: 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.
SQL> CREATE TABLE TBL(X NUMBER);

Table created.

SQL> CREATE SEQUENCE TBL_SEQ;

Sequence created.

SQL> DECLARE
   2       vcTName     VARCHAR2( 30 ) := 'TBL';
   3       vcPKColName VARCHAR2( 30 ) := 'X';
   4       vcTrIncBody VARCHAR2( 500 );
   5   BEGIN
   6       vcTrIncBody:='CREATE OR REPLACE TRIGGER '||vcTName||'_INC'||chr( 10 )
   7            ||'BEFORE INSERT ON '||vcTName||' FOR EACH ROW'||chr( 10 )
   8             ||'declare'||chr( 10 )          
   9             ||' I integer;'||chr( 10 )
  10             ||'begin'||chr( 10 )
  11         ||' if :new.'||vcPKColName||' is null then'||chr( 10 )
  12           ||'  SELECT '||vcTName||'_SEQ.NextVal into :new.'||vcPKColName||' from Dual;'||chr( 10 )
  13             ||' else'||chr( 10 )||'  SELECT '||vcTName||'_SEQ.NextVal into I from dual;'||chr( 10 )
  14             ||'  while :new.'||vcPKColName||'>I loop '||chr( 10 )||'    SELECT '||vcTName||'_SEQ.Ne
xtVal into I from dual;'||chr( 10 )   
  15             ||'  end loop;'||chr( 10 )||' end if;'||chr( 10 )||'end '||vcTName||'_INC;';
  16       execute immediate vcTrIncBody;
  17   END;
  18   /

PL/SQL procedure successfully completed.


SY
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32182763
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видите, у меня все работает без ошибок, значит проблема в формировании строки.

Код: 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.
SQL> create table ACCBAL1 (IDACCBAL1 number);

Table created.

SQL> create sequence ACCBAL1_SEQ;

Sequence created.

SQL> CREATE OR REPLACE TRIGGER ACCBAL1_INC BEFORE INSERT ON ACCBAL1 FOR EACH ROW
   2   declare
   3   I integer;
   4   begin
   5   if :new.IDACCBAL1 is null then
   6   SELECT ACCBAL1_SEQ.NextVal into :new.IDACCBAL1 from Dual;
   7   else
   8   SELECT ACCBAL1_SEQ.NextVal into I from dual;
   9   while :new.IDACCBAL1>I loop
  10   SELECT ACCBAL1_SEQ.NextVal into I from dual;
  11   end loop;
  12   end if;
  13   end;
  14   /

Trigger created.

SQL>
SQL> sho err
No errors.
SQL>
...
Рейтинг: 0 / 0
Не создается sequence?!?
    #32183062
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО ОГРОМНОЕ
СПАСИБО ОГРОМНОЕ!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не создается sequence?!?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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