又一个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:

结束。

相关推荐
是桃萌萌鸭~1 小时前
oracle的隐藏虚拟列详解
运维·数据库·oracle
Geoffwo2 小时前
Oracle MySQL8.0升级8.4,无感升级数据库
数据库·oracle
Irene19915 小时前
Oracle 查看表结构的方法(MySQL vs Oracle 查看表结构对比)
oracle
Irene19915 小时前
(课堂笔记)拉链表、索引与分区
oracle
lifewange5 小时前
SQL Server、MySQL、Oracle 核心区别对比
数据库·mysql·oracle
liwulin05065 小时前
【JAVAFX】从ORACLE JDK切换到国内的JDK以便使用JAVAFX功能
java·数据库·oracle
spencer_tseng6 小时前
Data Storage and Computation
database
承渊政道7 小时前
Oracle迁移避坑:一个(+)写错,LEFT JOIN可能变INNER JOIN
运维·服务器·数据库·数据仓库·学习·安全·oracle
Irene19917 小时前
MySQL、Oracle 数据库:唯一索引、普通索引、NUM_ROWS(行数)、ROW_NUM / ROWNUM(行号)
mysql·oracle
阿坤带你走近大数据7 小时前
OracleSQL优化案例-3
数据库·oracle·sql优化