达梦数据库执行sql报错:数据溢出

数据库执行sql报错数据溢出
单独查询对应的数字进行计算是不是超过了某个字段类型的上限或下限
如果已经超过了,进行对字段进行cast类型转换处理,转换为dec num都可以尝试

这里就是从

max(T.BLOCK_ID as dec*8192+t.bytes)/1024/1024 max_MB,

换成了这个执行则不报错了

max(cast(T.BLOCK_ID as dec)*8192+t.bytes)/1024/1024 max_MB,
SELECT /*+parallel(20)*/
 a.FILE_ID,
 a.file_name,
 t.owner,
 t.segment_name,
 decode(t.partition_name, NULL,NULL,t.partition_name) partition_name,
 t.segment_type,
 a.BYTES / 1024 / 1024 datafile_size,
 max(cast(T.BLOCK_ID as dec)*8192+t.bytes)/1024/1024 max_MB,
 SUM(T.bytes)/ 1024 / 1024 sum_MB
  FROM DBA_EXTENTS T, DBA_DATA_FILES A
 WHERE T.TABLESPACE_NAME IN ('TS_SETT')
   AND A.FILE_ID = T.FILE_ID
GROUP BY a.FILE_ID,a.file_name,a.BYTES,t.owner,t.segment_name,t.segment_type,t.partition_name
having max(cast(T.BLOCK_ID as dec)*8192+t.bytes)/1024/1024 > 6000
 ORDER BY a.file_id, max(T.BLOCK_ID) DESC;
<think>好的,用户之前问了关于Oracle升级到19c的问题,现在又问了如何将数据从Oracle迁移到达梦数据库,并关注兼容性问题。我需要先理解达梦数据库是什么,它应该是国产的数据库,可能和Oracle有兼容模式,但毕竟不同,迁移过程中需要注意数据类型、函数、SQL语法等方面的差异。 首先,用户可能是在做数据库迁移项目,或者准备迁移,需要了解步骤和注意事项。他们可能来自企业IT部门,或者是数据库管理员,需要将现有Oracle系统迁移到达梦,可能涉及国产化替代,所以需要详细的迁移步骤和常见问题。 接下来,我需要考虑迁移的一般流程,比如评估、准备、迁移、验证等阶段。评估阶段需要检查兼容性,包括数据类型、函数、存储过程、触发器等。迁移工具方面,达梦可能有自己的工具,比如DTS,或者使用第三方工具如OGG、ETL等,或者手动导出导入。 兼容性问题方面,数据类型比如Oracle的VARCHAR2和达梦的VARCHAR可能不同,日期函数如SYSDATE,达梦可能用SYSDATE或者不同的函数。还有序列、分页查询(ROWNUM vs LIMIT)、事务隔离级别等差异。 另外,用户可能还关心性能优化、数据一致性、回滚计划等。需要注意迁移后的测试,包括功能测试和性能测试,确保应用正常运行。 需要提醒用户特别注意存储过程和函数的改写,因为语法可能不同,比如PL/SQL达梦SQL语法差异。还有字符集、排序规则等设置,避免乱码问题。 可能还需要提到使用达梦的兼容模式,比如设置兼容性参数为Oracle,这样部分SQL可以更兼容,但并非全部。同时,迁移过程中可能需要逐步调试,处理不兼容的地方,比如使用达梦的替代函数或修改应用代码。 总结步骤:评估分析、环境准备、数据迁移、对象迁移、数据校验、应用适配、测试验证。每个步骤中的关键点和可能遇到的问题,比如使用DTS工具时的配置,或者手动导出导入时的数据类型转换。 最后,注意事项要分点列出,比如数据类型、函数、SQL语法、事务、性能差异等,并给出解决建议,如修改SQL、使用兼容函数、调整应用逻辑等。</think>以下是Oracle迁移到达梦数据库(DM8)的核心步骤与兼容性注意事项,适合项目实践参考: --- ### **一、迁移核心步骤** #### **1. 迁移前评估** - **对象兼容性分析**:使用达梦**DTS迁移工具**自动扫描Oracle表结构、视图、存储过程,生成差异报告。 - **数据量评估**:统计表大小、LOB字段占比,规划分批迁移策略(避免单次大事务)。 - **应用适配分析**:检查SQL语法(如ROWNUM vs LIMIT)、事务隔离级别(Oracle默认READ COMMITTED,达梦可配置)。 #### **2. 环境准备** - **字符集对齐**:达梦默认UTF-8,若Oracle使用ZHS16GBK,需在达梦建库时指定GBK。 - **兼容模式设置**:在达梦配置文件`dm.ini`中设置`COMPATIBLE_MODE=2`(开启Oracle语法兼容)。 #### **3. 数据迁移** - **使用DTS工具**: 1. 创建Oracle到达梦的迁移任务。 2. **类型映射**:自动转换`VARCHAR2→VARCHAR`、`NUMBER→DECIMAL`,需手动处理CLOB/BLOB字段。 3. **分批提交**:设置每批次提交量(例如10,000行),减少内存压力。 - **SQL*Loader替代方案**:导出Oracle数据为CSV,通过达梦`dimp`工具导入。 #### **4. 对象迁移** - **表结构**:检查约束(如外键级联删除)、索引(位图索引需转B-Tree)。 - **存储过程/函数**: - 重写`DECODE()`为达梦`CASE WHEN`。 - 替换`SYSDATE`为`NOW()`,`NVL()`为`COALESCE()`。 - **触发器**:调整行级触发器中的`:OLD/:NEW`引用方式。 #### **5. 数据一致性校验** - **行数比对**:通过`SELECT COUNT(*)`分表校验。 - **哈希校验**:对关键表执行`DBMS_UTILITY.GET_HASH_VALUE`(Oracle)与达梦`HASH_ROW()`比对。 --- ### **二、关键兼容性问题与解决方案** #### **1. 数据类型差异** | **Oracle类型** | **达梦默认映射** | **需手动处理场景** | |----------------------|------------------|----------------------------------| | `VARCHAR2(n)` | `VARCHAR(n)` | 长度超8188时需转`TEXT` | | `NUMBER(p,s)` | `DECIMAL(p,s)` | 无精度定义时转`DECIMAL(38,10)` | | `DATE` | `DATETIME` | 日期范围不同(达梦支持0001-9999)| | `RAW(n)` | `VARBINARY(n)` | 直接映射 | | **特殊类型** | | | | `ROWID` | 无直接对应 | 改用自增列或业务主键 | | `BINARY_FLOAT` | `FLOAT` | 精度损失需评估 | #### **2. 函数与语法差异** | **分类** | **Oracle示例** | **达梦适配方案** | |----------------|----------------------------------------|--------------------------------------| | **分页查询** | `WHERE ROWNUM <= 100` | `LIMIT 100` 或 `TOP 100` | | **字符串函数** | `TO_CHAR(date, 'YYYY-MM-DD')` | `DATE_FORMAT(date, '%Y-%m-%d')` | | **分析函数** | `LISTAGG(col, ',') WITHIN GROUP` | `WM_CONCAT(col)`(需启用WM_CONTEXT)| | **系统函数** | `NVL(col, 0)` | `IFNULL(col, 0)` | | **序列操作** | `SELECT seq.nextval FROM dual` | `SELECT seq.NEXTVAL`(无需FROM dual)| #### **3. 事务与锁机制** - **自治事务**:达梦使用`PRAGMA AUTONOMOUS_TRANSACTION`语法与Oracle相同,但需在存储过程中显式声明。 - **锁超时**:Oracle默认无限等待,达梦需设置`LOCK_WAIT_TIMEOUT=60`(单位:秒)。 #### **4. 性能相关差异** - **并行查询**:Oracle使用`/*+ PARALLEL(t 4) */`,达梦需设置`EXECUTE PARALLEL 4 ON OBJECT '表名'`。 - **统计信息**:达梦默认自动收集统计信息,复杂场景需手动执行`DBMS_STATS.GATHER_TABLE_STATS`。 --- ### **三、注意事项(避坑指南)** 1. **LOB字段迁移**:达梦的BLOB/CLOB字段需通过`DMHS`工具或JDBC流式处理,避免内存溢出。 2. **隐式类型转换**:达梦对`WHERE '1' = 1`严格报错,需显式转换(`WHERE CAST('1' AS INT) = 1`)。 3. **PL/SQL兼容性**: - 达梦不支持`PIPELINED`函数,需改用临时表。 - 游标循环中`%NOTFOUND`需改为`%NOT FOUND`(空格敏感)。 4. **时区处理**:达梦的`TIMESTAMP WITH TIME ZONE`存储格式与Oracle不同,建议应用层统一为UTC时间。 --- ### **迁移后验证要点** - **功能验证**:执行关键业务SQL,验证结果集一致性。 - **性能压测**:对比TPC-C或业务特有场景的TPS/QPS。 - **回退方案**:保留Oracle环境至少1个月,防止兼容性问题滞后暴露。 --- ### **示例迁移语句** ```sql -- Oracle分页查询改造 -- Oracle原语句: SELECT * FROM (SELECT t.*, ROWNUM rn FROM table t WHERE ROWNUM <= 100) WHERE rn > 90; -- 达梦适配: SELECT * FROM table ORDER BY col LIMIT 10 OFFSET 90; ``` --- 通过系统化的类型映射、语法适配和工具辅助,可显著降低迁移风险。建议在迁移前使用达梦**DMLink**功能建立跨库链路,实现灰度验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值