Ответ 1
Существует недокументированный пакет DUMPDIANA, предназначенный для сброса Дианы в удобочитаемом формате.
Файл $ORACLE_HOME\rdbms\admin\dumpdian.sql говорит: "Документация доступна в /vobs/plsql/notes/dumpdiana.txt". Я не могу найти этот файл, и без него мы можем только догадываться о значении некоторых параметров. Основное использование DUMPDIANA заключается в следующем:
SQL> show user
USER is "SYS"
SQL> @?\rdbms\admin\dumpdian
Library created.
Package created.
Package body created.
create or replace procedure hello_world
2 as
3 begin
4 dbms_output.put_line('hello world');
5* end;
Procedure created.
SQL> set serveroutput on
SQL> execute sys.DUMPDIANA.dump('HELLO_WORLD');
user: SYS
PL/SQL procedure successfully completed.
В этот момент в папке должно быть создано пару файлов
$ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace
. Кажется, что эти два файла соответствуют именованию:
orcl12c_ora_{PROCESS}.trc
orcl12c_ora_{PROCESS.trm
Если файл trc является доступной для пользователя версией соответствующего trm файла, а {PROCESS} является идентификатором процесса операционной системы. Чтобы найти это, используйте следующий запрос из того же сеанса:
select p.spid from v$session s,v$process p
where s.paddr = p.addr
and s.sid = sys_context('USERENV','SID');
Например, если идентификатор сеанса был 8861, то из оболочки bash вы можете просмотреть результаты, используя:
vim $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace/orcl12c_ora_8861.trc
Результат интересен... если не особенно интуитивно! Например, здесь приведен фрагмент созданного файла. Обратите внимание на строковый литерал HELLO_WORLD.
PD1(2):D_COMP_U [
L_SRCPOS : row 1 col 1
A_CONTEX :
PD2(2): D_CONTEX [
L_SRCPOS : row 1 col 1
AS_LIST : < >
]
A_UNIT_B :
PD3(2): D_S_BODY [
L_SRCPOS : row 1 col 1
A_D_ :
PD4(2): DI_PROC [
L_SRCPOS : row 1 col 11
L_SYMREP : HELLO_WORLD,
S_SPEC : PD5^(2),
S_BODY : PD8^(2),
Несколько заметок. Я запускаю это как SYS, который, как мы знаем, не является хорошей практикой, я не знаю, почему вы не должны предоставлять привилегии DUMPDIANA обычным пользователям. Все процедуры, которые вы запускаете, входят в один и тот же файл - если вы удалите этот файл, он перестает работать, и вам нужно будет начать новый сеанс. Если он перестает работать, запуск нового сеанса иногда, кажется, устраняет проблему.