远程调试 PL/SQL 包
Posted
技术标签:
【中文标题】远程调试 PL/SQL 包【英文标题】:Remote debug PL/SQL packages 【发布时间】:2017-12-28 14:18:31 【问题描述】:假设我有一个正在运行的 java web 应用程序,我正在尝试保存一些数据,使用 JDBC 调用数据库中的 PL/SQL 包。
在java代码中,调用了execute()函数,将要保存的数据发送到数据库中的PL/SQL包中,由PL/SQL包处理数据并最终保存。
有没有办法使用 Oracle SQL Developer 或 PL/SQL Developer 即时调试调用的 PL/SQL 包,这些 IDE 是否支持这种远程调试功能?
【问题讨论】:
“调试数据库”是什么意思?我不熟悉这个概念。 PL/SQL 的交互式调试是可能的,但前提是我们事先做好了准备。尤其是因为它需要授予某些特权。请阅读this blog by @thatjeffsmith which is a top-notch overview of the steps involved @mathguy thx,匆忙写下,现已更正 @APC 谢谢,我会检查一下,希望这也适用于对过程的 JDBC 调用 我反对将其关闭为“过于宽泛”。远程调试是尽可能多的主题编程,虽然可能有不止一种选择,但它不像是一堆选项的浪费。询问“我需要为正在开发的在线购物应用程序保存一些数据,我该怎么做?”是一个过于宽泛的问题。这个不是。 【参考方案1】:您正在寻找的是 Oracle SQL Developer 中提供的 远程调试 功能。 有几个先决条件需要满足:
-
您要调试的所有软件包都应为调试而编译:
alter package SCHEMA.PACKAGE_NAME compile debug;
应授予要从其执行远程调试的架构的用户适当的权限:
grant debug connect session to USER_NAME;
用于连接到远程用户的会话
grant debug any procedure to USER_NAME;
用于调试程序(包括捆绑在包中的程序)
如果你使用 Oracle 12c,你应该考虑额外的 ACL 限制,看看 here 和 here,还注意有一些有用的 Oracle 视图,比如 dba_network_acl_privileges
来检查你现有的 ACL 权限李>
远程用户应该能够为调试器“发出信号”
grant execute on SYS.DBMS_DEBUG_JDWP to REMOTE_USER_NAME;
可以访问其CONNECT_TCP
程序
如果满足这些要求(或者您能够满足这些要求),您可以遵循例如this entry 在 Sue Harper 的博客中(或 this article 在同一作者的 Oracle 博客中,或 this one)以实现您的目标。简而言之:
-
您应该在特定端口上本地启动调试侦听器并设置断点(或设置适当的调试器选项)。
远程用户应该在运行感兴趣的代码之前运行
exec DBMS_DEBUG_JDWP.CONNECT_TCP( 'ip-address', port )
,这可以在会话登录触发器上实现。
远程调试您的代码。
对此可能有一些更具体的内容(对于 Oracle,这不仅仅是真实的),但这是我通常处理它的方式。
我还想提一下,不幸的是 PL/SQL Developer does not support 远程调试(使用 DBMS_DEBUG
包而不是 DBMS_DEBUG_JDWP
),即使在最新版本中也是如此。 Oracle SQL Developer 是用 Java 编写的,PL/SQL Developer 不是,我认为这是问题的根源。
【讨论】:
以上是关于远程调试 PL/SQL 包的主要内容,如果未能解决你的问题,请参考以下文章
IDEA Intellij 如何调试从 Java 类调用的 PL/SQL 代码
调试Idea如何远程debug之SpringBoot jar包启动