Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с Seq.currval / 25 сообщений из 73, страница 1 из 3
12.05.2005, 13:54
    #33059789
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Суть такова : есть процедура , в которой поочерёдно делаются insert ....select ....
из основной базы в архив .... в архиве есть последовательность , так вот
запросы в процедуре создаются динамически и выполняются через
EXECUTE IMMEDIATE , в одном запросе выполняется
select rmo.vk_wav_seq.nextval@
,а в другом select rmo.vk_wav_seq.currval@

так вот во втором запросе возникает EXCEPTION и процедура обламывается с ORA-08002: последоват. VK_WAV_SEQ.CURRVAL ещё не определён в этом сеансе
ORA-02063: предшествующий line из [имя].[домен]
result = -8002


как можна побороть эту ошибку ? помогите советом .... мож чё нить не так делаю
...
Рейтинг: 0 / 0
12.05.2005, 14:27
    #33059891
Pavel Zenkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Код: plaintext
1.
2.
3.
4.
5.
ORA- 08002  sequence string.CURRVAL is not yet defined in this session

Cause: Sequence CURRVAL has been selected before sequence NEXTVAL.

Action: Select NEXTVAL from the sequence before selecting CURRVAL.

Вывод: нельзя делать select seq.currval, если в этой сессии ни разу не выполнялось select seq.nextval

-------------------------------------------------------
Кто людям помогает - тот тратит время зря. (с) Шапокляк
...
Рейтинг: 0 / 0
12.05.2005, 14:28
    #33059894
grom66
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Для того чтобы выполнилось SQ_CONTRACT.NEXTVAL
необходимо в текущей сесии выполнить хотя бы один раз
SQ_CONTRACT.nextval
...
Рейтинг: 0 / 0
12.05.2005, 14:38
    #33059941
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Pavel Zenkevich
Код: plaintext
1.
2.
3.
4.
5.
ORA- 08002  sequence string.CURRVAL is not yet defined in this session

Cause: Sequence CURRVAL has been selected before sequence NEXTVAL.

Action: Select NEXTVAL from the sequence before selecting CURRVAL.

это я тоже читал .... но тогда чем характеризуется сессия ? одним запросом (динамическим) ?

Pavel Zenkevich
Вывод: нельзя делать select seq.currval, если в этой сессии ни разу не выполнялось select seq.nextval


или всё таки пределами процедуры ?
...
Рейтинг: 0 / 0
12.05.2005, 15:04
    #33060029
grom66
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Пределами сесии.
...
Рейтинг: 0 / 0
12.05.2005, 15:11
    #33060060
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Код: 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.
Connected to Oracle8i Enterprise Edition Release  8 . 1 . 6 . 0 . 0  
Connected as igor


SQL> create sequence s1;

Sequence created

SQL> 
SQL> declare
   2   i int;
   3   begin
   4   select s1.currval into i from dual;
   5   end;
   6   /

declare
i int;
begin
select s1.currval into i from dual;
end;

ORA- 08002 : последов. S1.CURRVAL еще не определен в  этом сеансе
ORA- 06512 : íà  line  4 

SQL> 
SQL> declare
   2   i int;
   3   begin
   4   select s1.nextval into i from dual;
   5   end;
   6   /

PL/SQL procedure successfully completed

SQL> 
SQL> declare
   2   i int;
   3   begin
   4   select s1.currval into i from dual;
   5   end;
   6   /

PL/SQL procedure successfully completed

SQL> 

То есть curval определен во всей сессии, а не локально в процедуре
...
Рейтинг: 0 / 0
12.05.2005, 15:11
    #33060061
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
grom66Пределами сесии.

логично , а сессия чем определяется ? разве хранимая процедура -- это не одна сессия ????
...
Рейтинг: 0 / 0
12.05.2005, 15:13
    #33060072
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
waspwortТо есть curval определен во всей сессии, а не локально в процедуре

я об этом и говорю , поэтому и не могу понять причину ошибки ..... :-?
...
Рейтинг: 0 / 0
12.05.2005, 15:19
    #33060099
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
kosiakвозникает EXCEPTION и процедура обламывается с ORA-08002: последоват. VK_WAV_SEQ.CURRVAL ещё не определён в этом сеансе
ORA-02063: предшествующий line из [имя].[домен]как можна побороть эту ошибку ? помогите советом И что постоянно "обламывается"?
Суть в том, что последовательность удалённая . Возможно, между двумя запросами соединение с удалённой БД было разорвано и автоматически восстановлено.
В качестве workaraund-а: nextval можно сохранить в переменной, с которой впоследствии и работать.
...
Рейтинг: 0 / 0
12.05.2005, 15:20
    #33060101
Pavel Zenkevich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Код: 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.
SQL*Plus: Release  9 . 2 . 0 . 5 . 0  - Production on Thu May  12   14 : 09 : 01   2005 

Copyright (c)  1982 ,  2002 , Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 5 . 0  - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release  9 . 2 . 0 . 5 . 0  - Production

SQL > set serveroutput on
SQL > declare
   2     a number;
   3   begin
   4     dbms_output.enable;
   5     execute immediate 'select seq_product.nextval@db13 from dual' into a;
   6     dbms_output.put_line('next='||a);
   7     execute immediate 'select seq_product.currval@db13 from dual' into a;
   8     dbms_output.put_line('curr='||a);
   9   end;
  10   /
next= 341 
curr= 341 

PL/SQL procedure successfully completed.

SQL > declare
   2     a number;
   3   begin
   4     dbms_output.enable;
   5     execute immediate 'select seq_product.nextval@db13 from dual' into a
   6     dbms_output.put_line('next='||a);
   7     rollback;
   8     execute immediate 'alter session close database link db13';
   9     execute immediate 'select seq_product.currval@db13 from dual' into a
  10     dbms_output.put_line('curr='||a);
  11   end;
  12   /
next= 346 
declare
*
ERROR at line  1 :
ORA- 08002 : sequence SEQ_PRODUCT.CURRVAL is not yet defined in this session
ORA- 02063 : preceding line from DB13
ORA- 06512 : at line  9 

SQL >

Может есть смысл показать текст процедуры?

-------------------------------------------------------
Кто людям помогает - тот тратит время зря. (с) Шапокляк
...
Рейтинг: 0 / 0
12.05.2005, 15:20
    #33060103
Vadim_Maximov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Короче, в рамках сессии все должно работать:
Код: 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.
SQL> connect instructor/instructor@v901
Connected.
SQL> begin
   2     execute immediate 'create table test as select departments_seq.nextval as name, object_name from user_objects';
   3     execute immediate 'update test set name = departments_seq.currval';
   4     commit;
   5   end;
   6   /

PL/SQL procedure successfully completed.

SQL> select * from test;

      NAME OBJECT_NAME
---------- -----------------------------------------------------------------------------------------
     718190  ADD_JOB_HISTORY
     718190  COUNTRIES
     718190  COUNTRY_C_ID_PK
     718190  DEPARTMENTS
     718190  DEPARTMENTS_SEQ
     718190  DEPT_ID_PK
     718190  DEPT_LOCATION_IX
     718190  EMPLOYEES
     718190  EMPLOYEES_SEQ
     718190  EMP_DEPARTMENT_IX
     718190  EMP_DETAILS_VIEW

      NAME OBJECT_NAME
---------- -----------------------------------------------------------------------------------------
     718190  EMP_EMAIL_UK
     718190  EMP_EMP_ID_PK
     718190  EMP_JOB_IX
     718190  EMP_MANAGER_IX
     718190  EMP_NAME_IX
     718190  JHIST_DEPARTMENT_IX
     718190  JHIST_EMPLOYEE_IX
     718190  JHIST_EMP_ID_ST_DATE_PK
     718190  JHIST_JOB_IX
     718190  JOBS
     718190  JOB_HISTORY

      NAME OBJECT_NAME
---------- -----------------------------------------------------------------------------------------
     718190  JOB_ID_PK
     718190  LOCATIONS
     718190  LOCATIONS_SEQ
     718190  LOC_CITY_IX
     718190  LOC_COUNTRY_IX
     718190  LOC_ID_PK
     718190  LOC_STATE_PROVINCE_IX
     718190  REGIONS
     718190  REG_ID_PK
     718190  SECURE_DML
     718190  SECURE_EMPLOYEES

      NAME OBJECT_NAME
---------- -----------------------------------------------------------------------------------------
     718190  TEST
     718190  UPDATE_JOB_HISTORY
У вас подобный код или что-то иное? Может приведете нам полный текст процедуры?
...
Рейтинг: 0 / 0
12.05.2005, 15:36
    #33060155
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
хм, кстати да, странная фишка с этим динамическим sql. вот ясоздаю 2 процедуры

Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace procedure p is
i INT;
begin
  --execute immediate 'select s1.nextval from dual';
  select s1.nextval INTO i from dual;
end p;

Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace procedure p1 is
i INT;
begin
  --execute immediate 'select s1.currvall from dual';
  select s1.nextval INTO i from dual;
end p1;

далее по очереди вызываю их в одном сеансе сначала p потом p1. так вот, в этом виде все работает нормально, а если раскомментариваю строку с динамическим вызовом, то ругается что curval не определен в данной сессии. Из-за чего такое могет быть???
...
Рейтинг: 0 / 0
12.05.2005, 15:37
    #33060162
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
waspwortхм, кстати да, странная фишка с этим динамическим sql. вот ясоздаю 2 процедуры

Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace procedure p is
i INT;
begin
  --execute immediate 'select s1.nextval from dual';
  select s1.nextval INTO i from dual;
end p;

Код: plaintext
1.
2.
3.
4.
5.
6.
create or replace procedure p1 is
i INT;
begin
  --execute immediate 'select s1.currvall from dual';
  select s1.nextval INTO i from dual;
end p1;

да, во второй процедуре, там nextval читать как currval...

далее по очереди вызываю их в одном сеансе сначала p потом p1. так вот, в этом виде все работает нормально, а если раскомментариваю строку с динамическим вызовом, то ругается что curval не определен в данной сессии. Из-за чего такое могет быть???
...
Рейтинг: 0 / 0
12.05.2005, 15:43
    #33060190
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Pavel Zenkevich Может есть смысл показать текст процедуры?

всю не могу, сорри, но этого куска должно хватить

Код: 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.
Create Or Replace PROCEDURE PROC_NAME
   ( wav_id IN number,
     global_archname IN varchar2,  
     tabname IN varchar2,   
     result   out number 
          )
   IS
   sql_stmt0    VARCHAR2( 255 );
   sql_stmt1    VARCHAR2( 255 );
   sql_stmt2    VARCHAR2( 255 );
   sql_stmt3    VARCHAR2( 255 );
   vk_wav_seq   number;
   ftablename   VARCHAR2( 255 );
   wavlog_name  VARCHAR2( 255 );
   awav_date    date;
   res_wavid    number;
BEGIN
 result:= 0 ; 

--insert to vk_wav
 sql_stmt0:='insert into rmo.vk_wav@'||global_archname||' (wav_id,oldwav_id,hid,';
 sql_stmt1:='imsi,imei,msisdn,wav_date,wav_type,rec_time,fsize,prior1,cnt_sms,rtc,resume1,result,obj_idm,dnrs,cnrs,cells1,cells_time,cells2,cells3,cells4,cells5,cells6,cells7,cells8,cells9,cells10,fcl,dtmf) ';
 sql_stmt2:='select rmo.vk_wav_seq.nextval@'||global_archname||','||TO_Char(wav_id)||',hid,imsi,imei,msisdn,wav_date,wav_type,rec_time,fsize,prior1,cnt_sms,rtc,resume1,result,obj_idm,dnrs,cnrs,cells1,cells_time,';
 sql_stmt3:='cells2,cells3,cells4,cells5,cells6,cells7,cells8,cells9,cells10,fcl,dtmf from rmo.'||tabname||' where  wav_id='||TO_CHAR(wav_id);
 EXECUTE IMMEDIATE sql_stmt0||sql_stmt1||sql_stmt2||sql_stmt3;

--insert to vk_act
   ftablename:=sysadm.convertname('WAV','ACT',tabname);
   sql_stmt0:='insert into rmo.vk_act@'||global_archname||' (wav_id,act,usr_gr) ';
   sql_stmt1:='select rmo.vk_wav_seq.currval@'||global_archname||',act,usr_gr ';
   sql_stmt2:='from rmo.'||ftablename||' where wav_id='||TO_CHAR(wav_id);
  EXECUTE IMMEDIATE sql_stmt0||sql_stmt1||sql_stmt2;
.................................................................
.................................................................
.................................................................
<<U>>
null; 

 COMMIT WORK;
EXCEPTION
    WHEN others THEN
    begin
        DBMS_OUTPUT.put_line (SUBSTR(SQLERRM,  1 ,  150 ));
        result:=SQLCODE;   
        ROLLBACK WORK;
    end;    
END; -- Procedure

надеюсь вы рассмотрите последовательность .....
вот где-то так .....
...
Рейтинг: 0 / 0
12.05.2005, 16:04
    #33060256
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
Эээ...
Проще поюзать RETURNING INTO.
...
Рейтинг: 0 / 0
12.05.2005, 16:14
    #33060285
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
он жеЭээ...
Проще поюзать RETURNING INTO.

с этого места поподробнее пожалуйста
...
Рейтинг: 0 / 0
12.05.2005, 16:21
    #33060304
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
kosiak он жеЭээ...
Проще поюзать RETURNING INTO.

с этого места поподробнее пожалуйста

матчасть.....

Код: plaintext
1.
2.
3.
4.
5.
begin
  -- Test statements here
  INSERT INTO t1 VALUES (s1.nextval) RETURNING id INTO :i;
  INSERT INTO t1 VALUES (:i);
end;
...
Рейтинг: 0 / 0
12.05.2005, 16:29
    #33060338
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
проблема в том , что запросы строятся динамически ...... а инкремент нужен .....
...
Рейтинг: 0 / 0
12.05.2005, 16:32
    #33060347
он же
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
kosiakпроблема в том , что запросы строятся динамически ...... а инкремент нужен .....
Насколько я понял, первый инсерт у вас вставляет одну строку?
...
Рейтинг: 0 / 0
12.05.2005, 16:49
    #33060405
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
да, там вставляется по строке в каждую таблицу за один вызов процедуры
...
Рейтинг: 0 / 0
12.05.2005, 16:51
    #33060410
Vadim_Maximov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
!
ElicСуть в том, что последовательность удалённая . Возможно, между двумя запросами соединение с удалённой БД было разорвано и автоматически восстановлено.
В качестве workaraund-а: nextval можно сохранить в переменной, с которой впоследствии и работать.
...
Рейтинг: 0 / 0
12.05.2005, 16:58
    #33060430
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
то есть нужно искать другой путь ?
...
Рейтинг: 0 / 0
12.05.2005, 17:01
    #33060442
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
kosiakто есть нужно искать другой путь ?

А чем returning или select into не устраивает то???
...
Рейтинг: 0 / 0
12.05.2005, 17:31
    #33060561
kosiak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
waspwortА чем returning или select into не устраивает то???

я объясню ..... путь к базе передаётся в виде переменной , то есть строка запроса формируется динамически , для того чтобы сделать select into нужно в динамическую строку вплести переменную ,или же создавать курсор, поэтому я и прошу мне помочь , так как не до конца понимаю , как правильно это сделать ......
...
Рейтинг: 0 / 0
12.05.2005, 17:51
    #33060621
waspwort
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с Seq.currval
kosiak waspwortА чем returning или select into не устраивает то???

я объясню ..... путь к базе передаётся в виде переменной , то есть строка запроса формируется динамически , для того чтобы сделать select into нужно в динамическую строку вплести переменную ,или же создавать курсор, поэтому я и прошу мне помочь , так как не до конца понимаю , как правильно это сделать ......

и судя по всему global_archname и есть та самая переменная? А сколько она может принимать значений? Если немного, то почему бы не написать в лоб, что нить вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
case global_archname
      'db1': insert into t1@db1....
      'db2': insert into t1@db2....
       .....
      'dbn': insert into t1@dbn....
end case;


или я опять чего не понял?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с Seq.currval / 25 сообщений из 73, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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