开发过程中的达梦常见问题总结

本文档详细介绍了达梦数据库在遇到内存消耗过大、新增大字段报错、跨平台建表兼容性、最大连接数调整、大字段CLOB查询限制及TEXT类型字段转换等问题时的解决方案。包括修改配置文件、使用管理工具进行系统管理以及调整SQL语句等方法。

1、达梦数据库出现吃内存的情况

解决方法:

D:\DM\data\DAMENG\dm.ini文件里,修改三个参数的值,分别是

MAX_OS_MEMORY=70,70指的百分比

BUFFER   =  1024    单位M

MAX_BUFFER   =  2000     单位M

3个参数的值可以根据实际服务器内存大小调整。

改完后,重启数据库服务,

如果启动应用报

这个错误,则用达梦管理工具登陆数据库,右键“管理服务器”

点击“系统管理”

状态转换里,选择“打开”,点击“转换”按钮,点击确定。

重新启动应用即可

2、解决达梦数据库新增大字段报错问题

使用达梦数据库创建新表后往新表中增加TEXT类型字段报错,错误信息如下:

区别在于一个是“CLUSTER PRIMARY KEY”,一个是“NOT CLUSTER PRIMARY KEY”,如果建表时指定“NOT CLUSTER PRIMARY KEY”则可以随时添加大字段

解决方案:

去掉聚集主键,重新建表,或者修改dm.ini配置文件中的“PK_WITH_CLUSTER”配置为0即可,其实通过DM控制台工具修改一样可以,修改完成后记得重启数据库实例,如果不行,则重启服务器。

3、在网站的功能迁移中,我们有时需要将达梦数据库建表语句放在oracle中执行

这个时候需要注意,达梦库的建表语句中的表名和字段是有双引号的,我们在oracle中执行时一定要将双引号去掉,不然虽然sql执行没有报错,表也建成功了,但是功能代码在执行时会报标识符无效的错误和表不存在的错误。

达梦数据库生成的建表语句如下:

 

4、达梦数据库修改最大连接数

select SF_GET_PARA_VALUE(2,'MAX_SESSIONS'); 查询最大连接数

ALTER SYSTEM SET 'MAX_SESSIONS' =1000; 修改最大连接数为1000

也可以到DM数据库安装目录/data/DAMENG/dm.ini文件中修改:

5、达梦数据库当中大字段CLOB的like查询限制

问题描述:

大字段CLOB的like查询限制

问题分析:

原因是DM 默认配置中,LIKE语句中CLOB类型的最大长度默认为31kb,当你的数据中该字段有内容超过31kb时,则会查询失败

解决方案:

进入DM控制台工具修改该参数的值即可,如图:

 

 6、数据库中的TEXT类型字段值转换

达梦数据库中的TEXT类型字段,值要转换为json时不能用net.sf.json.JSONObject,会转换失败,目前使用fastjson

 

<think>达梦数据库(DM Database)是一种关系型数据库管理系统。调试存储过程是数据库开发中的常见需求。在达梦数据库中,调试存储过程通常可以通过其自带的图形化管理工具(如管理工具或开发工具)来完成,也可以通过编写脚本来辅助调试。 然而,由于达梦数据库的调试功能主要依赖于图形化工具,因此这里将介绍两种方法: 1. 使用达梦数据库自带的图形化工具(DM管理工具或DM数据迁移工具)进行调试。 2. 使用日志输出进行调试(类似于在存储过程中添加打印语句)。 由于无法直接提供图形化工具的操作代码,我将重点放在第二种方法上:在存储过程中使用输出语句(如`DBMS_OUTPUT.PUT_LINE`)来输出调试信息。 另外,达梦数据库也支持使用调试器,但需要配置调试环境,并且通常需要图形界面。因此,在无法使用图形界面的情况下,使用输出语句是最常用的方法。 下面我们以在存储过程中插入调试信息为例: 假设我们有一个存储过程,我们想在执行过程中输出一些变量的值,以便观察执行流程和变量状态。 首先,确保在会话中启用了输出功能(在达梦数据库中,默认可能不显示输出,需要设置`SERVEROUTPUT`为ON)。 在SQLPLUS或达梦的命令行工具中,可以执行: ```sql SET SERVEROUTPUT ON; ``` 然后,在存储过程中使用`DBMS_OUTPUT.PUT_LINE`来输出信息。 示例存储过程: ```sql CREATE OR REPLACE PROCEDURE debug_demo (p1 IN INT, p2 OUT INT) AS v_temp INT; BEGIN DBMS_OUTPUT.PUT_LINE('开始执行存储过程,输入参数p1=' || p1); v_temp := p1 * 2; DBMS_OUTPUT.PUT_LINE('v_temp=' || v_temp); -- 模拟一些操作 IF v_temp > 100 THEN DBMS_OUTPUT.PUT_LINE('v_temp大于100'); v_temp := v_temp - 50; ELSE DBMS_OUTPUT.PUT_LINE('v_temp不大于100'); END IF; p2 := v_temp; DBMS_OUTPUT.PUT_LINE('输出参数p2=' || p2); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生错误: ' || SQLERRM); END; / ``` 调用该存储过程并查看输出: ```sql DECLARE out_val INT; BEGIN debug_demo(60, out_val); DBMS_OUTPUT.PUT_LINE('最终输出: ' || out_val); END; / ``` 上述代码中,我们在存储过程的关键步骤添加了输出语句,这样在执行时就能看到执行路径和变量值。 但是,如果我们需要更复杂的调试(比如设置断点、单步执行等),就需要使用达梦数据库的图形化调试工具。使用图形化工具调试存储过程的一般步骤为: 1. 在DM管理工具中连接到数据库。 2. 找到需要调试的存储过程,右键选择“调试”。 3. 设置参数并启动调试。 4. 在调试过程中可以单步执行,查看变量值等。 由于图形化工具的操作步骤较多且依赖于界面,这里不展开。 另外,达梦数据库还提供了系统过程`SP_SET_SESSION_DEBUG`用于开启会话调试,但通常还是配合工具使用。 如果是在开发环境中(如Windows),使用图形化工具调试是方便的;若在无图形界面的Linux服务器上,则可能需要通过输出日志来调试。 总结:达梦数据库调试存储过程有两种主要方式: - 使用图形化工具(推荐,支持断点、单步等)。 - 在存储过程中使用`DBMS_OUTPUT.PUT_LINE`输出调试信息。 注意:在生产环境,应避免在存储过程中留下调试输出语句,以免影响性能。 §§相关问题§§: 1. 如何在达梦数据库中创建一个带有异常处理的存储过程? 2. 达梦数据库的存储过程支持哪些控制结构(如条件、循环)? 3. 如何在达梦数据库中使用游标? 4. 达梦数据库的存储过程调试工具支持哪些调试功能(如断点、单步执行等)? </think>### 达梦数据库调试存储过程解决方案 在达梦数据库中调试存储过程主要有两种方法:使用图形化工具调试和通过日志输出调试。以下是详细解决方案: #### 方法一:使用DM管理工具调试(图形化) ```sql -- 1. 创建测试存储过程 CREATE OR REPLACE PROCEDURE test_debug(a IN INT, b OUT INT) AS BEGIN DECLARE c INT := 0; c := a * 2; IF c > 100 THEN b := c - 50; ELSE b := c + 50; END IF; PRINT '计算结果: ' || b; END; ``` **调试步骤:** 1. 打开DM管理工具 → 连接数据库 2. 在"存储过程"对象中找到`TEST_DEBUG` → 右键选择"调试" 3. 设置输入参数(如a=60)→ 点击"执行" 4. 使用调试工具栏: - 设置断点(行号左侧单击) - 单步执行(F10) - 观察变量值(变量监视窗口) - 查看输出结果 #### 方法二:使用日志输出调试(编程式) ```sql -- 改进的存储过程(添加调试日志) CREATE OR REPLACE PROCEDURE test_debug_v2(a IN INT, b OUT INT) AS c INT; BEGIN DBMS_OUTPUT.PUT_LINE('[DEBUG] 输入参数 a=' || a); c := a * 2; DBMS_OUTPUT.PUT_LINE('[DEBUG] 中间值 c=' || c); IF c > 100 THEN b := c - 50; DBMS_OUTPUT.PUT_LINE('[DEBUG] 分支: c>100'); ELSE b := c + 50; DBMS_OUTPUT.PUT_LINE('[DEBUG] 分支: c<=100'); END IF; DBMS_OUTPUT.PUT_LINE('[RESULT] 输出 b=' || b); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('[ERROR] ' || SQLERRM); END; ``` **调试执行:** ```sql -- 启用输出缓冲区 SET SERVEROUTPUT ON; -- 执行存储过程 DECLARE result INT; BEGIN test_debug_v2(60, result); DBMS_OUTPUT.PUT_LINE('最终结果: ' || result); END; ``` **输出示例:** ``` [DEBUG] 输入参数 a=60 [DEBUG] 中间值 c=120 [DEBUG] 分支: c>100 [RESULT] 输出 b=70 最终结果: 70 ``` ### 调试技巧说明 1. **断点调试**:适合复杂逻辑,可在DM工具中设置多个断点观察变量变化 2. **日志分级**: - `DBMS_OUTPUT.PUT_LINE` 输出常规信息 - 异常块捕获错误详情 - 使用`PRINT`快速输出简单信息 3. **变量监控**: - 在图形化调试器中实时查看变量 - 日志中输出关键变量值 4. **参数测试**: - 边界值测试(如a=0, a=50, a=51) - 异常值测试(如a=null) ### 常见错误处理 ```sql -- 异常处理最佳实践 EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('数据类型转换错误'); WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('除零错误'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误代码: ' || SQLCODE); DBMS_OUTPUT.PUT_LINE('错误信息: ' || SQLERRM); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值