如何访问PL/SQL存储过程的AST(抽象语法树)?

Mar*_*son 18 oracle syntax plsql

当Oracle编译存储过程时,它以DIANA格式存储该过程的AST.

  • 我怎样才能访问这个AST?
  • 是否有用于处理此AST的内置工具?

Jam*_*mes 8

有一个无证件包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的权限授予普通用户.您转储的所有过程都会进入同一个文件 - 如果删除该文件,它将停止工作,您将需要启动一个新会话.如果它停止工作,有时似乎可以解决问题.