SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик  Ответить
 Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
Есть скрипт в поле типа CLOB (DDL пакета). Его необходимо выполнить. По причине размера скрипта execute immediate не подходит.

Знаю, что тема уже неоднократно на форуме поднималась. Поначитавшись всего вышесказанного, пробую:


DECLARE

c   INT;
ok  INT;

BEGIN

  FOR crec IN (SELECT * FROM table_name)
    LOOP
      c:= dbms_sql.open_cursor();
      DBMS_SQL.PARSE(c,crec.clob_field,1);
      ok:= dbms_sql.execute(c);
      dbms_sql.close_cursor(c);
    END LOOP;
  COMMIT;
  
  EXCEPTION when others THEN null;

END;


не получается :(

PS тапками прошу не закидывать, сталкиваюсь с такой задачей впервые...
15 сен 08, 15:00    [6185858] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 8414
Guesssst
Есть скрипт в поле типа CLOB (DDL пакета). Его необходимо выполнить. По причине размера скрипта execute immediate не подходит.

Знаю, что тема уже неоднократно на форуме поднималась. Поначитавшись всего вышесказанного, пробую:
..
не получается :(

PS тапками прошу не закидывать, сталкиваюсь с такой задачей впервые...

версия сервера-то какая?
переваривать лоб(как лоб) dbms_sql умеет только с 11g - в нем, кстати и заявление про
execute immediate не подходит.. - уже не верно. Если у вас сервер не 11, то
курите процедуры в том пакете, работающие с массивом (скалярных) порций (~строк) скрипта
15 сен 08, 15:19    [6186015] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
denix1
Member

Откуда: Киев
Сообщений: 4067
Guesssst
не получается :(
вы даже не знаете в результате чего не получается
таки открыть/считать лоб или выполнить его через DBMS_SQL...

к слову - если это скрипт, то выполнить его как одну команду не получится
нужно разбирать по командам и затем выполнять по одному
15 сен 08, 15:21    [6186039] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
orawish

версия сервера-то какая?


тестирую на 9, но предполагается потом ставить на 10.
15 сен 08, 15:32    [6186131] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
пробую:

DECLARE

c   INT;
ok  INT;

BEGIN

  FOR crec IN (SELECT * FROM table_name)
    LOOP
      c:= dbms_sql.open_cursor();
      DBMS_SQL.PARSE(c,crec.clob_field,1);
      ok:= dbms_sql.execute(c);
      dbms_sql.close_cursor(c);
    END LOOP;
  COMMIT;
  
  EXCEPTION when others THEN null;

END;
не получается :(


Ой, мама...
15 сен 08, 15:39    [6186183] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
denix1

к слову - если это скрипт, то выполнить его как одну команду не получится
нужно разбирать по командам и затем выполнять по одному


Это ddl создания пакетов/последовательностей и т.д.

Просто пытаюсь сделать нечто похожее на пример <a href="http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=398641" target="_blank">тут</a>
15 сен 08, 15:40    [6186207] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
Серафимный Шестикрыл
Guesssst
пробую:

DECLARE

c   INT;
ok  INT;

BEGIN

  FOR crec IN (SELECT * FROM table_name)
    LOOP
      c:= dbms_sql.open_cursor();
      DBMS_SQL.PARSE(c,crec.clob_field,1);
      ok:= dbms_sql.execute(c);
      dbms_sql.close_cursor(c);
    END LOOP;
  COMMIT;
  
  EXCEPTION when others THEN null;

END;
не получается :(


Ой, мама...


Забей, над обработкой ошибок подумаю потом.
15 сен 08, 15:42    [6186216] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
Забей, над обработкой ошибок подумаю потом.


Ты вообще понял, о чем идет речь ? Сомневаюсь.

SQL> create table t_clob (clob_field clob);

Table created.

SQL> insert into t_clob values('begin null; end;');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t_clob;

CLOB_FIELD
--------------------------------------------------------------------------------
begin null; end;

SQL> DECLARE
  2  
  3  c   INT;
  4  ok  INT;
  5  
  6  BEGIN
  7  
  8    FOR crec IN (SELECT clob_field FROM t_clob)
  9      LOOP
 10        c:= dbms_sql.open_cursor();
 11        DBMS_SQL.PARSE(c,crec.clob_field,1);
 12        ok:= dbms_sql.execute(c);
 13        dbms_sql.close_cursor(c);
 14    END LOOP;
 15  
 16  END;
 17  /

PL/SQL procedure successfully completed.

SQL> update t_clob set clob_field = 'begin polnaya hren; end;';

1 row updated.

SQL> commit;

Commit complete.

SQL> DECLARE
  2  
  3  c   INT;
  4  ok  INT;
  5  
  6  BEGIN
  7  
  8    FOR crec IN (SELECT clob_field FROM t_clob)
  9      LOOP
 10        c:= dbms_sql.open_cursor();
 11        DBMS_SQL.PARSE(c,crec.clob_field,1);
 12        ok:= dbms_sql.execute(c);
 13        dbms_sql.close_cursor(c);
 14    END LOOP;
 15  
 16  END;
 17  /
DECLARE
*
ERROR at line 1:
ORA-06550: line 1, column 15:
PLS-00103: Encountered the symbol "HREN" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "HREN" to continue.
ORA-06512: at "SYS.DBMS_SYS_SQL", line 906
ORA-06512: at "SYS.DBMS_SQL", line 39
ORA-06512: at line 11


SQL> DECLARE
  2  
  3  c   INT;
  4  ok  INT;
  5  
  6  BEGIN
  7  
  8    FOR crec IN (SELECT clob_field FROM t_clob)
  9      LOOP
 10        c:= dbms_sql.open_cursor();
 11        DBMS_SQL.PARSE(c,crec.clob_field,1);
 12        ok:= dbms_sql.execute(c);
 13        dbms_sql.close_cursor(c);
 14    END LOOP;
 15  
 16    EXCEPTION WHEN others THEN null;
 17  
 18  END;
 19  /

PL/SQL procedure successfully completed.
15 сен 08, 15:47    [6186270] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
Серафимный Шестикрыл


Ты вообще понял, о чем идет речь ? Сомневаюсь.



Дак я ж не спорю, что скрипт вываливается, в этом несложно убедиться, закомментировав отлов ошибок. Проблема в том - как сделать так, чтобы не вываливался.
15 сен 08, 15:54    [6186316] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
DenSoft
Member

Откуда: Москва
Сообщений: 275
Guesssst
Серафимный Шестикрыл
Guesssst
пробую:

DECLARE

c   INT;
ok  INT;

BEGIN

  FOR crec IN (SELECT * FROM table_name)
    LOOP
      c:= dbms_sql.open_cursor();
      DBMS_SQL.PARSE(c,crec.clob_field,1);
      ok:= dbms_sql.execute(c);
      dbms_sql.close_cursor(c);
    END LOOP;
  COMMIT;
  
  EXCEPTION when others THEN null;

END;
не получается :(


Ой, мама...


Забей, над обработкой ошибок подумаю потом.

+1
)
15 сен 08, 15:56    [6186338] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
Проблема в том - как сделать так, чтобы не вываливался.


Ох, мама...
Может быть, озвучить, наконец, сообщение об ошибке ?
15 сен 08, 15:58    [6186360] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
SQL> DECLARE
2
3 c INT;
4 ok INT;
5
6 BEGIN
7
8 FOR crec IN (SELECT * FROM table_name)
9 LOOP
10 c:= dbms_sql.open_cursor();
11 dbms_sql.parse(c,crec.clob_field,1);
12 ok:= dbms_sql.execute(c);
13 dbms_sql.close_cursor(c);
14 END LOOP;
15 COMMIT;
16
17 END;
18 /
DECLARE
*
ошибка в строке 1:
ORA-00955: имя уже задействовано для существующего объекта
ORA-06512: на "SYS.DBMS_SYS_SQL", line 906
ORA-06512: на "SYS.DBMS_SQL", line 39
ORA-06512: на line 11
15 сен 08, 16:05    [6186397] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
SQL> DECLARE
2 
3 c INT;
4 ok INT;
5 
6 BEGIN
7 
8 FOR crec IN (SELECT * FROM table_name)
9 LOOP
10 c:= dbms_sql.open_cursor();
11 dbms_sql.parse(c,crec.clob_field,1);
12 ok:= dbms_sql.execute(c);
13 dbms_sql.close_cursor(c);
14 END LOOP;
15 COMMIT;
16 
17 END;
18 /
DECLARE
*
ошибка в строке 1:
ORA-00955: имя уже задействовано для существующего объекта
ORA-06512: на "SYS.DBMS_SYS_SQL", line 906
ORA-06512: на "SYS.DBMS_SQL", line 39
ORA-06512: на line 11
15 сен 08, 16:06    [6186405] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
ORA-00955: имя уже задействовано для существующего объекта


Ну а теперь попробуй сообразить, что означает эта ошибка при попытке выполнения
"скрипта DDL".
15 сен 08, 16:12    [6186448] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
Серафимный Шестикрыл
Guesssst
ORA-00955: имя уже задействовано для существующего объекта


Ну а теперь попробуй сообразить, что означает эта ошибка при попытке выполнения
"скрипта DDL".


если ты имеешь в виду, что такие объекты уже есть в БД, так там везде CREATE OR REPLACE ...
15 сен 08, 16:15    [6186470] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
если ты имеешь в виду, что такие объекты уже есть в БД, так там везде CREATE OR REPLACE ...


А проверить это и вывести конкретную сторку, вызвавшую проблемы (как раз с помощью
обработчика ошибок) что именно мешает -
религия ?
15 сен 08, 16:19    [6186498] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Guesssst
Guest
Серафимный Шестикрыл, если смотреть на проблему глобальней, то в целом идея выполнения правильная и надо копать причину в скриптах создания, или поступить со всем вышеприведенным кодом методом CTRL+A, DELETE, т.к. это в корне неправильно и работать не будет?
15 сен 08, 16:22    [6186523] Ответить | Цитировать    Сообщить модератору

 Re: Выполнение скрипта средствами DBMS_SQL   [new]
Серафимный Шестикрыл
Member

Откуда: С луны свалился
Сообщений: 1540
Guesssst
Серафимный Шестикрыл, если смотреть на проблему глобальней, то в целом идея выполнения правильная и надо копать причину в скриптах создания, или поступить со всем вышеприведенным кодом методом CTRL+A, DELETE, т.к. это в корне неправильно и работать не будет?


Если речь идет о конкретной представленной проблеме - то она ясна и заключается в неизучении тобой
матчасти.

Если говорить о том, что ты пытаешься сделать - не все что может работать должно работать.
Мне лично в упор неясно за каким ####### записывать
скрипты создания объектов (sic !!!!!) в clob-поле таблицы, а потом изгаляться, выполняя
их через execute immediate / dbms_sql. Над нужностью тебе всей этой хрени ты уж сам подумай, тщательно.
15 сен 08, 16:30    [6186572] Ответить | Цитировать    Сообщить модератору

Все форумы / Oracle Ответить
Generated time: 171ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010