powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / FETCH из курсора говорит, что он закрыт.
5 сообщений из 5, страница 1 из 1
FETCH из курсора говорит, что он закрыт.
    #37692252
emctl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здрасте.
Есть процедура, которая вычитывает из таблицы dml скрипты и выполняет их.
Код: 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.
35.
36.
CREATE OR REPLACE PROCEDURE my_proc (...)
   LANGUAGE SQL
   BEGIN
    
      DECLARE sqlstate              CHAR (5) DEFAULT '00000';
      DECLARE sqlcode               INTEGER DEFAULT 0;
      DECLARE v_job_script          CLOB;
      DECLARE v_job_status          CHAR (1) DEFAULT 'F';
      DECLARE
         c_joblist CURSOR FOR
            SELECT script
              FROM   dmloperations  WITH UR;
      BEGIN

         OPEN c_joblist;
         FETCH FROM c_joblist
           INTO v_job_script;

         WHILE (sqlstate = '00000') DO
           job_exec:
            BEGIN
               /*Execution jobs script */
               DECLARE EXIT HANDLER FOR SQLEXCEPTION
                  EXECUTE IMMEDIATE v_job_script;
            END job_exec;

            COMMIT WORK;
            
            FETCH FROM c_joblist
              INTO  v_job_script;

         END WHILE;

         CLOSE c_joblist;
      END;
   END;


Но когда, эта процедура пытается второй раз сделать вычитку из курсора (первый раз в цикле), то я получаю ошибку:
Код: plsql
1.
2.
SQL0501N  The cursor specified in a FETCH statement or CLOSE statement is not open or a cursor 
variable in a cursor scalar function reference is not open.  SQLSTATE=24501   


Ну и в добавок, буду благодарен, если кто-то подскажет как делать вычитку из курсора без WHILE (sqlstate = '00000'), т.к. в я хочу продолжать выполнять джобы, даже если некоторые отвалились, но поскольку после первого EXECUTE IMMEDIATE v_job_script; с ошибкой sqlstate поменяет состояние, то и курсор перестанет вычитываться.
...
Рейтинг: 0 / 0
FETCH из курсора говорит, что он закрыт.
    #37692287
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
emctl...
Но когда, эта процедура пытается второй раз сделать вычитку из курсора (первый раз в цикле), то я получаю ошибку:
Код: plsql
1.
2.
SQL0501N  The cursor specified in a FETCH statement or CLOSE statement is not open or a cursor 
variable in a cursor scalar function reference is not open.  SQLSTATE=24501


Код: plaintext
1.
DECLARE
         c_joblist CURSOR WITH HOLD FOR ...

emctlНу и в добавок, буду благодарен, если кто-то подскажет как делать вычитку из курсора без WHILE (sqlstate = '00000'), т.к. в я хочу продолжать выполнять джобы, даже если некоторые отвалились, но поскольку после первого EXECUTE IMMEDIATE v_job_script; с ошибкой sqlstate поменяет состояние, то и курсор перестанет вычитываться.
При ошибке в EXECUTE IMMEDIATE управление передастся на следующий после BEGIN ... END оператор, т.е. на COMMIT.
После COMMIT SQLSTATE изменится, да и потом до конца WHILE еще и FETCH есть, который тоже изменит SQLSTATE.
Т.е. после ошибки SQLSTATE еще 2 раза изменится, так что ошибка никак на условие выхода из цикла не повлияет.
...
Рейтинг: 0 / 0
FETCH из курсора говорит, что он закрыт.
    #37692344
emctl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Спасибо, всё работает :).
...
Рейтинг: 0 / 0
FETCH из курсора говорит, что он закрыт.
    #37693370
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
emctl,

Чуть изящней будет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE PROCEDURE my_proc (...)
  LANGUAGE SQL
  BEGIN
    FOR joblist_loop AS c_joblist CURSOR WITH HOLD FOR
       SELECT script FROM   dmloperations  WITH UR 
    DO
       BEGIN
       /*Execution jobs script */
       DECLARE EXIT HANDLER FOR SQLEXCEPTION
           EXECUTE IMMEDIATE script;
       END;

       COMMIT;
    END FOR;
  END;
...
Рейтинг: 0 / 0
FETCH из курсора говорит, что он закрыт.
    #37693503
emctl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPb,

Не, ну неявные курсоры - наше всё, конечно :).
Просто поскольку я нигде в документации по DB2 не видел про неявные курсоры, а я работаю с clob полями (в принципе и про lob не очень то много написано), то я предпочёл использовать явные курсоры, дабы небыло потом проблем, что что-то "не так" работает :).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / FETCH из курсора говорит, что он закрыт.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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