Unwrap PL/SQL (2)

Thank you, good post.

emartife's Oracle Blog

En el post anterior colgué un ejecutable (Win 64 bits) que permite hacer unwrap del código PL/SQL. El hecho de que sea un ejecutable Windows puede ser incómodo a veces, así que si tuvieramos un código PL/SQL para hacerlo sería mucho más facil. Aquí adjunto el código necesario para hacerlo directamente desde la base de datos. Esta función nos devolverá un CLOB con el código original para que hagamos lo que queramos con él.

Clase de utilidad java para comprimir y descomprimir:

Package PL/SQL:

Espero que os sirva de ayuda para conocer más a fondo qué es lo que hace Oracle en sus packages…

View original post

Реклама

PL/SQL пакет для генерации PDF

Oracle mechanics

Пакет от Anton Scheffer для создания PDF версии 1.3, с поддержкой TruType Fonts и вставкой картинок JPG и PNG

Код открытый, работает как описано, позиционируется как замена Middleware/Reports. Судя по публикации на сайте фирмы, с лицензионной чистотой должно быть всё норм

Входит в библиотеку PL/SQL утилит Alexandria для разных текстовых форматов и протоколов

View original post

ASH-трассировка PL/SQL

Oracle mechanics

К примеру, в AWR-отчёте бд ERP-системы на первом месте видно продолжающееся/неоконченное выполнение процедуры, лидирующей по использованному DB Time с большим отрывом от ближайшего преследователя — 72% против 18%:

Для быстрой оценки такого рода проблем написал скрипт ash_plsqlmon_hist.sql, который по истории ASH вначале показывает суммарный вклад запросов и PL/SQL блоков по частоте попадания в историю ASH (ASH_ROWS), кол-во зафиксированных неповторяющихся выполнений (EXECS), затем — мин/мах время наблюдения(с соответствующими названиями столбцов) и общий профиль ожиданий (WAIT_PROFILE) примерно так:

View original post ещё 277 слов

ERP Галактика — не пускает пользователей (ORA-20001: RECORD LOCKED)

  • В моем случае ERP Галактика на базе Oracle 11g

Произошел разрыв по сети между сервером ERP Галактика и сервером СУБД Oracle. После сбоя новые подключения от пользователей (кроме администраторов) к ERP Галактика перестали устанавливаться. В логе моей базы Oracle alert_[db_name].log стали появляться сообщения подобного вида:

Errors in file x:\oracle\11.2.0\diag\rdbms\gal\trace\gal_ora_3688.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: RECORD LOCKED AAALsvAAFAAAACHAAB
ORA-06512: at «GAL.ALX$ACTIVEUSERS», line 1
ORA-04088: error during execution of trigger ‘GAL.ALX$ACTIVEUSERS’
ORA-06512: at «GAL.GAL_SYSFUNC_PKG», line 1
ORA-06512: at line 1

где GAL — это схема базы Oracle, где хранятся все данные ERP Галактика.
Триггер GAL.ALX$ACTIVEUSERS установлен на таблицу GAL.X$ACTIVEUSERS, через которую отслеживаются и устанавливаются новые подключения пользователей ERP Галактики. Следовательно строка с ROWID AAALsvAAFAAAACHAAB заблокирована в таблице GAL.X$ACTIVEUSERS. Чтобы найти, кто из подключенных пользователей заблокировал эту строку, я написал и выполнил следующий запрос:

SELECT GAL.INTTOHEX (ss.SID, 4) || GAL.INTTOHEX (ss.SERIAL#, 4)
          L_SESS,
       ss.SID,
       ss.SERIAL#,
       ss.USERNAME,
       loc.ADDRESS
  FROM V$SESSION ss, GAL.SYS#LOCKS loc
 WHERE     STATUS <> 'KILLED'
       AND loc.dbsessionid =
                 GAL.INTTOHEX(ss.SID, 4)
              || GAL.INTTOHEX(ss.SERIAL#, 4)
       AND loc.address = 'AAALsvAAFAAAACHAAB';

Определив Sid и Serial# блокирующей сессии по результатам запроса, я смог убить эту сессию, чтобы строка AAALsvAAFAAAACHAAB стала достуной.

ALTER SYSTEM KILL SESSION 'sid, Serial#' IMMEDIATE;

После того, как сессия была убита, новые пользовательские сессии к ERP Галактика стали устанавливаться.