Mar*_*son 18 oracle syntax plsql
当Oracle编译存储过程时,它以DIANA格式存储该过程的AST.
有一个无证件包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.
Run Code Online (Sandbox Code Playgroud)
此时应该在文件夹中创建一对文件
$ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace.这两个文件似乎遵循命名约定:
orcl12c_ora_{PROCESS}.trc
orcl12c_ora_{PROCESS.trm
Run Code Online (Sandbox Code Playgroud)
其中trc文件是相应trm文件的人类可读版本,{PROCESS}是操作系统进程ID.要查找此内容,请使用同一会话中的以下查询:
select p.spid from v$session s,v$process p
where s.paddr = p.addr
and s.sid = sys_context('USERENV','SID');
Run Code Online (Sandbox Code Playgroud)
例如,如果会话ID是8861,那么从bash shell中可以使用以下命令查看结果:
vim $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace/orcl12c_ora_8861.trc
Run Code Online (Sandbox Code Playgroud)
结果很有趣......如果不是特别直观!例如,这里是生成的文件的片段.请注意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),
Run Code Online (Sandbox Code Playgroud)
几个笔记.我把它作为SYS运行,我们知道这不是一个好习惯,我不知道为什么你不应该将DUMPDIANA的权限授予普通用户.您转储的所有过程都会进入同一个文件 - 如果删除该文件,它将停止工作,您将需要启动一个新会话.如果它停止工作,有时似乎可以解决问题.
| 归档时间: |
|
| 查看次数: |
1120 次 |
| 最近记录: |