又一个SQL Developer中调试存储过程的例子

此例基于OBE(Oracle By Example)的示例。是在SQL Developer中调试存储过程一文的进阶。复习了前文的一些基本概念,并纠正了官方示例的一个错误。

本文使用的是标准的HR 示例 Schema,调试的存储过程源代码如下:

sql 复制代码
CREATE OR REPLACE PROCEDURE emp_list (
    pmaxrows IN NUMBER
) AS

    CURSOR emp_cursor IS
    SELECT
        l.state_province,
        l.country_id,
        d.department_name,
        e.last_name,
        j.job_title,
        e.salary,
        e.commission_pct
    FROM
        locations   l,
        departments d,
        employees   e,
        jobs        j
    WHERE
            l.location_id = d.location_id
        AND d.department_id = e.department_id
        AND e.job_id = j.job_id;

    emp_record emp_cursor%rowtype;
    TYPE emp_tab_type IS
        TABLE OF emp_cursor%rowtype INDEX BY BINARY_INTEGER;
    emp_tab    emp_tab_type;
    i          NUMBER := 1;
BEGIN
    OPEN emp_cursor;
    FETCH emp_cursor INTO emp_record;
    emp_tab(i) := emp_record;
    WHILE
        ( emp_cursor%found )
        AND ( i <= pmaxrows )
    LOOP
        i := i + 1;
        FETCH emp_cursor INTO emp_record;
        emp_tab(i) := emp_record;
    END LOOP;

    CLOSE emp_cursor;
    FOR j IN REVERSE 1..i LOOP
        dbms_output.put_line(emp_tab(j).last_name);
    END LOOP;

END;

原文中的存储过程有错:

sql 复制代码
WHILE ((emp_cursor%FOUND) AND (i <= pMaxRows) LOOP

此处改为了:

sql 复制代码
WHILE (emp_cursor%FOUND) AND (i <= pMaxRows) LOOP

第一次调试出错:

错误提示很清晰,按下面赋权即可:

sql 复制代码
grant DEBUG CONNECT SESSION, DEBUG ANY PROCEDURE to HR;

第二次调试仍出错:

sql 复制代码
Connecting to the database Local-19c-HR-ORCLPDB1.
Executing PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '192.168.56.1', '51295' )
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line 68
ORA-06512: at line 1
Process exited.
Disconnecting from the database Local-19c-HR-ORCLPDB1.

这会是ACL的原因,运行以下代码解决:

sql 复制代码
 begin
  dbms_network_acl_admin.append_host_ace
  (host=>'192.168.56.1',
  ace=> sys.xs$ace_type(privilege_list=>sys.XS$NAME_LIST('JDWP') ,
  principal_name=>'HR',
  principal_type=>sys.XS_ACL.PTYPE_DB) );
end;
/

再次调试,以下是正确的信息:

sql 复制代码
Connecting to the database Local-19c-HR-ORCLPDB1.
Executing PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '192.168.56.1', '51579' )
Debugger accepted connection from database on port 51579.
Source breakpoint: EMP_LIST.pls:30

设置断点,开始调试,输入值改为5:

输入Debug Host,即SQL Developer所在的主机:

程序运行到断点:

先来演示Run to Cursor。将鼠标放到第44行,然后右键选择Run to Cursor

程序运行到当前Cursor处,Cursor这里指的是光标,而不是SQL中的游标:

再演示在运行中修改变量的值:

单击红框处,选中_value那行,右键选择Modify Value ...

修改原值King为James:

可以看到其生效了 ,然后点击上方的Resume按钮:

我们在输出中看到了James:

结束。

相关推荐
yumgpkpm11 小时前
Doris 并入CMP7(类Cloudera CDP 7.3.1 404华为鲲鹏ARM版)的方案和实施源代码
大数据·oracle·sqlite·sqoop·milvus·cloudera
yumgpkpm11 小时前
Doris在CMP7(类Cloudera CDP 7 404版华为Kunpeng)启用 Kerberos部署Doris
大数据·hive·hadoop·python·oracle·flink·cloudera
老衲提灯找美女11 小时前
MySQL数据库基础操作:
数据库·mysql·oracle
轻舟客丶11 小时前
ORA-03113的解决方案
数据库·经验分享·笔记·oracle
一颗宁檬不酸12 小时前
PL/SQL 知识点总结
数据库·sql·oracle·知识点
帅次17 小时前
系统分析师-案例分析-数据库系统&数据仓库&反规范化技术&NoSQL&内存数据库
大数据·数据库·数据仓库·oracle·kafka·数据库开发·数据库架构
我科绝伦(Huanhuan Zhou)17 小时前
Oracle AWR管理与快照操作完整指南
数据库·oracle·ffmpeg
员大头硬花生19 小时前
六、InnoDB引擎-架构-结构
数据库·mysql·oracle
晓py20 小时前
InnoDB 事务日志机制全流程详解|从 SQL 到崩溃恢复的完整旅程
数据库·sql·oracle
挨踢攻城20 小时前
Oracle OCP认证:深度解析与实战指南
mysql·oracle·dba·开闭原则·ocp·公众号:厦门微思网络·数据库专家