Anonymous block completed oracle что это
У меня возникла проблема с привязкой значения элемента страницы к объявленной переменной в анонимном процессе блока PL / SQL.
Проблема заключается в том, что элемент страницы (:P4550_REQUESTOR) не заполняется значением до тех пор, пока не будет выполнено условие. Похоже, что процесс блока PL / SQL привязывает переменную к пустому значению сразу после загрузки страницы, несмотря на то, что процесс не запускается до тех пор, пока не будет нажата определенная кнопка.
У кого-нибудь есть какие-нибудь мысли на этот счет?
Блок работает просто отлично, если я жестко закодирую значение в v_requestor. Если я попытаюсь получить значение P4550_REQUESTOR после загрузки страницы, оно будет пустым. После нажатия на кнопку "Редактировать", P4550_REQUESTOR заполняется.
** **MORE DETAIL** **
P4550_REQUESTOR-это элемент страницы, который находится в области запроса вакансии и отображается только при выполнении условия. В частности, условное условие - это кнопка редактирования, связанная со строкой таблицы, которая создается при загрузке страницы. Нажав кнопку "Редактировать" вызывает регионе подробности, чтобы отобразить, и связанные элементы страницы должны быть заполнены.
Значения элементов страницы в области запроса вакансий заполняются с помощью автоматической выборки строк, которая срабатывает после заголовка.
P4550_REQUESTOR имеет исходный тип столбца БД.
Процесс, который запускает приведенный выше код, настраивается на запуск при отправке-после вычислений и проверок
Если я регистрирую значение P4550_REQUESTOR при загрузке страницы, оно показывает null. Если я регистрирую значение после нажатия кнопки редактирования, я получаю ожидаемое строковое значение.
2 ответа
Вот: declare v_str1 varchar2(80); begin v_str1 := 'test'; print :v_str1; end Когда я запускаю его с помощью SQLDeveloper только на листе sql, я получаю следующее: Bind Variable v_str1 is NOT DECLARED anonymous block completed
Я пытаюсь поймать исключение в моем анонимном блоке PL/SQL DECLARE . BEGIN FOR herstell_row IN ( . ) LOOP . DECLARE table_does_not_exists exception; pragma exception_init( table_does_not_exists, -942 ); BEGIN INSERT INTO SMART_MONITORING_MACHINE_NAV_B ( MACHINE, NAVIGATION_LEVEL_ID ) SELECT.
(На самом деле об этом полезно подумать в других дисциплинах программирования и средах.)
Проблема Определена
Проблема в том, что элемент страницы (:P4550_REQUESTOR) не заполняется значением до тех пор, пока не будет выполнено условие. Похоже, что процесс блока PL/SQL привязывает переменную к пустому значению сразу после загрузки страницы, несмотря на то, что процесс не запускается до тех пор, пока не будет нажата определенная кнопка.
Постановка проблемы, сформулированная в терминологии Apex и представленная в форме фактического вопроса :
- На странице есть REPORT REGION , который содержит результат прямой ссылки на данные table/view. Этот отчет управляется процессом Apex под названием "Automated Fetch" и автоматически инициируется загрузкой заголовков страниц.
- На странице есть FORM ITEM , которая заполняется условно выбором BUTTON ITEM , сделанным пользователем. BUTTON ITEM является частью результатов отчета.
- Существует несколько элементов кнопок. Каждый из них связан со значением для каждой записи отчета.
- Если пользователь не выбирает BUTTON ITEM из REPORT REGION , FORM ITEM остается неназначенным и содержит значение "null".
Существует определенный блок кода PL/SQL, который должен выполняться при нажатии элемента SUBMIT BUTTON (также на той же странице). Почему мой блок кода (определенный процесс страницы) запускается со значением null, когда он запускается без предварительного нажатия BUTTON ITEM из REPORT REGION ?
Разработка программ на основе событий для процедурных программистов
Ответ не очевиден, если вы мыслите в рамках парадигмы процедурного языка. Не углубляясь в лекцию на эту тему, вот визуальный макет проблемного пространства OP, который я подготовил, чтобы проиллюстрировать, как проблему можно сделать более очевидной:
Это мой дизайн страницы Apex в реализации. Он достаточно универсален, чтобы использовать его в качестве шаблона для других проектов Apex. На этой диаграмме нет стрелок потока, потому что это система с отслеживанием состояния. Одно вызывает другое, и так далее. но не всегда и не все одновременно.
Варианты использования для дизайна страниц пользовательского интерфейса Apex
Попробуйте пройтись по нескольким примерам использования, чтобы понять, как элементы, разбитые на диаграмме, работают вместе. Каждый пользователь может использовать любое количество комбинаций кликов и взаимодействий, но существует общность:
- Все они вводят одни и те же инициализированные условия при загрузке страницы.
- Все они покидают страницу, перейдя в другое место или через событие SUBMIT button.
Разница между каждым случаем должна иллюстрировать , почему зависимое значение ( ThisItem , или, более конкретно, элемент страницы P4550_REQUESTOR ) равно null в одном случае использования по сравнению с другой.
Таблица, которую я использовал, называется STAR_EMPS. Он похож на таблицу EMP, но имеет только три столбца: ename, deptno и зарплата. Хотя это не очень важно, это набор данных, который я использовал для заполнения STAR_EMPS:
Я использовал простую таблицу из двух столбцов с именем STAR_EMPS_LOG для записи выходных данных успешно выполненного вызова процедуры. Вы могли бы сделать то же самое только с одним столбцом, но мне нужен последовательный идентификатор для отслеживания порядка записи каждого события - для запуска нескольких тестовых случаев. Эта процедура является одним из нескольких определенных процессов, хранящихся на этой странице:
Вот как был настроен макет страницы:
- Как и в вашем примере, я сделал область с ее поддерживающими элементами. Отчет SQL представляет собой запрос, направленный в таблицу исходных данных.
- был переименован в .
- определяется запросом SQL, существует также макет столбца для использования в качестве держателя места для размещения кнопок "edit".
- Технические характеристики кнопок подробно описаны в этом:
ДВА процесса страницы: PROCESS и BRANCH должны быть связаны с одинаковыми настройками, ссылающимися на элемент запуска BUTTON.
Тестовые случаи пользовательского интерфейса
Для начала просмотрите три предложенных сценария. Убедитесь, что система правильно интерпретирует запросы. Вот как выглядит макет страницы:
Два процесса в системе имеют определение, которое не упоминалось в предыдущих обсуждениях, может решить нашу первоначальную проблему:
Некоторые Прощальные Мысли
Хорошо, что это оказывается тривиальным случаем, когда он разбит. Метод построения диаграмм, описанный здесь, должен масштабироваться для других приложений Apex различной сложности. Существует значительная польза в том, чтобы отойти от кода, замкнуться на терминологии и попытаться описать системы и процессы без фактического кода. Пожалуйста, не забудьте поделиться любыми историями, если этот подход поможет вам решить ваши собственные проблемы с дизайном Oracle Apex.
При запуске следующего кода я получаю ORA-01001: недопустимый курсор, не уверенный в том, что происходит, я преобразовал его в процедуру, и это начало происходить; CREATE OR REPLACE PROCEDURE p_student_from_class_list (p_stu_id IN NUMBER) IS --Declaring a variable -- v_date date; --Creating a.
DECLARE data_line VARCHAR2(200); -- Data line read from input file data_file UTL_FILE.FILE_TYPE; -- Data file handle my_dir VARCHAR2(250); -- Directory containing the data file my_filename VARCHAR2(50); BEGIN my_dir := 'c:\temp'; my_filename := 'Lab4AData.dat'; my_file := UTL_FILE.FOPEN(my_dir.
Оригинальный, многословный ответ, по-видимому, слишком усложняет проблему. Руководство по концепциям состояний сеанса описывает это поведение более кратко.
Если P4550_REQUESTOR является обычным элементом, созданным с помощью мастера, использование :P4550_REQUESTOR вернет значение в процессах, запущенных после отправки, поскольку процессы отправки перемещают значения в браузере в состояние сеанса.
Если P4550_REQUESTOR отображается условно, то он всегда будет null, и я не уверен, что произойдет, если вы попытаетесь его установить - вероятно, зависит от того, как это сделать.
Аналогично, если бы вы использовали &P4550_REQUESTOR. для параметризации процесса, вы столкнулись бы с первоначально описанным поведением (и сделали код менее безопасным)
Похожие вопросы:
Это мой первый пост с StackOverflow. Я не разработчик, но надеюсь сбить пыль с некоторых заметок класса 10-year-old PL/SQL и, возможно, немного нарастить свой атрофированный набор навыков PL/SQL. Я.
Я пытаюсь запустить программу в Редакторе Oracle express edition. Когда я выполняю программу, я получаю ошибку ORA-06502: PL/SQL: numeric or value error: character string buffer too small Кто-нибудь.
Я новичок в PL/SQL, и пытаюсь выполнять команды, которые выучил на курсе. VARIABLE area NUMBER DECLARE radius NUMBER(2) := &s_radius; pi CONSTANT NUMBER := 3.14; BEGIN :area := pi * radius *.
Вот: declare v_str1 varchar2(80); begin v_str1 := 'test'; print :v_str1; end Когда я запускаю его с помощью SQLDeveloper только на листе sql, я получаю следующее: Bind Variable v_str1 is NOT.
Я пытаюсь поймать исключение в моем анонимном блоке PL/SQL DECLARE . BEGIN FOR herstell_row IN ( . ) LOOP . DECLARE table_does_not_exists exception; pragma exception_init(.
При запуске следующего кода я получаю ORA-01001: недопустимый курсор, не уверенный в том, что происходит, я преобразовал его в процедуру, и это начало происходить; CREATE OR REPLACE PROCEDURE.
DECLARE data_line VARCHAR2(200); -- Data line read from input file data_file UTL_FILE.FILE_TYPE; -- Data file handle my_dir VARCHAR2(250); -- Directory containing the data file my_filename.
У меня есть анонимный блок PL/SQL с переменными привязки, который я хочу запустить через JDBC. Пример блока PL / SQL : variable v_value number declare v_return varchar2(30); begin :v_value:=300;.
Я пытаюсь отобразить несколько столбцов данных из базы данных в одном столбце в приложении calender oracle application express мой запрос SQL выглядит следующим образом SELECT EXPDATE, 'Exp: ' ||.
Я написал стандартный запрос SQL Select, чтобы выбрать код zip, в котором было наибольшее количество продаж. Теперь мне нужно преобразовать его в анонимный блок PL / SQL, однако я все еще очень.
PL/SQL - это язык программирования , объединяющий в себе возможности процедурных языков и SQL . Иначе говоря, он представляет собой процедурное расширение языка SQL , отсюда и название - Procedural Language SQL . PL/SQL является родным языком Oracle , так как он интегрирован с сервером базы данных и его код выполняется непосредственно сервером, поэтому программы, написанные на PL/SQL , работают быстро и эффективно. Возможность использовать SQL в блоках PL/SQL - одна из важнейших его характеристик. PL/SQL применяется для доступа к базам данных Oracle из различных сред разработки, одной из которой является Oracle Forms . В этой главе мы ознакомимся с декларативной средой PL/SQL и ее возможностями, научимся создавать блоки и переменные PL/SQL .
Блоки PL/SQL
PL/SQL, как и любой другой процедурный язык программирования, состоит из логически связанных элементов, объединенных в программные единицы, которые называются блоками. Каждый модуль PL/SQL состоит как минимум из одного блока. Блоки PL/SQL могут содержать любое количество подблоков, то есть иметь различный уровень вложенности . Блок как структурная единица логически связанных элементов определяет область их действия, делает код читабельным и простым для понимания. В PL/SQL различают два типа блока:
Анонимные блоки
Анонимные блоки - это блоки, которые не имеют имени. Анонимные блоки не могут быть вызваны другими блоками, так как у них нет имени, на которое можно ссылаться.
Триггеры Oracle Forms и Reports, которые также называются клиентскими триггерами, являются анонимными блоками PL/SQL. Триггеры базы данных и сценарии в SQL*Plus, заключенные в операторские скобки BEGIN и END , также являются анонимными блоками. Ниже приведена структура анонимного блока:
- DECLARE - раздел объявлений. В этом разделе идентифицируются переменные, курсоры и вложенные блоки , на которые имеются ссылки в исполняемом блоке и блоке исключений. Этот раздел необязательный.
- BEGIN - END - исполняемый раздел. В этом разделе находятся операторы, которые выполняются ядром PL/SQL во время работы вашего приложения. Этот раздел является обязательным.
- EXCEPTION - раздел исключений. В этом разделе обрабатываются различные исключения, предупреждения и ошибки. Этот раздел необязателен.
Из всех ключевых слов в представленной структуре для анонимного блока ключевые слова BEGIN и END являются обязательными, и между ними должен быть как минимум один исполняемый оператор:
Несмотря на то что ключевые слова BEGIN и END обязательны, в Oracle Forms их можно опустить. Так, к примеру, простейший анонимный блок имеет вид:
В Oracle Forms этот анонимный блок можно записать и без ключевых слов BEGIN и END :
Я пользователь SQL Server, и у меня есть небольшой проект по использованию Oracle, поэтому я пытаюсь понять некоторые особенности Oracle и считаю, что мне нужна помощь, чтобы лучше понять следующую ситуацию:
Я хочу проверить, существует ли временная таблица перед ее созданием, поэтому у меня был этот код:
Он работает нормально, поэтому после того, как я выполнил его один раз, я добавил оператор else в свой IF:
Выполнил его снова, и в мою тестовую таблицу была добавлена строка.
Хорошо, мой код был готов и работал, поэтому я отбросил временную таблицу и снова попытался запустить весь оператор, однако когда я это сделаю, я получаю следующую ошибку:
Затем я изменил свой оператор else на это, и теперь он снова работает:
У меня вопрос: почему, работая индивидуально, я могу просто использовать вставку вместо EXECUTE IMMEDIATE, а также почему мой оператор SELECT сразу после BEGIN по-прежнему работает, когда все остальное, похоже, требует EXECUTE IMMEDIATE для правильной работы?
3 ответа
Весь блок PL / SQL анализируется во время компиляции, но текст внутри динамического оператора не оценивается до времени выполнения. (Это примерно то же самое для анонимного блока, но все же отдельные шаги).
Ваш if / else также не оценивается до времени выполнения. Компилятор не знает, что таблица всегда будет существовать к тому времени, когда вы сделаете свою вставку, он может только проверить, существует ли она, в момент, когда он анализирует весь блок.
Если таблица уже существует, все в порядке; компилятор видит это, блок выполняется, ваш select получает 1, и вы переходите в else, чтобы выполнить вставку. Но если он не существует, то синтаксический анализ вставки завершается ошибкой с ORA-00942 во время компиляции и ничего в блоке не выполняется.
Поскольку создание таблицы является динамическим, все ссылки на таблицу также должны быть динамическими - ваша вставка, как вы видели, но также, если вы затем запросите ее. По сути, это затрудняет чтение вашего кода и может скрыть синтаксические ошибки - поскольку динамический код не анализируется до времени выполнения, и возможно, у вас может быть ошибка в динамическом операторе в ветке, которая не попадает в много времени.
Глобальные временные таблицы не должны создаваться на- во всяком случае, муха. Это постоянные объекты с временными данными, специфичными для каждого сеанса, и их не следует создавать / удалять как часть кода вашего приложения. (В общем, ваше приложение не должно вносить никаких изменений в схему; они должны ограничиваться изменениями обновления / обслуживания и контролироваться, чтобы избежать ошибок, потери данных и неожиданных побочных эффектов; GTT ничем не отличаются).
В отличие от временных таблиц в некоторых других реляционных базах данных, когда вы создаете временную таблицу в базе данных Oracle, вы создаете определение статической таблицы. Временная таблица - это постоянный объект, описанный в словаре данных, но он кажется пустым, пока ваш сеанс не вставит данные в таблицу. Вы создаете временную таблицу для самой базы данных, а не для каждой хранимой процедуры PL / SQL.
Создайте GTT один раз и сделайте весь свой код PL / SQL статическим. Если вам нужно что-то более похожее на локальные временные таблицы SQL Server, загляните в Коллекции PL / SQL.
PL / SQL: ORA-00942: таблица или представление не существует
Это ошибка времени компиляции, то есть когда статический SQL анализируется еще до создания GTT.
Давайте посмотрим на разницу между временем компиляции и временем выполнения ошибки:
Статический SQL:
Динамический SQL:
В 1-м блоке PL / SQL была семантическая проверка во время компиляции, и вы могли увидеть PL/SQL: ORA-00942: table or view does not exist . Во втором блоке PL / SQL вы не видите ошибки PL / SQL.
Во время компиляции неизвестно, существует ли таблица, поскольку она создается только во время выполнения.
В вашем случае, чтобы избежать такого поведения, вам необходимо сделать INSERT также динамическим и использовать EXECUTE IMMEDIATE . Таким образом вы можете избежать ошибки времени компиляции и получить таблицу, созданную динамически , а также выполнить вставку в нее динамически во время выполнения .
При этом основная проблема заключается в том, что вы пытаетесь создать GTT на лету, что не является хорошей идеей. Вы должны создать его один раз и использовать по своему усмотрению.
Картинка для придания нужного настроения
Доброго времени суток!
В интернете вообще и на Хабре в частности немало публикаций о ремонте битых блоков. Например, здесь о выдергивании неповрежденных данных, а тут история победы над битым LOB сегментом.
Приводить легионы ссылок на инет с подобными статьями не буду. Но есть в большинстве этих статей общая черта. Когда данные спасены (или уничтожены, как получится), предлагается победить поврежденный free block захватом всего свободного места в tablespace. И почему то это предложение описательно.
Так добавим конкретики!
Напишем скрипт, который скушает (почти как рыбки на картинке), а потом освободит всё свободное место Oracle DB.
Подготовительная часть.
Посмотрели на наши битые блоки:
Убедились, что они есть.
Получили список команд. Запустили их. Потом таким же образом сформируем список команд, которые вернут autoextend.
Но здесь надо быть внимательным. Может датафайлы располагаются на разных дисках? И у них разные настройки расширения? Здесь стоит быть аккуратнее.
И только теперь, когда подготовительные шаги завершены.
Основная часть
Для работы с Oracle sql я использую SQL Developer. В нем есть все что нужно, и не наблюдается того, что не нужно.
Чего мы хотим?
Переформатировать все свободные блоки tablespace. Для этого будем создавать таблицы, и добавлять им экстенты пока место не закончится.
Вот такой скриптик PL\SQL нормально делает то, что нам нужно.
Опять же, заданные константы TABLESPACE_FOR_FULL и USER_SCHEMA как бы намекают на специфику моих баз.
Комментировать алгоритм работы мне видится излишним.
Скорость работы такой методы меня устраивает.
Чуть менее 100Gb за 3 минуты. Ясно, что оборудование играет очень большую роль, но там где оборудование слабое и размеров особых не будет. Тем более что Tb свободного места достаточно странная ситуация.
Завершающие шаги
Теперь вернув autoextend можно заняться проверкой базы.
Эпилог
А есть ли способ короче и быстрее? Должен быть. Обязательно. Я начал писать на PL\SQL три недели назад. И в первую очередь я специалист SAP BASIS, а не DBA.
Мне вполне хватает и этого. Но было бы интересно посмотреть на решение этой задачи от профи.
Как избавиться от ORA-01410, вычленив неповрежденные данные
и запускаем проблемный запрос
Находим в трейсе запись вроде этой:
По полученному значению получаем Block_number и Relative_fno:
Дополнительно находим data_object_id проблемного объекта:
По полученным значениям формируем ROWID:
Хотелось бы отметить, что подобных проблем, скорее всего, удалось бы избежать, имея выставленные параметры БД db_block_checking/db_block_checksum = 'Full' или db_ultra_safe = 'data_and_index', что несколько нагрузило бы процессор (
5%, хотя это обсуждаемо), но дало бы дополнительную надежность.
Corrupt block relative dba: 0x0724c078 (file 28, block 2408568)
Fractured block found during backing up datafile
Reread of blocknum=2408568, file=E:\ORACLE\ORADATA\XXX\XXX_BLOB16.DBF. found same corrupt data
Ситуация осложнялось тем, что бэкапов под рукой не было.
Далее последуют инструкции по выходу из данной ситуации.
RMAN упирался в данный блок и ни в какую не хотел бэкапить базу.
Начался детальный разбор полетов, и выяснение к чему относится данный блок:
Далее было выяснено к какой таблице относился данный LOB сегмент:
- 1. Поочередно перебрать записи из таблицы.
- 2. При попадании в запись, относящейся к битому блоку выдернуть ее ROWID.
Скрипт успешно вернул две записи:
При помощи нехитрого запроса были получены PRIMARY KEY данных записей и записи были успешно потерты.
Не очень хотелось создавать таблицу и забивать ее под завязку всего табличного пространства, поэтому было принято решение использовать ALTER TABLE XXX SHRINK SPACE.
Затем запускаем проверку проблемного файла RMAN'ом:
После данной операции представление V$DATABASE_BLOCK_CORRUPTION оказалось кристально чистым.
Далее база была успешно зарезервирована RMAN'ом а недостающие записи были выдернуты из реплики.
UPDATE
суббота, 4 октября 2014 г.
Перенесли базу ORACLE, содержащую в том числе
OWB repository, на другой сервер путем полного экспорта-импорта.
(Сказано, что OWB встроен в ORACLE 11, поэтому на сервер больше ничего , кроме ORACLE,
не ставили )
При попытке законнетится владельцем workspace в Design Center возникает ошибка
API502-Cannot connect to the specified account.
Verify connection information.
Хотя законнектится этим пользователем к базе посредством sql/plus
удается.
Удается также зайти через Repository Assistant, который вызывается по кнопке
Workspace Management окна Design Center Logon и посмотреть языки и пользователей.
ORACLE 11.1 Enterprise Edition, OWB Repository 11.1.0.1, OWB Client 11.1.0.6
Что нужно сделать? Помогите, пожалуйста.
> Перенесли базу ORACLE, содержащую в том числе
> OWB repository, на другой сервер путем полного экспорта-импорта.
Уверен, что полного экспорта-импорта? (это может оказаться ключевым моментом)
На Металинке есть нота под такую операцию (называется как-то How to update OWB after database cloning)
Или порыщи на Oracle-овом OWB-ешном форуме (надо как минимум выполнить update табличек OWBRTPS, WB_RT_SERVICE_NODES - для обновления пути к Oracle home и )
Да вроде как жил там же - все в одном флаконе, на одном сервере.
По ноте дошли до
* Update the Location Credentials stored in the Control Center
1. Start the OWB Browser Listener.
1. For Warehouse Builder 10.2:
For Windows : Start -> Programs -> Oracle OWB 10.2 -> Warehouse Builder -> Administration -> Start OWB Browser Listener
For Linux : OWB_home/owb/bin/unix/startOwbbInst.sh
2. For Warehouse Builder 11.1:
See the steps in Note 469422.1 : How To Start The Warehouse Builder 11g Repository Browser Listener
2. Start the Repository Browser.
For Windows : Start -> Programs -> Oracle -> Warehouse Builder -> Repository Browser
For Linux : OWB_home/owb/bin/unix/openRAB.sh
Repository Browser can be started from the client for unsupported platform.
3. Connect to Warehouse Builder Browser as the Control Center Owner.
И тут - ошибка
Not a valid Warehouse Builder Control Center
были инвалиды в OWF_MGR
осталось два, идут ссылки на несущуствующий
WF_ALL_JOBS. Синоним есть, объекта самого нет.
В исходной базе этот объект есть под SYS - это view.
Причем все остальные объекты WF_ в старой базе - под
OWF_MGR (кроме PUBLIC SYNONYM)
Почему это так?
Ну еще при неполном экспорте проекта (например на уровне модуля) OWB будет включать в список зависимые объекты из других модулей.
Типичный пример - в мэппинге используется таблица другого модуля, без опции "export dependencies" таблицы другого модуля не будут экспортированы
подскажите, плз, а как очистить хранилище?
Там один workspace, пытаюсь удалить его с клиента:
вызываю Design Center, там с его окна логина кнопкой Workspace Management
вызываю Repository Assistent, далее он спрашивает инфу для коннекта,
потом выбрать , что делать - Create/Delete Workspace, Manage Users, Add languages,
выбираю операции над workspace, далее - Drop, далее - Workspace Owner (OWB), Workspace name
(он там только один - OWB.OWB) и кнопка Finish.
В итоге появляется ошибка
ORA-20003: WBSecurityHelper found the SQL error:ORA-01927: cannot REVOKE privileges you did not grant
> Перенесли базу ORACLE, содержащую в том числе
> OWB repository, на другой сервер путем полного экспорта-импорта.
Уверен, что полного экспорта-импорта? (это может оказаться ключевым моментом)
На Металинке есть нота под такую операцию (называется как-то How to update OWB after database cloning)
Или порыщи на Oracle-овом OWB-ешном форуме (надо как минимум выполнить update табличек OWBRTPS, WB_RT_SERVICE_NODES - для обновления пути к Oracle home и )
Читайте также: