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

Откуда: Москва
Сообщений: 826
Коллеги, подскажите, что я делаю не так. Я еще не до конца освоил PL/SQL и какие-то вещи посте T-SQL мне кажутся странными. Например, я не очень понимаю, что я делаю не так вот здесь:

declare
  v_table_name   varchar2(30) := 'MYTABLE';
begin
    for item in (select column_name
                 from all_tab_columns
                 where owner       = 'MYSCHEMA'
                   and table_name = v_table_name
                   and column_name IN ('MYFIELD1', 'MYFIELD2', 'MYFIELD3', 'MYFIELD4',
                                       'MYFIELD5', 'MYFIELD6', 'MYFIELD7', 
                                       'MYFIELD8', 'MYFIELD9', 'MYFIELD10')
                ) 
   loop
     execute immediate 'ALTER TABLE OWNER_DWH.'||v_table_name||' DROP COLUMN '||item.column_name;
   end loop;

exception
  when no_data_found
    then null;
end;
/
27 июн 11, 09:35    [10879505]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
razliv
Member

Откуда:
Сообщений: 1199
avec

Навскидку

Странно, что ищете owner таблицы MYSCHEMA, а alter на ownera OWNER_DWH.

А так вроде все правильнО :)
27 июн 11, 09:41    [10879522]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
avec
Member

Откуда: Москва
Сообщений: 826
razliv,

одинаковые схемы, сорри за опечатку
27 июн 11, 09:43    [10879525]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
razliv
Member

Откуда:
Сообщений: 1199
avec

Ага, если одинаковые схемы, то в чем ошибка ?
27 июн 11, 09:46    [10879534]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
avec
Member

Откуда: Москва
Сообщений: 826
razliv,

такое ощущение что циклится. Хотя в таблице много данных, возможно это нормальная скорость (я окончания не дождался).
27 июн 11, 09:53    [10879553]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
razliv
Member

Откуда:
Сообщений: 1199
avec

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

автор
1. Get the object ID of the locked table:

SELECT object_id FROM dba_objects WHERE object_name='YOUR TABLE NAME';

2. Get the SID values for this ID:

SELECT sid FROM v$lock WHERE id1=OBJECT ID FROM STEP1

3. Get the session values for these SIDs:

SELECT sid, serial# from v$session where sid in (COMMA SEPARATED LIST OF SIDs FROM STEP2.)

4. Kill the sessions causing the lock:

ALTER SYSTEM KILL SESSION (SID,SERIAL#) pair values from step 3
e.g. ALTER SYSTEM KILL SESSION '231,23454'


и еще разок запустите :)
27 июн 11, 10:03    [10879598]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
Кореец
Member

Откуда:
Сообщений: 361
exception
  when no_data_found

вот этого в данном коде никогда не произойдет.
Или за циклом еще код подразумевается?
27 июн 11, 13:40    [10880863]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
razliv
avec

Скорее всего, вы не дождались выполнения и прервали программу, в результате таблица осталась лоцкед. Попробуйте закомитте изменения и проверьте есть ли блокировка, если есть убейте зависшую сессию и еще разок запустите :)


Я тоже хочу научиться коммитить "ALTER TABLE", но у меня не получается
27 июн 11, 14:04    [10881017]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
ALocky
Member

Откуда: Понаехал из Подмосковья
Сообщений: 747
SysOper
razliv
avec

Скорее всего, вы не дождались выполнения и прервали программу, в результате таблица осталась лоцкед. Попробуйте закомитте изменения и проверьте есть ли блокировка, если есть убейте зависшую сессию и еще разок запустите :)


Я тоже хочу научиться коммитить "ALTER TABLE", но у меня не получается

Я научу. После "ALTER TABLE" напиши commit. Для верности - несколько раз. Чем больше тем лучше.
27 июн 11, 14:18    [10881125]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
SysOper
Я тоже хочу научиться коммитить "ALTER TABLE", но у меня не получается

В Oracle DDL (alter,create,drop и т.п.) вызывает неявный commit.
27 июн 11, 14:34    [10881315]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
SysOper
razliv
avec

Скорее всего, вы не дождались выполнения и прервали программу, в результате таблица осталась лоцкед. Попробуйте закомитте изменения и проверьте есть ли блокировка, если есть убейте зависшую сессию и еще разок запустите :)


Я тоже хочу научиться коммитить "ALTER TABLE", но у меня не получается


COMMIT - это ерунда. Вот чтобы ROLLBACK заработал...
27 июн 11, 14:43    [10881384]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
а вроде обещали коммит-роллбэк после ддл в новых версиях?
27 июн 11, 14:46    [10881404]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Сергей Арсеньев,

черт смайлика не заметил
27 июн 11, 14:48    [10881424]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
Сергей Арсеньев
В Oracle DDL (alter,create,drop и т.п.) вызывает неявный commit.


Безусловно, если быть точным, то неявный коммит проходить перед выполнением DDL и commit или rollback сразу и обязательно после. Как это отдать на откуп пользователю, я не знаю. :)
27 июн 11, 15:06    [10881618]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
SysOper
Безусловно, если быть точным, то неявный коммит проходить перед выполнением DDL и commit или rollback сразу и обязательно после. Как это отдать на откуп пользователю, я не знаю. :)
на откуп пользователю отдается только принятие решения о нажатии кнопки на экране
:)
27 июн 11, 15:08    [10881642]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
razliv
Member

Откуда:
Сообщений: 1199
Вы что тут на меня напали ? Это понятно, что ддл вызывает неявный коммит. Но это в том случае когда он отработал полностью.

Только вот в ситуации, когда программмист не дожидаеться выполнения ддл и вырубает навигатор - бывает-случаеться остаються локи на таблицах.
Граждане, которые интересуються могут сами проверить, поэкспериментировать. И бывает-случаеться коммит спасает релизит все локи.
А бывает и нет.
27 июн 11, 15:33    [10881904]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
razliv
Вы что тут на меня напали ? Это понятно, что ддл вызывает неявный коммит. Но это в том случае когда он отработал полностью.

Только вот в ситуации, когда программмист не дожидаеться выполнения ддл и вырубает навигатор - бывает-случаеться остаються локи на таблицах.
Граждане, которые интересуються могут сами проверить, поэкспериментировать. И бывает-случаеться коммит спасает релизит все локи.
А бывает и нет.

А как дать коммит в сессии, которой нет ("вырубает навигатор")? Или достаточно коммита в любой другой сессии?
27 июн 11, 15:43    [10881992]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
SysOper
А как дать коммит в сессии, которой нет ("вырубает навигатор")? Или достаточно коммита в любой другой сессии?

Практически никак. razliv, наверное, имел ввиду ситуацию, когда DDL подвисает на блокировке всей таблицы, потому что есть транзакции заблокировавшие ее раньше. При условии отсутствия соответствующего тайаута. Понятно, что в этом случае следует найти виновных. И наказать кого попало.
Есть еще вариант, что сделан CTAS и он закончится с окончанием возможностей autoextend в tablespace. Но этот случай и так быстро даст о себе знать.

Хотя я не гуру и о блокировках переходящих из транзакции в транзакцию мало что понимаю.
27 июн 11, 15:54    [10882077]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
avec,

Резюмируя все вышесказанное и в попытках подтянуть предположения некоторых товарищей, я могу предположить:

- выполнение скрипта может быть долгим, если данная таблица залочена dml из соседней не закоммиченой сессии + (у Вас 11 oracle + установлен большое значение параметера ddl_lock_timeout) (иначе ORA-00054);
- таблица большая и чтение всех её блоков занимает много времени(наиболее вероятно).

Понять, что ожидает (выполняет) сессия можно из ряда системных views, например gv$session/

to razliv

LOck таблицы, который Вы имели честь наблюдать после отмены операции (ORA-01013) - скорее всего это rollback, который тоже требует времени.
27 июн 11, 16:26    [10882311]     Ответить | Цитировать Сообщить модератору
 Re: цикл в PL/SQL  [new]
razliv
Member

Откуда:
Сообщений: 1199
SysOper

Оно конечно понятно в той сессии, что повисла commit не получиться. И по уму надо искать locki, сессию подовисшую и вырубать ее.
Согласен, ни к чему такой коммит не приведет :) Но я лично для очистки совести это делаю :)

автор
LOck таблицы, который Вы имели честь наблюдать после отмены операции (ORA-01013) - скорее всего это rollback, который тоже требует времени.


Кстати да, я склоняюсь к этому мнению, но вот фокус в чем - подвисает очень и очень надолго. А работать надо, не будешь же пол дня ждать - поэтому проще убить сессию :)
27 июн 11, 17:22    [10882694]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить