# 调试 Oracle PL/SQL 代码

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

Procedure: 启用 数据库工具和 SQL 插件

此功能依赖于 数据库工具和 SQL 插件，该插件默认情况下在 IntelliJ IDEA 中绑定并启用。 如果相关功能不可用，请确保您没有禁用插件。

> **Note:**
> 没有 Ultimate 订阅时，数据库工具和 SQL 的功能支持在 IntelliJ IDEA 中受限。

1. 按 `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS)) 打开设置，然后选择  `插件` 。

2. 找到  数据库工具和 SQL  插件并点击   启用  。

调试器基于 甲骨文 探针，使用 DBMS_DEBUG 包的 API，应该可以在 甲骨文 服务器 9.0 及以上版本上运行。

在 甲骨文 中，您可以调试以下程序单元（PL/SQL 程序）：匿名块、包、过程、函数和触发器。

## 步骤 1。 创建 PL/SQL 对象

Procedure:

1. 右键点击 甲骨文 数据源并选择  `新建 | 查询控制台` 。

或者，从   查询控制台   列表（ `Ctrl+Shift+F10` (Windows), `⌘ ⇧ F10` (macOS), `⌘ ⇧ F10` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ F10` (macOS System Shortcuts), `Ctrl+Shift+F10` (XWin), `Ctrl+Shift+F10` (GNOME), `Ctrl+Shift+F10` (KDE), `Ctrl+Shift+F10` (Emacs), `Ctrl+Shift+F10` (Sublime Text), `⌘ ⇧ F10` (Sublime Text (macOS)), `Ctrl+Shift+F10` (Visual Studio), `⌘ ⇧ F10` (Visual Studio (macOS)), `Ctrl+Shift+F10` (NetBeans), `Ctrl+Shift+F10` (Eclipse), `⌘ ⇧ F10` (Eclipse (macOS))）中选择一个现有的查询控制台s。

2. 在 查询控制台 中键入或粘贴代码。

3. 点击   执行   按钮 ![“执行”按钮](https://resources.jetbrains.com/help/img/idea/2026.3/app.actions.execute.svg) 或按 `Ctrl+Enter` (Windows), `⌘ ⏎` (macOS), `⌘ ⏎` (IntelliJ IDEA Classic (macOS)), `⌘ ⏎` (macOS System Shortcuts), `Ctrl+Enter` (XWin), `Ctrl+Enter` (GNOME), `Ctrl+Enter` (KDE), `Ctrl+Enter` (Emacs), `Ctrl+Enter` (Sublime Text), `⌘ ⏎` (Sublime Text (macOS)), `Ctrl+Enter` (Visual Studio), `⌘ ⏎` (Visual Studio (macOS)), `Ctrl+Enter` (NetBeans), `Ctrl+Enter` (Eclipse), `⌘ ⏎` (Eclipse (macOS)) 以运行该过程代码。

因此，您会在   数据库  工具窗口（  `视图 | 工具窗口 |   数据库` ）中看到一个已创建的对象。

![创建 PL/SQL 对象](https://resources.jetbrains.com/help/img/idea/2026.3/pl_sql_debugging_create_procedure.png)

该过程的代码段：

```SQL
CREATE PROCEDURE simpleprocedure (inval NUMBER)
IS
    tmpvar   NUMBER;
    tmpvar2   NUMBER;
    total     NUMBER;
BEGIN
    tmpvar := 0;
    tmpvar2 := 0;
    total := 0;
    FOR lcv IN 1 .. inval
    LOOP
    total := 2 * total + 1 - tmpvar2;
    tmpvar2 := tmpvar;
    tmpvar := total;
    END LOOP;
    DBMS_OUTPUT.put_line ('TOTAL IS: ' || total);
END simpleprocedure;
/

```

## 步骤 2。 使用调试选项编译 PL/SQL 对象

Procedure:

要启用 PL/SQL 代码的调试，您需要使用  `调试`  选项对其进行编译。 编译过程将 PL/SQL 代码转换为 Pro*C，然后编译为 Oracle 共享库。 编译帮助 Oracle 解释器更快地处理您的代码。

1. 右键点击 您想调试的 PL/SQL 对象，然后选择  `SQL 脚本 | 重新编译` 。

2. 在   重新编译  对话框中，选择   带有 DEBUG 选项  。

3. 点击   OK  。

![编译代码以进行调试](https://resources.jetbrains.com/help/img/idea/2026.3/pl_sql_debugging_compile_for_debug.png)

## 步骤 3。 调试 PL/SQL 程序单元

Procedure: 通过匿名块调试 PL/SQL 过程和函数

PL/SQL 程序单元将代码组织成块。 一个没有名称的块是匿名块。 匿名块不存储在 Oracle 数据库中。 在调试过程中，您使用匿名块来传递参数的值。

要调试过程、包和函数，请编写调用必要程序的匿名块。

1. 在   数据库   工具窗口中，双击为调试而 [创建](#step-1-create-a-pl-sql-object)并 [编译](#step-2-compile-a-pl-sql-object-with-the-debug-option)的 PL/SQL 对象。

2. 点击   运行过程   按钮 ![运行过程按钮](https://resources.jetbrains.com/help/img/idea/2026.3/database-plugin.icons.procedureRun.svg)。 如果未选择会话，请从列表中选择一个会话。 有关管理会话的更多信息，请参阅 [会话](managing-connection-sessions.html)。

3. 从   执行例程   对话框中，将匿名块复制并粘贴到 查询控制台。

4. 在匿名块和此匿名块中引用的 PL/SQL 程序对象中放置断点。

5. （可选）修改参数值。

6. 点击   调试  。

[Video](https://resources.jetbrains.com/help/img/idea/2026.3/pl_sql_debugging_run_debug_in_anonymous_block.mp4)

该过程的代码段：

```SQL
CREATE PROCEDURE simpleprocedure (inval NUMBER)
IS
tmpvar   NUMBER;
tmpvar2   NUMBER;
total     NUMBER;
BEGIN
tmpvar := 0;
tmpvar2 := 0;
total := 0;
FOR lcv IN 1 .. inval
LOOP
total := 2 * total + 1 - tmpvar2;
tmpvar2 := tmpvar;
tmpvar := total;
END LOOP;
DBMS_OUTPUT.put_line ('TOTAL IS: ' || total);
END simpleprocedure;
/

```

Procedure: 通过匿名块调试 PL/SQL 包

程序包是一个模式对象，用于将逻辑上相关的 PL/SQL 类型、项和子程序进行分组。

就像过程和函数一样，要调试包，编写调用必要例程的匿名块。

1. 在   数据库   工具窗口中，双击为调试而 [创建](#step-1-create-a-pl-sql-object)并 [编译](#step-2-compile-a-pl-sql-object-with-the-debug-option)的软件包。

2. 在包中放置断点。

3. 右键点击 甲骨文 数据源并选择  `新建 | 查询控制台` 。

或者，从   查询控制台   列表（ `Ctrl+Shift+F10` (Windows), `⌘ ⇧ F10` (macOS), `⌘ ⇧ F10` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ F10` (macOS System Shortcuts), `Ctrl+Shift+F10` (XWin), `Ctrl+Shift+F10` (GNOME), `Ctrl+Shift+F10` (KDE), `Ctrl+Shift+F10` (Emacs), `Ctrl+Shift+F10` (Sublime Text), `⌘ ⇧ F10` (Sublime Text (macOS)), `Ctrl+Shift+F10` (Visual Studio), `⌘ ⇧ F10` (Visual Studio (macOS)), `Ctrl+Shift+F10` (NetBeans), `Ctrl+Shift+F10` (Eclipse), `⌘ ⇧ F10` (Eclipse (macOS))）中选择一个现有的查询控制台s。

4. 在 甲骨文 查询控制台 中，编写一个触发该过程的匿名块。

5. 点击   调试  。

[Video](https://resources.jetbrains.com/help/img/idea/2026.3/pl_sql_debugging_run_debug_packages.mp4)

软件包的代码片段：

```SQL
CREATE PACKAGE PKG_DBGD AS
    FUNCTION tst_1(I IN INTEGER) RETURN INTEGER;
    FUNCTION tst_2(I IN INTEGER) RETURN INTEGER;
END PKG_DBGD;
/

CREATE PACKAGE BODY PKG_DBGD AS
    FUNCTION tst_1(I IN INTEGER) RETURN INTEGER IS
    BEGIN
        IF I BETWEEN 5 AND 10 THEN
            RETURN 2 * I;
        END IF;
        IF I BETWEEN 0 AND 4 THEN
            RETURN tst_2(3 + I);
        END IF;
        IF I BETWEEN 6 AND 10 THEN
            RETURN tst_2(I - 2);
        END IF;
        RETURN I;
    END TST_1;
    FUNCTION tst_2(I IN INTEGER) RETURN INTEGER IS
    BEGIN
        IF I BETWEEN 6 AND 8 THEN
            RETURN tst_1(I - 1);
        END IF;
        IF I BETWEEN 1 AND 5 THEN
            RETURN I * 2;
        END IF;
        RETURN I - 1;
    END TST_2;
END PKG_DBGD;
/

```

匿名代码块的代码片段：

```SQL
DECLARE
    V_RESULT INTEGER;
BEGIN
    V_RESULT := PKG_DBGD.tst_1(4);
END;

```

Procedure: 通过查询调试 PL/SQL 触发器

触发器是一个 PL/SQL 程序单元，当发出  `INSERT` 、  `UPDATE`  或  `删除`  查询时，DBMS 会自动调用它。 触发器与表关联，并在插入、更新或删除数据行之前或之后调用。 一个表可以有多个触发器。

要调试触发器，请针对表或视图编写  `INSERT` 、  `UPDATE`  或  `删除`  查询。

1. 右键点击 甲骨文 数据源并选择  `新建 | 查询控制台` 。

或者，从   查询控制台   列表（ `Ctrl+Shift+F10` (Windows), `⌘ ⇧ F10` (macOS), `⌘ ⇧ F10` (IntelliJ IDEA Classic (macOS)), `⌘ ⇧ F10` (macOS System Shortcuts), `Ctrl+Shift+F10` (XWin), `Ctrl+Shift+F10` (GNOME), `Ctrl+Shift+F10` (KDE), `Ctrl+Shift+F10` (Emacs), `Ctrl+Shift+F10` (Sublime Text), `⌘ ⇧ F10` (Sublime Text (macOS)), `Ctrl+Shift+F10` (Visual Studio), `⌘ ⇧ F10` (Visual Studio (macOS)), `Ctrl+Shift+F10` (NetBeans), `Ctrl+Shift+F10` (Eclipse), `⌘ ⇧ F10` (Eclipse (macOS))）中选择一个现有的查询控制台s。

2. 在 查询控制台 中键入查询。

3. 在触发器中放置断点。

4. 点击   调试  。

[Video](https://resources.jetbrains.com/help/img/idea/2026.3/pl_sql_debugging_run_debug_triggers.mp4)

触发器的代码片段：

```SQL
create table Table_with_Triggers
(
    Code char(1),
    Name varchar(26)
)
/

create trigger Table_with_Triggers_Trg_1
    before update on Table_with_Triggers
declare
    x positive := 42;
begin
    dbms_output.put_line('trigger before update statement');
end;
/

create trigger Table_with_Triggers_Trg_2
    before update on Table_with_Triggers
    for each row
begin
    dbms_output.put_line('trigger before update row '||:old.Code);
end;
/

create trigger Table_with_Triggers_Trg_3
    after update on Table_with_Triggers
    for each row
begin
    dbms_output.put_line('trigger after update row '||:old.Code);
end;
/

create trigger Table_with_Triggers_Trg_4
    after update on Table_with_Triggers
begin
    dbms_output.put_line('trigger after update statement');
end;
/

insert into Table_with_Triggers values ('A', 'Altai');
insert into Table_with_Triggers values ('B', 'Barnaul');
commit;

alter trigger Table_with_Triggers_Trg_1 compile debug;
alter trigger Table_with_Triggers_Trg_2 compile debug;
alter trigger Table_with_Triggers_Trg_3 compile debug;
alter trigger Table_with_Triggers_Trg_4 compile debug;

begin
    dbms_output.enable(4000);
end;
/

begin
    update Table_with_Triggers
        set Name = Name || '+';
end;
/

update Table_with_Triggers
set Name = Name || '+'
/

rollback
/


select *
from user_source
/

```

## 单步模式:

在调试 PL/SQL 代码时，您可以选择两种单步执行模式：   优雅   和   原生  。

在   优雅  模式中，您可以暂停调试的会话（目标会话），设置和移除断点。 如果没有设置有效的断点，调试器将逐行执行代码。

在   原生   模式下，调试器使用 Oracle 原生调试命令。 您无法暂停目标会话或管理断点，但在 CPU 密集型操作（包括大量计算和循环的操作）中，您可能会体验到性能提升。 您可以在 [官方 Oracle 文档](https://docs.oracle.com/database/121/ARPLS/d_debug.htm#ARPLS66129)中阅读有关 Oracle 调试命令的更多信息。 如果未设置有效的断点，调试器将执行整个例程。

Procedure: 更改步进模式

1. 打开设置（ `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))），然后导航到  `构建、执行、部署工具 | 调试器 | 步进` 。

2. 从   步进模式  列表中选择所需的调试模式。

Procedure: 在可调试代码的开头暂停

您可以强制调试器在可调试代码的开头暂停。 调试器暂停的位置会被自动检测。 如果您在声明部分分配变量值，调试器会在变量声明处暂停。 如果未将值赋予变量，调试器将跳过声明部分并在执行部分的  `开始` 关键字处暂停。

1. 打开设置（ `Ctrl+Alt+S` (Windows), `⌘ Comma` (macOS), `⌘ Comma` (IntelliJ IDEA Classic (macOS)), `⌘ Comma` (macOS System Shortcuts), `Ctrl+Alt+S` (XWin), `Ctrl+Alt+S` (GNOME), `Ctrl+Alt+S` (KDE), `Ctrl+Alt+S` (Emacs), `Ctrl+Alt+S` (Sublime Text), `⌘ Comma` (Sublime Text (macOS)), `Ctrl+Alt+S` (Visual Studio), `⌘ Comma` (Visual Studio (macOS)), `Ctrl+Alt+S` (NetBeans), `Ctrl+Alt+S` (Eclipse), `⌘ Comma` (Eclipse (macOS))），然后导航到  `构建、执行、部署工具 | 调试器 | 步进` 。

2. 选择   开始时暂停  。

![在可调试代码的开头暂停](https://resources.jetbrains.com/help/img/idea/2026.3/db_pause_at_debuggable_code.svg)

