首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问PL/SQL存储过程的AST (抽象语法树)?

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

Stack Overflow用户
提问于 2015-07-31 17:37:59
回答 2查看 1.9K关注 0票数 19

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

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

回答 2

Stack Overflow用户

发布于 2016-02-03 14:56:05

有一个无文件的软件包DUMPDIANA,它意味着以人类可读的格式转储戴安娜。

文件$ORACLE_HOME\rdbms\admin\dumpdian.sql说:“文档可以在/vobs/plsql/note/dumpdiana.txt a.txt中找到”。我找不到那个文件,没有它,我们只能猜测一些参数的含义。DUMPDIANA的基本用法如下:

代码语言:javascript
复制
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中创建一对文件。这两个文件似乎遵循命名约定:

代码语言:javascript
复制
orcl12c_ora_{PROCESS}.trc
orcl12c_ora_{PROCESS.trm

如果trc文件是相应trm文件的人类可读的版本,而{ process }是操作系统进程ID。要查找此文件,请使用来自同一会话的以下查询:

代码语言:javascript
复制
select p.spid from v$session s,v$process p 
where s.paddr = p.addr
and s.sid = sys_context('USERENV','SID');

例如,如果会话ID为8861,则可以从bash中使用以下方法查看结果:

代码语言:javascript
复制
vim $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace/orcl12c_ora_8861.trc

结果很有趣..。如果不是特别直观的话!例如,这里是生成的文件片段。注意HELLO_WORLD字符串文本。

代码语言:javascript
复制
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),

几个音符。正如我们所知,这不是一个很好的实践,我不知道为什么您不应该将DUMPDIANA上的特权授予一个普通用户。您转储的所有过程都进入同一个文件-如果删除该文件,它将停止工作,您将需要启动一个新的会话。如果它停止工作,启动一个新的会话有时似乎解决了问题。

票数 9
EN

Stack Overflow用户

发布于 2016-02-10 08:02:50

这是一篇关于DIANA和IDL在PDF 如何解包PL/SQL中的优秀教程,作者principal是西门子在撰写这篇文章时的主要顾问,他专门研究和保护Oracle数据库。

在其他非常有趣的事情中,你会学到:

  • 戴安娜被写成IDL (接口定义语言)。
  • IDL存储在4个表中(IDL_CHAR$、IDL_SB4$、IDL_UB1$和IDL_UB2$)
  • 包装器PL/SQL简单地写成IDL。
  • 默认情况下不安装Dumpdiana,您需要确保还安装了DIANA、PIDL和DIUTIL /SQL包,并且您需要作为SYS运行它。
  • 如何甩掉戴安娜树并理解它。
  • 如何从DIANA中重构PL/SQL源。
  • 如何编写PL/SQL未包装器。
  • 基于PL/SQL的非包装器的局限性。
  • PL/SQL本身的限制。
  • 如何枚举戴安娜节点和属性。
  • 非包装概念的证明。

你可以找到他的网站在这里。那里有那么多的内容。您会发现关于Oracle安全性的精彩文章和许多有用的安全工具不仅是由他开发的,而且也是由其他作者开发的。

最重要的是,如果阅读后你还有问题,你可以和他联系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31752034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档