CodeGym /课程 /SQL SELF /通过pgAdmin调试PL/pgSQL:断点、查看变量

通过pgAdmin调试PL/pgSQL:断点、查看变量

SQL SELF
第 56 级, 课程 0
可用

你写了人生第一个过程或者函数,跑起来了,但哪里不对劲。你当然可以加一堆RAISE NOTICE,想搞清楚到底是哪里“翻车”了。但!为啥要这么折腾自己?pgAdmin自带调试器啊,直接用它多爽!

pgAdmin让你可以一步步执行代码,设置断点(breakpoints),实时看变量值,还能查找错误原因。简直就是你的“侦探工具箱”,专门用来破案:“为啥我的SQL不work?”

为啥要用pgAdmin调试?

有时候过程里的bug藏得太深,只靠日志或者终端输出,查起来简直折磨人。这时候,逐步调试就特别有用了,你能看到每一步到底发生了啥。就像拼超难的拼图,但有提示一样。

用pgAdmin调试,你可以:

  1. 设置断点(breakpoints)——就是让代码在某一行停下来,好让你分析当前状态。
  2. 一步步走SQL代码——真的就是一步一步看每个语句是怎么跑的。
  3. 实时看变量值——确认数据是不是正确传递和处理的。
  4. 找到出错的地方,搞明白为啥错了。

怎么开始:pgAdmin调试前的准备

在开始调试之前,先确保一切都配置好了。

启用plpgsql扩展

确保你的数据库里启用了PL/pgSQL编程语言:

CREATE EXTENSION IF NOT EXISTS plpgsql;

这个语言一般PostgreSQL默认就有,但最好还是check一下。

确保你装的是pgAdmin 4或者更高版本(才支持调试)。还没装的话,可以去官网下载。

安装pldbgapi扩展

要让pgAdmin能调试PL/pgSQL,需要激活pldbgapi扩展:

CREATE EXTENSION IF NOT EXISTS pldbgapi;

这个扩展就是专门给调试器用的。

超级重要!!!你得有PostgreSQL服务器的管理员权限才能执行上面的命令。

调试基础:设置断点(breakpoints)

断点(breakpoints)就是你代码里专门停下来的地方,让你能“窥探”过程内部。就像长途开车中途休息一下:停下来,看看地图,检查下状态,然后再继续。

怎么在pgAdmin里设置断点?

  1. 打开pgAdmin,连上你的数据库。
  2. 在对象树里找到你的函数或过程:Functions → <你的schema> → <你的函数>。
  3. 右键点函数,选Debugging → Debug。这就启动调试器了。
  4. 在弹出来的代码窗口,找到你想开始调试的那一行,点左边的空白区域。会出现一个红色小圆圈——这就是断点。

效果大概是这样:

CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE '你选择了id: %', id;
    -- 这里可以设置断点
    PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;

断点设好后,你可以运行你的函数,执行会正好停在你设的那一行。现在你就能看变量值、前面语句的执行结果,当然也可以继续往下跑代码。

在pgAdmin里查看变量

知道代码停下来了,挺好。但更重要的是搞清楚内存里现在都有什么数据。比如:

  • 输入参数现在是什么值。
  • 某个代码块执行后变量变成啥了。
  • 数据库查询返回了啥。

怎么查看变量值?

当函数执行在断点停下时:

  1. 切到调试窗口下方的Variables标签。
  2. 你会看到所有变量和它们当前的值。

比如我们有个函数:

CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    discounted_price NUMERIC;
BEGIN
    discounted_price := price - (price * discount / 100);
    RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;

如果你在discounted_price那一行设断点,调试器会显示price和discount已经有值了,但discounted_price还是空的。

断点停下后变量列表大概这样:

变量 值
price 100.00
discount 15.00
discounted_price NULL

等你执行完当前行,discounted_price就会变成85.00。

一步步执行代码

在调试窗口,你可以用按钮控制函数的执行:

  1. Step Over —— 执行当前语句,跳到下一行。
  2. Step Into —— 进入被调用的函数或过程内部。
  3. Continue —— 一直跑到下一个断点或者函数结束。

实战:调试复杂函数

来,咱们写个复杂点的函数,实际调试一下。

例子:订单处理

CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
    order_status TEXT;
    total_amount NUMERIC;
BEGIN
    -- 设置订单状态
    SELECT status INTO order_status
    FROM orders
    WHERE id = order_id;

    IF order_status = 'Pending' THEN
        -- 计算订单总额
        SELECT SUM(price * quantity) INTO total_amount
        FROM order_items
        WHERE order_id = order_id;

        -- 更新订单状态
        UPDATE orders
        SET status = 'Processed', processed_date = NOW()
        WHERE id = order_id;

        RETURN '订单已处理。总额: ' || total_amount;
    ELSE
        RETURN '订单已处理或不存在。';
    END IF;
END;
$$ LANGUAGE plpgsql;

可以设置断点的地方:

  1. 在SELECT status INTO order_status那一行。
  2. 在SELECT SUM(price * quantity) INTO total_amount那一行。

调试时你可以:

  • 确认order_status确实是'Pending'。
  • 检查total_amount是不是算对了。

常见错误和解决办法

用pgAdmin调试时,你可能会遇到这些情况:

  1. 找不到你的函数。 确认函数真的已经在数据库里创建了,而且你连的是对的数据库。
  1. 断点不起作用。 检查pldbgapi扩展是不是启用了,还有你有没有足够的权限。

  2. 调试器连接报错。 确认PostgreSQL服务器配置支持调试(shared_preload_libraries参数里有pldbgapi)。

用pgAdmin调试PL/pgSQL,整个调试过程变得超级简单直观。设个断点,看看你的变量“呼吸”得咋样,把所有小毛病都修好——这离你的理想应用就差一步啦!

2
任务
SQL SELF, 第 56 级, 课程 0
已锁定
调试带有多个变量的函数
调试带有多个变量的函数
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION